优化 brainfuck 中的细胞增长

Optimized cell increasing in brainfuck

所以我的目标是: 将值 n 放入指令数量最少的单元格中。

我可以 + 20 次以获得值 20。

但是更短的方法是 >++++[<+++++>-]<

如何在 python 中计算优化值 setter(假设单元格为零,我只能使用此单元格和正确的单元格)?

我目前的想法:如果我能找到 abc 的最小值,以便 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 给出了获取不同值的最短已知方法(标记了它们使用了多少个单元格以及它们是否依赖于溢出时的环绕)。为了等于所有只使用两个单元格的程序,你的程序需要稍微复杂一点,但它看起来是可行的。