言葉への手紙の流れ


8

文字のみを含む文字列(大文字と小文字を区別しない)が与えられた場合、以下の分布を使用して、ランダムな長さの単語に分割します。ただし、有効な長さ(1〜10)の最後の単語は例外です。出力は、スペースで区切られた文字列("test te tests")、文字列の配列(["test","te","tests"])、またはその他の同様の出力形式として、これらの単語です。

語長分布

Word Length - Fractional Chance / 72 - Rounded Percentage
1 - 2 / 72 - 2.78%
2 - 14 / 72 - 19.44%
3 - 16 / 72 - 22.22%
4 - 12 / 72 - 16.67%
5 - 8 / 72 - 11.11%
6 - 6 / 72 - 8.33%
7 - 5 / 72 - 6.94%
8 - 4 / 72 - 5.56%
9 - 3 / 72 - 4.17%
10 - 2 / 72 - 2.78%

オッズは正確に一致している必要はありません- どちらの方向にも1/144th、または.69%でずれている可能性があります(ただし、それらはまだ72/72またはに合計される必要があります100%)。

この論文の最初の図である4ページ目から概算されたデータ。

サンプル出力を使用したテストケース

非常に短い(長さ<11)テストケースでの動作は定義されていません。

これらは手動で作成したため、上記の均一分布に従う場合とそうでない場合があります。

abcdefghijklmnopqrstuvwxyz
abcd efgh i jklmnopq rs tu vwx yz

thequickbrownfoxjumpedoverthelazydog
t heq uick brown fo xj ump edo vert helazydog

ascuyoiuawerknbadhcviuahsiduferbfalskdjhvlkcjhaiusdyfajsefbksdbfkalsjcuyasjehflkjhfalksdblhsgdfasudyfekjfalksdjfhlkasefyuiaydskfjashdflkasdhfksd
asc uyoi uawer k nb a dhcviua hsid ufe r bfa lskd jhv lkcj haius dy faj se fbks dbfkals jcuyasjehf lkjh falk sd blhsgdf asudyfekjf alk sdjfhlk asefyu iaydskfja shdflk as dhf ksd

これはなので、バイト単位の最短の回答が優先されます。



最後の単語を空の文字列にすることはできますか?
rahnema1 2017

@ rahnema1配列出力であなたはどういう意味ですか?
スティーブン

はい、配列出力の最後の要素。
rahnema1 2017

@ rahnema1確かに、もしあなたがスペースで配列に参加するなら、私が許すであろう末尾のスペースがあるだけなので。
スティーブン

回答:


5

ゼリー、28 バイト

“¤Œæ׿®¬©¥¤‘Jẋ"$FẋLẊ‘1¦+\Ṭœṗ

リストを受け取り、リストのリストを返すモナディックリンク。

オンラインでお試しください!(フッターは、結果のリストのリストをスペースで区切ります)

どうやって?

最も近い整数に丸められた分布のすべてのパーセンテージを使用します(したがって、0.69%の許容しきい値内です)。

