Implementación eficiente de while loop en brainf***
while-loop brainfuck (1)
Estoy teniendo problemas con la implementación de un ensamblador de brainf *** para codegolf.se. Me las arreglé para cargar una cadena en la memoria para encontrar su longitud, imprimir cuerdas n veces, etc., pero no puedo cargar solo los números que no sean minúsculas en la memoria. Así que vamos a tomar el siguiente ciclo que realiza algo de magia. (Las marcas hash son marcadores de depuración).
#,#[>#<[<]<<#+#>>>[>]#,#]<[<]
Comienza en el puntero 512 y escribe la cadena como valores ascii en puntos después de 512
Ahora bien, si (por alguna razón) quisiera quitar los caracteres en minúscula, se verá así en psuedo BF.#,#[>#<[<]<<#+#>>>[>]#do{,(takes input and assigns it)}
while(input>=96/*Go arbitrarily to the right for this implementation but
make sure that the first non-lowercase number is stored at the index*/)#
//Also be sure to zero out any temporary cells used
<[<]
Ahora mi pregunta es, ¿cómo implemento un bucle while mientras uso solo espacios a la derecha de 512 como almacenamiento Y luego los borro más tarde? Para los curiosos este es el problema que deseo resolver en branf ***.
Su código puede ser simplificado a
,[[<]<+>>[>],]<[<]
(el <<+>>
es probablemente el resultado del uso de un compilador en línea que olvida la celda 255)
y repetido, para producir la operación de salida:
>.[[<]<->>[>]<.>]<[<]
Si desea usar solo las celdas vacías en su camino, puede hacerlo. Pero tendrá que establecer un protocolo propio para definir la siguiente celda, como guardar cada celda de datos con la siguiente celda indicando la distancia a la siguiente, como:
[..., 104, 5, x, x, x, x, 108, 3, x, x, 102, 2...]
[..., 104 , 5 , x, x, x, x, 108 , 3 , x, x, 102 , 2 ...]
data pointer data pointer data pointer
cuando x
es un valor arbitrario, distinto de cero (de lo contrario lo usaría). Esta implementación sería una especie de lista vinculada, pero tenga en cuenta que el espacio y el código serían caros .
Poner a cero las celdas , o como lo llamas limpiarlas, se puede hacer de la misma manera que hiciste con [<]
- usando [-]
. esto disminuirá el valor de la celda hasta que llegue a 0 - y luego saldrá en bucle. Puedes iterar el hilo hacia abajo cuando estás en su extremo y retroceder mientras limpias cada celda hasta que tocas el comienzo ( 0
u otro número reservado que coloques allí).