Wordグリッドの生成


8

指定された入力を使用してnn可能な限り数バイトのサイズの単語グリッドを生成します。

細部

提供される数は常に奇数です。グリッドの中央の正方形は常に空でなければなりません(スペース文字)。グリッドを埋める文字は、英語のScrabble文字分布からランダムに選択する必要があります。つまり、各タイルは、次の100文字からランダムに、一定の確率で選択する必要があります。

??EEEEEEEEEEEEAAAAAAAAAIIIIIIIIIOOOOOOOONNNNNNRRRRRRTTTTTTLLLLSSSSUUUUDDDDGGGBBCCMMPPFFHHVVWWYYKJXQZ

どこ?空白のタイルを示しています。

スクラブルボードと同様に、このボードの一部のタイルは、より高いスコアのボーナスタイルにもなります。これらのタイルは、サイズが9以上のボードでのみ表示されます。中央の正方形から3行ごとに外側に向かって広がるパターンで表示されますが、最も外側の文字には表示されません。ボーナススクエアは小文字で示され、空白のタイルはの!代わりにとして識別されます?。ボーナスタイルを正しく分配する方法の例については、この視覚的なデモまたはリファレンス実装参照してください。

入力: 5

出力:

VNZNT
IFOSN
UD VD
ZIOO?
KTLED

入力: 9

出力:

UWDESTKPW
ItDBaDEdI
TERMDYSTR
ROANJLEFT
EkCI OOsT
IPAJPGM?Y
MZLORETVI
G!EGgPUeI
MNROYOEER

リファレンス実装

ルール

これはので、バイト単位の最短コードが優先されます。

  • 整合性があると想定して、I / Oには適切な形式を使用できます。
  • 少なくとも999までのグリッドを処理できる必要があります。
  • すべての標準の抜け穴は禁止されています。

3
私は実際、しばらく前にジェリーにスクラブル文字セットの利回りを追加することを考えていました:p
ジョナサンアラン

実際に単語を形成する必要なくタイルをランダムに配置するだけの場合は、これらをレターグリッドと呼ばないでください。
シャギー2017

@Shaggyだから、私はもともとこのサンドボックスの投稿に従ってこれらを解決することについて挑戦したかったのですが、これらを生成して座標を検証するスクリプトを作成するとき、彼らは自分で楽しい挑戦をするだろうと思いました、私はしませんでしたチャレンジの名前を更新しましたが、私はそれを元に戻しました...おそらくあなたは正しいです!
Dom Hastings

回答:


5

ゼリー 67 65 64 66 64  63 バイト

