ランダムボーグルボードの生成


16

文字/スペースの4x12グリッドを生成します。

各ダイスは、ランダムに選択された場所に1回だけ表示されます。場所は、サイコロの一様なランダム順列に近似する必要があります。各ダイのランダムな(再び、ほぼ均一な)面を表示します。3文字のウィンドウで顔を左揃えにします。例えば、

A  E  A  A
E  C  D  E
D  A  Qu E
E  A  H  D

私が望むフォーマットの非ランダム化ボードです。末尾のスペースは許可されます。

サイコロ:

A  A  E  E  G  N
E  L  R  T  T  Y
A  O  O  T  T  W
A  B  B  J  O  O
E  H  R  T  V  W
C  I  M  O  T  U
D  I  S  T  T  Y
E  I  O  S  S  T
D  E  L  R  V  Y
A  C  H  O  P  S
H  I  M  N  Qu U
E  E  I  N  S  U
E  E  G  H  N  W
A  F  F  K  P  S
H  L  N  N  R  Z
D  E  I  L  R  X

面白い事実:セットには1 Kしかありません。死ぬのは他にどんな手紙だけですか?

これはので、バイト数が最も短いプログラムが勝ちます。


3
Kが存在する場合、Fは存在できません。これは、firetruckをスペルできないことを意味します!:P
ブレイザー

@ブレイザー:ええ、そしてあなたもf ... olkを綴ることはできません。:P
Ry-

回答:


5

GolfScript、116バイト

スコアリングはバイト単位であるため、ソリューションですべてのバイトを使用できることを意味ます。印刷可能なASCIIセットの外に出ると、ここでコードを表示するのが難しくなりますが、Peter Taylorのソリューションよりも多少短いソリューションが可能になります。印刷できないデータがない場合、私のコードは次のようになります。

'57 BYTES OF BINARY DATA HERE'256base 26base 6/{;9.?rand}${6rand=65+.81='  u '2/=}%8/n*

これは、ピーター・テイラーのソリューションにかなり似ている、と私は臆面もなく(のような、それのビットを借りるために認める.81=' u '2/=私は、私も余分に過ごした後、少し彼のシャッフルを短縮するために管理だと思いますが、トリックを)char型のより良いランダム性のためにバイトを。

スクリプトの先頭のバイナリ文字列には印刷できない文字が含まれているため、ここに直接貼り付けることはできません。代わりに、16進ダンプとしてスクリプトを提供します。

0000000: 2701 8302 7c56 97d5 ec9c 52e3 462e 44d7  '...|V....R.F.D.
0000010: a8d2 81c9 6115 fc80 4da4 6cd3 b06f a6d8  ....a...M.l..o..
0000020: 4e7e 2029 12a9 f331 0b83 3481 de36 81e2  N~ )...1..4..6..
0000030: 41b4 534d dee8 13f7 ccfd 2732 3536 6261  A.SM......'256ba
0000040: 7365 2032 3662 6173 6520 362f 7b3b 392e  se 26base 6/{;9.
0000050: 3f72 616e 647d 247b 3672 616e 643d 3635  ?rand}${6rand=65
0000060: 2b2e 3831 3d27 2020 7520 2732 2f3d 7d25  +.81='  u '2/=}%
0000070: 382f 6e2a                                8/n*

Linux、またはxxdユーティリティがインストールされたシステムでは、この16進ダンプをに渡すことで、動作する116バイトのGolfScriptプログラムに戻すことができますxxd -r

編集:ランダム性を大幅に改善999randする9.?randために置き換えられました。シャッフルは、基礎となるRNGが許可する程度にほぼ完璧に近いはずです。


ああ-マッピングでソートできることを忘れていました。
ピーターテイラー

4

Pythonの2.7、253の229 215文字

from random import*
j=0
for x in map(choice,sample("AAEEGN ELRTTY AOOTTW ABBJOO EHRTVW CIMOTU DISTTY EIOSST DELRVY ACHOPS HIMNQU EEINSU EEGHNW AFFKPS HLNNRZ DEILRX".split(),16)):j+=1;print x+' u'[x=='Q']+'\n'[j%4:],

ほとんどのキャラクターはサイコロそのものです。私はあまりにも多くの時間を費やしたくはありませんでした

軽微な編集:不要な2バイトを削除(余分なスペース)

edit2:229まで

edit3:215まで


1
あなたは、インデックスを使用してコードをタイトにし、できるprint a+' u'[a=='Q']print'\n'[j%4:]
キース・ランドール

@keithありがとう!これらの2つのトリックを組み合わせることで、さらにタイトになりました:)
ブレイザー

1
私はそれを殺すことなく218まで下げることができました(私が思う?):1)importステートメントを変更してfrom random import*allを削除しますr.。2)文字列の区切り文字を ``(スペース)に変更し、str.splitのデフォルト引数を利用します。3)に関係するすべてのものを取り除きj、使用します'\n'[len(d)%4:]。4)list.popのデフォルト引数を使用します。5)... 6)利益!
ディロンコウアー

