Скреббл з ношених плиток


35

Проблема

Ви застрягли в салоні посеред лісу, лише старий скребковий комплект, щоб розважити себе. При огляді ви бачите, що літери для скребля настільки зношені, що видно лише точки на кожній букві.

Тим не менш, ви вирішили пограти в гру. Ви витягуєте з мішка сім букв і поміщаєте їх на піднос, ваше завдання - визначити, якими можуть бути ці букви.

Тож загалом, даючи список точок, перетворюйте його в будь-який можливий рядок або список літер.


Плитки та розподіли

  • 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"не був би дійсним (оскільки в мішку є лише плитка Q 1)


Конкретні правила проблеми

  • Ви можете припустити, що всі вхідні дані є дійсними, і що завжди буде 7 плиток (тобто це не буде список із семи десяткових плиток і не буде 9 плиток)
  • Ви можете припустити, що жодна плитка не була витягнута з мішка (тому розподіл - це стандартний розподіл англійської плитки, як визначено вище)
  • Не потрібно генерувати дійсне слово, лише дійсний рядок літер.
  • Порядок вашої рядка не має значення, якщо для кожної плитки є відповідна літера.
  • Бали базуються на стандартних англійських плитках для скремблення, як визначено вище.
  • Ви можете виводити у верхньому або нижньому регістрі, для порожньої плитки можна виводити або символ пробілу, або підкреслення "_"
  • Ваша відповідь може відображати будь-яке розумне представлення плиток, таких як Список, Рядок, Масив або Послідовність

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати 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
Пропонований тестовий випадок: [2,2,2,2,2,2,2](єдиний випадок, коли важливо почати з, Dа не, Gякщо використовується велосипедний метод)
Арнольд

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 байт

Збережено 10 байт за допомогою велосипедного методу Ніла

Повертає список плиток. Використання _для чистої плитки.

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

Спробуйте в Інтернеті!

Як?

На кожну кількість очок ми перебираємо групу з рівно 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

NB : Ми не повинні зберігати остаточний "_"ін"_XJ_" , так як він ніколи не буде доступний в будь-якому випадку.

Кількість точок н перетворюється на правильний індекс iн у цей рядок за допомогою:

iн=((20×н)мод44)мод32

  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 [n] на 8 кожного разу коштуватиме один додатковий символ для просування, але дозволить замінити% 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 Звучить добре! Я завтра детальніше ознайомлюсь із цим.
Арнольд

@supercat Ще одна цікава формула - '_??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рядка. ;)
Кевін Крейссен

1
@KevinCruijssen - yws, typo fixwd; Спасибі!
Джонатан Аллан

4

Піт - 92 86 83 81 80 75 60 52 49 42 36 байт

Проведіть петлю через введення, вискакуючи з наявних літер. Я просто маю по одній букві, яка разом дає 7 для цієї категорії балів. Тепер використовується кодована строкова кодування.

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

05AB1E , 70 52 39 38 29 26 25 байт

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

-18 байт завдяки @ExpiredData .
-13 байт, використовуючи те саме розширення до розміру 7 з відповіді Pyth @Maltysen .
-9 байт, створивши порт відповіді на желей @JonathanAllan , тому обов'язково підтримайте його!
-3 байти завдяки @Emigna .

Результати в списку символів, використовуючи малі літери та пробіли для пробілів.

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

Пояснення:

{                      # 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
Ви можете зберегти 3 байта , використовуючи {vзамість 7Fі yзамість I{Nè.
Емінья

@Emigna Ах, звичайно .. Дякую!
Кевін Кройсейсен

2

C (gcc) , 110 байт

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

Спробуйте в Інтернеті!

Динамічно використовує _масив як індекс у статичну рядок, "DDDDGGGBBCCMMPFFHHVVWKJXQZ"за винятком для 0 та 1.

Аргумент - це закінчений -1масив балів, який перетворюється на місці в -1-викінчений рядок.




1

Желе , 34 32 байт

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

Спробуйте в Інтернеті!

Коли я писав це, я не бачив, щоб була коротша відповідь «Желе», і для цього використовується інший підхід, тому я вважав, що варто також публікувати.

Дякуємо @JonathanAllan за збереження 2 байтів!


Використовуючи базову декомпресію, ви можете зберегти 2 байти
Джонатан Аллан

1

Пітон 3 , 178 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]

Спробуйте в Інтернеті!

-1 байт завдяки cdlane

правильно завдяки математиці


в "-> в" за 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
математика

0

Пітон 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)]

Ця друга версія дала б такий вихід ['__', '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

Таким чином, він по суті зберігає пошук зсувів для кожного значення плитки та збільшує їх у міру необхідності, використовуючи зміщення, щоб витягнути символ із наявного набору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.