レターボックスバリデーター


28

New York Timesには、Letter Boxedと呼ばれる毎日のオンラインゲームがあり(リンクはペイウォールの背後にあります。ゲームについてもここで説明します)、広場に次のように表示されます。

New York Timesのレターボックスの例

3文字の4つのグループが与えられます(各グループは写真の片側に対応します)。文字が2回表示されません。ゲームの目的は、次のような12文字(およびそれらの文字のみ)で構成される単語を見つけることです。

  • 各単語は少なくとも3文字の長さです。
  • 連続した文字を同じ側から出すことはできません。
  • 単語の最後の文字は、次の単語の最初の文字になります。
  • すべての文字は少なくとも1回使用されます(文字は再利用できます)。

このチャレンジでは、文字と単語のリストが与えられます。目標は、単語のリストが有効なレターボックスソリューションであるかどうかを確認することです。

入力

入力は、(1)3文字の4つのグループと(2)単語のリストで構成されます。任意の適切な形式にすることができます。

出力

単語のリストがそれらの4×3文字のレターボックスチャレンジに対する有効なソリューションである場合は真理値、それ以外の場合は偽値です。

テストケース

文字のグループ={{I,C,O}, {M,R,E}, {G,N,S}, {A,P,L}}

真実の価値

  • 巡礼、囲い
  • 作物、セール、リーン、NOPE、ENIGMA

偽値

  • PILGRIMAGE、ECONOMIES(同じ側にいるのでCOを持つことはできません)
  • CROPS、SAIL、LEAN、NOPE(GとMは使用されていません)
  • PILGRIMAGE、ENCLOSURE(Uは12文字のうちの1つではありません)
  • ENCLOSE、PILGRIMAGE(最初の単語の最後の文字は2番目の単語の最初の文字ではありません)
  • 詐欺、SO、ORGANISE、ELOPE(すべての単語は3文字以上でなければなりません)。

このチャレンジでは、単語が有効かどうか(辞書の一部)は気にしないことに注意してください。

得点:

この、バイト単位の最低スコアが勝ちです!


4
@TFeldno letter appears twice
feersum

単語のリストがそれらの4×3文字のレターボックスチャレンジに対する有効なソリューションである場合は真理値、それ以外の場合は偽値です。Python用(および他のほとんどの言語、私は期待して)、両方[]0falseyです。どちらかを出力できますか、または出力に一貫性が必要ですか?
アルテミスはモニカを

@ArtemisFowlどちらでも結構です。
ロビンライダー

私はそう思いましたが、私の質問は、それらを混ぜることができますか?
アルテミスはモニカを

@ArtemisFowlはい、それらを混在させることができます。
ロビンライダー

回答:


6

JavaScript(ES6)、 130  126バイト

入力をとして受け取ります(letters)(words)0または1返します。

L=>W=>L.every(a=>a.every(x=>(W+'').match(x,a.map(y=>s+='|'+x+y))),p=s=1)&W.every(w=>w[2]&&p|w[0]==p&!w.match(s,p=w.slice(-1)))

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

ステップ1

最初にLを反復処理して、すべての無効な文字のペアで構成されるパイプで区切られた文字列sを構築します。その際、各単語が少なくとも一度は必ず現れるようにします。

L.every(a =>              // for each group of letter a[] in L[]:
  a.every(x =>            //   for each letter x in a[]:
    (W + '')              //     coerce W[] to a string
    .match(               //     and test whether ...
      x,                  //       ... x can be found in it
      a.map(y =>          //       for each letter y in a[]:
        s += '|' + x + y  //         append '|' + x + y to s
      )                   //       end of map()
    )                     //     end of match()
  ),                      //   end of inner every()
  p = s = 1               //   start with p = s = 1
)                         // end of outer every()

ステップ2

Wを反復処理し、各単語をテストします。

W.every(w =>              // for each word w in W[]:
  w[2] &&                 //   is this word at least 3 characters long?
  p |                     //   is it the first word? (p = 1)
  w[0] == p &             //   or does it start with the last letter of the previous word?
  !w.match(               //   and finally make sure that ...
    s,                    //     ... it doesn't contain any invalid pair of letters
    p = w.slice(-1)       //     and update p to the last letter of w
  )                       //   end of match()
)                         // end of every()

6

ゼリー30 29バイト

