도움! 숙제가 더 있어요!


18

선생님은 나의 화성 숙제에 불만이 많았습니다 . 나는 모든 규칙을 따랐지만 그녀는 내가 출력 한 것이 횡설수설이라고 말했습니다. "모든 언어는 Zipf의 법칙을 따라야한다"... 나는 Zipf의 법칙이 무엇인지조차 몰랐다!

알고 보니 지프의 법칙의 상태는 y 축에 각 단어의 주파수의 대수 및 x 축에 각 단어의 "장소"의 대수 (가장 일반적인 = 1 음모 경우 그 두 번째 가장 일반적인 = 2, 세 번째로 가장 commmon = 3 등), 플롯은 약 -1의 기울기를 가진 선을 표시하거나 약 10 %를 줄이거 나 갖습니다.

예를 들어, 다음은 Moby Dick에 대한 플롯입니다.

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

x 축은 n 번째로 가장 많이 사용되는 단어이고 y 축은 n 번째로 가장 많이 사용되는 단어 의 발생 횟수입니다 . 선의 기울기는 약 -1.07입니다.

이제 우리는 Venutian을 다루고 있습니다. 고맙게도, Venutians는 라틴 알파벳을 사용합니다. 규칙은 다음과 같습니다.

  • 각 단어에는 모음이 하나 이상 있어야합니다 (a, e, i, o, u)
  • 각 단어에는 한 줄에 최대 세 개의 모음이있을 수 있지만 한 줄에 두 개 이상의 자음이있을 수 있습니다 (자음은 모음이 아닌 문자 임).
  • 15 자보다 긴 단어가 없습니다
  • 선택 사항 : 단어를 문장으로 묶어 3 ~ 30 단어 길이로 구분합니다.

선생님은 내가 화성 숙제를 부정했다고 생각하기 때문에 적어도 30,000 단어 길이의 에세이를 작성하도록 배정되었습니다. 그녀는 Zipf의 법칙을 사용하여 나의 작업을 점검 할 것이므로, (위에 설명 된 바와 같이) 선이 적합 할 때 경사는 최대 -0.9이지만 -1.1 이상이어야하며, 최소 200 단어의 어휘를 원합니다. 같은 단어를 한 번에 5 번 이상 반복해서는 안됩니다.

이것은 CodeGolf이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 출력을 Pastebin 또는 텍스트 파일로 다운로드 할 수있는 다른 도구에 붙여 넣으십시오.


그렇습니다. 원한다면 32767 단어 문장을 할 수 있습니다. 제한은 문장의 단어의 빈도가 zipf의 법칙을 따라야한다는 것입니다
J. Antonio Perez

1
"비너스에서"에 대한 전통적인 형용사는 Veneral이지만 어떤 이유로 인기가 떨어졌습니다. 금성은 공상 과학에서 일반적으로 사용됩니다.
피터 테일러

zipf 배포 후 단어 목록을 작성하고 셔플 링하면 zipf 배포 후 연속 단어 쌍으로 시퀀스를 생성 할 가능성이 높다고 추측합니다. 더욱이, 목록에 충분히 다른 단어가 있으면 같은 단어가 연속으로 5 번 이상 반복 될 확률은 실제로 작습니다. 이 접근법을 시도하여 유효한 에세이를 만들 수 있다면 받아 들일 수 있습니까?
Leo

기울기는 -0.35 것 비록 당신의 추측은 합리적이다
J. 안토니오 페레즈

여전히 직선처럼 보일 것입니다. 그것은 단지 경사가 너무 클 것입니다
J. Antonio Perez

답변:


3

수학, 102 바이트

""<>RandomChoice[1/Range@215->Rest@Flatten@Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}],8!]

이름이없는 함수는 입력을받지 않고 후행 공백이있는 40,320 개의 3 문자 금성 단어로 구성된 문자열을 반환합니다.

Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]"vaeiou"문자 만 사용하여 216 개의 3 글자 단어를 만들 수 있습니다. 이 단어 중 첫 번째 단어 인 "vvv"는 유효한 금성가 아니지만 Rest버립니다.

