이 사이트에서 우리는 열역학 법칙을 준수합니다!


23

특히 제 2 법칙 : 고립 된 시스템의 엔트로피는 시간이 지남에 따라 증가한다 .

이 도전에 대해

  • " 분리 된 시스템 "은 프로그램 또는 기능 (이후부터 "프로그램"으로 약칭 됨)으로 간주됩니다.
  • " 시간 " 의 전달은 새로운 프로그램으로 간주되는 프로그램 출력의 반복 된 실행에 해당합니다 .
  • " 엔트로피 "는 섀넌의 1 차 엔트로피 (아래에 정의 됨)로 간주되며, 이는 문자열의 문자가 얼마나 다양한지를 측정합니다.

도전

프로그램은 동일한 언어로 프로그램으로 실행될 때 이전보다 더 엔트로피가있는 문자열을 생성하는 비어 있지 않은 문자열을 생성해야합니다. 이 실행-출력 프로세스를 무한 반복하면 엄격하게 증가하는 엔트로피 값 시퀀스를 생성해야 합니다 .

문자열은 모든 유니 코드 9.0 문자를 포함 할 수 있습니다 . 문자열 순서는 결정적이지 않아야합니다 (임의와 반대로).

주어진 문자열 의 엔트로피 는 다음과 같이 정의됩니다. 문자열에서 고유 문자와 발생 횟수를 식별하십시오. i 번째 고유 문자 의 빈도 p i 는 해당 문자의 발생 횟수를 문자열 길이로 나눈 값입니다. 그러면 엔트로피는

여기에 이미지 설명을 입력하십시오

여기서 합계는 문자열의 모든 고유 문자 위에 있습니다. 기술적으로, 이것은 스트링에서 관찰 된 주파수에 의해 주어진 분포 를 갖는 이산 랜덤 변수엔트로피에 대응한다 .

하자 H는 K 나타낸다하여에 의해 생성 된 문자열의 엔트로피 K 번째 프로그램, 그리고하자 H 0 나타낸다에게 초기 프로그램의 코드의 엔트로피를. 또한 L 0 은 초기 프로그램의 길이를 문자로 나타냅니다. 시퀀스 { H k }는 챌린지 요구 사항에 따라 모노톤이며, 기존 문자의 수가 유한하기 때문에 제한됩니다. 그러므로 한계 갖는다 H ∞를 .

점수 제출의은 (것이다 H - H 0 /) L 0 :

  • 분자 H H 0 는 코드가 무한한 시간 범위에 걸쳐 엔트로피를 증가시키는 법칙을 어느 정도까지 준수하는지 반영합니다.
  • denonimator L 0 은 바이트 단위가 아닌 문자 단위의 초기 코드 길이입니다.

가장 높은 점수를받은 코드가 이깁니다 . 동점은 가장 빠른 제출 / 편집을 위해 해결됩니다.

문자열의 엔트로피를 계산하기 위해 자바 스크립트 스 니펫 ( @flawr 제공)을 사용할 수 있습니다. 와에 의해 수정과 @Dennis@ETHproductions 이 게시물의 끝 부분을).

특정 경우에 H 한계를 얻는 것이 어려운 경우, H 20 과 같은 하한 을 사용하여 점수를 계산할 수 있습니다 (따라서 ( H 20 - H 0 ) / L 0 사용 ). 그러나 어쨌든 무한한 엔트로피 순서는 엄격히 증가해야합니다.

확실하지 않은 경우 엔트로피 순서가 증가하고 있다는 설명이나 간단한 증거를 포함하십시오.

가상의 언어에서 코드를 고려하십시오 aabcab 실행 문자열 생성, cdefgh실행이 생산 cdefghi하는 ...

원래 코드의 고유 문자는 a이고 bc각 주파수는 3/6, 2/6 및 1/6입니다. 엔트로피는 1.4591입니다. 이건 H 야 0 입니다.

문자열 cdefgh보다 엔트로피가 더 많습니다 aabcab. 주어진 수의 문자에 대해 모든 주파수가 같을 때 엔트로피가 최대화되기 때문에이를 계산하지 않고도 알 수 있습니다. 실제로, 엔트로피 H 1 은 2.5850이다.

문자열은 cdefghi다시 이전보다 더 엔트로피가 있습니다. 존재하지 않는 캐릭터를 추가하면 항상 엔트로피가 증가하기 때문에 컴퓨팅 없이도 가능합니다. 실제로, H 2 는 2.8074이다.

다음 문자열이 42체인 인 경우 H 3 이 1, 2.8074보다 작기 때문에 유효하지 않습니다 .

반면에 시퀀스가 ​​한계 H = 3으로 엔트로피가 증가하는 문자열을 생성하는 경우 점수는 (3-1.4597) / 6 = 0.2567이됩니다.

감사의 말

덕분에

  • @xnor 는 도전을 개선하는 데 도움을 주며 특히 반복 실행으로 얻은 무한 엔트로피 체인이 실제로 가능하다는 확신을 심어주었습니다 .

  • @flawr 점수 함수 수정 및 매우 유용한 스 니펫 작성을 포함하여 여러 가지 제안 사항이 있습니다.

  • 점수 함수의 이전 정의에서 필수적인 단점을 지적하기위한 @Angs ;

  • JavaScript 스 니펫에서 수정 한 @Dennis ;

  • 스 니펫의 다른 수정을위한 @ETHproductions ;

  • 엔트로피의 정의에 대한 정정을 위해 @PeterTaylor .

