Чи можете ви написати це слово за допомогою цих кубиків?


20

Буквальні кубики поширені в іграх на слова. Це може бути цікаво, наприклад, спробувати написати смішні слова, наприклад, з грізними кістками. Якщо ви схопите кілька кубиків, швидше за все, ви не зможете написати певні слова. Цей виклик є узагальненням цієї ідеї.

Виклик

З огляду на список кісток, у яких кожен має принаймні 1 обличчя та слово, ваше завдання - визначити, чи можна написати це слово за допомогою заданих кісток (у такому випадку воно повинно повернути результат). Можна використовувати лише одну букву з кожного штампу, а матрицю можна використовувати лише один раз. Не потрібно використовувати всі дані кістки.

Приклади

У тривіальному прикладі з кубиками [[A], [C], [T]] та рядком CAT результат є вірним. BAT, звичайно, повернеться помилково, оскільки на них немає кісток з B

Якби [[A, E, I, O, U], [A, B, C, T], [N, P, R]] було задано набір кубиків, ви повернете справжнє для ART, TON та CUR , але false для CAT, EAT та PAN, оскільки ці рядки вимагають повторного використання кісток. Слід також бути досить очевидним, що CRAB не може бути написаний цими кістками, оскільки не вистачає кісток.

Якби [[A, B, C], [A, E, I], [E, O, U], [L, N, R, S, T]] як набір кісток, ви могли б заклинання CAT, BEE, BEAN, TEA, BEET та BAN, але ви не зможете написати LONE, CAB, BAIL, TAIL, BAA або TON

Можуть бути кратні однакові штампи. Якщо вам дано [[A, B, C], [A, B, C], [A, B, C]], ви зможете написати CAB, BAA, AAA тощо, але без A, очевидно, нічого не буде, B, або C в ньому.

Правила

  • Не використовуються стандартні лазівки
  • Це , тому виграє найкоротший код.
  • Ви можете припустити, що і слова, і кістки будуть складатися лише з великих літер.
  • Ви можете припустити, що слово завжди буде мати принаймні одну букву і завжди буде хоча б 1 вмирати.
  • Ви можете припустити, що штамп ніколи не матиме більше однієї і тієї ж букви.
  • Введення та вихід можуть бути у будь-якому зручному форматі.

Навіщо робити нові теги?
користувач202729

Чи можна взяти список (вектор) символів як вхідний (подібний формат, як кістки)? Просити друга, який хотів би зберегти 27 байт.
JayCe

1
@JayCe "Введення та вихід можуть бути у будь-якому зручному форматі", так що так.
Beefster

Відповіді:


12

Брахілог , 5 байт

∋ᵐ⊇pc

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

Ми використовуємо вхідну змінну для кісток і вихідну змінну для слова. Він виводить, true.коли можна написати слово та false.інше.

Пояснення

∋ᵐ        Map element: Take one side from each die
  ⊇       Subset
   p      Permute
    c     Concatenate into a string: will only succeed if it results in the output word

8

Haskell , 48 44 байт

import Data.List
(.mapM id).any.(null.).(\\)

Це анонімна функція. Зв'язаний до якогось ідентифікатора, fвін може бути використаний як f "ART" ["AEIOU", "ABCT", "NPR"], що дає результат True. Спробуйте в Інтернеті!

Еквівалент без точки - це

f word dice = any(\s -> null $ word\\s) $ mapM id dice

mapM idнад списком списків використовується Monadекземпляр списку і може розглядатися як недетермінований вибір . Так, наприклад, mapM id ["AB","123"]урожайність ["A1","A2","A3","B1","B2","B3"].

Для кожної з цих комбінацій кісток ми перевіряємо, чи різниця (\\)в списку даного слова та комбінації дає порожній список.


@LuisMendo Дякую за вказівку! Виправлено перемиканням на інший метод, який у кінцевому підсумку зберігає 4 байти.
Лайконі

6

JavaScript (ES6), 68 байт

f=([c,...w],a)=>!c||a.some((d,i)=>d.match(c)&&f(w,a.filter(_=>i--)))
<div oninput=o.textContent=f(i.value,d.value.split`\n`)>
<textarea id=d rows=9>
ABC
AEI
EOU
LNRST
</textarea>
<br>
<input id=i value=BEAN>
<pre id=o>true


1
Помилка @RickHitchcock для EEE.
Ніл

6

Пітон 2 , 82 байти

f=lambda d,w:w==''or any(w[0]in x>0<f(d[:i]+d[i+1:],w[1:])for i,x in enumerate(d))

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

f=lambda d,w:w==''                                                                 # Base case: we can spell '' with any dice.
                  or any(                                 for i,x in enumerate(d)) # Otherwise, we check if there is some die x such that...
                         w[0]in x                                                  # the first letter is on this die,
                                 >0<                                               # and
                                    f(d[:i]+d[i+1:],w[1:])                         # we can spell the rest of the word with the rest of the dice.

Ланцюг порівняння w[0]in x>0<f(...)еквівалентний: w[0]in x і x>0 і 0<f(...) .

Друга з них завжди вірна ( str> int), а третя з них рівнозначна f(...), так що вся справа - це коротший спосіб написанняw[0]in x and f(...)


5

JavaScript (ES6), 74 байти

Бере участь у синтаксисі currying (w)(a), де w - це слово, яке ми шукаємо, а a - список рядків, що описують кістки. Повертає 0 або 1 .

