スペインのナンバープレートゲーム


26

この質問はに基づいて、私は尋ねた質問ではスペイン語。はい、スペイン語のアルゴリズムを要求しました。:)

スペインでは、現在のナンバープレートには次のパターンがあります。

1234 XYZ

ここで、XYZはスペイン語の子音の完全なセットから取られた3つの子音です(「Ñ」を除く)。

時々、妻と旅行するとき、私たちはゲームをするのに使います。ナンバープレートが表示されたら、3つの子音を取得し、これら3つの子音を含む単語を作成して、ナンバープレートと同じ順序で表示します。例(スペイン語):

BCD
    BoCaDo (valid)
    CaBezaDa (not valid)
FTL
    FaTaL (valid)
    FLeTar (not valid)
FTR
    FleTaR (valid, wins)
    caFeTeRa (valid, loses)

最後の例でわかるように、勝者は最も少ない文字数を使用した人です。

チャレンジ

単語のリストと3つの子音のセットを受け取り、3つの子音を同じ順序で含むリスト内の最短の単語を見つける最短のプログラムまたは関数を作成します。このゲームでは、大文字と小文字は区別されません。

  • 単語リストの入力(最初のパラメーター)は、言語stringタイプの配列になります。2番目のパラメーター(3つの子音)はanotherになりstringます。ご使用の言語に適している場合stringは、3つの子音でパラメーターのリスト全体の最後の項目を検討してください。出力は別のものになりstringます。
  • 単語リスト内の単語は、発明された単語や無限の単語ではなく、標準の辞書にある単語になります。制限が必要な場合は、単語リストに50文字を超える単語がないと仮定します。
  • 有効な答えになる可能性のある同じ長さの単語が複数ある場合は、それらのいずれかを返すことができます。必ず1つの単語を返すか、3つの子音のパターンに一致する単語がない場合は空の文字列を返すようにしてください。
  • グループ内で子音を繰り返すことができるため、3つの子音の有効な入力は両方FLRGGGです。
  • スペイン語の子音は英語とまったく同じですが、「Ñ」が追加されています。母音は、強調された母音の追加と同じです: "áéíóúüü"。「-」や「 '」など、他の種類のマークはありません。
  • 単語リストと3つの子音の両方で大文字と小文字が常に同じであると仮定できます。

スペイン語の単語の実際のコレクションを使用してアルゴリズムをテストする場合は、100万を超える単語を含むファイル(15.9 MB)をDropboxからダウンロードできます

テストケース

Input: 'psr', {'hola' 'repasar' 'pasarais' 'de' 'caída' 'pequeñísimo' 'agüeros'}
Output: 'repasar'

Input: 'dsd', {'dedos' 'deseado' 'desde' 'sedado'}
Output: 'desde'

Input: 'hst', {'hastío' 'chest'}
Output: 'chest'

これはなので、妻を常に倒すのに役立つ最短のプログラムが勝ちます!:)


単語リスト内の単語はどのくらいの期間保証されますか?
ニール

2
実際のナンバープレートでは、文字Q も許可されていません。そしてWはない、適切なスペイン語の文字が、ある
ルイスMendo

2
リスト内の単語と3文字がすべて1つのケースにあると想定できますか?
ジョナサンアラン

1
@LuisMendo W1969年からスペイン語の手紙です。
ワレン

1
@walenそれが私が「適切」と言った理由です:-)それはスペイン語に存在しますが、外国人に感じます
ルイスメンドー

回答:


7

05AB1E10 8バイト

Leoのおかげで2バイト節約

ʒæså}éR`

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

説明

ʒ         # filter list, keep only members for which the following is true
  så      # input is in the
 æ        # powerset of the current word
    }     # end filter
     é    # sort by length
      R   # reverse
       `  # push separately (shortest on top)

私はhead最後にバイトを保存していましたが、一致しない場合は空のリストを出力します。


3
3ù #keep only those of length 3なぜこれが必要なのですか?
レオ

1
@レオ:私はそうではない、それは私の愚かだった。ありがとう:)
エミグナ

6

MATL30 29バイト

xtog!s2$S"1G!'.*'Yc!@gwXXn?@.

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

説明

