抽象重写挑战(强盗)


9

这有点 -喜欢 挑战。这是强盗的线索。警察的线在这里

强盗

警察将发布摘要重写系统。您的任务是通过应用重写规则来证明从源字符串可以到达或不能到达目标字符串,从而破解他们的提交。(您可以通过发布一系列以源字符串开头并以目标字符串结尾的重写规则,或者通过数学方式证明该规则存在或不存在来执行此操作。)

有关详细信息和定义,请参见警察的线程


h!我悬赏于一个错误的问题,这本来是对警察的挑战。所以有人会得到随机的赏金。
纳撒尼尔(Nathaniel)'18

不用担心,我已经退还了赏金。
詹姆斯

@DJMcMayhem:呵呵...这就是为什么SE API将此问题列为特色,但没有赏金或截止日期的原因。:o哦,是时候为我的用户脚本添加一些输入验证了。
Ilmari Karonen

Answers:


16

吉米23013

让我们为这一步倒退。我们首先将数字转换为二进制表示形式。我们从VW626206555675126212043640270477001760465526277571600601VW++__+_++__+____++_+_++_++_+++_++++_+__+_+_++__+___+_+____+___++++_+______+_+++___+__++++++________++++++____+__++_+_++_+_+_++__+_+++++++_++++__+++_______++______+。接下来,我们将不断的倒数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,我们现在可以摆脱所有Ds,因此得到VCCC.......CCCW。我们将V背面转换成YZ。现在我们有了YZCCC.......CCCW

我们希望能够摆脱所有Cs并使其具有形式YAAA...AAABBB...BBBZW。幸运的是,这可以通过以下方法完成。首先,我们对YB:Y587912508217580921743211进行逆运算得到YBBB.......BBBZCCC.......CCCW。然后,我们重复以下步骤序列(其中[?*]表示任意数量的?,不一定大于零):

  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),然后As 的数量是s 数量的1/587912508217580580743743211 C,剩下7890127658096618386747843 As。我们现在有YAAA.......AAABBB.......BBBZW。将ZWback 转换为a U,然后反向应用U:BU多次以仅保留2 Bs,然后将其转换BBU为a T,现在有了YAAA.......AAAT。然后,由于s 的数目比5的倍数大3 ,因此您可以反向应用T:AAAAAT多次以得到。YAAATA

感谢您的挑战!


是在任何地方说明还是默认情况下允许反向应用?

2
@WeijunZhou我的意思是,如果应用A:BABCBBC,很明显,应用的倒数A:BBBC可以给ABC。没有明确说明允许这样做,但是我可以轻松地扭转自己的步伐,并拥有一个“常规”解决方案,只是倒退IMO更容易。
HyperNeutrino

我的意思是,例如,如果只有一个规则A:B,并且没有说明允许反向应用,那么我认为您不能从BBC转到ABC。这种特定情况可能有所不同,并且在其他方​​向上还有一些路要走。稍后再检查。

2
@HyperNeutrino ^^
卫军周

1
您使用了哪个程序将其分解,并且花费了多长时间?
user202729

9

Boboquack

对于给定的字符串,取所有字母(a = 0,b = 1,c = 2),将它们求和并取模3。然后,任何重写规则都不会更改该值。源字符串的值是1,目标字符串的值是2。因此,规则的组合都不会将源字符串转换为目标字符串。


9

费瑟姆

这是一个推箱子难题。起始位置是:

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

结束位置是:

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

可以使用以下键序列解决此问题:

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

这是一个bash程序,它将键序列转换为sed命令并应用它们。sed命令仅包含使用cop答案中定义的重写规则的替换命令,以及不修改字符串的标签和分支命令。它确认您仅可以使用重写规则来获取目标字符串。

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

异或

规则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. 应用直到oS之间n,并r变为0,我们有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 os,离开xor


2

涡旋

F如果不创建/使用其他字符,则无法消除;因此,我们必须使用I:F最后一步来达到目标​​。没有规则给出一个I没有其他多余字符字符,因此您无法到达目标字符串。

同样,如果尝试从源向后映射,则只能在没有更多选择之前从FI


哎呀,好痛。不过,还有另一种解决方案...
VortexYT

@VortexYT哦,真的吗?嗯,不知道。但是,是的,目标无法映射回一个以上的步骤,这可能使此操作比您预期的要容易得多:P
HyperNeutrino

2X更容易准确
VortexYT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.