擦り切れたタイルのスクラブル


35

問題

森の真ん中にある小屋で立ち往生し、自分を楽しませるために古いスクラブルだけをセットしています。検査すると、スクラブル文字がすり減っており、各文字のポイントだけが見えることがわかります。

それにもかかわらず、あなたはゲームをプレイすることにしました。バッグから7文字を引き出してトレイに置きます。あなたの課題は、それらの文字が何であるかを判断することです。

そのため、一般に、ポイントのリストが与えられると、それを可能な文字列または文字のリストに変換します。


スクラブルタイルと分布

  • 2つの空白のタイル(0ポイントのスコア)
  • 1点:E×12、A×9、I×9、O×8、N×6、R×6、T×6、L×4、S×4、U×4
  • 2点:D×4、G×3
  • 3点:B×2、C×2、M×2、P×2
  • 4点:F×2、H×2、V×2、W×2、Y×2
  • 5ポイント:K×1
  • 8点:J×1、X×1
  • 10点:Q×1、Z×1

だから、あなたはポイントのリストを持っている場合は[10,10,8,5,1,1,1]、次に"QZJKEEE"有効であるだろうが、"QQJKEEE"(袋にのみ1 Qタイルがあるので)、有効ではありません


問題固有のルール

  • すべての入力が有効であり、常に7タイル(つまり、7つの10ポイントタイルのリストではなく、9タイルではない)があると想定できます。
  • バッグから以前にタイルが引き出されていないと仮定できます(したがって、分布は上記で定義された英語のタイルの標準分布です)
  • 有効な単語を生成する必要はなく、有効な文字列のみを生成します。
  • 各タイルに対応する文字がある限り、文字列の順序は関係ありません。
  • ポイントは、上記で定義した標準的な英語のスクラブルタイルポイントに基づいています。
  • 大文字または小文字で出力できます。空白のタイルでは、スペース文字またはアンダースコア「_」のいずれかを出力できます
  • 回答は、リスト、文字列、配列、シーケンスなどのタイルの合理的な表現として出力される場合があります

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーターおよび戻り値型、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンク(TIOなど)を追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース

可能な値を出力できるため、厳密なテストケースを定義することは困難です。

有効な戻り値が考えられるいくつかのケース:

[10,0,10,5,8,8,0] -> "Q ZKJX "
[1,1,1,1,1,1,1] -> "EEEEEEE"
[1,2,3,4,5,8,0] -> "NDBHKJ "
[2,2,2,2,2,2,2] -> "DGDGDGD"

無効な戻り値を持ついくつかのケース:

[10,0,10,5,8,8,0] -> "Q QKJX "  - Too many Qs 
[1,1,1,1,1,1,1] -> "EEEEEE "  - Space is 0 points not 1
[1,2,3,4,5,8,0] -> "NDBH" - Too short
[1,2,3,4,5,8,0] -> "NDBHKJ  I" - Too long
[1,2,3,4,5,8,0] -> "ÉDBHKJ1" - Contains none scrabble characters
[2,2,2,2,2,2,2] -> "GDGDGDG" - Contains too many Gs (case for invalid cycling)

文字列を出力する必要がありますか、それともリストは大丈夫ですか?
マルティセン

リストを出力できます。質問を更新します
期限切れデータ

1
ブランクには何を出力できますか?
マルティセン