x         % Implicitly take first input (string with three letters). Delete.
          % Gets copied into clipboard G, level 1
t         % Implicitly take second input (cell array of strings defining the
          % words). Duplicate
o         % Convert to numeric array of code points. This gives a matrix where
          % each string is on a row, right-padded with zeros
g         % Convert to logical: nonzeros become 1
!s        % Sum of each row. This gives the length of each word
2$S       % Two-input sort: this sorts the array of strings according to their
          % lengths in increasing order
"         % For each word in the sorted array
  1G      %   Push first input, say 'xyz'
  !       %   Transpose into a column vector of chars
  '.*'Yc  %   Concatenate this string on each row
  !       %   Transpose. This gives a char array which, when linearized in
          %   column-major order, corresponds to 'x.*y.*z.*'
  @g      %   Push corrent word
  w       %   Swap
  XX      %   Regexp matching. Gives a cell array with substrings that match
          %   the pattern 'x.*y.*z.*'
  n       %   Number of matchings
  ?       %   If non-zero
    @     %     Push cell array with current word, to be displayed as output
    .     %     Break loop
          %   Implicit end (if)
          % Implicit end (for)
          % Implicitly display stack

6

PHP、111バイト

$y=array_map(str_split,preg_grep("#".chunk_split($_GET[1],1,".*")."#",$_GET[0]));sort($y);echo join($y[0]??[]);

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


2
ナンバープレートは、配列ではなく文字列にする必要があります。ただし、修飾子は必要ありません。
タイタス

@タイタス修正!!
ヨルグヒュルサーマン

You can suppose the case will always be the same in both the word list and the three consonants.-正規表現修飾子は不要です。wordwrap代わりに試しましたjoin(str_split())か?
タイタス

@タイタス良いアイデア
ヨルクヒュルサーマン

5

ゼリー 12 11  10 バイト

ŒPċðÐfLÞḣ1

小文字(単語)のリストのリストと小文字(文字)のリストを受け入れ、文字に等しいサブシーケンスを含む最短の単語の最初を印刷する完全なプログラム(または存在しない場合は何もありません) )。

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

どうやって?

ŒPċðÐfLÞḣ1 - Main link: words; characters
   ðÐf     - filter keep words for which this is truthy:
ŒP         -   the power-set (all sub-sequences of the word in question)
  ċ        -   count (how many times the list of characters appears)
           - ...note 0 is falsey while 1, 2, 3, ... are truthy
       Þ   - sort by:
      L    -  length
        ḣ1 - head to index 1 (would use Ḣ but it yields 0 for empty lists)
           - implicit print (smashes together the list of lists (of length 1))

1
私が正しくあなたの説明を理解していれば「BRC」は「brrc」の部分文字列ではないので、これは、「BRC」の子音の順序のための「borracho」などの言葉を拒否するだろう
レオ

ああ@Leo、はい良いキャッチは、私はそれが失敗だと思う...
ジョナサン・アラン

@Leo -よく、それは固定の...(チェックは、各単語の全体のパワーセットは、「内に存在する」)、それは完全にgolfedされなくてもよい
ジョナサンアラン

5

Pyth- 22 21 19 12 11バイト

h+f/yTQlDEk

-1 Maltysenに感謝します。

入力として2行を使用します。1番目は3文字の文字列(小文字)で、2番目は小文字の単語リストです。

ここで試してみてください

説明:

h+f/yTQlDEk
       lDE   # Sort word list by length
  f          # Filter elements T of the word list...
    yT       # by taking the powerset...
   /  Q      # and checking whether the 3-letter string Q is an element of that.
 +        k  # Add empty string to the list (in case no results found)
h            # And take the first result (the shortest)

古い19バイトのソリューション:

h+olNf/-T"aeiou"QEk                       

@ジョナサンアラン:修正!それを指摘してくれてありがとう。
マリア

1
@JonathanAllan:彼は質問を編集して、その場合は空の文字列を返す必要があることを明確にしたようです。それに応じて回答を編集しました。
マリア

1
uは、LDとOLN置き換えることができるように、我々は、ソートによってD内のメタ演算子を持っている
Maltysen

5

Brachylog v2、11バイト

tlᵒ∋.&h⊆.∨Ẹ

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

