혼돈의 드롭 (최소 비 주기적 시퀀스 구성)


9

여기서 아이디어는 거의 반복되는 패턴 을 생성하는 것 입니다. 즉, 구성되는 시퀀스는 마지막 순간에 일부 하위 시퀀스의 반복을 피하기 위해 변경됩니다. AA 및 ABA 유형의 하위 시퀀스는 피해야합니다 (여기서 B는 A보다 길지 않습니다).

예 :

계속해서 설명을 명확하게하기 위해 작은 예제를 모두 나열하여 시작하겠습니다. 0부터 시작하겠습니다.

유효 : 0

무효 : 00 (AA 패턴)
유효 : 01

유효하지 않음 : 010 (ABA 패턴)
무효 : 011 (AA 패턴)
유효 : 012

유효 : 0120
잘못된 : 0121 (ABA 패턴)
무효 : 0122 (AA 패턴)

유효하지 않음 : 01200 (AA 패턴)
잘못된 : 01201 (ABA 패턴; 01-2-01)
잘못된 : 01202 (ABA 패턴)
유효한 : 01203

이제는 4증거가 없지만 a 가 필요하지 않다고 강력하게 믿고 있습니다 0123. (아마도 AA 패턴이없는 무한 문자열을 갖는 데 세 문자 만 필요한 방법과 밀접한 관련이있을 수 있습니다. 여기에는 Wikipedia 페이지 가 있습니다.)

입출력

입력은 0이 아닌 양의 단일 정수 n입니다. 당신은 그것을 가정 할 수 있습니다 n <= 1000.

출력은 n금지 된 패턴 (AA 또는 ABA)과 일치하는 서브 시퀀스가없는 문자 시퀀스입니다.

샘플 입력 및 출력

>>> 1
0

>>> 2
01

>>> 3
012

>>> 4
0120

>>> 5
01203

>>> 50
01203102130123103201302103120132102301203102132012

규칙

  • 문자 0123만 허용됩니다.
  • B는 A.이이 상황을 회피하는 것보다 더 이상 없습니다 012345다음되어야 6하기 때문에 0123451이있다을 : 1-2345-1. 다시 말해,이 시퀀스는 사소하고 흥미롭지 않을 것입니다.
  • n하드 코딩을 제외한 원하는 방법을 통해 입력 할 수 있습니다 .
  • 출력이 쉬운 지 여부에 따라 목록 또는 문자열이 될 수 있습니다.
  • 무차별 힘 ; 실행 시간은 아주 느린 컴퓨터에서 최대 1 시간 정도 여야합니다 n=1000. (이것은의 전체 n길이 순열을 반복하는 솔루션을 실격 화 {0,1,2,3}하여 트릭 및 유사한 트릭을 허용하지 않습니다.)
  • 평상시와 같이 표준 허점 은 허용되지 않습니다.
  • 점수는 바이트 단위입니다. 이것은따라서 가장 짧은 참가작이 승리합니다 (아마도 보너스 참조).
  • 보너스 : 각 단계에서 가장 낮은 숫자를 선택하십시오. 경우 13시퀀스의 다음 자리에 대한 가능한 선택은, 선택 1. 점수에서 5 바이트를 뺍니다 . 그러나 아래 참고 사항에 유의하십시오.

노트!

막 다른 골목이 가능합니다. 프로그램이나 기능은이를 피해야합니다. 예를 들면 다음과 같습니다.

그루터기 : 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130120
그루터기 : 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130123
그루터기 : 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310320
그루터기 : 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310321301203102130

이러한 각 시퀀스는 (를 사용하지 않고 4) 더 이상 확장 할 수 없습니다 . 그러나 첫 번째 두 번째와 두 번째 두 사이에는 결정적인 차이가 있습니다. 공유 된 초기 서브 시퀀스를 X이것을보다 명확하게하기 위해로 대체 할 것 입니다.

그루터기 : X2130120
그루터기 : X2130123
그루터기 : X320
그루터기 : X321301203102130

