นี่คือปริศนา sokoban ตำแหน่งเริ่มต้นคือ:
___#
#___####_____#
#_#_#_##_#_!##
##______##_###
##__####_#_###
###__###__
ตำแหน่งสิ้นสุดคือ:
___#
#___####_____#
#_#_#_##_#_###
##____!__#_###
##__####_#_###
###__###__
สามารถแก้ไขได้โดยใช้ลำดับของคีย์ต่อไปนี้:
←←→↓↓←↑←←←←←←↓↓→↑←↑↑↑←←↓→↑→↓↓→→→→→→↓→↑↑↓↓←↓←↑→↑←←← ←↑←←↓→→→→→↓→→↑↑→↑↑←↓←←↓↓→↑←↑→→↑→→↓←↓←←↓↓→↑←←←←←←←↑ ↑←←↓→→↓→↓↓←↑←↑→↑↑←←↓→↑→↓↓←↓→↑→→→→→→↓↓←↑→↑←←←←←←→→→ →→→↑↑←↓→↓←↑↑→→↑→→↓←↓←→↑↑←↓←↓↑→→↓←↑←←↓↓↓→→↑↑↓↓←←↑↑→ ↓↑↑→↑→→↓←↓←↓←←↑↑→→↑→↓←↓↓←←←←←↑←←↓→→→→→←←←←←↑↑←←↓→→ ↓↓←↑→→→→
นี่คือโปรแกรม bash ที่แปลงลำดับของคีย์ไปเป็นคำสั่ง sed และใช้มัน คำสั่ง 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
ถูกนำไปใช้เพียงครั้งเดียวตามลำดับและกฎที่เกี่ยวข้องจะถูกนำไปใช้ซ้ำ ๆ จนกระทั่ง!
ปรากฏขึ้นอีกครั้ง เพื่อสิทธิหนึ่งในนั้น!#_:_!#
และ!_:_!
ถูกนำไปใช้ สำหรับซ้ายหนึ่ง_#!:#!_
และ_!:!_
ถูกนำไปใช้
ดูผลลัพธ์ในลิงค์สำหรับตำแหน่งหลังจากการย้ายแต่ละครั้ง