Können Sie dieses Wort mit diesen Würfeln buchstabieren?

20

Buchstabenwürfel sind in Wortspielen weit verbreitet. Es kann zum Beispiel Spaß machen, lustige Wörter mit Würfeln zu buchstabieren. Wenn Sie eine Handvoll Würfel nehmen, können Sie möglicherweise bestimmte Wörter nicht buchstabieren. Diese Herausforderung ist eine Verallgemeinerung dieser Idee.

Herausforderung

Wenn Sie eine Liste von Würfeln mit mindestens einem Gesicht und einem Wort haben, müssen Sie feststellen, ob es möglich ist, dieses Wort mit den angegebenen Würfeln zu buchstabieren (in diesem Fall sollte es ein wahres Ergebnis liefern). Von jedem Würfel kann nur ein Buchstabe und ein Würfel nur einmal verwendet werden. Sie müssen nicht alle angegebenen Würfel verwenden.

Beispiele

In einem einfachen Beispiel mit den Würfeln [[A], [C], [T]] und der Zeichenfolge CAT ist das Ergebnis wahr. BAT würde natürlich false zurückgeben, da kein Würfel mit B darauf liegt

Wenn Sie als Würfelsatz [[A, E, I, O, U], [A, B, C, T], [N, P, R]] angeben, erhalten Sie für ART, TON und CUR den Wert true , aber false für CAT, EAT und PAN, da diese Zeichenfolgen die Wiederverwendung von Würfeln erfordern. Es sollte auch ziemlich offensichtlich sein, dass CRAB mit diesen Würfeln nicht buchstabiert werden kann, da nicht genügend Würfel vorhanden sind.

Wenn Sie [[A, B, C], [A, E, I], [E, O, U], [L, N, R, S, T]] als Würfelsatz angeben, könnten Sie Schreibe CAT, BEE, BEAN, TEA, BEET und BAN, aber du könntest nicht LONE, CAB, BAIL, TAIL, BAA oder TON buchstabieren

Es kann ein Vielfaches desselben Würfels geben. Wenn Sie [[A, B, C], [A, B, C], [A, B, C]] eingeben, können Sie CAB, BAA, AAA usw. buchstabieren, aber natürlich nichts ohne A, B oder C drin.

Regeln

  • Keine Ausnutzung von Standardlücken
  • Das ist , also gewinnt der kürzeste Code.
  • Sie können davon ausgehen, dass sowohl Wörter als auch Würfel nur aus Großbuchstaben bestehen.
  • Sie können davon ausgehen, dass das Wort immer mindestens einen Buchstaben lang ist und dass es immer mindestens einen Würfel gibt.
  • Sie können davon ausgehen, dass ein Würfel niemals mehr als einen Buchstaben enthält.
  • Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen.
Beefster
quelle
Warum neue Tags erstellen?
user202729
Kann man eine Liste (Vektor) von Zeichen als Eingabe nehmen (ähnliches Format wie ein Würfel)? Nach einem Freund fragen, der 27 Bytes sparen möchte.
JayCe
1
@JayCe "Eingabe und Ausgabe können in jedem geeigneten Format erfolgen", also ja.
Beefster

Antworten:

12

Brachylog , 5 Bytes

∋ᵐ⊇pc

Probieren Sie es online!

Wir verwenden die Eingabevariable für die Würfel und die Ausgabevariable für das Wort. Es gibt aus, true.wann es möglich ist, das Wort und zu buchstabierenfalse. ansonsten.

Erläuterung

∋ᵐ        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
Tödlich
quelle
8

Haskell , 48 44 Bytes

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

Dies ist eine anonyme Funktion. Gebunden an einen Bezeichner fkann er als f "ART" ["AEIOU", "ABCT", "NPR"], was ergibt, verwendet werden True. Probieren Sie es online!

Das nicht-punktfreie Äquivalent ist

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

mapM idüber eine Liste von Listen wird die MonadInstanz von list verwendet und kann als nicht deterministische Auswahl angesehen werden . Also zB mapM id ["AB","123"]Erträge ["A1","A2","A3","B1","B2","B3"].