関数の提出。(TIOリンクには、完全なプログラムであるかのように関数を実行するためのコマンドライン引数があります。)

説明

再び仕様の直接翻訳…

tlᵒ∋.&h⊆.∨Ẹ
t            The last element of {standard input}
   ∋.        contains the return value as an element
     &       and
      h      the first element of {standard input}
       ⊆.    is a subsequence of the return value
         ∨   alternate behaviour if no solution is found:
          Ẹ  return empty string
  ᵒ          tiebreak override: favour answers that have a low
 l           length

あなたは実際にほとんど答えることができますh⊆.&t∋-評価順序を交換すると、Brachylogはデフォルトで最短の回答を選択します(最初の制約はデフォルトのタイブレークとしてかなり便利な「最短」です)-しかし、その場合、Brachylogの残念ながら、答えが実際に見つからない場合、評価アルゴリズムは無限ループに入ります。したがって、回答のほぼ半分は、適切な回答がない場合の処理​​に専念しています。それでも、lᵒタイブレークオーバーライド(技術的には一種であり、リストの先頭に近い要素を優先するデフォルトのタイブレークは2バイトのみです。他の3つは、Brachylogのデフォルトの「ソリューションなし」センチネル値とは対照的に、出力が見つからない場合に空の文字列を出力する必要性から生じます(これ.に従う必要がない場合、最終は暗黙的であるため)。

興味深いことに、以前にBrachylogに実装されていた機能があり、ここで1バイト節約できました。ある時点で、などの構文を使用して?₁、入力引数から要素を抽出でき?₂ます。これにより、プログラムをtlᵒ∋.⊇?₁∨Ẹ10バイトのみに再配置できます。残念ながら、使用された実装は実際には機能しなかった(そして、他の多くの動作中のプログラムが壊れた)ため、元に戻されました。ただし、プログラムは「概念的に」10バイト長であると考えることができます。


4

ハスケル 129 125 74バイト

import Data.List
l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0

@nimiへのクレジット


1
あなたは、右端置き換えることができますmapし、filterリストと理解を。既にData.Listスコープ内にあるので、使用sortOn lengthしてヘッドを選択し、最小の長さの要素を見つけることができます。最後にy、中置関数を作成します。これはすべてfk不必要ですl#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
nimi

あなたが正しい!ゴルフを始めたばかりです!ありがとう!
ダビデスパタロ

1
もう1つ:インポートをData.Listsに切り替えると、:のargmin代わりに使用sortOnして保存できます。持っている多くの素敵な機能を!!0l#w=argmin length[...]Data.Lists
nimi

3

Perl、53バイト

48バイトのコード+の5 -paF

$"=".*";($_)=sort{$a=~y///c-length$b}grep/@F/,<>

これはに補間リストという事実を利用してm//、オペレータが利用$"からの最初の入力文字列を変更する変数psrへのp.*s.*rその後の各単語をマッチしているとでソートさをlength

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


リストに「adsd」を挿入すると、プログラムはそれを見つけられません。検索する最初の文字は、単語の最初である必要はありません。
チャーリー

@CarlosAlejo入力には末尾の改行が必要ですが、問題なく動作します:オンラインで試してください!。しかし、<<<オペレーターがコマンドラインでそれを追加するので、それは私を油断しました。
ドムヘイスティングス

3

JavaScript(ES6)、77 75 72バイト

カリー化構文の3つの子音cと単語のリストをl受け取ります(c)(l)。同じケースで両方の入力が期待されます。

c=>l=>l.map(w=>x=!w.match([...c].join`.*`)||!x[w.length]&&x?x:w,x='')&&x

テストケース


c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))72のために、私は考える
LarsW

@LarsW確かに、ありがとう!ただし、新しいルールに準拠するために別のアプローチを選択しました。3つの子音のパターンに一致する単語がない場合は空の文字列です
アーナルド

3

R、101バイト

初めてのゴルフ!これは何らかの形で凝縮できると確信しています

可能な入力の文字列xと文字ベクトルyを受け取ります

w=pryr::f((b=y[sapply(gsub(paste('[^',x,']'),'',y),function(l)regexpr(x,l))>0])[which.min(nchar(b))])

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

