Thử thách viết lại trừu tượng (Cướp)


9

Đây là một thử thách giống như . Đây là chủ đề của bọn cướp; chủ đề của cảnh sát ở đây .

Cướp

Các cảnh sát sẽ đăng các hệ thống viết lại trừu tượng. Nhiệm vụ của bạn là bẻ khóa đệ trình của họ bằng cách chứng minh rằng chuỗi mục tiêu có thể hoặc không thể đạt được từ chuỗi nguồn bằng cách áp dụng các quy tắc viết lại của họ. (Bạn có thể thực hiện việc này bằng cách đăng một chuỗi các quy tắc viết lại bắt đầu bằng chuỗi nguồn và kết thúc bằng đích hoặc bằng cách chứng minh một cách toán học rằng điều này tồn tại hoặc không tồn tại.)

Xem chủ đề của cảnh sát để biết chi tiết và định nghĩa.


Đừng! Tôi đặt tiền thưởng cho câu hỏi sai, điều này có nghĩa là trong thử thách của cảnh sát. Vì vậy, ai đó sẽ nhận được một tiền thưởng ngẫu nhiên.
Nathaniel

Không phải lo lắng, tôi đã hoàn trả tiền thưởng.
James

@DJMcMayhem: Huh ... vậy đó là lý do tại sao API SE liệt kê câu hỏi này là đặc trưng, ​​nhưng không có số tiền thưởng hoặc ngày kết thúc. : o Oh, đã đến lúc thêm một số xác nhận nhập vào tập lệnh người dùng của tôi.
Ilmari Karonen 18/03/18

Câu trả lời:


16

tháng sáu năm 2013

Hãy làm việc ngược lại cho cái này. Đầu tiên chúng ta biến các chữ số thành biểu diễn nhị phân của chúng. Chúng tôi đi từ VW626206555675126212043640270477001760465526277571600601đến VW++__+_++__+____++_+_++_++_+++_++++_+__+_+_++__+___+_+____+___++++_+______+_+++___+__++++++________++++++____+__++_+_++_+_+_++__+_+++++++_++++__+++_______++______+. Tiếp theo, chúng tôi tiếp tục áp dụng nghịch đảo DCW:W+DW:W_cho đến khi chúng tôi xóa tất cả các biểu tượng. Kết quả của chúng tôi là bây giờ VDCDCDDDCDDCDCDDDCDDDDDCDCDDCDDCDCDDCDCDDCDCDCDDCDCDCDCDDCDDDCDDCDDCDCDDDCDDDDCDDCDDDDDCDDDDCDCDCDCDDCDDDDDDDCDDCDCDCDDDDCDDDCDCDCDCDCDCDDDDDDDDDCDCDCDCDCDCDDDDDCDDDCDCDDCDDCDCDDCDDCDDCDCDDDCDDCDCDCDCDCDCDCDDCDCDCDCDDDCDCDCDDDDDDDDCDCDDDDDDDCW. Bây giờ chúng tôi muốn làm cho chuỗi này phù hợp VD+C+W; đó là, chúng tôi muốn di chuyển tất cả các Ds sang bên trái của tất cả các Cs. Điều này có thể được thực hiện bằng cách đảo ngược DCC:CD. Chúng tôi làm điều này bằng cách lặp lại thuật toán sau:

  1. Tìm cái đầu tiên Dnằm bên phải một khối Cs.
  2. Di chuyển Dsang bên trái của khối đó.
  3. Nhân đôi số Cs.

Thông qua một số phép toán, chúng ta có thể xác định rằng chúng ta sẽ kết thúc với 123 Ds và 4638704741628490670592103344196019722536654143873 Cs (bạn đã đúng về điều này không phù hợp với câu trả lời SE ... Tôi nghi ngờ điều này sẽ phù hợp nếu được lưu trữ dưới dạng các nguyên tử trên Trái đất kết hợp: P).

