Cero una celda arbitrariamente grande en Brainf ***

28

Su tarea consiste en escribir un pedazo de código que los ceros de la celda actual en la variante Brainfuck que, cada célula puede contener una firma entero de magnitud arbitrariamente grande, en lugar de la normal de 0 a 255.

Puede suponer que hay l celdas a la izquierda yr celdas a la derecha de la celda actual que inicialmente son cero. Su programa solo puede acceder a estas celdas l + r +1. Después de que su código termine, debe dejar las celdas adicionales l + r cero y el puntero a la celda actual en la posición original.

No puede usar ninguna entrada / salida.

El código con l + r más pequeño gana. Si hay un empate, gana el código más corto. También se recomienda indicar la complejidad temporal de su programa como referencia, donde n es el valor absoluto del entero original en la celda actual.

Herramientas utiles

Puede probar un programa Brainfuck en esta variación utilizando este intérprete en TIO de mbomb007 .

También puede usar el intérprete en esta respuesta por boothby (otras respuestas de Python probablemente también funcionen, pero no lo probé ).

jimmy23013
fuente
Lo he etiquetado como code-golf porque creo que alcanzaremos el valor óptimo de l + r rápidamente.
jimmy23013
2
Parece que, por su comentario, se refería a un número entero arbitrariamente grande, que puede ser positivo o negativo. Esta es una diferencia en el dialecto inglés para algunas personas, por lo que puede ser útil aclarar que puede ser muy positivo o muy negativo.
isaacg
44
@ jimmy23013 ¿Tiene un intérprete BF con celdas firmadas que podamos usar para esto?
mbomb007
@ mbomb007 codegolf.stackexchange.com/a/3085/25180 pero probablemente demasiado golfista ...
jimmy23013
1
@Mego ¿Por qué? En el desafío "real", también debe obtener el valor óptimo de l + r, lo que probablemente dificultará la reducción del tamaño del código.
jimmy23013

Respuestas:

17

l + r = 0 + 2 = 2, 55 53 51 bytes

[>+[-<+>>+<]<[>]>[+[-<+<->>]<[->+<]]>[-<+>]<<]>[-]<

l + r = 1 + 2 = 3, 46 44 bytes

[[>+[-<+<+>>]<[<+[->->+<<]]>]>[>]<[-]<<[-]>]

Mi propio algoritmo El puntero debe comenzar en el número que debe ponerse a cero. La complejidad del tiempo es O (n ^ 2).

Cómo funciona:

  • Comenzamos con el número n.
  • Incrementamos uno, entonces el número se convierte n+1.
  • Decrementamos dos, entonces el número se convierte n+1-2 = n-1
  • Incrementamos tres, entonces el número se convierte n-1+3 = n+2.
  • Disminuimos cuatro, entonces el número se convierte n+2-4 = n-2.

Repetimos el proceso, aumentando el decremento / decremento en cada paso, hasta obtener cero.

JungHwan Min
fuente
2
Exactamente el algoritmo en el que pensé después de pasar la etapa "esto ni siquiera es posible": P
ETHproductions
9

l + r = 0 + 2 = 2; 58 bytes

>+<[>[<->>+<-]>+<<[>]>[<<+>+>-]<[->+<]>[<]>+[-<+>]<<]>[-]<

La complejidad es O (n ^ 2).

El siguiente es mi generador de programas de prueba, por lo que pueden ver que realmente intenté probarlo en caso de que no funcione ...

p='''
>+<
[
>
[<->>+<-]
>+<
<[>]>
[<<+>+>-]
<
[->+<]
>[<]>
+ [-<+>]
<<
]
> [-] <
'''

p = ''.join(p.split())

cpp = '''
#include <bits/stdc++.h>
using namespace std;
void test(int q) {
long long t[3] = {q, 0, 0};
int i = 0;
ZZZ
printf("q=%d %lld %lld %lld\\n", q, t[0], t[1], t[2]);
}
int main() {
while(true) {
    int q; cin >> q; test(q);
}
}
'''

d = {
'>': '++i; assert(i<3);',
'<': '--i; assert(i>=0);',
'+': '++t[i];',
'-': '--t[i];',
'[': 'while(t[i]){',
']': '}',
}

print cpp.replace('ZZZ', ''.join(d[c] for c in p))
Feersum
fuente
Puedes probarlo usando el intérprete que acabo de hacer. Ver comentario
mbomb007
Parece que me funciona.
mbomb007
2
Esto tiene que ser el óptimo l + r. Prueba rápida de que 1 es imposible: en cada punto en el que la celda de reserva llega a cero, solo puede almacenar una cantidad finita de datos además del valor de la celda original (en la posición del cabezal de la cinta y el puntero de instrucción), lo que significa que está limitado en cuanto puede ajustar la celda principal desde ese punto en al menos una dirección.
@ ais523 Podría haber otros equivalentes. Sería interesante si alguien crea l + r = 1 + 1.
mbomb007