3
推奨されるテストケース:(サイクリングメソッドを使用する場合、a [2,2,2,2,2,2,2]からではDなくaから開始することが重要な唯一のケースG
Arnauld

1
通知は@であり、スペースのない人の名前です。すなわち、データが期限切れ @ExpiredDataなります。
タウ

回答:


8

JavaScript(ES6)、72バイト

@supercatによって提案された短いバリアント

a=>a.map(o=n=>'?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])

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


JavaScript(ES6)、 137 ... 84 78 77  76バイト

Neilのサイクリングメソッドを使用して10バイトを節約

タイルのリストを返します。_空白のタイルに使用します。

a=>a.map(o=n=>"____FHVWGDGD_K__BCMPEEEE_ZQ__XJ"[n*20%44%32+(o[n]=-~o[n])%4])

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

どうやって?

ポイントの数ごとに、各グループの2番目のタイルから始まる、正確に4つのタイルのグループを循環します(これはGvs にとって重要ですD)。

 points | group | max. sequence
--------+-------+---------------
    0   | ____  | __
    1   | EEEE  | EEEEEEE
    2   | GDGD  | DGDGDGD
    3   | BCMP  | CMPBCMP
    4   | FHVW  | HVWFHVW
    5   | _K__  | K         \
    8   | _XJ_  | XJ         }--- these letters may only appear once each
   10   | _ZQ_  | ZQ        /

これらのグループはすべて、31文字の単一の文字列として保存されます。

____FHVWGDGD_K__BCMPEEEE_ZQ__XJ
^   ^   ^   ^   ^   ^   ^   ^
0   4   8  12  16  20  24  28

注意:ファイナル"_""_XJ_"アクセスすることは決してないので、ファイナルをに保存する必要はありません。

ポイントnは、次を使用してこの文字列に正しいインデックスnに変換されます。

n=20×nmod44mod32

  n | *20 | mod 44 | mod 32 | group
----+-----+--------+--------+-------
  0 |   0 |    0   |    0   | ____
  1 |  20 |   20   |   20   | EEEE
  2 |  40 |   40   |    8   | GDGD
  3 |  60 |   16   |   16   | BCMP
  4 |  80 |   36   |    4   | FHVW
  5 | 100 |   12   |   12   | _K__
  8 | 160 |   28   |   28   | _XJ_
 10 | 200 |   24   |   24   | _ZQ_

o


o [n]を毎回8ずつ進めると、前進のために1文字余分にコストがかかりますが、正味勝利のために%4と%32の両方を&31に置き換えることができます。私のベストは、あなたのものに基づいて、だろうa=>a.map(o=n=>('?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31]))。短い「ほぼ」バージョンですa=>a.map(o=n=>("_EDBFK_EDCHJQEGMVXZEGPW"[n+(o[n]=5-~o[n])%24]))が、そのアプローチでは、値8と10を11と12にマップするコンパクトな方法と、オフバイワンの問題を修正するための文字列の微調整が必​​要になります。
スーパーキャット

@supercatいいね!明日、詳しく見ていきます。
アーナルド

@supercatもう1つの興味深い式は'_??VKWZHQFP?M?CGBGXDJD'[(n*96+(o[n]=32-~o[n]))%68%33]||'E'、検索文字列が22文字のみであるというものです。ただし、完全なコードはソリューションよりも2バイト長くなります。
アーナルド

7

、33バイト

⭆觧⪪”&↖“Vh_z↶∕¡⌈∨₂χ¹‖◨⌊″”¶ι№…θκι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

 θ                  Input array
⭆                   Map over elements and join
     ”...”          Literal string " \nE\nDG\nBCMP\nFHVW\nK\n\n\nJX\n\nQZ"
    ⪪     ¶         Split on newlines
   §       ι        Indexed by current element
  §                 Cyclically indexed by
            №…θκι   Number of times current element has already appeared
                    Implcitly print

5

ゼリー 31 30 27  26 バイト

“ñẒẎYñ(“Nut¦hß’ṃØA;€⁶ɓṢĖœị

文字のリストを生成する整数のリストを受け入れる単項リンク。
-私の以前の、下の、そしてニック・ケネディの私の改善のミッシュマッシュ

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

出力は、入力と同じ順序では与えられません(これは許可されています)。

回答での言語への私自身の追加を2つ使用することは、あまり起こりません!(およびɓここ)。

どうやって?

“...“...’ṃØA;€⁶ɓṢĖœị - Link: list of integers, V     e.g. [10,1,0,3,2,1,10]
“...“...’            - list of base 250 integers          [28089224382041, 77611203526272]
          ØA         - 'ABC...XYZ'
         ṃ           - base decompress (vectorises)       ["EDMFKZZJZQ", "NGPYKZZXZZ"]
            ;€       - for €ach: concatenate:
              ⁶      -   a space                          ["EDMFKZZJZQ ", "NGPYKZZXZZ "]
               ɓ     - start a new dyadic chain with swapped arguments - i.e. f(V,that)
                Ṣ    - sort                               [0,1,1,2,3,10,10]
                 Ė   - enumerate                          [[1,0],[2,1],[3,1],[4,2],[5,3],[6,10],[7,10]]
                  œị - multi-dimensional index into       " NEGMZQ"
                       (1-based and modular)

前@ 30

“²rṛʂṂø5=Ɓṇ^N¥Y»⁾tky;⁶s2ɓṢĖUœị

文字のリストを生成する整数のリストを受け入れる単項リンク。

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

この出力も大文字と小文字が混在しています(これは許可されています)。

どうやって?

“...»⁾tky;⁶s2ɓṢĖUœị - Link: list of integers, V          e.g. [10,1,0,3,2,1,10]
“...»               - compression of dictionary entries:
                    -   "end", "GMP", "fyttes", "adj", and "xci" and the string "qz"
                    -                                         "endGMPfyttesadjxciqz"
        y           - translate with:
     ⁾tk            -   ['t', 'k']                            "endGMPfykkesadjxciqz"
         ;⁶s2ɓṢĖUœị - ...
                    - ...then like the above method (except U reverses each pair of indices)
                                                              " neGMzq"

最初の説明でタイプミスをしたと思います。' NWGMZQ'への多次元インデックスの後はW、文字列に何もなければかなりの偉業になります。;)
Kevin Cruijssen

1
@KevinCruijssen-yws、typo fixwd; ありがとう!
ジョナサンアラン

4

Pyth- 92 86 83 81 80 75 60 52 49 42 36バイト

入力をループし、使用可能な文字をポップします。そのポイントカテゴリに7を与える各文字の1つがあります。パックされた文字列エンコーディングを使用するようになりました。

K[M*L7c."B_êº çÑOÒ
7âCkÑ"\Lm.)@K

K                       Assign to K       
 [M                     Map list(for popping). Uses a quirk of M to splat each first
  *L7                   Map repeating each string by 7
   c      \L            Split on occurrences of 'L'
    ."..."              Packed string encoding of the needed letters
m              (Q)      Map on input (input is taken implicitly)
 .)                     Pop. This returns the first element after removing it
  @K                    Index into K
   (d)                  The loop variable is given implicitly

ところで、これはエンコード前の元の文字列です"_ E DG BCMP FHVW K JX QZ"

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



3

05AB1E70 52 39 38 29 26 25 バイト

{ε.•3Oû}α›ηö‡.ÝŽ{•2ôÁyèNè?

@ExpiredDataのおかげで-18バイト。@MaltysenのPyth回答
からサイズ7まで同じ拡張を使用して-13バイト。@JonathanAllanのJelly answerの ポートを作成して-9バイトなので、必ず彼に賛成してください!@Emignaの おかげで-3バイト

文字のリストが生成され、小文字と空白用のスペースが使用されます。

オンラインそれを試してみてくださいまたはいくつかのより多くのテストケースを検証します

説明:

{                      # Sort the (implicit) input-list
 ε                     # Map each character `y` in this list to:
  .•3Oû}α›ηö‡.ÝŽ{•     #  Push compressed string "endgmpfykkzzzzjxzzqz "
                  2ô   #  Split into parts of size 2
                    Á  #  Rotate it once towards the left so the space is leading
  yè                   #  Use integer `y` to index into the string-pairs
    Nè                 #  Then get the `N`'th character of the string-pair (with automatic
                       #   wraparound), where `N` is the index of the loop

この05AB1Eのヒント(辞書の一部ではない文字列を圧縮する方法は?を参照して、なぜであるかを理解し.•3Oû}α›ηö‡.ÝŽ{•てください"endgmpfykkzzzzjxzzqz "


前の38バイトの回答:

.•Mñ&Àû«ì{₆v*Å+µ-•#ðšε7∍}IvDyèн©?ε®õ.;

オンラインそれを試してみてくださいまたはいくつかのより多くのテストケースを検証します

説明:

.•Mñ&Àû«ì{₆v*Å+µ-•    # Push compressed string "e dg bcmp fhvw k   jx  qz"
                  #   # Split on spaces: ["e","dg","bcmp","fhvw","k","","","jx","","qz"]
                   ðš # Prepend a space to this list
 ε7∍}                 # Extend each string to size 7:
                      #  ["       ","eeeeeee","dgdgdgd","bcmpbcm","fhvwfhv","kkkkkkk","","","jxjxjxj","","qzqzqzq"]
     Iv               # Loop `y` over the input-list:
       Dyè            #  Get the `y`'th string from a copy of the list
          н           #  Get it's first character
           ©?         #  Store it in the register, and print it without trailing newline
        ε             #  Then map each string in the list to:
         ®õ.;         #   Remove the first occurrence of the character from the register

この05AB1Eのヒント(辞書の一部ではない文字列を圧縮する方法は?を参照して、なぜであるかを理解し.•Mñ&Àû«ì{₆v*Å+µ-•てください"e dg bcmp fhvw k jx qz"


使えないの" 0eeeeeee0ddddggg0bbccmmp0ffhhvvw0k000jx00qz"
期限切れのデータ

@ExpiredDataああ、もちろん。あなたは7文字だけを描きます。ありがとう!それを変更します。
ケビンクルーッセン

1
{v代わりに7Fおよびのy代わりにを使用して3バイトを保存できますI{Nè
エミグナ

@Emignaああ、もちろん。ありがとう。
ケビンクルーッセン



1

ゼリー34 32バイト

“¿RÇĊƈ⁸⁾%ỵṆþœsṀṂ’ṃØAṣ”A;⁶ẋ€7⁸ịḢ€

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

私はこれを書いたときに短いゼリーの答えがあるとは思っていませんでしたが、これは異なるアプローチを使用しているので、投稿する価値があると思いました。

2バイトを節約してくれた@JonathanAllanに感謝します!


base-decompressionを使用すると2バイト
ジョナサンアラン

1

Pythonの3178の 142 135 127 112 117バイト

def f(l):
 d=list(map(list,"  _EEEEEEE_DDDDGGG_BBCCMMP_FFHHVVW_K___JX__QZ".split('_')))
 return[d[i].pop()for i in l]

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

cdlaneのおかげで-1バイト

mathmandanのおかげで正しい


in "-> in" 111
cdlane

d=list(map(list,"...".split('_')))別のバイトを保存するには
cdlane

この関数はfおそらく名前を付ける必要がないので、2バイト節約できます。ただし、fのエントリを消費するdため、「関数は、サブミッションに付随する他のコードを...復元することなく、任意に頻繁に再利用可能でなければならない」というコンセンサス要件に適合するかどうかはわかりません。(たとえば、f([10,0,10,5,8,8,0])複数回実行するとエラーになります。)メタディスカッションを参照してください:codegolf.meta.stackexchange.com/a/7615/36885
mathmandan

0

Python 2 2、102バイト(または多分95?)

(Python 3でも問題ありません。)

lambda a:''.join([r*7for r in'_ E DG BCMP FHVW K * * JX * QZ'.split()][x][:a.count(x)]for x in set(a))

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

以下は受け入れられるとは思いません。

lambda a:[[r*7for r in'_ E DG BCMP FHVW K * * JX * QZ'.split()][x][:a.count(x)]for x in set(a)]

この2番目のバージョンでは、のような出力が得られます['__', 'JX', 'QZ', 'K']。そのため、文字は正しくなりますが、ポイント値によって収集されます。(これが許容できる場合、7バイト節約されます。)


0

PHP、101バイト

$b=[_,E,DG,BCMP,FHVW,K,8=>JX,0,QZ];foreach($argv as$t){echo$c=($d=$b[$t])[0];$b[$t]=substr($d,1).$c;}

スタンドアロンプ​​ログラムとして、コマンドラインから入力します。

$ php s.php 10 0 10 5 8 8 0
"Q_ZKJX_"

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

または関数として112バイト

function($a){$b=[_,E,DG,BCMP,FHVW,K,8=>JX,0,QZ];foreach($a as$t)$b[$t]=substr($d=$b[$t],1).$c[]=$d[0];return$c;}

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

出力

[10,0,10,5,8,8,0]   "Q_ZKJX_"
[1,1,1,1,1,1,1]     "EEEEEEE"
[1,2,3,4,5,8,0]     "EDBFKJ_"
[2,2,2,2,2,2,2]     "DGDGDGD"


0

Perl 6、63バイト

*>>.&{(<_ E DG BCMP FHVW K _ _ JX _ QZ>[$_]x 7).comb[%.{$_}++]}

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

<_ E DG BCMP FHVW K _ _ JX _ QZ> # array indexed on tile value
(<...>[$_] x 7)     # pull letters for this value, repeat 7 times to catch E
          %         # anonymous stateful hash
           .{$_}    # element for this tile value
                ++  # post increment value to move position
       .comb[...]   # characters to array, pull this incrementing index

したがって、基本的には、各タイル値のオフセットのルックアップを保持し、必要に応じてオフセットを使用して、利用可能なセットから文字を引き出します。

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