Nếu chúng ta tiếp tục áp dụng ngược lại V:VD, chúng ta có thể thoát khỏi tất cả các Ds bây giờ, vì vậy chúng ta nhận được VCCC.......CCCW. Chúng tôi chuyển đổi Vtrở lại vào YZ. Bây giờ chúng tôi có YZCCC.......CCCW.

Chúng tôi muốn có thể thoát khỏi tất cả các Cs và có nó trong mẫu YAAA...AAABBB...BBBZW. May mắn thay, điều này có thể được thực hiện bằng phương pháp sau. Đầu tiên, chúng tôi áp dụng nghịch đảo YB:Y587912508217580921743211 lần để có được YBBB.......BBBZCCC.......CCCW. Sau đó, chúng tôi lặp lại chuỗi các bước sau ( [?*]có nghĩa là bất kỳ số lượng nào ?, không nhất thiết phải lớn hơn 0):

  1. CZ:ZCÁp dụng nghịch đảo 587912508217580921743211 lần để có đượcY[A*]BBB.......BBBCCC.......CCCZCCC.......CCCW
  2. Áp dụng ngược CB:BCnhiều lần để có đượcY[A*]BCBCBC.......BCBCBCZCCC.......CCCW
  3. Áp dụng ngược AZ:ZAB:BCAnhiều lần để có đượcY[A*]ABBB.......BBBZCCC.......CCCW

Thông qua cảm ứng, chúng ta thấy rằng chúng ta có thể di chuyển BZtổ hợp từ đầu đến cuối (trừ trước W) và sau đó số As là 1/587912508217580921743211 của số Cs, để lại cho chúng ta 7890127658096618386747843 As. Bây giờ chúng ta có YAAA.......AAABBB.......BBBZW. Chuyển đổi ZWtrở lại thành a U, sau đó áp dụng nghịch đảo U:BUnhiều lần để chỉ giữ lại 2 Bgiây và sau đó chuyển đổi BBUthành a T, và bây giờ bạn có YAAA.......AAAT. Sau đó, bạn có thể áp dụng nghịch đảo T:AAAAATnhiều lần để có được YAAATvì số As lớn hơn 3 lần so với bội số của 5.

Cảm ơn các thử thách!


Nó được nêu ở bất cứ đâu hoặc theo mặc định rằng áp dụng nghịch đảo được cho phép?
Weijun Zhou

2
@WeijunZhou Ý tôi là, nếu áp dụng A:Bđể ABCcung cấp cho BBC, nó rõ ràng rằng việc áp dụng các nghịch đảo của A:Bđể BBCcó thể cung cấp ABC. Điều đó không nói rõ rằng điều đó được cho phép, nhưng tôi có thể dễ dàng đảo ngược các bước của mình và có một giải pháp "thông thường", chỉ đơn giản là đi ngược IMO dễ dàng hơn.
HyperNeutrino

Ý tôi là, ví dụ, nếu chỉ có một quy tắc A:Bvà không nói rằng áp dụng ngược được cho phép thì tôi không nghĩ bạn có thể đi từ BBCđến ABC. Trường hợp cụ thể này có thể khác nhau và có một số cách để đi theo hướng khác. Tôi sẽ kiểm tra nó sau.
Weijun Zhou

2
@HyperNeutrino ^^
Weijun Zhou

1
Chương trình nào bạn đã sử dụng để nhân tố này và mất bao lâu?
dùng202729

9

boboquack

Đối với một chuỗi đã cho, lấy tất cả các chữ cái (a = 0, b = 1, c = 2), tổng hợp chúng và lấy modulo 3. Sau đó, không có quy tắc viết lại nào thay đổi giá trị đó. Chuỗi nguồn có giá trị là 1 và mục tiêu có giá trị là 2. Do đó, không có sự kết hợp các quy tắc nào sẽ chuyển đổi chuỗi nguồn thành chuỗi đích.


9

feerum