“¤Œæ׿®¬©¥¤‘Jẋ"$FẋLẊ‘1¦+\Ṭœṗ - Link: list (of characters), s
“¤Œæ׿®¬©¥¤‘                 - code page indexes = [3,19,22,17,11,8,7,6,4,3]
               $             - last two links as a monad:
            J                -   range of length = [1, 2, 3, 4, 5,6,7,8,9,10]
              "              -   zip with:
             ẋ               -     repeat list = [[1,1,1],...,[9,9,9,9],[10,10,10]]
                F            - flatten (into one list of length 100)
                  L          - length of s
                 ẋ           - repeat list (one list of length 100*length(s) with the
                             -              correct distribution of integer lengths)
                   Ẋ         - shuffle
                      ¦      - sparse application of:
                    ‘        -   increment
                     1       -   to indexes: 1 (offset indexes for the partition below)
                        \    - cumulative reduce by:
                       +     -   addition (e.g. [4,4,7,1,...] -> [4,8,15,16,...])
                         Ṭ   - untruth (yield a list with 1s at those indexes (1 indexed)
                          œṗ - partition s at truthy indexes (note: excess ignored)

スクリプトは、理論的には最初の要素が空の文字列であるリストを出力する場合があります。質問で許可されているかどうかはわかりません。

@ThePirateBayええ、私は実際にこれに気づきました-累積長の最初の要素に1を追加する必要があります。修正するためにまもなく更新されます。
ジョナサンアラン

修正され、説明が追加されました(最初の語長が実際に間違った分布を使用しているため、先頭のスペースを許可するよう要求することはできません)。
ジョナサンアラン

4

PHP、94バイト

for(;$c=$argn[$k++];print$c." "[--$e])if(!$e)for($r=rand(0,71);$r>ord(x^"ywgSKAF:=?"[$e++]););

でパイプとして実行する-nR、オンラインで試してください

壊す

for(;$c=$argn[$i++];            # loop $c through string
    print$c                         # 2. print current character,
        ." "                        # 4. if remaining length is 0, print space
        [--$e]                      # 3. decrement remaining length
    )
    if(!$e)                         # 1. if remaining length is 0,
        for($r=rand(0,71);              # get random value from 0 to 71
            $r>ord(x^"ywgSKAF:=?"[$e++])    # and increment $e while $r is > probability
        ;);

注:ywgSKAF:=?増加する確率を表します-1:[1,15,31,43,51,57,62,66,69,71]


疑問に思う:rand()すべての比較を要求すると、確率は変わるのか?そうでなければ、5バイト節約できます。
タイタス

1
それらは確かに変化します。たとえば、長さ2の確率は70/72 * 16/72で、14/72よりも高くなります。
Ørjanヨハンセン

@ØrjanJohansen何かが起こると私に言った。同情:その方法では、少なくとも5バイトを無駄にします。
タイタス

<?で始まらない、おそらく完全なPHPソリューションを見たのはこれが初めてではありません。または<?php。PHPはスタンドアロンプ​​ログラムとして実行する必要があります。それとも何か不足していますか?
manassehkatz-Moving 2 Codidact 2017

@manassehkatz行方不明Run as pipe with -nRです。つまり、このコードは、ファイルではなく、phpのパラメーターであると想定されています。echo <input> | php -nR '<code>'コマンドラインで使用して実行します。
タイタス

3

オクターブ、108バイト

@(s)mat2cell(s,1,[k=(w=repelems(1:10,[1:10;'AMOKGEDCBA'-63])(randi(72,1,n=nnz(s))))(cumsum(w)<=n) n-sum(k)])

オンラインでお試しください!

*文字列を入力として取り、文字列の配列を出力します。

*出力の最後の要素は空の文字列になる場合があります。


3

パイソン2、154の 150 147 145バイト

わかりました、これはコードゴルフの私の最初の試みです。コードをまっすぐに:

import numpy.random as r
def f(s):
 i=0
 while i<len(s):
    i+=r.choice(11,p=[x/72. for x in [0,2,14,16,12,8,6,5,4,3,2]])
    s=s[:i]+' '+s[i:]
    i+=1
 return s

2番目のインデントは、TIOバージョンで確認できるように、タブ文字によるものです: オンラインでお試しください

指定した分布に従って、文字列にスペースを追加します。私は以下を使用して私のディストリビューションを非常に強化しました:

import collections
dist = r.choice(11,100000,p=[x/72. for x in [0,2,14,16,12,8,6,5,4,3,2]])
print collections.Counter(dist)

それは私に与えました:

Word Length - Rounded Percentage as asked - Rounded Percentage as counted
1 - 2.78% - 2.794%
2 - 19.44% - 19.055%
3 - 22.22% - 22.376%
4 - 16.67% - 16.638%
5 - 11.11% - 11.246%
6 - 8.33% - 8.362%
7 - 6.94% - 7.063%
8 - 5.56% - 5.533%
9 - 4.17% - 4.153%
10 - 2.78% - 2.780%

私はそれで十分だと思います。次に、文字列の長さが成功するまで、スペースを追加するプロセスを繰り返します。また、スペースを追加した後、位置インデックスを1つ増やします。このラインのゴルフを誰かが手伝ってくれるといいのですが、最初のスペースを偽造することなく、どうやってそれを出すことができるのかわかりませんでした。

私のテキストを見ると、このサイトについてたくさん学ぶ必要があることを認識しています。誰かが私に次の投稿のために学ぶことができるようにコメントでStackoverflow回答機能を使用する方法のガイドをリンクできますか?


編集:

見たところ、私の投稿を読み直しているときに、i + = 1を取り除く方法を見つけました。だから私はそれをすることによって4バイトを節約しました。新しいコードは次のようになります。

import numpy.random as r
def f(s):
 i=-1
 while i<len(s):
  i+=r.choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1
  s=s[:i]+' '+s[i:]
 return s

オンラインでお試しください!


編集:

改行をいくつか削除できることがわかりました。

import numpy.random as r
def f(s):
 i=-1
 while i<len(s):i+=r.choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1;s=s[:i]+' '+s[i:]
 return s


編集:インポートを変更し、iの定義を関数内に配置しました。

from numpy.random import*
def f(s,i=-1):
 while i<len(s):i+=choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1;s=s[:i]+' '+s[i:]
 return s

オンラインでお試しください!


プログラミングパズルとコードゴルフへようこそ!素敵な最初の投稿!回答を少し編集してフォーマット(タイトル、構文の強調表示)を改善しました。変更内容を確認して、今後の投稿のコマンドを確認できます。(悲しいことにあなたに与えるリンクはありませんが、誰か他の人がそうすることを願っています)
Dada

ようこそ、私のテキストをフォーマットしてくれてありがとう。これは私を助け、私はすでに編集でそれを使用していました。
Simon

2

Dyalog APL、90バイト

{k←⍵⋄{' '~⍨(2⊃⍵)↓k↑⍨⊃⍵}¨(↓(o[1;2]),0),↓o←1↓⍉2(1-⍨≢⍵)⍴+\((2 14 16 12 8,⌽1+⍳5)\⍳10)[72?⍨≢⍵]}

オンラインでお試しください![実行]を数回押して、それがどのように変化するかを確認します。

どうやって?

72?⍨≢⍵ -72回サイコロの長さのサイコロを振る

[...] -内部のインデックス

(2 14 16 12 8,⌽1+⍳5)\⍳10- 2 14 16 12 8 6 5 4 3 2(加重ランダムを作成するために)10の範囲を拡大します

+\ -累計

⍉2(1-⍨≢⍵)⍴-圧縮テーブルの形x y zz x, x y, y z

o←1↓ -最初の要素をドロップ

(↓(o[1;2]),0),↓o -最初の座標と0のペアで包む

¨ -各ペア(x、y)

(2⊃⍵)↓k↑⍨⊃⍵ -インデックスxからyに入力を受け取ります

' '~⍨ -スペースを削除します



2

Mathematica、164バイト

(s=Length[c=Characters@#];t=0;l={};While[t<s,If[t+(r=RandomChoice[{2,14,16,12,8,6,5,4,3,2}->Range@10])<=s,l~AppendTo~r];t=Tr@l];""<>#&/@FoldPairList[TakeDrop,c,l])&


文字列を入力
出力配列として受け取ります


2

チャコール43 39バイト

FθF⁺¹I‽⪫Eχ×Iκ⌕᧔v↷£o8″!”κω⊞υ⎇κω Fθ⁺ι⊟υ

オンラインでお試しください!リンクはコードの詳細バージョンです。最後の単語がランダムに選択された正確なサイズである場合、末尾のスペースを出力します。


ええ、それは長すぎるように見えます:/それを短くする新しい機能のアイデアはありますか?
ASCIIのみ

@ASCIIのみ確率表を生成する良い方法は考えられません。これはすでにコードの50%を超えています。Assign(Slice(q, i), q);しかし、私が働いていないのを回避する必要がなかったらいいのですが。
ニール

それはちょうどそれがない完全に確認してください申し訳ありませんが、その修正するための最良の方法の、曖昧だし、うまくいく
ASCIIのみ

すごいネスティング
ASCIIのみ

@ASCIIのみバイトを節約できるかどうかは誰が気にしますか?
Neil

2

Perl 5、107バイト

@B=((1,10,9,5,2)x2,(2,3,4)x12,(5,6)x6,7,(3,7,8)x4,9);while(10<length){$i=$B[rand 72];s/.{$i}//;print"$& "}

オンラインでお試しください!

106バイトのコード+1 -p


サイトへようこそ!新しいPerlゴルファーに会えてうれしい、すばらしい答えです!(ただし、数バイトを保存することもできます)。また、いくつかの説明を追加することをお勧めします。これにより、Perl以外の人があなたがそれをどのようにしたかを理解できるようになります(Perlコーダーの場合でも、少し時間が節約されます)。しかし、それは必須ではなく、あなた次第です。
ダダ2017


1

> <>168 152バイト

<v?(0:i
~/<r
/x\/oo \
012\oo~\!/ !ox\
\v/:1=?^?\ooo>>
 x^
v\:1\/>> o
|/o\=\x^!/
voo/? >x
v\o~/ v_
>" "\?\x>xoo\
^oooooo<<< \
^.22/ \>x!/xv
^ooooooo_o<<<

オンラインでお試しくださいでか、魚の遊び場で見て。

ランダム性は> <>でトリッキーです:ランダムな命令は1つだけです。 x、魚の方向を上、下、左、または右のいずれかに設定します。これは複雑なプログラムなので、次の図は色分けされた図です。

色分けされたコード!

確率をチャンクに分割して、チャンク内およびチャンク間の確率がかなり単純になるようにしました(たとえば、1/3から25/72が望ましい)。私はこれを次のように行いました:

確率のツリー

魚はコードの灰色のビット(X)から始まります。これは、すべての入力を読み取るためのかなり標準的な> <>コードです。もっと面白くなるので、先に進みましょう。

次に、魚は明るい緑と濃い緑のセクションに来ます(Y)。確率ツリーから、3つの主要なブランチの合計がそれぞれ1/3であり、これらのブランチのそれぞれが2/3サブブランチと1/3サブブランチに分割されていることに気付くでしょう。コードの緑のセクションは、ツリーのこれら2つのレベルをカバーしています。最初に、ライトグリーンビットのトップローブで、0、1、2からランダムな数を選びます。4方向の命令を使用して、1/3の確率をシミュレートできますx出口の1つを切り取り、魚をにリダイレクトするだけでます。その場合、xからのエスケープルートは3つだけxで、対称性により、それらは等しい確率になります。

xは、これより少し下で、魚を^位置にあり、2/3の確率で隣に左から泳いだ場合、魚は折り返しx\、1/3の確率でに下がります。次に、魚は薄緑色のセクションの2つの尾の1つに沿って泳ぎます。これらのテールは機能的には同じです。それぞれが前に0、1、または2をプッシュしたかどうかをチェックし、それに応じて分岐します。これで、ツリーの最初の2つのレベルが完成しました。

次の6つのセクション(A - F)、本質的に、使用がよりxさらに魚を分岐し、その後いくつかの数の使用に対するS o入力から文字の数を印刷するのを。これらのセクションは、単純なもの(例:濃い青、  C、3つの文字を印刷するもの)から、それほど単純ではないもの(例、オレンジ、Dx3 / 8–5 / 8の分割をシミュレートするために2 秒必要で、複数の段階)。これらの詳細は演習として残します。(私は特に、ループEで魚を送る黄色のEに満足しています!)

これらの各分岐の後、魚は最終的にピンク色のセクション(Z)に到達します。これはすべてのブランチを一緒に描画し、スペースを印刷し、最後に魚をグリッド内の位置(2,2)にジャンプさせ、最初の位置から再び開始しますxます。


上記の「複雑な」説明で正しい確率が得られると確信が持てない場合は、長さ65,000の入力文字列(64 KiB、TIOでわずか13秒!)でテストし、結果として得られた単語長の分布を確認しました。だった

{{1,0.027377},{2,0.191237},{3,0.226599},{4,0.164128},{5,0.113064},{6,0.0818627},{7,0.0703885},{8,0.0543515},{9,0.0426089},{10,0.0283835}}

これらの確率は、期待される確率から最大0.0044離れています。

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