これは一意に連結可能ですか?


10

で接頭コードについては、この課題は、我々は接頭コードが一意に連結可能であることを学びました。

つまり、区切り文字を使用せずに、あいまいさを排除して結合できます。

たとえば、[1,2,45]はプレフィックスコードであるため、セパレータなしで1245245112145として結合できます。あいまいさはありません。

ただし、その逆は常に正しいとは限りません。

たとえば、[3,34]はプレフィックスコードではありません。ただし、同じことを行うことができます:3333434334333。あいまいさはありません。スマートなパーサーが必要になるだけです。

ただし、[1,11]は一意に連結可能ではありません。1111は5つの方法で解釈できるためです。

ゴール

あなたの仕事は、文字列のリスト(ASCII)を入力として受け取るプログラム/関数を記述し、それらが一意に連結可能かどうかを判断することです。

細部

重複はfalseとしてカウントされます。

得点

これはです。バイト単位の最短のソリューションが優先されます。

テストケース

正しい:

[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]

誤り:

[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]

私が問題を正しく理解していることを確認するためだけに、文字列の1つが他の文字列の任意の組み合わせで構成されている場合、それは一意に連結可能ではありませんか?その詳細をより明確にする必要があります。
— ジェームズ

これは停止の問題と同等ではないのですか?
— feersum 2016年

これが停止問題と同等である理由を実証できますか?
— Leaky Nun

とは言いませんでしたが、そうだろうと思いました。もう少し考えた後、私はそうではないと信じています。
— feersum

@feersumここでは、この問題のために、ポリ時間アルゴリズムです:en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
— isaacg

回答:


5

05AB1E、15バイト

電話でので、説明は後で続く必要があります。コード:

gF¹N>ã})€`€JDÚQ

CP-1252エンコーディングを使用します。オンラインでお試しください!。

最後のテストケースに必要なメモリが多すぎるため、機能しない可能性があります...


3
スマートフォンで入力できるのは非常に印象的です。
— ジェームズ

3
@DrGreenEg​​gsandHamDJ約40分かかりました...
— Adnan

2
@アドナン私はあなたの電話キーボードのテキスト予測機能がそのすべての不要な記号をどう思うか疑問に思います:-)
— Luis Mendo

1
@LuisMendoハハ、ランダムに05AB1Eプログラムを友達に送ったのは一度だけです。
— Adnan

これは、最短の衝突の長さに上限を設定することで機能すると思います。私は正しいですか?
— Peter Taylor

4

CJam(54バイト)

q_N/:A\,{_Am*:${~1$,<=},{~\,>}%La:L-}*A,A_&,-A*](\M*&!

stdinの入力を改行で区切られたリストとして受け取ります。

オンラインデモ

重複するコードワードを処理する必要がない場合は、これを44に短縮できます。

q_N/\,{_W$m*:${~1$,<=},{~\,>}%La:L-}*](\M*&!

または、CJamに2番目の各項目の最初のリストから1つの項目のみを削除する配列減算がある場合、48になる可能性があります...

解剖

これはSardinas-Pattersonアルゴリズムですが、最適化されていません。各ダングリングサフィックスは最大で1回しか表示されないため、入力(分離文字を含む)の文字数と同じ回数だけメインループを実行すると、十分であることが保証されます。

CJamインタープリターの間違いなくバグであるものを回避しなければならなかったことに注意してください。

"abc" "a" #   e# gives 0 as the index at which "a" is found
"abc" "d" #   e# gives -1 as the index at which "d" is found
"abc" ""  #   e# gives an error

したがって、接頭辞チェックは複雑では1$,<=なく\#!

e# Take input, split, loop once per char
q_N/\,{
  e# Build the suffixes corresponding to top-of-stack and bottom-of-stack
  _W$m*
  e# Map each pair of Cartesian product to the suffix if one is the prefix of the other;
  e# otherwise remove from the array
  :${~1$,<=},{~\,>}%
  e# Filter out empty suffixes iff it's the first time round the loop
  La:L-
}*
e# If we generated an empty suffix then we've also looped enough times to generate all
e# of the keywords as suffixes corresponding to the empty fix, so do a set intersection
e# to test this condition.
](\M*&!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.