FQṢ=Ṣ},i@€€’:3Iʋ,Ẉ>2ɗ,U=ḢɗƝ{Ȧ

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

単語のリストを左の引数として、ボックス内の文字のフラット化されたリストを右の引数としてとる二項リンク。1trueと0falseを返します。

説明

F                               | Flatten the word list
 Q                              | Unique
  Ṣ                             | Sort
   =                            | Is equal to
    Ṣ}                          |   The sorted letterbox letters
      ,        ʋ                | Pair this with the following:
       i@€€                     |   The index of each letter of each word in the letterbox            
           ’                    |   Decrease by 1
            :3                  |   Integer divide by 3
              I                 |   Differences between consecutive ones (will be zero if any two consecutive letters in a word from same side of box)
                ,   ɗ           | Pair everything so far with the following:
                 Ẉ>2            |   Whether length of each input word is greater than 2
                     ,   ɗƝ{    | Pair everything so far with the following, applied to each neighbouring pair of the input word list
                      U         |   Upend (reverse) first word
                       =        | Compare characters to second
                        Ḣ       |   Take first (i.e. last character of first word equals first character of second)
                            Ȧ   | Flatten all of the above and check there are no false values

6

05AB1E37 35 33 32 31 29 28 バイト

εk3÷üÊ}DO2@¹ü«εüQO}²{¹˜êQ)˜P

- êアプローチからインスピレーションを得て2バイト @Emignaは彼の05AB1Eの答えに使用します@Grimyの
おかげで-3バイト。

最初の入力として単語の文字のリストのリストを取り、2番目の入力として12文字のフラット化されたリストを取ります。

オンラインで試すたり、すべてのテストケースを確認してください

説明:

ε         # Map over the character-lists `y` of the (implicit) input-list of words:
 k        #  Get the index of each character in the (implicit) input-list of letters
  3÷      #  Integer-divide each index by 3
    üÊ    #  Check for each overlapping pair of integers that they are NOT equal
}D        # After the map: duplicate the resulting list
  O       #  Get the sum of each inner list of truthy/falsey values
   2@     #  And check that each is larger than 2 (so all words had at least 3 letters)
¹ü        # Get all overlapping pairs of character-lists from the input-list of words:
  «       #  And merge them together to a flattened list of characters
   ε   }  # Map over those merged character lists:
    üQ    #  Check for each overlapping pair of characters in the list that they are equal
      O   #  And take the sum of this (where we'd expect 1/truthy if the last character of
          #  the first word and the first character of the second word are equal)
          #  (NOTE: This could fail for inputs with identical adjacent characters,
          #   but the earlier check of `εk3÷üÊ}` already covers for this)
²{        # Push the input-list of letters, and sort them
  ¹˜      # Push the input-list of list of word-letters, flattened,
    ê     # and then uniquified and sorted as well
     Q    # And check if both lists of characters are the same
        # Then wrap everything on the stack into a list, and deep flatten it
  P       # And check if everything is truthy by taking the product
          # (which is output implicitly as result)

1
@Grimy Ah、その最初のコメントは確かに明らかです。文字配列に変更したばかりなので、今では単語がまだ文字列だったときに以前はなかった場所で実際に動作します。マージのその2番目のアプローチ、ペアの同等性のチェック、合計は非常に素晴らしいです!:Dありがとう(いつものように)。
ケビンクルーッセン

1
別の-1:¹€g3@-> DO2@最初のチェックの後(TIO
Grimmy

1
@Grimy別の素敵なもの、ありがとう。私たちは、29のゼリーの答えの下になりましたよ:)
ケビンCruijssen




4

Haskell、231バイト

import Data.List
l&w=all((>2).length)w&&c w&&all(l!)w&&(h l)%(h w)
h=concat
l%w=null[x|x<-l,x`notElem`w]
l!(a:b:c)=a#l?(b#l)&&l!(b:c)
l!_=1>0
Just a?Just b=a/=b
_?_=1<0
c#l=findIndex(elem c)l
c(a:b:t)=last a==head b&&c(b:t)
c _=1>0

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

最高のスコアではありません。Haskellの第一人者はおそらくこれを100バイト未満で取得できるでしょう。

使用法

["ICO","MRE","GNS","APL"]&["CROPS", "SAIL", "LEAN", "NOPE", "ENIGMA"]

説明

import Data.List
l&w = all((>2).length)w &&      -- Every word has length > 2
      c w &&                    -- Every word ends with the same letter as the next one starts with
      all(l!)w &&               -- For every word: Consecutive letters are on different sides (and must exist on a side)
      (h l)%(h w)               -- All letters are used

h=concat                        -- Just a shorthand

l%w=null[x|x<-l,x`notElem`w]    -- The letters of l, with all letters of w removed, is empty

l!(a:b:c)=a#l?(b#l)&&l!(b:c)    -- Sides of the first two letters are different, recurse from second letter
l!_=1>0                         -- Until fewer than 2 letters remain

Just a?Just b=a/=b              -- Both sides must be different
_?_=1<0                         -- And must exist

c#l=findIndex(elem c)l          -- Find the side of letter c

c(a:b:t)=last a==head b&&c(b:t) -- Last letter of the first word must be same as first letter of second word, recurse starting from second word
c _=1>0                         -- Until there are fewer than 2 words

4

ハスケル、231バイト

@Paul Mutserとまったく同じサイズの異なるHaskellバリエーション:)