”?;ØAx“³Ċu~Ṿr¥rṇ⁽ȦƑ’ḃ12¤µŒl⁾?!yW,WKF€
H3ṬṚ¤ṁ‘1¦ṚŒḄ0,0j«þ`ị¢X€€Y

数値を取り、文字のリストを返すモナディックリンク、または結果を出力する完全なプログラム。

オンラインでお試しください!(私はそれがより正方形であるのGではなく使用することを好みます)Y

どうやって?

”?;ØAx“³Ċu~Ṿr¥rṇ⁽ȦƑ’ḃ12¤µŒl⁾?!yW,WKF€ - Link 1, getLetterSets: no arguments
”?                                    - literal '?'
   ØA                                 - yield uppercase alphabet
  ;                                   - concatenate
                       ¤              - nilad followed by link(s) as a nilad:
      “³Ċu~Ṿr¥rṇ⁽ȦƑ’                  -   base 250 number
                    ḃ12               -   converted to bijective base 12 (frequencies)
     x                                -   times (repeat each)
                        µ             - start a new monadic chain, call that uppers
                         Œl           - to lower-case
                           ⁾?!        - literal ['?','!']
                              y       - translate (change '?'s to '!'s)
                               W      - wrap (that) in a list
                                 W    - wrap (uppers) in a list
                                ,     - pair
                                  K   - join with a space, ' '
                                   F€ - flatten €ach (both flattens the wrapped lists
                                      -               AND makes the lone ' ' into [' '])

H3ṬṚ¤ṁ‘1¦ṚŒḄ0,0j«þ`ị¢X€€Y - Main link: number, n                 e.g. 13
H                         - halve                                     6.5
    ¤                     - nilad followed by link(s) as a nilad:
 3                        -   literal three                           3
  Ṭ                       -   untruth                                 [0,0,1]
   Ṛ                      -   reverse                                 [1,0,0]
     ṁ                    - mould like (implicit range(int(right)))   [1,0,0,1,0,0]
        ¦                 - sparse application:
       1                  - ...to indices: 1
      ‘                   - ...action: increment                      [2,0,0,1,0,0]
         Ṛ                - reverse                                   [0,0,1,0,0,2]
          ŒḄ              - bounce                          [0,0,1,0,0,2,0,0,1,0,0]
            0,0           - literal [0,0]                             [0,0]
               j          - join                          [0,0,0,1,0,0,2,0,0,1,0,0,0]
                  `       - repeat left argument as right argument with:
                 þ        -   outer product using:       [[0,0,0,0,0,0,0,0,0,0,0,0,0],
                «         -     minimum                   [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,1,0,0,1,0,0,1,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,1,0,0,2,0,0,1,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,1,0,0,1,0,0,1,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0],
                          -                               [0,0,0,0,0,0,0,0,0,0,0,0,0]]
                    ¢     - call the last link (1) as a nilad (the letter sets)
                   ị      - index into - gets the correct letter sets for each cell
                     X€€  - random-choice for €ach cell in €ach row
                        Y - join with newlines
                          - if running as a full program: implicit print

ボーナスタイルの位置にあるときはこれに代わるもの?ではないと思います。!いくつかのセットを実行しました(9sで見つけるのが簡単です!)すみません...
Dom Hastings

@DomHastings ⁾?!yはまさにそれを意味しますが、失敗するようです。
Erik the Outgolfer 2017

正しい@DomHastingsバグがあります(大文字のリストは、翻訳を実行しようとした時点でリストにラップされているため、?sが表示されません)今すぐ修正します...
Jonathan Allan

4

R288 281 267 257 225214バイト

-1バイトの@coleのおかげで?、2をrep(2,10)

それを実現する-10バイト row(m) == t(col(m))

-41バイト、重みの再構成、インデックス作成のゴルフ、およびいくつかの通常のRヒントのためのuser2390246のおかげ

function(n){m=matrix(sample(el(strsplit("EOAINRTLSUDGBCMPFHVW?YKJXQZ","")),n^2,T,rep(c(12,8,9,6,4:1),c(1,1:4,1,10,5))),,n)
K=n/2+.5
L=col(m)
m[i]=chartr("A-Z?","a-z!",m[i<-(x=!(L-K)%%3&L-1&L-n)&t(x)])
m[K,K]=" "
m}

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

行列を返します。かなりシンプルな実装。適切な分布でn ^ 2値をサンプリングし、nxn行列として格納します。

K 中心のインデックスです。

L=col(m)行列の各要素の列番号を示す行列です。したがって!(L-K)%%3、可能な列(エッジを含む)、つまり中央の列から3の倍数離れた列を取得するように計算します。エッジを削除するには、とを考慮L-1L-nます。L-1である0(偽)は、最初の列のためとL-nされ0、最後の列に。これらの3つに&(要素ごとのブール値AND)を適用するとTRUE、これらの列に、エッジを除いて中心から3の倍数離れた行列が生成されます。この結果をとして保存しxます。

我々はの転置を取るならばxt(x)我々は同じ行列を得るが、行のために、それゆえx&t(x)我々はとして保存する行列であるi含む:TRUE必要な細胞の指標、およびFALSE他の場所で。

次に、を使用chartrして必要な変換を実行しm[i]、結果をとして保存しm[i]、中央のセルをスペースに変更して、行列を返します。

重要なuser2390246が指摘し、我々はテストを必要としないn>=9ためのでn<7、そこに任意の細胞は3の倍数中心から離れていない(離れてとにかくスペースに変更された中心から)、とのためにn==7のみ細胞が、中心から3の倍数が端にあるため、除外されます。きちんと!


2
をに?対応する文字列の部分に移動し、それをrep(2,9)に増やすことはできrep(2,10)ますか?
cole 2017

@coleはい、それは私が-1バイトだと思いますか?
ジュゼッペ

のように2を削除し、2,1を得るので、そのように見えます10
cole 2017

1
文字配布の場合:rep(c(12,8,9,6,4:1),c(1,1:4,1,10,5))10バイトを節約します。(文字の順序をEOAIに切り替える必要があります...)
user2390246

@ user2390246わあ、ありがとう!
ジュゼッペ

4

JavaScript(ES6)、247 242バイト

-5バイト(@Shaggyの支援あり)

n=>[...Array(p=n*n)].map((_,i)=>i==p>>1?" ":g(i/n|0)&g(i%n,c="AI9O8NRTEE6LSUD4G3BCMPFHVWY?2KJXQZ".replace(/(\D+)(\d)/g,(_,c,i)=>c.repeat(i))[Math.random()*100|0])?c<"A"?"!":c.toLowerCase():++i%n?c:c+`
`,g=x=>x&&x<n-1&((n>>1)-x)%n%3==0).join``

テストスニペット


cの呼び出しの1つでの割り当てを移動することにより、数バイトを節約できるはずgです。
シャギー2017

スライダーとレイアウト機能が本当に好きです!
Dom Hastings

@Shaggyありがとう、3項式も改善することで、さらに節約できました。
ジャスティンマリナー

3

Perl 6の162の 161 154 153バイト

{(my@b=0,|(-$^m..$m).map({$_%%3+!$_}),0).map:{((my$e='AIJKQXZG'~'NRTBCFHMPVWYG'x 2~'EEEAAIIOONRTUSLD'x 4)~'??',$e.lc~'!!',' ')[@b Xmin$_]».comb».roll}}

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

(n-3)/ 2を入力として取り、文字のリストのリストを返します。

説明:

-> $m {
    # Idea stolen from @Xcali's answer.
    my $e = 'AIJKQXZG' ~ 'NRTBCFHMPVWYG' x 2 ~ 'EEEAAIIOONRTUSLD' x 4;
    # Array containing 1 for bonus tiles, 2 for middle element, like
    #     (0,1,0,0,1,0,0,2,0,0,1,0,0,1,0)
    my @b = 0, |(-$m..$m).map({ $_ %% 3 + !$_ }), 0;
    # Map column vector.
    @b.map: {
        # Compute element-wise minimum of row vector and value from
        # column vector. Select character pools accordingly and get
        # random items.
        ($e~'??', $e.lc~'!!', ' ')[@b Xmin $_]».comb».roll
    }
}

3

パール5246 244 + 1(-n)= 247 245バイト

$m=($n=$_-$_%2)/2;for(@a=(U x++$n)x$n){$_=(LUU,ULU,UUL)[$m%3]x($n/3).U x($n%3)if$z%@a&&$z%3==$m%3;substr$_,$m,1,$"if$m==$z++;s/L/-U/g;s/U/substr"EEAIONRT"x6 .AIJKQXZG."AIO?BCFHMPVWYGUUSSLLDD"x2,rand 100,1/ge;s/^-//;s/-\?/!/g;s/-(.)/lc$1/ge;say}

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


他のいくつかのものと一緒に今それを修正しました。
Xcali

3

【C64ベーシックV2、210の 209バイト]

1t$="2?9E3E9A9I8O6N6R6T4L4S4U4D3G2B2C2M2P2F2H2V2W2Y1K1J1X1Q1Z":rEn
3fOx=1ton:fOy=1ton:a=rN(0)*100:b=1
4c=aS(mI(t$,b,1))-48:d=aS(mI(t$,b+1,1)):b=b+2:ifc>atH6
5a=a-c:gO4
6pO983+40*y+x,c:nE:nE:pO1003.5+n*20.5,32

入力n5は次のように指定できます

0dA5

最後の「5」は任意の奇数に変更する必要があります。25を超える値を指定しないでください。プログラムが上書きされます。


試してみる方法:グーグルの「vice c64 emulator」、それをインストールして、この基本的なコードをコピーしてそれに貼り付けてください。プログラムを起動するには、次のように入力しますRUN。画面をクリアするには、shift / homeを押します。

そしてその結果:

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


これを検証して入力を適用するための最良の方法は何ですか?:)
Dom Hastings

モニター付きの@DomHastings C64エミュレーター(モニターはc64の世界ではバイトレベルのメモリー修飾子です)、またはヘルププラス基本エクステンダー。私はそれがうまくいくかどうか100%確信していませんが、90はい。
peterh-モニカを2017年

@DomHastingsデバッグ可能なバージョンを3バイト長くできます。ここで重要なことは、一般的な基本コマンドがトークン化された形式でここに示されていることです。トークンは常に非常に単純です。コマンドの最初の文字+大文字の2番目の文字。たとえば、FORはtokenzied fOです。またはGOTOとしてgO。インタラクティブにすることもできますが、残念ながらINPUTコマンドは例外で、トークンがありません。これがDATA、トークンがであるコマンドで入力を与える必要がある理由ですdA
peterh-モニカを2017年

私は確かにそれが実際に動作するのを見たいと思っています。ああ、説明してくれてありがとうございます。朝帰ってきます!!
Dom Hastings

@DomHastings必要ありません。準備ができています。:-)いくつかのマイナーなバグがありました、私はそれらを修正し、結果は1バイト小さくなりました!asmでは、約40バイトでしかなかった可能性があります。ランダムな生成にはトリッキーな方法を使わなければなりませんでしたが。
peterh-モニカを2017年

2

Pythonの3214の 236 240バイト

lambda n:[[[choice([s,[[c.lower(),'!'][c<'A']for c in s]][((i-n//2)%3+(j-n//2)%3<1)*(i*j>0)*(i<n-1)*(j<n-1)])," "][i==j==n//2]for j in range(n)]for i in range(n)]
from random import*
s=(("OIAE"*2+"SDLUNTRE")*2+"HVBMCYPWF?GNTR")*2+"ZXJQKGIA"

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

各文字の多重度は、2の累乗の合計として表され12 = 8 + 4 => "E"*12 = "E"*2*2*2 + "E"*2*2ます。

((i-n//2)%3+(j-n//2)%3<1)*(i*j>0)*(i<n-1)*(j<n-1) おそらくゴルフされているかもしれません。


@Giuseppe私はそれを修正します
jferard 2017

アサートによる追加の説明が好きです!
Dom Hastings

@Giuseppe大丈夫だといいな。(下)i<nであっても常に真実でしたi=n-1。も同じですj
jferard 2017

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