의 마지막 두 자리가 X있다 10, 그래서 다음 자리에 유일하게 가능한 선택 사항은 다음 23. 선택하면 2시퀀스 종료 되어야 하는 상황이 발생합니다 . 욕심 많은 알고리즘은 여기서 작동 하지 않습니다 . (어쨌든 역 추적 없이는 안됩니다.)


실제 시간에 출력을 제공하지 않더라도 가능한 모든 문자열을 테스트하는 무차별 대입 전략을 사용할 수 있습니까? 모두를위한 해결책이 있다는 것을 알고 n있습니까? 누군가가 휴리스틱 세미 욕심 알고리즘을 제공하는 경우 알고리즘이 매우 긴 시간 동안 문제를 일으키지 않는지 어떻게 확인할 것입니까? 일반적인 문제는 흥미로운 것이며 패턴 회피 부분에서 패턴의 길이를 제한하는 것을 찾을 수 없었습니다. 누군가가 일반적인 레시피를 생산할 수 있다면, 이것이 최선의 방법이라고 생각합니다.
xnor

나는 규칙에서 무차별적인 힘을 허용하지 않았다고 생각합니다. 아마 강조해야 할 것 같습니다. 나는 모든 것에 대한 해결책이 있다는 증거n없지만, 프로그램이 발견 한 그루터기가 매번 평균 10 자리 씩 길어지는 경향이 있다고 가정하면 무한 시퀀스가 ​​존재한다고 확신합니다. 세미 욕심 많은 알고리즘이 임의로 큰 시퀀스에 대해 어떻게 테스트 될 수 있는지 잘 모르겠습니다. 요구 사항n= 1000으로 제한하고 더 높게 걱정할 수는 없습니다 n.
El'endia Starman

4
나는 가정 AA정말 입력되는 ABA경우 B비어 있습니다. 이는 일부 솔루션을 간소화하는 데 도움이 될 수 있습니다.
mathmandan

답변:


6

망막 , 86 바이트-5 = 81