編集:私のバージョンは135でした。Scroobleは-34に感謝します!


1
PPCGへようこそ!これは、入力がハードコードされた変数にあるスニペットのように見えます。回答は、完全なプログラムまたは呼び出し可能な関数である必要があります。可能なI / Oメソッドについては、これ(または他のRの回答)をご覧ください。
マーティンエンダー

2

網膜、58バイト

O#$^`¶.+
$.&
s`^((.)(.)(.).*¶(?-s:(.*\2.*\3.*\4.*)))?.*
$5

オンラインでお試しください!1行で3つの子音を取得し、その後のすべての行で単語のリストを取得します。説明:長さによって数値的にキーが付けられた最初の行を除いOてリスト¶.+をソートします。次に、3つの子音を順番に含む行を探します。最後よりも適切な行が存在する場合、つまり最も短い場合、そのような行が出力になります。それ以外の場合、出力は空です。の効果を一時的にオフにして、1行のみが一致するようにします。#$$.&?-s:s`


1
私はそれらが3つのへそまたは3つの胸であるかどうか決定できません。
チャーリー

@CarlosAlejoもしかしたら、Eccentrica Gallumbitsを考えていますか?
ニール

Total Recallからエイリアンのことを考えていましたが、Eccentricaもオプションになり得ました... :)
チャーリー

2
@CarlosAlejoどうやらメアリーはEccentrica Gallumbitsへのオマージュです。
ニール

1

ピップ、17バイト

@:qJ`.*`N_FI#_SKg

単語リストをコマンドライン引数として、子音を標準入力から取得します。 オンラインでお試しください!

説明

                   g is list of cmdline args (implicit)
              SKg  Sort g using this key function:
            #_      Length of each item (puts shortest words first)
          FI       Filter on this function:
  q                 Line of input
   J`.*`            joined on regex .* (turns "psr" into `p.*s.*r`)
        N_          Count regex matches in item (keeps only words that match)
@:                 Get first element of result (using : meta-operator to lower precedence)
                   If the list is empty, this will give nil, which results in empty output

1

Java 8、132 126バイト

s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}

@Nevayのおかげで-6バイト。

説明:

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

s->a->{              // Method with two String-array parameters and String return-type
  String r="";       //  Result-String, starting empty
  for(String x:a)    //  Loop over the words
    r=(x.length()<r.length()
                     //   If a word is smaller than the current `r`,
      |r.isEmpty())  //   or `r` is still empty
      &x.matches(r.format(".*%s.*%s.*%s.*",s))?
                     //   And if the word is valid
       x             //    Change `r` to the current word
      :              //   Else:
       r;            //    Leave `r` the same
  return r;}         //  Return the result

1
126バイト:s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}
ネベイ


0

MATL28 27 26バイト

x"l1G@g3XNXm/@gn*v]&X<2Gw)

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

x-最初の入力(3文字の文字列)を暗黙的に取得して削除します。レベル1のクリップボードGに自動的にコピーされます(この部分は@Luis Mendoの回答に触発されました)。

" -暗黙的に2番目の入力(単語のセル配列)を取得し、繰り返し処理します。

l -後で使用する1を押す

1G -最初の入力をプッシュする(「psr」など)

@g -現在の単語を配列としてプッシュする

3XN-- nchoosek単語から3文字のすべての組み合わせを取得する

Xm-ナンバープレートコード「psr」がこれらの組み合わせの1つであるかどうかを確認します。falseの場合は0、trueの場合は1を返します。

/-1(以前にプッシュした)をこの結果で割ります。0をInfsに変更します

@gn -現在の単語の長さを取得する

*-長さを除算結果で乗算します。wordに3文字が含まれる場合はそのままの長さを返し、そうでない場合はInf

v -これらの結果を単一の配列に垂直に連結します

] -閉ループ

&X< -その配列から最小値のインデックス、つまり文字を含み、最小の長さの単語が見つかったインデックスを取得します

2G -2番目の入力をもう一度押します

w -最小インデックスをスタックの先頭に戻す

) -最小のインデックスで単語の配列にインデックスを付け、最小の長さで有効な単語を返します

(暗黙的な出力。)


古い:

x"@g1Gy3XNXm1w/wn*v]&X<2Gw)

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.