추상 재 작성 챌린지 (로버)


9

이것은 다소 -처럼 도전. 이것은 강도의 실입니다. 경찰의 실이 여기에 있습니다 .

강도

경찰은 추상적 재 작성 시스템을 게시 할 것입니다. 귀하의 작업은 다시 쓰기 규칙을 적용하여 소스 문자열에서 대상 문자열에 도달 할 수 있거나 도달 할 수 없음을 증명하여 제출을 크랙하는 것입니다. 소스 문자열로 시작하고 대상으로 끝나는 일련의 다시 쓰기 규칙을 게시하거나 이것이 존재하는지 여부를 수학적으로 증명하여이를 수행 할 수 있습니다.

자세한 내용과 정의 는 경찰 스레드 를 참조하십시오.


아! 나는 잘못된 질문에 현상금을 걸었습니다. 이것은 경찰의 도전에 대한 것이 었습니다. 그래서 누군가는 임의의 현상금을 얻습니다.
Nathaniel

걱정하지 마십시오. 현상금을 환불했습니다.
James

@DJMcMayhem : Huh ... 그래서 SE API 는이 질문을 추천 된 것으로 표시하지만 현상금이나 마감일은 없습니다. : o 오, 글쎄, 내 사용자 스크립트에 입력 유효성 검사를 추가 할 시간입니다.
Ilmari Karonen

답변:


16

jimmy23013

이것을 위해 거꾸로 작업합시다. 먼저 숫자를 이진 표현으로 바꿉니다. 에서 VW626206555675126212043640270477001760465526277571600601로 이동 합니다 VW++__+_++__+____++_+_++_++_+++_++++_+__+_+_++__+___+_+____+___++++_+______+_+++___+__++++++________++++++____+__++_+_++_+_+_++__+_+++++++_++++__+++_______++______+. 다음으로, 우리의 역을 계속 적용 DCW:W+하고 DW:W_때까지 우리는 모든 심볼을 취소합니다. 우리의 결과는 지금 VDCDCDDDCDDCDCDDDCDDDDDCDCDDCDDCDCDDCDCDDCDCDCDDCDCDCDCDDCDDDCDDCDDCDCDDDCDDDDCDDCDDDDDCDDDDCDCDCDCDDCDDDDDDDCDDCDCDCDDDDCDDDCDCDCDCDCDCDDDDDDDDDCDCDCDCDCDCDDDDDCDDDCDCDDCDDCDCDDCDDCDDCDCDDDCDDCDCDCDCDCDCDCDDCDCDCDCDDDCDCDCDDDDDDDDCDCDDDDDDDCW이다. 이제이 문자열을 일치 시키려고합니다 VD+C+W. 즉, 모든 Ds를 모든 s의 왼쪽으로 이동하려고합니다 C. 이것은 반전하여 수행 할 수 있습니다 DCC:CD. 다음 알고리즘을 반복하여이를 수행합니다.

  1. s D블록의 오른쪽에있는 첫 번째 를 찾으십시오 C.
  2. D해당 블록의 왼쪽 으로을 이동하십시오 .
  3. Cs 의 수를 두 배로 늘립니다.

수학을 통해 우리는 123 Ds 및 4638704741628490670592103344196019722536654143873 Cs로 끝날 것이라고 결정할 수 있습니다 (SE 답변에 적합하지 않은 것이 옳았습니다 ... 지구의 모든 원자 상태로 저장하면 이것이 적합하지 않을 것입니다. 결합 : P).

의 역순을 계속 적용하면 V:VD모든을 제거 할 수 있으므로을 D얻습니다 VCCC.......CCCW. 우리는 V다시로 변환합니다 YZ. 이제 우리는 YZCCC.......CCCW.

우리는 모두 제거 할 수 있도록하려면 Cs와는 형태가 YAAA...AAABBB...BBBZW. 다행히도 다음 방법으로 수행 할 수 있습니다. 먼저, 우리는 YB:Y587912508217580921743211을 곱하여을 얻습니다 YBBB.......BBBZCCC.......CCCW. 그런 다음 다음 단계 시퀀스를 반복합니다 (여기서 반드시 0보다 크지 않은 [?*]임의의 수를 의미 함 ?).

  1. 역 적용 CZ:ZC587912508217580921743211 번Y[A*]BBB.......BBBCCC.......CCCZCCC.......CCCW
  2. CB:BC여러 번 역으로 적용Y[A*]BCBCBC.......BCBCBCZCCC.......CCCW
  3. 역 적용 AZ:ZAB:BCA여러 번Y[A*]ABBB.......BBBZCCC.......CCCW

