これらのサイコロでこの言葉を綴ることができますか?


20

手紙のサイコロは、単語ゲームでは一般的です。たとえば、おかしな単語をボグルサイコロで綴ろうとするのは楽しいことです。ほんの一握りのサイコロをつかむと、特定の単語を綴ることができなくなる可能性があります。この課題は、そのアイデアの一般化です。

チャレンジ

それぞれが少なくとも1つの顔と単語を持つサイコロのリストが与えられたら、あなたの仕事は、与えられたサイコロを使用してその単語を綴ることができるかどうかを判断することです(その場合、それは真実の結果を返すはずです)。各ダイから1文字のみ使用でき、ダイは1回しか使用できません。指定されたサイコロをすべて使用する必要はありません。

サイコロ[[A]、[C]、[T]]および文字列CATを使用した簡単な例では、結果はtrueです。BATは、Bが付いたサイコロがないため、もちろんfalseを返します。

サイコロのセットとして[[A、E、I、O、U]、[A、B、C、T]、[N、P、R]]が与えられた場合、ART、TON、およびCURに対してtrueを返します。 、ただし、CAT、EAT、およびPANについてはfalseです。これらの文字列はサイコロを再利用する必要があるためです。また、十分なサイコロがないため、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などを綴ることができます...その中にB、またはC。

ルール

  • 標準的な抜け穴を悪用しない
  • これはなので、最短のコードが優先されます。
  • 単語とサイコロの両方が大文字のみで構成されていると仮定することができます。
  • 単語は常に少なくとも1文字の長さであり、常に少なくとも1つのダイが存在すると想定できます。
  • あなたはダイスが同じ文字を複数持つことはないと想定するかもしれません。
  • 入力および出力は、任意の便利な形式にすることができます。

新しいタグを作成する理由
user202729

入力として文字のリスト(ベクトル)を取得できますか(サイコロのような形式)?27バイトを節約したい友人を求めています。
JayCe

1
@JayCe「入力および出力は任意の便利な形式にすることができる」ため、はい
ビーフスター

回答:


12

Brachylog、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

Haskell48 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"]yields ["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

Python 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(...)です。

それらの2番目は常に真(str> int)であり、3番目はに等しいf(...)ので、全体の記述はより短い方法ですw[0]in x and f(...)


5

JavaScript(ES6)、74バイト

カリー化構文の入力を受け取ります(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 -plF48の、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検証されていない単語に対して。検証された単語の正の整数

どうやって?

この説明では、コードを実行順に、この1行の場合は実質的に右から左に見ていきます。

-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バイトも):

可能な場合は正の整数(真)を返し、それ以外の場合は0(偽)を返す同じ入力形式のダイアディックリンク。

Œ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

R192185135117111109バイト

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

オンラインでお試しください!

-ジュゼッペのおかげで2文字。


単語の文字数がサイコロの数より少ない場合、これは失敗します。
ジュゼッペ

21バイトのコストで保存できると思います。こちら
ジュゼッペ

@ジュゼッペあなたは一日を救った!
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.