Изношенная плитка Эрудит

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 баллов: К × 1
  • 8 очков: J × 1, X × 1
  • 10 баллов: Q × 1, Z × 1

Таким образом, если у вас есть список очков, [10,10,8,5,1,1,1]то "QZJKEEE"он будет действительным, но "QQJKEEE"не будет действительным (поскольку в сумке только 1 Q)


Особые правила проблемы

  • Вы можете предположить, что все входные данные верны и что всегда будет 7 плиток (то есть это не будет список из семи плиток с 10 точками и не будет 9 плиток)
  • Вы можете предположить, что никакие плитки не были ранее извлечены из сумки (таким образом, распределение является стандартным распределением английских плиток, как определено выше)
  • Вам не нужно генерировать правильное слово, только правильную строку букв.
  • Порядок вашей строки не имеет значения, если для каждой плитки есть соответствующая буква.
  • Очки основаны на стандартных точках английского скрэббл-тайла, как определено выше.
  • Вы можете выводить в верхнем или нижнем регистре, для пустой плитки вы можете вывести либо пробел, либо знак подчеркивания '_'
  • Ваш ответ может выводиться как любое разумное представление плиток, таких как List, String, Array или Sequence

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать 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)
Истек срок действия данных
источник
Нужно ли выводить строку или список в порядке?
Maltysen
Вы можете вывести список, я обновлю вопрос
Просроченные данные
1
Что я могу вывести на бланк?
Maltysen
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_" , так как он никогда не будет доступен в любом случае.

Количество точек N преобразуется в правильный индекс яN в эту строку с помощью:

яNзнак равно((20×N)модификация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_

о

Arnauld
источник
Продвижение 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 Еще одна интересная формула '_??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, опечатка исправлена; Благодарность!
Джонатан Аллан
4

Pyth - 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" .

Попробуйте онлайн .

Maltysen
источник
3

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

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

-18 байт благодаря @ExpiredData .
-13 байт, используя тот же продлить до размера 7 из @Maltysen Pyth ответа «s .
-9 байт, создав порт ответа @JonathanAllan 's Jelly , так что убедитесь, что проголосовали за него!
-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-определенную строку.

LambdaBeta
источник
102 байта
ceilingcat
1

Желе , 34 32 байта

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

Попробуйте онлайн!

Я не видел, чтобы был короткий ответ Желе, когда я писал это, и это использует другой подход, поэтому я подумал, что стоит также опубликовать.

Спасибо @JonathanAllan за сохранение 2 байта!

Ник Кеннеди
источник
Используя базовую декомпрессию, вы можете сохранить 2 байта
Джонатан Аллан
1

Python 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

исправить благодаря mathmandan

Noodle9
источник
в "-> в" для 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 , 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 байтов.)

mathmandan
источник
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"
640 КБ
источник
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

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

Фил Х
источник