귀납법을 통해 BZ조합을 끝까지 (을 제외하고 W) A끝까지 옮길 수 있고 Cs 의 수는 s 의 수의 1/587912508217580921743211이므로 7890127658096618386747843 As 로 남습니다 . 우리는 지금이 YAAA.......AAABBB.......BBBZW. 변환 ZWA와 다시 U다음 역에 적용 U:BU단지 2 유지하기 위해 많은 시간을 B들 다음 변환 BBUA를 T, 당신은 지금이 YAAA.......AAAT. 그런 다음 s 의 수가 5의 배수보다 3이 커서 T:AAAAAT여러 번 역 적용 할 수 있습니다 .YAAATA

도전 해 주셔서 감사합니다!


어디에나 언급되어 있습니까? 아니면 기본적으로 역 적용이 허용됩니까?
Weijun Zhou

2
@WeijunZhou 내 말은, 적용하는 경우 A:B에하는 ABC수 있습니다 BBC, 그것의 명백한 그 역 적용 A:BBBC제공 할 수 있습니다 ABC. 구체적으로 언급되어 있지는 않지만 쉽게 단계를 취소하고 "기존의"솔루션을 가질 수 있습니다. IMO를 거꾸로 돌리는 것이 더 쉽다는 것입니다.
HyperNeutrino

이 단 하나의 규칙 인 경우 I는, 예를 들어, 의미 A:B그리고 역 그때 난 당신이에서 갈 수 있다고 생각하지 않습니다 허용 적용 할 것을 주장하지 않습니다 BBCABC. 이 특정 사례는 다를 수 있으며 다른 방향으로 갈 수있는 방법이 있습니다. 나중에 확인하겠습니다.
Weijun Zhou

2
@HyperNeutrino ^^
Zhou

1
이것을 분해하기 위해 어떤 프로그램을 사용했으며 시간이 얼마나 걸렸습니까?
user202729 년

9

보보 qua

주어진 문자열에 대해, 모든 문자 (a = 0, b = 1, c = 2)를 취하고 그것들을 합한 다음 모듈로 3을 취하십시오. 그러면 다시 쓰기 규칙 중 어느 것도 그 값을 변경하지 않습니다. 소스 문자열의 값은 1이고 대상의 값은 2입니다. 따라서 규칙 조합은 소스 문자열을 대상 문자열로 변환하지 않습니다.


9

페어 섬

이것은 sokoban 퍼즐입니다. 시작 위치는 다음과 같습니다

          ___#
#___####_____#
#_#_#_##_#_!##
##______##_###
##__####_#_###
###__###__

끝 위치는 다음과 같습니다.

          ___#
#___####_____#
#_#_#_##_#_###
##____!__#_###
##__####_#_###
###__###__

다음 키 순서를 사용하여 해결할 수 있습니다.

←← → ↓↓ ← ↑ ←←←←←←← ↓↓↓ → ↑ ← ↑↑↑ ←← ↓↓ → ↑ → ↓↓ →→→→→→→→→ ↑↑ ↓↓ ← ↓ ←← →→ ↑ ←←← ← ↑ ←← ↓ →→→→→→→ ↓ →→ ↑↑ → ↑↑↑ ← ↓ ←← ↓↓ →→ ←← ↑ →→ ↑ →→ ↓ ← ↓ ←←← ↓↓ → ↑ ←←←←←←←←← ↑ ↑ ←← ↓ →→ ↓ → ↓↓ ← ↑ ← ↑ → ↑↑↑ ←← ↓ → ↑ → ↓↓ ← ↓ → ↑ →→→→→→→→ ↓↓ ← ↑ → ↑ ←←←←←←←← →→→ →→→ ↑↑ ← ↓ → ↓ ←← ↑↑ →→ ↑ →→ ↓ ← ↓ ← → ↑↑ ← ↓ ← ↓↓↓ →→ ↓ ← ↑ ←← ↓↓↓↓ →→ ↑↑ ↓↓ ←←← ↑↑ → ↓ ↑↑ → ↑ →→ ↓↓ ← ↓ ← ↓ ←← ↑↑ →→ ↑ → ↓ ← ↓↓ ←←←←←←←←← ↓↓ →→→→→ ←←←←← ↑↑ ←←← ↓ →→ ↓↓ ← ↑ →→→→

