Zużyte płytki Scrabble

35

Problem

Utknąłeś w chatce pośrodku lasu, z tylko starą sceną do zabawy. Po inspekcji widać, że litery scrabble są tak zużyte, że widoczne są tylko punkty dla każdej litery.

Niemniej jednak decydujesz się na grę. Wyciągasz siedem liter z torby i umieszczasz je na tacy, a Twoim zadaniem jest ustalenie, jakie mogą być te litery.

Ogólnie biorąc, biorąc pod uwagę listę punktów, zamień ją na dowolny możliwy ciąg lub listę liter.


Scrabble Tiles and Distribution

  • 2 puste kafelki (zdobycie 0 punktów)
  • 1 punkt: E × 12, A × 9, I × 9, O × 8, N × 6, R × 6, T × 6, L × 4, S × 4, U × 4
  • 2 punkty: D × 4, G × 3
  • 3 punkty: B × 2, C × 2, M × 2, P × 2
  • 4 punkty: F × 2, H × 2, V × 2, W × 2, Y × 2
  • 5 punktów: K × 1
  • 8 punktów: J × 1, X × 1
  • 10 punktów: Q × 1, Z × 1

Więc jeśli masz listę punktów, [10,10,8,5,1,1,1]to "QZJKEEE"byłby ważny, ale "QQJKEEE"nie byłby ważny (ponieważ w torbie jest tylko 1 płytka Q)


Zasady specyficzne dla problemu

  • Możesz założyć, że wszystkie dane wejściowe są prawidłowe i że zawsze będzie 7 płytek (tzn. Nie będzie to lista siedmiu 10-punktowych płytek i nie będzie 9 płytek)
  • Możesz założyć, że wcześniej nie wyciągnięto żadnych płytek z torby (więc rozkład jest standardowym rozkładem angielskich płytek, jak zdefiniowano powyżej)
  • Nie musisz generować prawidłowego słowa, tylko prawidłowy ciąg liter.
  • Kolejność łańcucha nie ma znaczenia, o ile dla każdej płytki znajduje się odpowiednia litera.
  • Punkty są oparte na standardowych angielskich punktach kafelka, jak zdefiniowano powyżej.
  • Możesz pisać wielkimi lub małymi literami, dla pustego kafelka możesz wypisać znak spacji lub znak podkreślenia „_”
  • Twoja odpowiedź może być wyświetlana jako dowolna uzasadniona reprezentacja kafelków, taka jak Lista, Łańcuch, Tablica lub Sekwencja

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe

Oczywiście, ponieważ można podać dowolną możliwą wartość, trudno jest zdefiniować ścisłe przypadki testowe.

Niektóre przypadki z możliwą prawidłową wartością zwracaną:

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

Niektóre przypadki z niepoprawną wartością zwracaną:

[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)
Wygasły dane
źródło
Czy muszę wyprowadzać ciąg, czy lista jest w porządku?
Maltysen
Możesz wypisać listę, zaktualizuję pytanie
Data wygasła
1
Co mogę wydrukować na puste miejsce?
Maltysen
3
Sugerowany przypadek testowy: [2,2,2,2,2,2,2](jedyny przypadek, w którym ważne jest, aby zacząć od Dzamiast Gmetody cyklicznej)
Arnauld
1
Powiadomienia to @, a następnie nazwisko osoby bez spacji. Tj . Przeterminowane dane zmieniłyby się na @ExpiredData.
Tau

Odpowiedzi:

8

JavaScript (ES6), 72 bajty

Krótszy wariant sugerowany przez @supercat

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

Wypróbuj online!


JavaScript (ES6),  137 ... 84 78 77  76 bajtów

Zaoszczędzono 10 bajtów, stosując metodę cykliczną Neila

Zwraca listę kafelków. Zastosowania _do pustych płytek.

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

Wypróbuj online!

W jaki sposób?

