Coding katas: MV Coders on Fire II

Lecherito

#60 Ahora mismo lo estaba haciendo del tipo:

1- Lee caracter
1.1- si es [ que coja todo el bucle e interpretalo

Pero no sé en que puedo fallar <.<

elkaoD

Se me pasó completamente #13 y revisando los posts lo he visto. Tiene buena pinta y por lo que veo los participantes manejan. ¿Se puede apuntar cualquiera?

Aún así, te animo a que te apuntes a alguna de estas :)

#60 si lo dices por stdin, tienes abajo un link que pone "haga click aquí para pegar entrada (stdin)". Imagino que funcionará también con Octave.

ItNaS

nada no hay manera de coger el input en ideone con octave, no le da la gana.

Os pongo mi solución igualmente en Octave
http://ideone.com/HI1ZCm (no lee el stdin, tarda en correr un poquillo)

1 2 respuestas
elkaoD

#63 buena, aunque te falta la parte de ancho de celda/IO y la de 10 = \n.

Para STDIN haz aunque sea que lea de un string, si no la solución no es válida :(

1 respuesta
themaz

voy a participar en esta kata , ya que la anterior no me dio tiempo a participar. pero tengo las siguientes dudas:

  • Cuando dice que tiene que leer un código y una entrada, ¿con lo de la entrada a que se refiere?
  • El ancho de I/O para que sirve ?
  • Y la cinta ?

alguien me lo puede explicar, con algún ejemplo o algo ? porque no lo pillo :s

2 respuestas
Khanser

#65 La kata consiste en crear un programa intérprete de código brainfuck. Seria como si elkaoD te pidiera que hicieras un programa que lee PHP y lo ejecuta, pero en vez de PHP, es brainfuck :D
La cinta, con esto se refiere a la memoria que puede usar el programa, en este caso 30000 bytes, esto quiere decir que el programa en brainfuck solo podrá tener ese espacio, y la cinta es que si el programa en brainfuck intenta acceder a la posición 30000 de la memoria, el puntero volverá a 0, por lo que solo podrá almacenar memoria entre la 0 y la 29999.

El tema de I/O es como vas a pasarle el programa en brainfuck, si como parámetro en la consola, si poniendo una ruta de fichero (y tu programa leera el contenido del fichero antes de ponerse a ejecutarlo).... etc

Y el ancho ya te lo dicen en #67 XD

1 respuesta
elkaoD

#65 Lo de la cinta justo lo que explica #66.


La entrada es stdin, la entrada estándar, como cuando en Linux haces echo "cadena de entrada" | programa o en Windows también programa < archivo.

http://es.wikipedia.org/wiki/Entrada_est%C3%A1ndar

Ojo, la entrada de tu programa no tienes por qué leerla de la entrada estándar de tu SO, puede ser un array, un string... sólo es para ilustrar el paralelismo con la entrada estándar.

Las operaciones en Brainfuck son la coma (,) para leer UN byte de la entrada, y el punto (.) para escribir UN byte en la salida.


El ancho de I/O es el tamaño de entrada/salida. Un ancho de 8 bits significa que tanto la entrada como la salida pueden ser un número entre 0 y (28)-1.

¿Por qué difiere del tamaño de celda? Porque un archivo se lee byte a byte por huevos. Para la entrada no tiene importancia (porque las reglas dicen que toda entrada están entre 0-255, no hace falta asegurarse) pero para la salida... ¿qué pasa si quieres imprimir 256? Eso no cabe en un byte... y no puedes imprimir dos bytes en uno :) La salida debe ser por tanto 0 (overflow).

1 respuesta
BLZKZ

#60 con lo facil que es llamarlo pila... xD

ItNaS

#64 no entiendo, el 10 ya es un salto de línea de por si, no?

1 1 respuesta
elkaoD

#69 cada cual lo implementa como le sale de los cojones (en win hay \r\n) así que he decidido eliminar la regla por no poder comprobarla en condiciones. No hace falta que tratéis \n especialmente.

Para todos: con respecto a PRIME, recordad que la entrada tiene que acabar en \n (10, 0x0a) si no, entra en un bucle infinito (el programa usa \n para saber cuando ha acabado el string del número, como el \0 en C).

elkaoD

Bueno, pues aquí va

mi kata en CoffeeScript

Uso: bf(string, [byte, byte, byte...])

Devuelve un objeto: {out: [...], tape: [...]}, ambas un array de bytes.

La podéis probar copiando el código de https://gist.github.com/alvaro-cuesta/4745047 en http://coffeescript.org/#try: , haciendo click en Run y veréis el resultado en la consola de JS (en Chrome se abre con F12). Imprime Hello World!, Fibonacci hasta 89, un triángulo de Sierpinski y los primos hasta 20. Incluye str2byte y byte2str para convertir la entrada/salida.

