여기서 아이디어는 거의 반복되는 패턴 을 생성하는 것 입니다. 즉, 구성되는 시퀀스는 마지막 순간에 일부 하위 시퀀스의 반복을 피하기 위해 변경됩니다. 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}
하여 트릭 및 유사한 트릭을 허용하지 않습니다.) - 평상시와 같이 표준 허점 은 허용되지 않습니다.
- 점수는 바이트 단위입니다. 이것은코드 골프따라서 가장 짧은 참가작이 승리합니다 (아마도 보너스 참조).
- 보너스 : 각 단계에서 가장 낮은 숫자를 선택하십시오. 경우
1
와3
시퀀스의 다음 자리에 대한 가능한 선택은, 선택1
. 점수에서 5 바이트를 뺍니다 . 그러나 아래 참고 사항에 유의하십시오.
노트!
막 다른 골목이 가능합니다. 프로그램이나 기능은이를 피해야합니다. 예를 들면 다음과 같습니다.
그루터기 : 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130120 그루터기 : 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130123 그루터기 : 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310320 그루터기 : 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310321301203102130
이러한 각 시퀀스는 (를 사용하지 않고 4
) 더 이상 확장 할 수 없습니다 . 그러나 첫 번째 두 번째와 두 번째 두 사이에는 결정적인 차이가 있습니다. 공유 된 초기 서브 시퀀스를 X
이것을보다 명확하게하기 위해로 대체 할 것 입니다.
그루터기 : X2130120 그루터기 : X2130123 그루터기 : X320 그루터기 : X321301203102130
의 마지막 두 자리가 X
있다 10
, 그래서 다음 자리에 유일하게 가능한 선택 사항은 다음 2
과 3
. 선택하면 2
시퀀스 가 종료 되어야 하는 상황이 발생합니다 . 욕심 많은 알고리즘은 여기서 작동 하지 않습니다 . (어쨌든 역 추적 없이는 안됩니다.)
n
없지만, 프로그램이 발견 한 그루터기가 매번 평균 10 자리 씩 길어지는 경향이 있다고 가정하면 무한 시퀀스가 존재한다고 확신합니다. 세미 욕심 많은 알고리즘이 임의로 큰 시퀀스에 대해 어떻게 테스트 될 수 있는지 잘 모르겠습니다. 요구 사항 을 n
= 1000으로 제한하고 더 높게 걱정할 수는 없습니다 n
.
AA
정말 입력되는 ABA
경우 B
비어 있습니다. 이는 일부 솔루션을 간소화하는 데 도움이 될 수 있습니다.
n
있습니까? 누군가가 휴리스틱 세미 욕심 알고리즘을 제공하는 경우 알고리즘이 매우 긴 시간 동안 문제를 일으키지 않는지 어떻게 확인할 것입니까? 일반적인 문제는 흥미로운 것이며 패턴 회피 부분에서 패턴의 길이를 제한하는 것을 찾을 수 없었습니다. 누군가가 일반적인 레시피를 생산할 수 있다면, 이것이 최선의 방법이라고 생각합니다.