Für jede dieser Würfelkombinationen prüfen wir, ob der Listenunterschied zwischen (\\)dem angegebenen Wort und der Kombination eine leere Liste ergibt.

Laikoni
quelle
@ LuisMendo Vielen Dank für den Hinweis! Behoben, indem zu einer anderen Methode gewechselt wurde, die 4 Bytes sparte.
Laikoni
6

JavaScript (ES6), 68 Byte

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

Neil
quelle
1
@ RickHitchcock schlägt fehl für EEE.
Neil
6

Python 2 , 82 Bytes

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

Probieren Sie es online!

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.

Die Vergleichskette w[0]in x>0<f(...)ist äquivalent zu: w[0]in x und x>0 und 0<f(...) .

Die zweite davon ist immer wahr ( str> int) und die dritte ist gleichbedeutend mit f(...), so dass das Ganze eine kürzere Schreibweise istw[0]in x and f(...)

Lynn
quelle
5

JavaScript (ES6), 74 Byte

Nimmt Eingaben in der Currysyntax vor (w)(a), wobei w das gesuchte Wort und a eine Liste von Zeichenfolgen ist, die die Würfel beschreiben. Gibt 0 oder 1 zurück .

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

Probieren Sie es online!

Kommentiert

Wir wandeln jede Teilmengenpermutation der Würfel in ein reguläres Ausdrucksmuster um und testen sie gegen das Zielwort.

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()
Arnauld
quelle
3

Schale , 5 Bytes

~V`¦Π

Probieren Sie es online!

Gibt einen Wert ungleich Null zurück, wenn das Wort buchstabiert werden kann, andernfalls Null.

Erläuterung

~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
Fyr
quelle
2

Perl 5 -plF , 48 46 Bytes

@DomHastings sparte 2 Bytes

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

Probieren Sie es online!

Eingang:

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

Ausgabe:

0für ein Wort, das nicht validiert ist. Beliebige positive Ganzzahl für ein Wort, das überprüft wird

Wie?

In dieser Erklärung wird der Code in der Ausführungsreihenfolge betrachtet, und zwar von rechts nach links für diesen Einzeiler.

-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
Xcali
quelle
1

JavaScript (Node.js) , 98 Byte

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

Probieren Sie es online!

Vorausgesetzt, es gibt genug Würfel

JavaScript (Node.js) , 100 Byte

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

Probieren Sie es online!

JavaScript (Node.js) , 99 Byte

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

Probieren Sie es online!

l4m2
quelle
1

Gelee ,  10  9 Bytes

-1 danke an Erik den Outgolfer (benutze wstatt ẇ@>. <)

Œ!Œp€Ẏw€Ṁ

Ein dyadischer Link, der eine Liste von Zeichen auf der linken Seite (die Würfel) und eine Liste von Zeichen auf der rechten Seite (das Wort) akzeptiert und wenn möglich 1 und wenn nicht, 0 zurückgibt.

Probieren Sie es online! Oder sehen Sie sich die Testsuite an .

Wie?

Œ!Œ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)

Schnellerer Algorithmus (auch 9 Bytes):

Eine dyadische Verknüpfung mit demselben Eingabeformat, die, wenn möglich, eine positive Ganzzahl (truey) und ansonsten eine 0 (falsey) zurückgibt.

Œ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
Jonathan Allan
quelle
1

R , 192 185 135 117 111 109 Bytes

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

Probieren Sie es online!

-2 Zeichen dank Giuseppe.

JayCe
quelle
Dies schlägt fehl, wenn ein Wort weniger Buchstaben als Würfel enthält.
Giuseppe
Ich denke, Sie können es auf Kosten von 21 Bytes speichern, versuchen Sie es hier
Giuseppe
@ Giuseppe Du hast den Tag gerettet!
JayCe
Sie brauchen nicht dieF=
Giuseppe
0

Pyth , 21 Bytes

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

Testsuite

Erläuterung:
.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
hakr14
quelle