長さのリスト、およびそれらの長さを表す文字列が与えられた場合、それらは一致しますか?


16

長さのリストを表すパターンと、それらの長さを表す文字列が与えられた場合、それらは一致しますか?

興味のある人にとって、これは、ノノグラムの行または列が正しいかどうかを検証することと同等の質問です。ただし、これらのパズルになじみのない人にとって質問の混乱を少なくするために、Nonogramsに関連するすべての言語を省略しました。

入力

改行で区切られた2行のデータ。

  1. 最初の行は、スペースで区切られた整数のリストです。例:

    3 6 1 4 6
    

    この行、2番目の行が一致しなければならない正の長さの不明な空のスペースで区切られた、整数リストに等しいサイズの塗りつぶされたスペースのパターンを示しています。一致した文字列の先頭と末尾に空のスペースが存在する場合もあります。

  2. 2行目は、1行目のパターンと一致する場合と一致しない場合があります。それは完全で構成され#x_。この行の長さは、少なくとも最初の行の整数合計と、異なる整数の数から1を引いた長さであることが保証されておりこれより長くすることもできます。したがって、この場合の2行目は、少なくとも24文字、または24文字の長さが保証されています。最初の行のパターンと一致する24文字の行の例を次に示します。(3+6+1+4+6) + (5) - 1

    ###_######_#_####_######
    

記号の意味:

  • # これは塗りつぶされたボックスを表します
  • x これは、「空であることが保証されている」とマークされたボックスを表します
  • _ これは、不明/マークされていないボックスを表します。

ゴール

アイデアは次のとおりです。

  1. 2行目が最初の行のパターンを満たす有効な行である可能性があることを検証します。
    • ERROR不明なスペースを埋めることができない場合、#またはx最初のものと一致させることができない場合は、明確なエラーメッセージを印刷する必要があります(これを選択する方法はあなた次第です。以下の例では、5文字である必要はありません)ライン。
  2. 行に完全に配置され、スペースで区切らた整数のゼロインデックスのインデックスを出力します。あいまいさがある場合は、indexを出力しないください

例:

Input:                    |  Output:    |  Reason:
--------------------------------------------------------------------------
3 6 1 4 6                 | 0 1 2 3 4   |  This is a complete string that 
###x######x#x####x######  |             |  matches perfectly.
--------------------------------------------------------------------------
1 2 1                     | 0 1 2       |  There is no ambiguity which filled cells 
#____xx___##__x_#         |             |  correspond to which parts of the pattern.
--------------------------------------------------------------------------
1 2 1                     |             |  I don't know whether the filled block is
____#___x                 |             |  part of the 1, 2, or 1, so output nothing.
--------------------------------------------------------------------------
1 2 1                     | ERROR       | The first unknown cell will create a block that
#_#x_#                    |             | matches either 1 1 or 3, but not 1 2.
--------------------------------------------------------------------------
1 2 1                     | 0 2         | Even though we know where all the filled cells
#____#                    |             | must be, only 0 and 2 are actually filled here.
--------------------------------------------------------------------------
1 1 1 1                   |             | There are so many possible ways to do fill this,
__#_______#____           |             | we don't know which indices are actually matched.
--------------------------------------------------------------------------
4 4                       |             | Again, we don't know WHICH 4 is matched here, 
______x####________       |             | so output nothing.
--------------------------------------------------------------------------
4 4                       | 0           | However, here, there's no room for a previous 4,
__x####________           |             | so the displayed 4 must be index 0.
--------------------------------------------------------------------------
3                         | ERROR       | We can't fit a 3 into a space before or after
__x__                     |             | the x, so this is impossible to match.
--------------------------------------------------------------------------
5 1 3                     | 0           | While we can match the 5, we don't know whether
x#####x____#____          |             | the single block matches the 1 or the 3.
--------------------------------------------------------------------------
3 2 3                     | 1           | The two has been completely placed,
____##x##____             |             | even though we don't know which it is.

ルール:

入力を改行で区切られたStringまたはSTDIN(または最も近い代替)として受け取り、出力をスペースで区切られたStringとして返すか、STDOUT(または最も近い代替)に出力するプログラムまたは関数を作成できます。オプションで、出力に単一の末尾の改行を含めることができます。

さらに、もはや面白くない標準的な抜け穴禁止されています。


1
これは、ノノグラムを解決するためのものですよね?非グラムに言及することは、それを解決する人にとって課題がすぐに意味をなすので役立つかもしれません。
xnor

@ jimmy23013応答で編集されました。
durron597

回答:


5

Perl、134バイト

(1つのスイッチを含む)

perl -pe '$p.="([#_]{$_})[x_]+"for@l=split;chop$p,$_=<>;/^[x_]*$p*$(?{$h[$_-1].=$$_ for 1..@l})(?!)/;$_=@h?join$",grep{$h[$_]!~/_/}0..$#l:ERROR'

STDINから2行の入力を受け取ります。すべての入力に対して再実行する必要があります。

アイデアは、最初に指定された長さに一致するすべての可能なパターンを抽出することです。我々は長さがあれば、例えば、1 2パターンを#_x_#_、次いで、マッチングパターンである(#, _#)(#, #_)。次に、インデックスごとに一致したパターンを連結します(##, _##_)。例では、結果はlist です。次に、リスト内の「#」文字のみを持つすべての文字列のインデックスを出力します。

ここでPerlの正規表現からすべての可能な一致を抽出するメソッドを得ました。


涼しい。未追加のバージョンとイデオンのリンクを追加してください。
durron597

もちろん、回答の最後にリンクを追加しました。
svsd

ゴルフされたコードスニペットがどれほどひどいものであるかの実例!少なくとも私には。
アルジュン

1
@Arjun Golfingはコードを難読化する傾向があります。ゴルフのコードには美しさがありますが、それが書かれている言語を知っている場合のみです。
svsd15年

1
問題の説明では1つのシナリオがまだあいまいであるため、新しい例を追加しました。幸い、その場合でもプログラムは正しく動作します。
durron597
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.