import Data.List
f x=filter(\a->length a>1)$concatMap subsequences x
g=nub.concat.f
p l(x:y)=foldl(\(m,n)c->(c,n&&length c>2&&(not$any(`isInfixOf`c)(f l))&&last m==head c))(x,True)y
z l w=null(g l\\g w)&&null(g w\\g l)&&(snd$p l w)

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

非ゴルフ

-- generate all invalid substrings
f :: [String] -> [String] 
f xs = filter (\x -> length x > 1) $ concatMap subsequences xs

-- utility function to flatten and remove duplicates
g :: [String] -> String
g  = nub $ concat $ f

-- verify that all conditions are satisfied along the list
p :: [String] -> [String] -> (String, Bool)
p l (x:xs) = foldl (\(m,n) c -> (c , n && length c > 2 && (not $ any (`isInfixOf` c)(f l)) && last m == head c)) (x, True) xs

-- put all the pieces together and consume input
z :: [String] -> [String] -> Bool
z l w = null (g l \\ g w) && null (g w \\ g l) && (snd $ p l w)

3

ルビー、126バイト

->l,w{(/(_|^)..(_|$)/!~s=w*?_)&&!!s.chars.uniq[12]&&/__|^_|_$|(_.*)\1/!~s.gsub(/(.)_\1/,'\1').chars.map{|x|l.grep(/#{x}/)}*?_}

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


いいですね、最初にチャレンジを見たとき、似たようなことをしようとしましたが、140居住のどこかでスコアをあきらめました。ところで、後に括弧を削除してバイトを保存しますgrep
キリルL.

これは、最後の単語が1文字または2文字の長さの場合は機能しません。たとえば、ではなくをputs f[l,['PILGRIMAGE','ENCLOSE','EG']]返します。truefalse
ロビンライダー

1
あなたは正しい、修正されました。
GB

3

Java(JDK)、188バイト

g->w->{var v=0<1;int x=0,l,i=0,j,p,z,y=w[0][0];for(;i<w.length;i++)for(l=w[i].length,v&=y==w[i][0]&l>2,j=0,p=-9;j<l;v&=z>=0&z/3!=p/3,x|=2<<(p=z))z=g.indexOf(y=w[i][j++]);return v&x==8190;}

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

説明

g->w->{     // Lambda accepting letter groups as a string and a list of words, in the form of an array of char arrays.
 var v=0<1;     // Validity variable
 int x=0,       // The letter coverage (rule 4)
     l,         // The length of w[i]
     i=0,       // The w iterator
     j,         // The w[i] iterator
     p,         // The previous group
     z,         // The current group
     y=w[0][0]; // The previous character
 for(;i<w.length;i++) // For each word...
  for(
     l=w[i].length,     // make a shortcut for the length
     v&=y==w[i][0]&l>2, // check if the last character of the previous word is the same as the first of the current.
                        // Also, check if the length is at least 3
     j=0,               // Reset the iteration
     p=-9               // Set p to an impossible value.
    ;
     j<l                // 
    ;
     v&=z>=0&z/3!=p/3,  // Check that each letter of the word is in the letter pool,
                        //  and that the current letter group isn't the same as the previous one.
     x|=2<<(p=z)      // After the checks, assign z to p,
                        //  and mark the letter of the pool as used.
   )
   z=g.indexOf(y=w[i][j++]); // Assign the current letter to y so that it contains the last at the end of the loop.
                             //  and fetch the position of the letter in the pool.
 return v&x==8190; // Return true if all matched
                   //  and if the rule 4 is enforced.
}

クレジット

  • ceilingcatのおかげで-2バイト

2

木炭、63バイト

⌊⁺⁺⁺⭆η›Lι²⭆⪫ηω№⪫θωι⭆⪫θω№⪫ηωι⭆η⭆ι⎇μ¬⁼Φθ№νλΦθ№ν§ι⊖μ∨¬κ⁼§ι⁰§§η⊖κ±¹

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

⌊⁺⁺⁺

以下の式を連結し、0それらのいずれかに含まれている場合は出力します0場合ます1

⭆η›Lι²

ソリューションの各単語について、その長さが少なくとも3であるかどうかを出力します。

⭆⪫ηω№⪫θωι

ソリューションの各文字について、パズルに表示されるかどうかを出力します。

⭆⪫θω№⪫ηωι

パズルの各文字について、ソリューションに表示されるかどうかを出力します。

⭆η⭆ι⎇μ¬⁼Φθ№νλΦθ№ν§ι⊖μ∨¬κ⁼§ι⁰§§η⊖κ±¹

ソリューション内の各文字について、単語の最初の文字でない限り、前の文字が同じグループに含まれていないことを確認します。ソリューションの手紙、その場合は単に無視します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.