@DCああありがとう!見落としているのには驚いた。しかし、私はそれを私が数分でそれを書くために得るものだと思う:P-
ブレイザー

1
そして、小さなマップトリックを使用してさらに3文字削減しましたがj=0...+'\n'[j%4:]、それを機能させるために維持する必要がありました
ブレイザー

3

GolfScript(141 139 137 文字のバイト)

そのうち94は、サイコロを含む文字列に展開されます。Figureには、スクロールせずにコードを表示できるように、折り返すために挿入される不要な改行は含まれていません。

'Y
ISY
XIAOOW
VYAAEEGNABBJOOEHRTVWCIMOTUEIOSSTACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZ'n/'TTELRD'*
6/{[6rand=99rand\]}%${1=.81='  u '2/=}%8/n*

私の(手作業による)分析が正しければ、サイコロの順序やサイコロ内の順序に関係なく、単純な置換でデータを圧縮するのに十分な長さと頻度のストリングは他にありません。
ピーターテイラー

サイコロをインターリーブし、ランレングスエンコーディングを使用することで、テーブルを96文字から84文字に減らすことができました。違いを補うかもしれないデコード...それは確かにPythonのために行います。
ブースビー

6文字を30ビットでエンコードし、次に5文字を印刷可能な文字でエンコードして、16バイトを節約できます。ただし、それらを抽出するにはシフト/マスクが必要です。
-ugoren

@ ugoren、Ilmariはすでにそうしました。
ピーターテイラー

@PeterTaylor、あなたが彼がそう言ったなら、私はあなたを信じます(私はGolfscriptを学ぶことを気にしませんでした)。しかし、彼は57の印刷できない文字を使用しているようですが、私は80の印刷可能な文字を提案しました。
-ugoren

2

ルビー、201 197文字

%W(AAEEGN ELRTTY AOOTTW ABBJOO EHRTVW CIMOTU DISTTY EIOSST DELRVY ACHOPS HIMNQU EEINSU EEGHNW AFFKPS HLNNRZ DEILRX).sample(16).map{|c|c[rand 6]}.each_slice(4){|x|puts x.join("  ").gsub(/Q ?/,"Qu")}

(そして、それはワンライナーです)

編集1:.splitと1組の引用符を避けるために%W()を使用しました。

編集2:仕様に合わせました(各出力列の間に2つのスペース)


この回答に対する「匿名ユーザー」による編集を承認しました。私はマーク、それはあなただったと仮定して、あなただけでログインするのを忘れて(詩あなたの出力は正確に仕様にしていないようです;使用。x.join(" ").gsub(/Q ?/,"Qu")。3つの、余分な文字を犠牲にすることを修正します)
イルマリKaronen

(これは、join文字列に1つの余分なスペース、正規表現に余分なスペースと疑問符が1つあります。SEソフトウェアがスペースを破壊する場合に備えて...)
イルマリカロネン

@IlmariKaronenおかげで、列の間の2つのスペースに気付かなかった。これで仕様どおりになります。
マークトーマス

2

Powershell、234文字

$d=(0..15|%{@{'AAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZDEILRX'[6*$_+(random)%6]=random}.GetEnumerator()}|sort Value|%{$_.Key})
0..3|%{($d[($_*4)..($_*4+3)])-join"   "-replace'Q ','Qu'}

読みやすさを向上させるために、余白を追加した同じコードを次に示します:-)

#########################################
# roll the 16 dice and shuffle them     #
#########################################

$d=(
        0..15 | % {
                    @{
                       'AAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZDEILRX'[6*$_+(random)%6]=random
                     }.GetEnumerator() 
                  } | sort Value | % {
                                        $_.Key
                                     }
    )

############################################
# add the 16 results to the 4 by 4 grid    #
############################################

0..3 | % {
            ($d[($_*4)..($_*4+3)]) -join "   " -replace 'Q ','Qu'
         }

私はshufflePowerShellの組み込み機能を知らないので、各結果をキーと値のペアに変換しました-キーはサイコロの結果に等しく、値は乱数に等しくなります。その後、これらのペアを値でソートしてからキーを出力するだけのケースでした。


たぶん、ミリ秒単位の現在時刻の最後の数字をソート値として使用できますか?
ブレイザー

@Blazer-おそらく、「ランダム」には6文字しか使用できません:
アンドリューシェパード

0

Perl、179文字

@d=(Qu,map"$_ ",HIMNUAAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSEEINSUEEGHNWAFFKPSHLNNRZDEILRX
=~/./g);print+(splice@d,6*int rand@d/6,6)[rand 6],@d%24?$":$/while@d

プログラムの詳細バージョンは次のとおりです。

my $fullset = "HIMNUAAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTY"
           . "EIOSSTDELRVYACHOPSEEINSUEEGHNWAFFKPSHLNNRZDEILRX";
my @dice = ("Qu");
push @dice, "$_ " for split //, $fullset;
while (@dice) {
    my @die = splice @dice, 6 * (int rand @dice / 6), 6;
    print $die[rand 6];
    print @dice % 24 ? " " : "\n";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.