이것이 고유하게 연결 가능한가?


10

에서 접두사 코드에 대한이 도전 , 우리는 접두사 코드는 유일하게 concatenable 것을 배웠습니다.

즉, 구분 기호없이, 모호하지 않고 함께 연결할 수 있습니다.

예를 들어 [1,2,45]는 접두사 코드이므로 구분 기호없이 1245245112145와 같이 결합 할 수 있으며 모호성이 없습니다.

그러나 그 대화가 항상 사실은 아닙니다.

예를 들어 [3,34]는 접두사 코드가 아닙니다. 그러나 나는 똑같이 할 수 있습니다 : 3333434334333, 그리고 모호성이 없습니다. 더 똑똑한 파서 만 있으면됩니다.

그러나 1111은 5 가지 방식으로 해석 될 수 있기 때문에 [1,11]은 고유하게 연결될 수 없습니다.

작업은 문자열 목록 (ASCII)을 입력으로 사용하는 프로그램 / 함수를 작성하고 고유하게 연결 가능한지 확인하는 것입니다.

세부

중복은 거짓으로 간주됩니다.

채점

이것은 입니다. 바이트 단위의 최단 솔루션이 승리합니다.

테스트 케이스

진실:

[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]

도전을 올바르게 이해하기 위해 문자열 중 하나가 다른 문자열의 조합으로 구성된 경우 고유하게 연결할 수 없습니까? 세부 사항을 더 명확하게해야합니다.
James

이것이 중지 문제와 동등하지 않습니까?
feersum

이것이 왜 정지 문제에 해당하는지 설명 할 수 있습니까?
Leaky Nun

나는 그것이 아니라고 생각했지만 그럴지도 모른다. 좀 더 생각한 후에는 그렇지 않다고 생각합니다.
feersum

@feersum이 문제에 대한 폴리 시간 알고리즘은 다음과 같습니다. en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

답변:


5

05AB1E , 15 바이트

전화상에서 나중에 설명을 따라야합니다. 암호:

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

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .

마지막 테스트 사례에 대해 너무 많은 메모리를 사용하므로 작동하지 않을 수 있습니다.


3
휴대 전화에서 입력 할 수 있다는 것은 매우 인상적입니다.
James

3
@DrGreenEggsandHamDJ 약 40 분이 걸렸습니다 ...
Adnan

2
@Adnan 전화 키보드의 텍스트 예측자가 모든 쓰레기 기호에 대해 어떻게 생각하는지 궁금합니다. :-)
Luis Mendo

1
@LuisMendo Haha, 친구에게 임의의 05AB1E 프로그램을 보낸 것은 한 번만 발생했습니다.
Adnan

가장 짧은 충돌 길이에 상한을 배치하여 이것이 효과가 있다고 생각합니다. 내가 맞아?
피터 테일러

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에 배열 빼기가 있으면 두 번째 항목의 첫 번째 목록에서 하나의 항목 만 제거하면 48이 될 수 있습니다.

해부

이것은 Sardinas-Patterson 알고리즘 이지만 최적화되지 않았습니다 . 각 댕글 링 접미어는 최대 한 번만 나타나므로 입력 (세퍼레이터 포함)에 문자가있는 횟수만큼 메인 루프를 실행하면 충분합니다.

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.