Scrabble yang sudah usang

35

Masalah

Anda terjebak di sebuah pondok di tengah hutan, dengan hanya scrabble tua yang diatur untuk menghibur diri sendiri. Setelah diperiksa Anda melihat bahwa surat-surat scrabble begitu dikenakan, sehingga hanya poin untuk setiap huruf yang terlihat.

Meskipun demikian Anda memutuskan untuk bermain game. Anda menarik tujuh huruf dari tas dan meletakkannya di baki Anda, tantangan Anda adalah untuk menentukan apa huruf-huruf itu.

Jadi secara umum, diberi daftar poin mengubahnya menjadi string atau daftar surat yang mungkin.


Ubin dan Distribusi Scrabble

  • 2 ubin kosong (mencetak 0 poin)
  • 1 poin: E × 12, A × 9, I × 9, O × 8, N × 6, R × 6, T × 6, L × 4, S × 4, S × 4, U × 4
  • 2 poin: D × 4, G × 3
  • 3 poin: B × 2, C × 2, M × 2, P × 2
  • 4 poin: F × 2, H × 2, V × 2, W × 2, Y × 2
  • 5 poin: K × 1
  • 8 poin: J × 1, X × 1
  • 10 poin: Q × 1, Z × 1

Jadi jika Anda memiliki daftar poin [10,10,8,5,1,1,1]maka "QZJKEEE"akan valid tetapi "QQJKEEE"tidak akan valid (karena hanya ada 1 ubin Q di tas)


Masalah Aturan Khusus

  • Anda dapat mengasumsikan semua input valid dan akan selalu ada 7 petak (mis. Itu tidak akan menjadi daftar tujuh petak 10 poin dan tidak akan ada 9 petak)
  • Anda dapat mengasumsikan tidak ada ubin yang sebelumnya ditarik dari tas (jadi distribusinya adalah distribusi standar ubin bahasa Inggris seperti yang ditentukan di atas)
  • Anda tidak harus membuat kata yang valid, hanya serangkaian huruf yang valid.
  • Urutan string Anda tidak relevan selama untuk setiap ubin ada huruf yang sesuai.
  • Poin didasarkan pada poin ubin scrabble inggris standar seperti yang didefinisikan di atas.
  • Anda dapat menampilkan dalam huruf besar atau kecil, untuk ubin kosong Anda dapat menampilkan karakter spasi atau garis bawah '_'
  • Jawaban Anda dapat ditampilkan sebagai representasi ubin yang wajar seperti Daftar, String, Array, atau Urutan

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa yang bukan kode. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Uji Kasus

Jelas karena Anda dapat menampilkan nilai yang mungkin, sulit untuk menentukan kasus pengujian yang ketat.

Beberapa kasus dengan kemungkinan nilai pengembalian yang valid :