w=>P=(a,m='')=>w.match(m)==w|a.some((w,i)=>P(a.filter(_=>i--),m+`[${w}]`))

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

Прокоментував

Перетворимо кожну підмножину перестановки на кістки в звичайний шаблон виразів і перевіримо їх на цільове слово.

w =>                        // w = target word
  P =                       // P = recursive function taking:
    (a,                     //   a[] = list of dice
        m = '') =>          //   m   = search pattern
    w.match(m) == w |       // force a truthy result if w matches m
    a.some((w, i) =>        // for each word w at position i in a[]:
      P(                    //   do a recursive call:
        a.filter(_ => i--), //     using a copy of a[] without the current element
        m + `[${w}]`        //     and adding '[w]' to the search pattern
      )                     //   end of recursive call
    )                       // end of some()

3

Лушпиння , 5 байт

~V`¦Π

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

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

Пояснення

~V`¦Π  Arguments: word [Char], dice [[Char]]
 V     Checks if any element of a list (2) satisfies a predicate (1)
~      Composes both arguments of the above function
  `¦     (1) Is the word a subset of the element?
    Π    (2) Cartesian product of the dice list

2

Perl 5 -plF , 48 46 байт

@DomHastings зберегло 2 байти

$_=grep/@{[sort@F]}/,map"@{[sort/./g]}",glob<>

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

Вхід:

word               # The word to validate
{A,B,C}{D,E,F}     # Each die is surrounded by braces, commas between the letters

Вихід:

0для слова, яке не підтверджене. Будь-яке додатне ціле число для слова, яке підтверджене

Як?

Це пояснення розглядає код у порядку виконання, фактично праворуч ліворуч для цього одного вкладиша.

-F             # The first line of input is automatically split by the -F command option into the @F array.
glob<>         # Read the rest of the input and enumerate all of the permutations of it
map"@{[sort/./g]}",  # Split the permutation into separate letters, sort them and put them back together
/@{[sort@F]}/, # use the sorted letters of the target to match against
$_=grep        # check all of those permutations to see if the desired word is in them
-p             # Command line option to output the contents of $_ at the end

1

JavaScript (Node.js) , 98 байт

f=(s,d,u=[])=>d<1?s.every(t=>u.pop().match(t)):d.some((x,i)=>f(s,e=[...d],[...u,x],e.splice(i,1)))

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

Якщо припустити, що вистачить кісток

JavaScript (Node.js) , 100 байт

f=(s,d,u=[''])=>d<1?s.every(t=>u.pop().match(t)):d.some((x,i)=>f(s,e=[...d],[...u,x],e.splice(i,1)))

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

JavaScript (Node.js) , 99 байт

s=>f=(d,u=[''])=>d<1?s.every(t=>u.pop().match(t)):d.some((x,i)=>f(e=[...d],[...u,x],e.splice(i,1)))

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


1

Желе ,  10  9 байт

-1 завдяки Еріку Попелу (використовуйте, wа не ẇ@>. <)

Œ!Œp€Ẏw€Ṁ

Дядічне посилання, що приймає список списків символів зліва (кістки) та список символів праворуч (слово), яке повертає 1, якщо можливо, і 0, якщо ні.

Спробуйте в Інтернеті! Або дивіться тестовий набір .

Як?

Œ!Œp€Ẏw€Ẹ - Link: list of lists of characters Dice, list of characters Word
Œ!        - all permutations of the dice (i.e. all ways to order the dice)
  Œp€     - Cartesian product of €ach (i.e. all ways to roll each ordering)
     Ẏ    - tighten (i.e. all ordered ways to roll the dice)
       €  - for each:
      w   -   first index (of sublist W) in the result (positive if there, 0 otherwise)
        Ẹ - any truthy? (1 if it is possible to roll the word, 0 otherwise)

Швидший алгоритм (також 9 байт):

Діадичне посилання з тим же форматом введення, яке повертає додатне ціле число (truthy), коли це можливо, і 0 (falsey) в іншому випадку.

Œpf€Ṣ€ċṢ} - Link: list of lists of characters Dice, list of characters Word
Œp        - Cartesian product of the dice (all rolls of the dice)
  f€      - filter keep for €ach (keep the rolled letters if they are in the word)
    Ṣ€    - sort €ach result
       Ṣ} - sort Word
      ċ   - count occurrences

1

R , 192 185 135 117 111 109 байт

function(x,...)s(x)%in%apply(expand.grid(lapply(list(...),c,"")),1,s)
s=function(x)paste(sort(x),collapse="")

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

-2 символи завдяки Джузеппе.


Це не вдасться, якщо слово має менше букв, ніж у вас кістки.
Джузеппе

Я думаю, що ви можете зекономити ціною 21 байт, спробуйте тут
Джузеппе

@Giuseppe Ви врятували день!
JayCe

вам не потрібноF=
Джузеппе

0

Pyth , 21 байт

.Em}eQdsm.ps.nd.U*bZh

Тестовий набір

Пояснення:
.Em}eQdsm.ps.nd.U*bZhQ # Code with implicit variables
.E                     # Print whether any of
       sm.ps  d        # all positive length permutations of each element in
        m   .nd.U*bZhQ # the Cartesian product of the list of dice
  m}eQd                # contain the target word
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.