#!/usr/bin/env tclsh9.0 proc run {A} { set B 0; set C 0; set out 0 while {$A} { set B [expr {($A & 7) ^ 5}] set C [expr {$A >> $B}] set A [expr {$A >> 3}] set B [expr {$B ^ 6 ^ $C}] set out [expr {($out << 3) | ($B & 7)}] } return $out } proc runp {A} { puts [format "%llo (%lld) -> %llo" $A $A [run $A]] } proc try {prefix} { global target set t [expr {$target % 2**(3*(1 + [llength $prefix]))}] # puts [format "try t=%llo $prefix" $t] set n 0 foreach d $prefix {set n [expr {$n << 3 | $d}]} for {set d 0} {$d <= 7} {incr d} { set A [expr {$n << 3 | $d}] set out [run $A] if {$out == $target} { runp $A exit } if {$out == $t} { try [list {*}$prefix $d] } } } # runp 0o1000000000000371 # runp 0o3710000000000000 set target 0o2415750316435530 try [list] # B := A mod 8 # 2,4 # B := B ^ 5 # 1,5 # C := A / 2**B # 7,5 # A := A / 8 # 0,3 # B := B ^ 6 # 1,6 # B := B ^ C # 4,3 # out B mod 8 # 5,5 # JMP 0 if A # 3,0