[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"

Beberapa kasus dengan nilai pengembalian tidak valid :

[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)
Data Kedaluwarsa
sumber
Apakah saya perlu membuat string atau daftar tidak apa-apa?
Maltysen
Anda dapat menampilkan daftar, saya akan memperbarui pertanyaan
Data Kedaluwarsa
1
Apa yang bisa saya hasilkan untuk kosong?
Maltysen
3
Kasing uji yang disarankan: [2,2,2,2,2,2,2](satu-satunya kasing yang penting untuk memulai dengan menggunakan metode bersepeda Ddaripada Gjika)
Arnauld
1
Notifikasi adalah @ maka nama orang tersebut tanpa spasi. Yaitu Data Kedaluwarsa akan menjadi @ExpiredData.
Tau

Jawaban:

8

JavaScript (ES6), 72 byte

Varian yang lebih pendek disarankan oleh @supercat

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

Cobalah online!


JavaScript (ES6),  137 ... 84 78 77  76 byte

Disimpan 10 byte dengan menggunakan metode bersepeda Neil

Mengembalikan daftar ubin. Penggunaan _untuk ubin kosong.

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

Cobalah online!

Bagaimana?

Untuk setiap jumlah poin, kami menggilir grup tepat 4 ubin, dimulai dengan ubin kedua dari setiap grup (ini penting untuk 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        /

Semua grup ini disimpan sebagai string tunggal 31 karakter:

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

NB : Kami tidak perlu menyimpan final "_"di "_XJ_", karena tidak akan pernah diakses pula.

Jumlah poin n dikonversi ke indeks yang benar sayan ke dalam string ini dengan:

sayan=((20×n)mod44)mod32

  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_

Hai

Arnauld
sumber
Memajukan dengan [8] setiap 8 kali akan dikenakan biaya satu karakter tambahan untuk kemajuan, tetapi memungkinkan seseorang untuk mengganti% 4 dan% 32 keduanya dengan & 31 untuk kemenangan bersih. Yang terbaik, berdasarkan milikmu, adalah a=>a.map(o=n=>('?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])). Versi yang lebih pendek, "hampir" adalah a=>a.map(o=n=>("_EDBFK_EDCHJQEGMVXZEGPW"[n+(o[n]=5-~o[n])%24]))tetapi pendekatan itu akan membutuhkan cara yang ringkas untuk memetakan nilai 8 dan 10 menjadi 11 dan 12, ditambah sedikit penyesuaian pada string untuk memperbaiki masalah off-by-one.
supercat
@supercat Kedengarannya bagus! Saya akan melihat lebih dekat besok.
Arnauld
@supercat Formula menarik lainnya adalah '_??VKWZHQFP?M?CGBGXDJD'[(n*96+(o[n]=32-~o[n]))%68%33]||'E', dengan string pencarian hanya 22 karakter. Kode lengkapnya masih 2 byte lebih lama dari solusi Anda.
Arnauld
7

Arang , 33 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 θ                  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
Neil
sumber
5

Jelly ,  31 30 27  26 byte

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

Tautan monadik yang menerima daftar bilangan bulat yang menghasilkan daftar karakter.
- kecelakaan saya sebelumnya, di bawah, dan peningkatan saya Nick Kennedy

Cobalah online!

Output tidak diberikan dalam urutan yang sama dengan input (ini diizinkan).

Menggunakan 2 tambahan saya sendiri untuk bahasa dalam jawaban tidak sering terjadi! ( dan di ɓsini).

Bagaimana?

“...“...’ṃØ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)

sebelumnya @ 30

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

Tautan monadik yang menerima daftar bilangan bulat yang menghasilkan daftar karakter.

Cobalah online!

Output yang satu ini juga case campuran (ini diizinkan).

Bagaimana?

“...»⁾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"
Jonathan Allan
sumber
Saya pikir Anda membuat kesalahan ketik pada penjelasan pertama Anda. ' NWGMZQ'setelah indeks multi-dimensi menjadi cukup prestasi tanpa ada Wdalam string. ;)
Kevin Cruijssen
1
@KevinCruijssen - yws, salah ketik fixwd; Terima kasih!
Jonathan Allan
4

Pyth - 92 86 83 81 80 75 60 52 49 42 36 byte

Loop melalui input, muncul surat-surat yang tersedia. Saya hanya punya satu dari setiap huruf yang bersama-sama memberikan 7 untuk kategori poin itu. Sekarang menggunakan pengkodean string yang dikemas.

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

Btw, ini adalah string surat asli sebelum penyandian: "_ E DG BCMP FHVW K JX QZ" .

Cobalah online .

Maltysen
sumber
3

05AB1E , 70 52 39 38 29 26 25 byte

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

-18 byte terima kasih kepada @ExpiredData .
-13 byte dengan menggunakan sama memperpanjang ukuran 7 dari @Maltysen 's Pyth jawabannya .
-9 byte dengan membuat port dari jawaban Jelly @ JonathanAllan , jadi pastikan untuk menambahkannya!
-3 byte terima kasih kepada @Emigna .

Menghasilkan daftar karakter, dan menggunakan huruf kecil dan ruang kosong.

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

{                      # 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

Lihat ini 05AB1E ujung tambang (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami mengapa .•3Oû}α›ηö‡.ÝŽ{•adalah "endgmpfykkzzzzjxzzqz ".


Jawaban 38 byte sebelumnya:

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

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

.•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

Lihat ini 05AB1E ujung tambang (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami mengapa .•Mñ&Àû«ì{₆v*Å+µ-•adalah "e dg bcmp fhvw k jx qz".

Kevin Cruijssen
sumber
Tidak dapat Anda gunakan " 0eeeeeee0ddddggg0bbccmmp0ffhhvvw0k000jx00qz"?
Data Kedaluwarsa
@ExpiredData Ah, tentu saja. Anda hanya menggambar 7 huruf .. Terima kasih! Akan mengubahnya.
Kevin Cruijssen
1
Anda dapat menyimpan 3 byte menggunakan {vbukan 7Fdan ybukan I{Nè.
Emigna
@Emigna Ah, tentu saja .. Terima kasih!
Kevin Cruijssen
2

C (gcc) , 110 byte

_[]={0,7,14,21,0,0,22,0,24};f(char*s){for(;*s+1;s++)*s=*s?*s-1?"DDDDGGGBBCCMMPFFHHVVWKJXQZ"[_[*s-2]++]:69:32;}

Cobalah online!

Menggunakan _array sebagai indeks ke string statis "DDDDGGGBBCCMMPFFHHVVWKJXQZ"secara dinamis dengan pengecualian untuk 0 dan 1.

Argumen adalah -1array skor -minminasi yang diubah di tempat menjadi -1string -minminminasi.

LambdaBeta
sumber
102 byte
ceilingcat
1

Jelly , 34 32 byte

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

Cobalah online!

Saya belum melihat ada jawaban Jelly yang lebih pendek ketika saya menulis ini, dan ini menggunakan pendekatan yang berbeda jadi saya pikir layak untuk diposkan juga.

Terima kasih kepada @JonathanAllan karena telah menghemat 2 byte!

Nick Kennedy
sumber
Dengan menggunakan basis-dekompresi,, Anda dapat menyimpan 2 byte
Jonathan Allan
1

Python 3 , 178 142 135 127 112 117 byte

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

Cobalah online!

-1 byte berkat cdlane

benar terima kasih kepada mathmandan

Mie9
sumber
dalam "-> dalam" untuk 111
cdlane
d=list(map(list,"...".split('_')))untuk menyimpan byte lain
cdlane
Fungsi ini fmungkin tidak perlu dinamai, sehingga Anda dapat menyimpan 2 byte. Namun, fmengkonsumsi entri d, jadi saya tidak yakin itu sesuai dengan persyaratan konsensus bahwa "fungsi harus dapat digunakan kembali secara sewenang-wenang, tanpa ... menyatakan kembali ... kode lain yang menyertai pengiriman." (Misalnya, menjalankan f([10,0,10,5,8,8,0])lebih dari satu kali akan menghasilkan kesalahan.) Silakan lihat diskusi meta di sini: codegolf.meta.stackexchange.com/a/7615/36885
mathmandan
0

Python 2 , 102 byte (atau mungkin 95?)

(Juga baik untuk 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))

Cobalah online!

Saya pikir hal berikut tidak akan diterima:

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

Versi kedua ini akan memberikan output seperti ['__', 'JX', 'QZ', 'K']. Jadi surat-surat itu benar, tetapi dikumpulkan dengan nilai poin. (Jika ini dapat diterima, itu akan menghemat 7 byte.)

mathmandan
sumber
0

PHP , 101 byte

$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;}

Sebagai program mandiri, masukan melalui baris perintah:

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

Cobalah online!

Atau 112 byte sebagai fungsi

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;}

Cobalah online!

Keluaran

[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"
640KB
sumber
0

Ruby , 77 76 byte

->a{r=%w{_ E DG BCMP FHVW K . . JX . QZ};a.map{|i|(r[i]<<r[i][0]).slice! 0}}

Cobalah online!

Pasang kembali Monica iamnotmaynard
sumber
0

Perl 6 , 63 byte

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

Cobalah online!

<_ 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

Jadi pada dasarnya itu membuat pencarian offset untuk setiap nilai ubin dan menambahkannya sesuai kebutuhan, menggunakan offset untuk menarik karakter dari set yang tersedia.

Phil H
sumber