엔트로피를 계산하기위한 스 니펫


4
"이 사이트에 우리는 열역학의 법칙을 순종!"[표창장은 필요에]
TuxCrafting


1
질문은 "핫"네트워크 질문에 대한 것이기를 바랐습니다.
mbomb007

1
나는 궁금해했다 ... 실제로 엔트로피를 무한히 증가시키는 것이 가능합니까? 부호없는 이진 형식으로 출력을 가져 오면 기본적으로 [0,255] 범위의 정수 시퀀스입니다. 모든 문자가 다를 때 엔트로피가 최적이라면 (가정) 엔트로피가 가장 큰 문자열의 길이가 256 바이트라는 것을 의미하지 않습니까? 그것은 무한한 것이 아닙니다. 아니면 내 가정이 잘못되었습니다.
Osable

2
@Osable 해당 문자열의 복사본을 자체에 첨부하면 엔트로피가 동일합니다. 그런 다음 하나의 문자를 제거하면 약간 작습니다. 프로세스를 반전 시키면 엔트로피가 증가합니다. 당신은 최대 엔트로피를 결코 도달하기 위해 관리하는 경우, 당신은 영원히 계속 증가 할 수 있습니다
루이스 Mendo을

답변:


4

젤리, 0.68220949

“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v⁵

H 90 = 19.779597644909596802, H 0 = 4.088779347361360882, L 0 = 23

나는 계산하기 위해 긴 두 배를 사용 H (90) . 배정 밀도 플로트가 H 47 <H 46

첫 번째 프로그램이 인쇄됩니다

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v1010

여기서 코드 포인트가 100,000 에서 1,000,000 사이 인 모든 유니 코드 문자의 자리 표시 자로 사용됩니다 . 실제 길이는 900,031 자입니다.

초 프로그램 인쇄

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v101010

차례로 인쇄

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v10101010

기타

이 프로그램 중 어느 것도 온라인 인터프리터에서 작동하지 않으며 100KB 출력 제한이 있습니다. 그러나 0123456789위에서 언급 한 900,000 개의 유니 코드 문자 대신 인쇄하도록 프로그램을 수정하면 온라인으로 시도 할 수 있습니다!


5

MATLAB, 9.6923e-005 0.005950967872272

H0 =  2.7243140535197345, Hinf = 4.670280547752703, L0 = 327

이 새 버전은 첫 번째 "개념 증명"의 개선 된 버전입니다. 이 버전에서는 첫 번째 반복에서 큰 점수를 얻었습니다. 이것은 첫 번째 프로그램의 출력을 "부풀려서"이루어졌으며, 이는 이후의 모든 프로그램에 의해 복제됩니다. 그런 다음 H0코드의 가장 일반적인 기호를 가능한 한 많이 추가 하여 최소값을 찾으려고했습니다 . (이것은 감소 할 H0뿐만 아니라 동시에 증가하기 때문에 한계가있었습니다 L0. 추가하거나 제거하여 크기가 변하는 프로그램의 크기에 대한 점수의 전개를 볼 수 있습니다 1.) 반복은 아래 이전 버전과 동일합니다.

a=['ns}z2e1e1116k5;6111gE16:61kGe1116k6111gE16:6ek7;:61gg3E1g6:6ek7;:61gg3E1'];11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;;disp(['[''',a+1,'''];',0,'a=[''',a,'''];',0,[a-10,']]);'],0,[a-10,']]);']]);

점수 대 프로그램 길이

이전 버전:

H0 = 4.22764479010266, Hinf = 4.243346286312808, L0 = 162

다음 코드는 matlab quine에서 영감을 얻은 것 입니다. 기본적으로 다시 두 번 출력 됩니다 . 힌트는 반복 할 때마다 n코드 n-1줄 과 줄 바꿈 기호가 있다는 것 \n입니다. 그래서 n무한대로 접근, 뉴 라인에 코드 라인의 비율은 우리가 엔트로피 엄격하게 단조로운 성장을 가지고 1에 접근, 동시에이 보장. 즉 Hinf, 줄 바꿈과 마찬가지로 줄 바꿈이 많은 0 세대 코드를 고려하여 쉽게 계산할 수 있습니다 . (단순히 수렴하므로 실험적으로 확인할 수 있습니다.)

a=['ns}z2e1kGe1116k6111gE16;:61kGe1116k6111gE16;:6ek7;:61gg3E1g6;:6ek7;:61gg3E1'];
disp(['a=[''',a,'''];',10,'a=[''',a,'''];',10,[a-10,']]);'],10,[a-10,']]);']]);

아주 좋아요! 당신은 대체 뭔가를 얻을 것이다 10으로 0(즉,의 코드의 나머지 부분과 조정)? 숯불은 0matlab에 의해 공간으로 표시됩니다
루이스 Mendo을

제안 해 주셔서 감사합니다! 시험해 보도록하겠습니다.하지만 점수를 더 많이 올리는 다른 개선 사항이 있다고 생각합니다. 이것은 무엇보다도 개념의 증거가되어야합니다 :)
flawr

나는 당신의 제안을 다른 개선 사항들과 함께 포함 시켰습니다.
flawr

나는 그 최적화 그래프를 좋아한다 :-)
Luis Mendo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.