Dla każdej liczby punktów przechodzimy przez grupę dokładnie 4 kafelków, zaczynając od drugiej płytki każdej grupy (jest to ważne w przypadku 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        /

Wszystkie te grupy są przechowywane jako pojedynczy ciąg 31 znaków:

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

Uwaga : Nie trzeba przechowywać ostateczną "_"in "_XJ_", jako że nigdy nie będą dostępne w każdym razie.

Liczba punktów jest konwertowana na poprawny indeks na ten ciąg za pomocą:njan

jan=((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_

Bieżąca pozycja w każdej grupie jest przechowywana w obiekcie .o

Arnauld
źródło
Awans o [n] o 8 za każdym razem kosztowałby jedną dodatkową postać za awans, ale pozwala zastąpić% 4 i% 32 zarówno przez & 31, jak i wygraną netto. Mój najlepszy, oparty na twoim, byłby a=>a.map(o=n=>('?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])). Krótsza, „prawie” wersja jest, a=>a.map(o=n=>("_EDBFK_EDCHJQEGMVXZEGPW"[n+(o[n]=5-~o[n])%24]))ale takie podejście wymagałoby zwartego sposobu mapowania wartości 8 i 10 na 11 i 12, a także niewielkiej korekty ciągu, aby naprawić problem występujący osobno.
supercat
@supercat Brzmi dobrze! Jutro przyjrzę się temu bliżej.
Arnauld
@ superupat Inną ciekawą formułą jest '_??VKWZHQFP?M?CGBGXDJD'[(n*96+(o[n]=32-~o[n]))%68%33]||'E'łańcuch wyszukiwania zawierający tylko 22 znaki. Pełny kod jest jednak nadal o 2 bajty dłuższy niż rozwiązanie.
Arnauld
7

Węgiel drzewny , 33 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 θ                  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
źródło
5

Galaretka ,  31 30 27  26 bajtów

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

Monadyczny link akceptujący listę liczb całkowitych, która daje listę znaków.
- miszmasz mojego poprzedniego, poniżej i moje ulepszenie Nicka Kennedy'ego

Wypróbuj online!

Dane wyjściowe nie są podawane w tej samej kolejności co dane wejściowe (jest to dozwolone).

Użycie 2 własnych dodatków do języka w odpowiedzi nie zdarza się często! ( i ɓtutaj).

W jaki sposób?

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

poprzednia @ 30

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

Monadyczny link akceptujący listę liczb całkowitych, która daje listę znaków.

Wypróbuj online!

Ten sygnał wyjściowy ma również wielkość liter (jest to dozwolone).

W jaki sposób?

“...»⁾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
źródło
Myślę, że popełniłeś literówkę w swoim pierwszym wyjaśnieniu. ' NWGMZQ'po indeksie wielowymiarowym w byłoby wyczynem bez żadnego Ww ciągu. ;)
Kevin Cruijssen
1
@KevinCruijssen - yws, typo fixwd; dzięki!
Jonathan Allan
4

Pyth - 92 86 83 81 80 75 60 52 49 42 36 bajtów

Pętle poprzez wprowadzanie, usuwając dostępne litery. Mam tylko jeden z każdego listu, który razem daje 7 dla tej kategorii punktowej. Teraz za pomocą kodowania spakowanych ciągów.

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, to jest oryginalny list ciąg przed kodowaniem: "_ E DG BCMP FHVW K JX QZ".

Wypróbuj online .

Maltysen
źródło
3

05AB1E , 70 52 39 38 29 26 25 bajtów

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

-18 bajtów dzięki @ExpiredData .
-13 bajtów za pomocą tej samej wielkości 7 rozciąga się od @Maltysen jest Pyth odpowiedź .
-9 bajtów poprzez utworzenie portu @JonathanAllan „s Jelly odpowiedzi , więc upewnij się, aby go upvote!
-3 bajty dzięki @Emigna .

Daje listę znaków, używa małych liter i spacji.

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Wyjaśnienie:

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

Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować ciągi znaków nie będące częścią słownika? ), Aby zrozumieć, dlaczego tak .•3Oû}α›ηö‡.ÝŽ{•jest "endgmpfykkzzzzjxzzqz ".


Poprzednie 38 bajtów odpowiedzi:

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

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Wyjaśnienie:

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

Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować ciągi znaków nie będące częścią słownika? ), Aby zrozumieć, dlaczego tak .•Mñ&Àû«ì{₆v*Å+µ-•jest "e dg bcmp fhvw k jx qz".

Kevin Cruijssen
źródło
Nie można używać " 0eeeeeee0ddddggg0bbccmmp0ffhhvvw0k000jx00qz"?
Data wygasła
@ExpiredData Ah, oczywiście. Rysujesz tylko 7 liter. Dzięki! Zmieni to.
Kevin Cruijssen
1
Możesz zapisać 3 bajty, używając {vzamiast 7Fi yzamiast I{Nè.
Emigna
@Emigna Ach, oczywiście .. Dzięki!
Kevin Cruijssen
2

C (gcc) , 110 bajtów

_[]={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;}

Wypróbuj online!

Dynamicznie używa _tablicy jako indeksu w łańcuchu statycznym "DDDDGGGBBCCMMPFFHHVVWKJXQZ"z wyjątkami dla 0 i 1.

Argument jest -1tablicą wyników, która jest przekształcana w miejscu w -1ciąg znaków.

LambdaBeta
źródło
102 bajty
ceilingcat
1

Galaretka , 34 32 bajty

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

Wypróbuj online!

Kiedy nie napisałem, nie widziałem krótszej odpowiedzi na galaretkę, która wykorzystuje inne podejście, więc pomyślałem, że warto ją również opublikować.

Dzięki @JonathanAllan za zapisanie 2 bajtów!

Nick Kennedy
źródło
Używając dekompresji bazy , możesz zaoszczędzić 2 bajty
Jonathan Allan
1

Python 3 , 178 142 135 127 112 117 bajtów

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

Wypróbuj online!

-1 bajt dzięki cdlane

poprawne dzięki Mathmandan

Kluski 9
źródło
w „-> w” dla 111
cdlane
d=list(map(list,"...".split('_')))zapisać kolejny bajt
cdlane
Ta funkcja fprawdopodobnie nie musi mieć nazwy, więc możesz zapisać 2 bajty. Jednak fpochłania wpisy d, więc nie jestem pewien, czy spełnia on konsensusowy wymóg, zgodnie z którym „funkcja musi być dowolnie używana wielokrotnie, bez… ponownego tworzenia… jakiegokolwiek innego kodu towarzyszącego przesłaniu”. (Na przykład uruchomienie f([10,0,10,5,8,8,0])więcej niż raz spowoduje błąd.) Zobacz meta dyskusję tutaj: codegolf.meta.stackexchange.com/a/7615/36885
mathmandan
0

Python 2 , 102 bajty (a może 95?)

(Również dobrze dla Pythona 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))

Wypróbuj online!

Nie sądzę, aby następujące warunki były do ​​zaakceptowania:

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

Ta druga wersja da wynik podobny do ['__', 'JX', 'QZ', 'K']. Tak więc litery byłyby poprawne, ale byłyby zbierane według wartości punktowej. (Gdyby to było dopuszczalne, zaoszczędziłoby to 7 bajtów).

Mathmandan
źródło
0

PHP , 101 bajtów

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

Jako samodzielny program wprowadzaj z wiersza poleceń:

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

Wypróbuj online!

Lub 112 bajtów jako funkcja

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

Wypróbuj online!

Wydajność

[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"
640 KB
źródło
0

Perl 6 , 63 bajtów

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

Wypróbuj 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

Zasadniczo więc sprawdza przesunięcia dla każdej wartości kafelka i zwiększa je w razie potrzeby, używając przesunięcia, aby wyciągnąć postać z dostępnego zestawu.

Phil H.
źródło