优化 brainfuck 中的细胞增长
Optimized cell increasing in brainfuck
所以我的目标是:
将值 n
放入指令数量最少的单元格中。
我可以 +
20 次以获得值 20。
但是更短的方法是 >++++[<+++++>-]<
。
如何在 python 中计算优化值 setter(假设单元格为零,我只能使用此单元格和正确的单元格)?
我目前的想法:如果我能找到 a
、b
和 c
的最小值,以便 a+b*c=my number
,那么算法看起来像这个:
>(b times +/-)[<(c times +/-)>-]<(a times +/-)
.
加号或减号,因为有可能环绕 0<->255
好吧,我自己做了,但是它不是一个很好的代码,因为它检查了一个数字的所有可能性,return 最小的。我还包含了一个偏移选项,因此计算单元格不需要是它右边的单元格(右边 == 1 的偏移量)。
def num ( number, off = 1 ) :
code = "[-]"
if not number : return code
char = "-" if number > 127 else "+"
number = ( 256 - number ) if number > 127 else number
table = { }
for i in range ( number ) :
loop = ( off * 4 + 3 + i + number // i ) if i else 0
if i :
if ( number % i ) <= ( ( - number ) % i ) :
mod = number % i
else :
mod = (( - number ) % i )
loop += 1
else :
mod = number
table [ i ] = loop + mod
mins = [ ]
for i in table :
if table [ i ] == min ( table.values ( )) : mins.append ( i )
m = min ( mins )
if m :
if ( number % m ) <= ( ( - number ) % m ) :
mchar = char
mod = number % m
app = number // m
else :
mchar = "+" if char == "-" else "-"
mod = (( - number ) % m )
app = number // m + 1
code += ">" * off + m * "+" + "[" + "<" * off
code += app * char + ">" * off + "-]" + "<" * off
code += mod * mchar
else :
mod = number
code += mod * char
return code
编辑:修复了负模计算的小错误
https://esolangs.org/wiki/Brainfuck_constants 给出了获取不同值的最短已知方法(标记了它们使用了多少个单元格以及它们是否依赖于溢出时的环绕)。为了等于所有只使用两个单元格的程序,你的程序需要稍微复杂一点,但它看起来是可行的。
所以我的目标是:
将值 n
放入指令数量最少的单元格中。
我可以 +
20 次以获得值 20。
但是更短的方法是 >++++[<+++++>-]<
。
如何在 python 中计算优化值 setter(假设单元格为零,我只能使用此单元格和正确的单元格)?
我目前的想法:如果我能找到 a
、b
和 c
的最小值,以便 a+b*c=my number
,那么算法看起来像这个:
>(b times +/-)[<(c times +/-)>-]<(a times +/-)
.
加号或减号,因为有可能环绕 0<->255
好吧,我自己做了,但是它不是一个很好的代码,因为它检查了一个数字的所有可能性,return 最小的。我还包含了一个偏移选项,因此计算单元格不需要是它右边的单元格(右边 == 1 的偏移量)。
def num ( number, off = 1 ) :
code = "[-]"
if not number : return code
char = "-" if number > 127 else "+"
number = ( 256 - number ) if number > 127 else number
table = { }
for i in range ( number ) :
loop = ( off * 4 + 3 + i + number // i ) if i else 0
if i :
if ( number % i ) <= ( ( - number ) % i ) :
mod = number % i
else :
mod = (( - number ) % i )
loop += 1
else :
mod = number
table [ i ] = loop + mod
mins = [ ]
for i in table :
if table [ i ] == min ( table.values ( )) : mins.append ( i )
m = min ( mins )
if m :
if ( number % m ) <= ( ( - number ) % m ) :
mchar = char
mod = number % m
app = number // m
else :
mchar = "+" if char == "-" else "-"
mod = (( - number ) % m )
app = number // m + 1
code += ">" * off + m * "+" + "[" + "<" * off
code += app * char + ">" * off + "-]" + "<" * off
code += mod * mchar
else :
mod = number
code += mod * char
return code
编辑:修复了负模计算的小错误
https://esolangs.org/wiki/Brainfuck_constants 给出了获取不同值的最短已知方法(标记了它们使用了多少个单元格以及它们是否依赖于溢出时的环绕)。为了等于所有只使用两个单元格的程序,你的程序需要稍微复杂一点,但它看起来是可行的。