Đây là một câu đố sokoban. Vị trí bắt đầu là:

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

Vị trí kết thúc là:

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

Nó có thể được giải quyết bằng chuỗi khóa sau:

← → → ↓↓ ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← <← ← ← ← ← ← ← ← ↑ ← ← ← → → → ↓↓ ↓↓ ↑ ↓↓ ↑ ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← → → ↓ ↓ ↑↑ → →> ↓ ← ← ← chọn ↓ → → ↓↓ ↓↓ ← ← ← ← ← ← ← ← ← ← ← ↓↓ ← →>

Dưới đây là một chương trình bash chuyển đổi chuỗi khóa thành các lệnh sed và áp dụng chúng. Các lệnh sed chỉ chứa các lệnh thay thế bằng cách sử dụng các quy tắc viết lại được xác định trong câu trả lời của cảnh sát, và các lệnh gắn nhãn và phân nhánh không sửa đổi chuỗi. Nó xác nhận rằng bạn có thể nhận được chuỗi mục tiêu chỉ bằng cách sử dụng các quy tắc viết lại.

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"

Hãy thử trực tuyến!

Hãy thử trực tuyến (với mã thoát được loại bỏ)!

Để lên và xuống, !:wLW_hoặc !:_VRvđược áp dụng một lần tương ứng, và các quy tắc có liên quan được áp dụng lặp đi lặp lại cho đến khi !xuất hiện lại. Đối với quyền, một trong !#_:_!#!_:_!được áp dụng. Đối với bên trái, một trong _#!:#!__!:!_được áp dụng.

Xem đầu ra trong các liên kết cho vị trí sau mỗi lần di chuyển.


6

xnor

Quy tắc 1 x:xn Quy tắc 2 no:oon Quy tắc 3 nr:r Quy tắc 4ooooooooooo:

Chúng tôi sử dụng [X,Y]để chỉ ra một chuỗi Y Xs

Bắt đầu từ xn[o,A]r,

  1. Áp dụng Quy tắc 2 một khi chúng ta có x[o,2]n[o,A-1]r.
  2. Áp dụng Quy tắc 2 một lần nữa chúng ta có x[o,4]n[o,A-2]r
  3. Áp dụng cho đến khi os giữa nrtrở thành 0, chúng ta có x[o,2*A]nr.
  4. Áp dụng Quy tắc 3 một khi chúng ta có x[o,2*A]r.
  5. Áp dụng Quy tắc 1 khi chúng ta có xn[o,2*A]r.

Vì vậy, chúng ta có một thuật toán để tạo ra từ xn[o,A]rđể xn[o,2*A]r.

Bắt đầu từ xnor = xn[o,1]r, lặp lại 10 lần thuật toán - ngoại trừ trong vòng lặp thứ 10, chúng tôi dừng lại ở Bước 4, có x[o,1024]r.

Áp dụng Quy tắc 4, điều này sẽ xóa 1023 = 11 * 93 ogiây, để lại xor.


2

Xoáy

Không có cách nào để loại bỏ Fs mà không tạo / sử dụng các ký tự khác; do đó, chúng ta phải sử dụng I:Fnhư bước cuối cùng để đến mục tiêu. Không có quy tắc nào đưa ra một đơn Imà không có các ký tự không mong muốn khác, do đó bạn không thể truy cập chuỗi mục tiêu.

Tương tự, nếu bạn cố gắng để ánh xạ ngược từ nguồn, bạn có thể chỉ nhận được từ Fđến Itrước khi bạn có các tùy chọn không còn nữa.


Ooch, đau quá. Có một giải pháp khác mặc dù ...
VortexYT

@VortexYT ồ, thật sao? hm, không biết nhưng vâng, mục tiêu không thể ánh xạ lại nhiều hơn một bước, điều này có thể khiến việc này trở nên dễ dàng hơn bạn dự định: P
HyperNeutrino

Chính xác hơn
gấp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.