다음은 키 시퀀스를 sed 명령으로 변환하여 적용하는 bash 프로그램입니다. sed 명령에는 경찰의 답변에 정의 된 다시 쓰기 규칙을 사용하는 명령과 문자열을 수정하지 않는 레이블 지정 및 분기 명령 만 포함됩니다. 다시 쓰기 규칙 만 사용하여 대상 문자열을 얻을 수 있음을 확인합니다.

s="___##___####_____##_#_#_##_#_!####______##_#####__####_#_######__###__"
input=

while
    printf '\n%80s\n' "$s"|fold -w14
    read -n 1
    [ "$REPLY" = $'\e' ]
do
    read -n 2
    case "$REPLY" in
    [A)
        s="$(sed '
s:!:wLW_:
        :a
s:L:<<<<<<<<<<<<<:
s:#w<:w#:
s:_w<:w_:
s:_<:<_:
s:#<:<#:
s:#wW:wLX!:
s:_W:W_:
s:#W:W#:
s:_wW:!:
s:_X:X_:
s:#X:X#:
s:_wX:#:
        ta' <<<"$s")";;
    [B)
        s="$(sed '
s:!:_VRv:
        :a
s:R:>>>>>>>>>>>>>:
s:>v#:#v:
s:>v_:_v:
s:>_:_>:
s:>#:#>:
s:Vv#:!URv:
s:U_:_U:
s:U#:#U:
s:Uv_:#:
s:V_:_V:
s:V#:#V:
s:Vv_:!:
        ta' <<<"$s")";;
    [C)
        s="$(sed '
s:!#_:_!#:
        te
s:!_:_!:
        :e' <<<"$s")";;
    [D)
        s="$(sed '
s:_#!:#!_:
        te
s:_!:!_:
        :e' <<<"$s")";;
    esac
    input="$input${REPLY:1}"
done

echo "$input"

온라인으로 사용해보십시오!

이스케이프 코드가 제거 된 상태에서 온라인으로 사용해보십시오!

위아래로 !:wLW_또는 !:_VRv해당하는 경우 한 번 적용되며 관련 규칙이 !다시 나타날 때까지 반복적으로 적용 됩니다. 권리 중 하나 !#_:_!#와이 !_:_!적용됩니다. 왼쪽 중 하나 _#!:#!__!:!_ 가 적용됩니다.

각 이동 후 위치에 대한 링크의 출력을 참조하십시오.


6

xnor

규칙 1 x:xn 규칙 2 no:oon 규칙 3 nr:r 규칙 4ooooooooooo:

우리 [X,Y]는 Y X의 런을 나타 내기 위해 사용 합니다.

에서 시작 xn[o,A]r,

  1. 일단 규칙 2를 적용하면 x[o,2]n[o,A-1]r.
  2. 우리가 한 번 더 규칙 2를 적용 x[o,4]n[o,A-2]r
  3. (가) 될 때까지 적용 o사이에요 nr0이되고, 우리가x[o,2*A]nr .
  4. 우리가 일단 규칙 3을 적용합니다 x[o,2*A]r.
  5. 일단 규칙 1을 적용하면 xn[o,2*A]r.

따라서 ~에서 생성하는 알고리즘 xn[o,A]rxn[o,2*A]r있습니다.

에서 시작 xnor = xn[o,1]r하여 알고리즘의 10 배를 반복합니다. 10 번째 루프를 제외하고는 4 단계에서 멈 춥니 다 x[o,1024]r.

규칙 4 적용이 1023 = 11 개 * 93 개 웁니다 o떠나들 xor.


2

소용돌이

F다른 캐릭터를 생성 / 사용하지 않고 s 를 제거하는 방법은 없습니다 . 따라서 I:F목표에 도달하기위한 마지막 단계로 사용해야합니다 . 규칙은 하나도 제공하지 않습니다I다른 원치 않는 문자가없는 없으므로 대상 문자열에 도달 할 수 없습니다.

당신이 소스에서 뒤쪽으로 매핑 할 경우 동등하게, 당신은 단지에서 얻을 수 FI당신은 더 이상 옵션이 있습니다 전에.


아, 아파요 그래도 또 다른 해결책이 있습니다 ...
VortexYT

@VortexYT 아, 그래요? 흠, 몰랐다. 그러나 네, 목표는 아마도 당신이 의도 한 것보다 훨씬 쉽게 만들 수있는 하나 이상의 단계를 다시 매핑 할 수 없습니다 : P
HyperNeutrino

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