Explicación para los curiosos
7
The-Force

Pues aquí esta mi

código (python)

y aquí la

La velocidad de ejecución no es nada fiable. En el pc de cmo7 tarda la mitad que en el mio xD
No me metais mucha mierda si mi código es feo y tocho. Es así de largo para optimizar la velocidad de ejecución. De todos modos seguiré intentando optimizarlo mas. Acepto sugerencias

2 2 respuestas
Amazon

Ni mucho menos busco que vaya rápido, sólo quería que me funcionara, y pillé la idea de #72 (aunque yo se la sonsaqué a cmo7 xDD) de

spoiler
Codigo

e

Y me planto, no pienso modificarlo para optimizarlo ni nada xD

Edit: V2 #78

Edit: V3 #86 (soporte para caracteres que no son de bf y pequeña optimización del código (elimino espacios sobrantes únicamente xd)

1 1 respuesta
elkaoD

#72 #73

sugerencias

#72 me mola la idea de la optimización. Yo lo hice en JS (¡compilando con strings a una función JS directamente!) pero no sólo no gané rendimiento sino que perdía. Tengo que probar en Node, pero en browser iba como un 30% peor.

¿Como cuánto te tardan los primos hasta 200?

2 respuestas
Amazon

#74 personalmente me quedo con el suyo

spoiler
The-Force

#74 Lo del mapeo lo deseché por que requiere que muchas variables sean elementos de la clase y eso se traduce a muchisimos "self." en cada operación. Tengo una versión del código que hace exactamente eso y ademas de ser ilegible con tanto self es mas lento. Lo único bueno es que el método run se reduce mucho.

1 respuesta
elkaoD

#76 eso os pasa por usar clases :P http://stackoverflow.com/questions/4020419/closures-in-python

EDIT: rectifico, me informa The-Force que las closures en Python son read-only. Ains...

Amazon

Código de #73 actualizado para optimizarlo.

spoiler
ItNaS

estaba jugando con la siguiente idea pero no tengo más tiempo para dedicarle. A ver si alguien se anima

http://ideone.com/Gedt4K

4 respuestas
Lecherito

#79 Yo ya lo pensé pero tampoco pensé que sería legal xDD

A cambio un no del todo funcional (ya que no soporta bucles anidados, no, no he conseguido hacerlo): http://ideone.com/QRuwoX

2 respuestas
elkaoD

#79 #80 aquí otro que también jugó con la idea (en JS también), además colapsando cosas como "+++++" en "+= 5". Irónicamente pierdo rendimiento frente a la solución ingenua en #71, no entiendo muy bien por qué.

Cuidado #79, (-1 % 5) == -1 :P

http://ideone.com/AY07KD

No es lo mismo módulo que resto.

1 2 respuestas
ItNaS

#81 no lo testee mucho tampoco. Me tenía que centrar en otras cosas jejeje

Amazon

#79 #80 #81 creo que force hizo lo de '+= 5' y le salió bien, echadle un ojo a su code. Optimiza el codigo bf para que la ejecución de este sea mas rápidav(no vi tu codigo #79)

meuxx

Siguiendo la idea de #79 he hecho esto en JS que creo que sigue todas las normas

Code

Para probarlo http://jsfiddle.net/AaMzG/

2
aitorman

Bueno, he estado unos mesecillos sin postear en el foro (he tenido bastante aparcados mis proyectos, aunque si que he hecho un par de cosas que ya pondre en la Guía de desarrollo de juegos indie) y que mejor manera de volver que con una kata, asi que aqui va la mia en C++:

La clase Program se usa así:

Program *programa=new Program("archivo_programa","archivo_input");
programa->Execute();

En el codigo que he puesto ejecuta el PRIME.BF (entrada "20\n", el triangulo de Sierpinski y el Fibonacci.
Imagen del output:

El codigo esta bastante cacosamente optimizado (cada vez que se encuentra un '[' busca el ']' correspondiente en ved de precalcularlo y cosas asi), pero bueno, es lo primero que me salio y no hay ganas de optimizarlo mas xD

1
Amazon

Versión 3 de mi programa, que me di cuenta que no me ejecutaba el triangulo de sierpinski (no contemplaba caracteres en el código que no estuviesen aceptados :( )

spoiler

Y con esto acabo :>

2
cm07

Nada especial, resuelve el problema con el código más claro y limpio que he podido hacer en el tiempo que le he dedicado

Code
2 1 respuesta
BLZKZ

#87 126 segundos?

2 respuestas
cm07

#88 Python no es especialmente rápido, y no he hecho ninguna optimización loca.

B

#88 es 126 segundos más rápido que el tuyo.

2 1 respuesta