$
_
(r`^(?<-2>.)+_((.)+)\b$
$1!
\b$
0
3#
#
0#
1
1#
2
2#
3
)r`\1(?<-2>.)*((.)+)$
$0#
!
<empty>

어디 <empty>빈 후행 라인을 나타냅니다. -s플래그 를 사용하여 단일 파일에서 위의 코드를 실행할 수 있습니다 .

입력은 단항 으로 제공해야합니다 ( 예 :)111111 . 나는 아직 수천 가지의 출력을 테스트하지 않았지만 두 개의 정규 표현식이 잠시 후에 약간 느려질 수 있지만 몇 초 안에 쉽게 수백을 처리 할 수 ​​있습니다.

설명

이것은 간단한 역 추적 솔루션입니다.

  1. 을 추가하십시오 0.
  2. 현재 시퀀스가 ​​유효하지 않은 경우 모든 후행 3을 제거하고 마지막이 아닌을 증가시킵니다 3.
  3. 원하는 길이의 유효한 순서가 될 때까지 반복하십시오.

이 역 추적은 문자열이 한 번의 반복을 통해 변경되지 않으면 중단되는 정규식 대체 루프로 구현됩니다.

$
_

이것은 _입력 에 a 를 추가하는데 , 이것은 우리가 구축하고있는 순서에서 단항 입력을 분리하는 데 사용됩니다.

(r`^(?<-2>.)+_((.)+)\b$
$1!

이것은 루프에서 첫 번째 대체입니다 (선행으로 표시 (). 정규식은 a) 문자열 끝에 단어 문자 (예 : 숫자)가 있습니다 (문자열이 유효 함을 의미합니다-유효하지 않은 시퀀스는 후행으로 표시됩니다 #). b) 최소한 입력에서와 같이 시퀀스에서 많은 문자 ( 밸런싱 그룹을 사용하여 확인 ). 이 경우 입력을 제거하고 a를 추가하십시오 !. 이렇게 !하면 루프의 모든 정규 표현식이 실패하여 종료됩니다.

\b$
0

끝에 단어 문자가있는 경우 (즉, 시퀀스가 ​​유효하고 이전 단계에서 루프가 종료되지 않은 경우)을 추가하십시오 0.

3#
#

(대신) 시퀀스가 ​​유효하지 않은 것으로 표시되고로 끝나는 경우이를 3제거합니다 3(그러나 현재 접두어에 대한 연속이 없기 때문에 시퀀스를 유효하지 않은 상태로 두십시오. 따라서 다음 문자도 역 추적해야합니다).

0#
1
1#
2
2#
3

시퀀스가 유효하지 않은 것으로 표시 3되고 끝 이외의 숫자가 있으면 숫자 를 증가시키고 마커를 제거합니다.

)r`\1(?<-2>.)*((.)+)$
$0#

루프에서 마지막 대체 (로 표시 )) 문자열이 끝나는 지 여부를 확인합니다 ABA(여기서 B길지 A않지만 비어있을 수 있음). 의 상대적인 길이 A와는 B다시 밸런싱 그룹을 사용하여 확인하고,의 반복은 A단순한 역 참조하여 판정한다.

이 정규식이 일치하면을 추가하여 시퀀스를 유효하지 않은 것으로 표시합니다 #.

!
<empty>

루프가 종료되면를 제거 !하고 원하는 출력을 유지하기 만하면됩니다.


2

파이썬 2, 175-5 = 170 바이트

n=input();s='';u=j=-1
while n>len(s):
 while u>2:u=int(s[0]);s=s[1:]
 u+=1;t=`u`+s;m=c=0
 while t[c:]*0**m:c+=1;i=t[c:].find(t[:c]);m=j<i<=c
 if c>=len(t):s=t;u=j
print s[::j]

역 추적 기능이있는 욕심 많은 알고리즘입니다. 나는 그것이 더 짧기를 바란다. 나는 그것이 정확하기를 바랍니다 (아래 참조).

한 번에 한 자리 숫자로 문자열을 작성합니다. d이미 발견 된 일련의 숫자가 주어지면 a를 st 숫자 0로 추가하려고합니다 (d+1). 그래도 작동하지 않으면 a 1, a 2, a를 시도 하십시오 3. 이들 중 어느 것도 작동하지 않으면 d숫자 로 돌아가서 증가하거나 (보다 작은 경우 3) 제거하거나 (같으면 3이전 숫자를 증가시키는 등) 제거합니다.

유효성 검사는 그 .find안에 있는 라인입니다 . 누군가 내 코드를 읽으려는 경우이 프로그램이 실제로 문자열을 뒤로 저장한다는 것을 말해야합니다. 즉, 앞에 숫자를 추가한다는 의미입니다 . 따라서 검사는 문자열에서 첫 번째 c 숫자가 나중에 다시 나타나는 위치 ( 첫 번째 숫자 다음에 있는 위치)를 찾고 c그러한 위치가있는 경우 중간 길이가 최대인지 여부를 확인합니다 c.

(물론 인쇄하기 전에 문자열을 뒤집습니다.)

또한 더 빠를 수도 있습니다. 원래 효율성을 위해 다양한 루프를 일찍 종료했지만 귀중한 바이트가 필요했습니다. 그래도 여전히 범위에서 OK입니다 n=1000.

어쨌든 프로그램은 작은 자릿수에 대한 선호를 나타내는 것처럼 보이지만 매우 선호되는 것은 아닙니다. 예를 들어, 그것을 실행하면 0, 1, 2, 3으로 끝나는 n=2000문자열이 나옵니다 . 다른 사람이 욕심 많은 알고리즘을 연구하고 있다면 아마도이 결과를 확인할 수 있습니다. 또는 숫자로 카운트를 얻었 습니다.52350249747830210312013021n=1000[263, 251, 248, 238]

마지막으로,이 수는 대칭 분포를 암시하는 것으로 언급합니다. 마치 우리가 균일 분포로 시작한 것처럼 일부를 3' 로, 일부 를 0' 21' 에스. 그러나 분명히 그것은 우연의 일치 일 수 있습니다. 나도 몰라!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.