그런 다음 RandomChoice[1/Range@215->...,8!]8을 만듭니다! = 215 개 단어리스트에서 40,320 개의 무작위 선택. 빈도 가중치는 첫 215 개의 정수 ( 1/Range@215) 의 역수에 의해 결정됩니다 . 마지막으로 <>""...결과 목록에서 문자열을 연결합니다.

결과는 결정론과 거리가 멀다. 한 번의 실행 으로이 금성 에세이가 나왔습니다 .

Mathematica, 129 바이트

#2&@@@Sort[Join@@Table[{i,Rest@Flatten@Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]~Part~j},{j,215},{i,0,1,j/7!}]]<>""

이것은 결정 론적입니다. 215 단어의 기본 집합은 동일하지만 이제 각 단어는 zipf의 법칙을 강제로 적용하기 위해 정확한 횟수만큼 반복됩니다 (워드 #j는 대략 7! / j 번 반복됨). 그런 다음 반복을 피하기 위해 단어가 동일하게 인터리브됩니다. (각 단어가 눈금자에 배치되어 있고 그 단어의 모든 사본이 같은 간격으로 배치되어 있다고 가정합니다. 모든 단어를 순서대로 읽으면 어떤 단어도 많이 반복되지 않을 것입니다. 결과는 30,117 단어 입니다.) 금성 에세이 .


8을 만들지 않습니다! 의사 난수 선택은 같은 단어를 6 번 연속 반복 할 수 있다는 의미입니까?
Dennis

예, 이론 상으로는
Greg Martin

@GregMartin 사실 ... 링크 된 에세이는 비준수입니다. vva6 번 연속해서 나타납니다. 그래도 더 큰 문제가 있다고 생각합니다 ... 매번 답변이 작동하지 않아야합니까? (그리고 그렇지 않다면 어떻게 작동해야하는지에 대한 선을 어떻게 그리십니까?)
H Walters

이것은 공정한 비평이며, 그것이 어떻게 작동하는지 알고 싶습니다.
Greg Martin

2

05AB1E ,34 33 32 바이트

525DL/9*vNy<FD}})žMDâžNâJè3ô.rðý

525DL                            Yield [1, ..., 525]
     /                           Yield [525/1, ..., 525/525]
      9*                         Yield [4725/1, ..., 4725/525]. It's the number of occurences of each word. The sum of this array is greater than 30000
        v                        For each value (y = value, N = iteration counter starting from 0)
         N                       Push iteration counter
          y<FD}                  Push an array of "int(value)" times the iteration counter
               }                 End for
                )                Wrap everything in an array. At this point the array countains the sorted indices of all words that matches the frequency specs
                 žM              Push "aeiou"
                   Dâ            Cartesian product with itself (["aa", "ae", ...])
                     žN          Push the consonants
                       âJ        Cartesian product and join the values to make valid venutian words
                         è       Compute a big string with all words that correspond to the formerly computed indices
                          3ô     Since all words are concatenated, separate them into blocks of 3 letters
                            .r   Shuffle
                              ðý Join with whitespaces and implicitly display

온라인으로 사용해보십시오!

나는 아직도 골프를 할 수 있다고 생각합니다! 예를 들어 숫자 상수 vNy<FD}는 골프를 칠 수 있습니다.

출력 예

어떻게 작동합니까?

"vowel + vowel + consonant"규칙에 따라 모든 단어 조합을 생성하여 525 개의 고유 한 유효한 단어 (200 개 이상)를 만듭니다. 그런 다음 법을 충족시키는 빈도를 그들 각각과 연관시킵니다 f(x) = 4725/x.x는 1에서 시작하여 525로 끝나는 현재 단어의 순위입니다. 그런 다음 주파수는 정규화되고 곱하여 최소 30000 개의 단어가 있습니다. 이 코드는 항상 32074 단어를 생성하여 관련 상수를 골프화 할 수있게합니다 (코드 설명 참조). 따라서 각 단어는 같은 단어의 빈도에 해당하는 횟수만큼 반복됩니다. 마지막으로 단어가 섞입니다. 그러나 단어가 한 번에 5 번 반복되는 것은 아닙니다. 따라서 프로그램은 단어가 한 번에 5 번 반복 될 확률을 줄이기 위해 필요한 200 개 이상의 고유 단어를 생성합니다. 이 코드는 항상 동일한 단어 시퀀스를 생성합니다. 두 번의 실행에서 다른 점은 셔플 링 작업의 결과입니다.

