助けて!もっと宿題があります!


18

私の先生は私の火星の宿題に不満でした。私はすべての規則に従いましたが、彼女は私が出力したものが意味不明であると言います...彼女が最初にそれを見たとき、彼女は非常に疑っていました。「すべての言語はZipfの法則に従わなければなりません」... Zipfの法則が何かさえ知りませんでした!

結局のところジップの法則の状態は、y軸上の各単語の頻度の対数、およびX軸上の各単語の「場所」の対数(最も一般的な= 1をプロットした場合には、二番目に多い= 2、 3番目に最も大きいcommmon = 3など)、プロットには約-1の勾配の線が表示され、約10%が与えられます。

たとえば、Moby Dickのプロットは次のとおりです。

ここに画像の説明を入力してください

x軸はn番目の最も一般的な単語で、y軸はn番目の最も一般的な単語の出現回数です。線の勾配は約-1.07です。

今、私たちはVenutianをカバーしています。ありがたいことに、Venutiansはラテンアルファベットを使用しています。ルールは次のとおりです。

  • 各単語には少なくとも1つの母音(a、e、i、o、u)が含まれている必要があります
  • 各単語には、連続して最大3つの母音を含めることができますが、連続する子音は2つまでです(子音は母音ではない任意の文字です)。
  • 15文字を超える単語はありません
  • オプション:単語をピリオドで区切られた3〜30語の文にグループ化します

私は火星の宿題をだましていると先生が感じているので、少なくとも30,000語の長さのエッセーを書くように割り当てられました(ヴェヌチア語)。彼女は、Zipfの法則を使用して私の作品をチェックするので、線を(上記のように)当てはめる場合、勾配は最大-0.9で-1.1以上でなければならず、少なくとも200語の語彙が必要です。同じ単語を5回以上連続して繰り返さないでください。

これはCodeGolfなので、バイト単位の最短コードが優先されます。出力をPastebinまたはテキストファイルとしてダウンロードできる別のツールに貼り付けてください。


はい、必要に応じて32767の単語文を実行できます。制限は、文章中の単語の頻度は、ジップの法則に従わなければならないということです
J.アントニオ・ペレス

1
「金星から」の伝統的な形容詞はVeneralですが、何らかの理由で人気が落ちています。金星は、一般的にサイエンスフィクションで使用されます。
ピーターテイラー

私は、zipf分布に続く単語のリストを作成し、それをシャッフルすると、zipf分布にも続く連続した単語のペアでシーケンスを生成する可能性が高いと推測しています。さらに、リストに十分な異なる単語があると、同じ単語が連続して5回以上繰り返される可能性は非常に低くなります。このアプローチを試みて、有効なエッセイを作成できた場合、受け入れられますか?
レオ

勾配は-0.35であろうが、あなたの予想は、合理的である
J.アントニオ・ペレス

それでも直線のように見えます。それはちょうど傾きがあまりにも素晴らしいだろう
J.アントニオ・ペレス

回答:


3

Mathematica、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のランダムな選択肢1/Range@215。最初の215の整数の逆数()で決定される頻度の重み。最後<>""...に、結果のリスト内の文字列を連結します。

出力は確定的ではありません。1回の実行でこの金星のエッセイが得られた。

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個の単語の基本セットは同じですが、各単語が正確な回数繰り返され(単語#jは約7!/ j回繰り返されます)、zipfの法則が保持されます。次に、繰り返しを避けるために、単語は均等にインターリーブされます。(各ワードは等間隔その単語のすべてのコピーと、ルーラー上にレイアウトされている想像して、全ての単語が順に読み取られる場合、特に言葉は、おそらくすべてではないで、はるかに繰り返さない。)結果は30117ワード金星のエッセイ


8を作っていない!擬似ランダムの選択は、同じ単語を6回連続して繰り返すことを意味しますか?
デニス

はい、理論的には。
グレッグマーティン

@GregMartin実際には...あなたがリンクしたエッセイは非準拠です。vva6回連続して表示されます。おそらくもっと大きな問題があると思います...毎回答えに挑戦するべきではありませんか?(もしそうでなければ、どのように彼らが働くべきであるかの線を引きますか?)
Hウォルターズ

これは公正な批判であり、私はそれがどのように機能するかを見ることに興味があります。
グレッグマーティン

2

05AB1E34 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/xxは、1から始まり525で終わる現在の単語のランクです。その後、頻度が正規化され、少なくとも30000単語になるように乗算されます。このコードは常に32074ワードを生成し、関連する定数をゴルフ可能にします(コードの説明をご覧ください)。したがって、各単語は、同じ単語の頻度に対応する回数だけ繰り返されます。最後に言葉がシャッフルされます。ただし、単語が連続して5回繰り返されることはありません。したがって、プログラムは、単語が連続して5回繰り返される可能性を減らすために、必要な200を超える一意の単語を生成します。このコードは常に同じ単語シーケンスを生成することに注意してください。2つの実行で異なるのは、シャッフル操作の結果だけです。

頻度を評価するには?

「output」という名前のファイル内のテキストを取得し(アルゴリズムの観点からは理にかなっています!)、「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区切り文字として使用します。一部のソフトウェアまたは企業は、手書きの10進値のようにドットではなくコマで10進値を入力するのに慣れています。整数部と小数部を区切るのに常にドットを使用しますが、これ以上考えることなくセミコロンを使用します。しかし、ちょっと、ssvも素晴らしいです;)
Osable

0

Bash / Core Utils、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に設定されます)。したがって、次の行は、頻度5575 / xで後続の単語を生成し、zipf頻度に近似します。

次のステップは、繰り返しの要件に合わせてこれを決定論的に変更することです。--random-source非常に大きなフラグ名であるにもかかわらず、shufでそれを使用すると、mul-modセレクターをハンドローリングするcharカウントに勝ります。 yes ae実際、私が準拠していることがわかった最短の固定「ランダム」デバイスです。

これにより、この33729ワードのエッセイ[pastebin]が生成されます。

Bash / Core Utils、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

分析

ジップスロープはまっすぐになるように調整されています。Excelを使用して対数スケールでプロットする:

教師は、zipf勾配= -1.000764に気付くはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.