빈도를 평가하는 방법?

"출력"이라는 파일의 텍스트 (알고리즘의 관점에서 말이됩니다!)를 가져 와서 "stats.csv"로 출력하는 간단한 Python3 코드를 만들었습니다.

from collections import Counter
from math import log10

with open("output", "r") as f:
    with open("stats.csv", "w") as stats:
        words = f.read().split()
        freqs = Counter(words)
        freqs = sorted([(i,freqs[i]) for i in freqs],key=lambda x:-x[1])

        print(len(words), "words")
        stats.write("logX;logF\n")
        for i, (key, f) in enumerate(freqs):
            stats.write(str(log10(i+1))+";"+str(log10(f))+"\n")

내 코드에 대해 항상 다음과 같은 분포를 생성합니다. 주파수 법

따라서 기울기는 -1.0138입니다. 이 값은 이전 코드의 기울기보다 -1에 가깝지 않지만 여전히 기울기 구속 조건을 충족합니다.


스크립트가 빈도를 평가 해 주셔서 감사합니다. 끝에 추가`가 있습니다. 또한 세미콜론을 구분 기호로 사용하는 이유는 무엇입니까? CSV 일반적 콤마 분리 된 값을 나타내며)
레오

1
네 맞아요 하하! 나는 마크 다운과 잠시 혼란스러워했다. 먼저 인라인 코드를 사용한 다음 코드 블록을 사용하는 것이 더 적절하다는 것을 깨달았지만 여분의`를 제거하는 것을 잊었습니다. 프랑스어이기 때문에 세미콜론을 CSV 구분 기호로 사용하고 일부 소프트웨어 또는 회사는 필기 소수점 값과 마찬가지로 점 대신 쉼표로 소수점 값을 사용하는 데 익숙합니다. 정수 부분을 소수 부분과 구분하기 위해 항상 점을 사용하지만 더 이상 생각하지 않고 세미콜론을 사용합니다. 그러나 이봐, ssv도 훌륭합니다;)
Osable

0

배시 / 코어 늘어날 때 122 110 바이트

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{ let ++x;yes $w|head -$[5575/x];}|shuf --random-source=<(yes ae)

풀림 :

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{
    let ++x
    yes $w|head -$[5575/x]
}|shuf --random-source=<(yes ae)

for w루프 (243 개)는 고유 워드를 생성한다. let ++x;처음에 설정 해제 x 증가 (첫 번째 실행 중 산술 표현식 규칙 당)x 따라 0으로 처리되므로 증분이 1로 설정 됨) 다음 라인은 따라서 zipf 주파수에 근접하도록 주파수 5575 / x에서 다음 단어를 생성합니다.

다음 단계는 반복 요구 사항에 맞게 결정적으로이를 퍼 미트하는 것입니다. --random-source엄청나게 큰 플래그 이름 임에도 불구하고 shuf와 함께 사용하면 mul-mod 선택기를 롤링하는 문자 수를 능가합니다. yes ae실제로 내가 찾은 가장 짧은 고정 된 "무작위"장치입니다.

33729 단어 에세이를 생성 합니다 [pastebin] .

배쉬 / 코어 유틸리티, 96 84 바이트 (비경쟁)

비 결정적 접근법의 경우 shuf 플래그를 잘라 내십시오.

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{ let ++x;yes $w|head -$[5575/x];}|shuf

분석

zipf 경사는 직선으로 조정됩니다. Excel을 사용하여 로그 스케일로 플롯 :

교사는 zipf 기울기가 = -1.000764임을 알아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.