Coding katas: MV Coders on Fire II

The-Force

Bueno ahí va la mía

Al final he usado unity por que quería probar unas cosillas con las fuentes, aunque los resultados no son lo esperado :(

Para generar los cubos solo hay que introducir las medidas x y z sin espacio al principio, y darle al enter. Para generar otro cubo le volvemos a dar a enter y asi.

Aqui la version sencilla en python

4 3 respuestas
Amazon

#151 xdddddddddddddddddddddddddddddddddddddddddddddddddddddd

1 1 respuesta
aitorman

#151 viendo la foto pensaba que era una solución sin mas pero me lo he bajado por curiosidad despues de leer #152 y menudo despolle me he pegado xD

1
elkaoD

#151 pfff maldito troll

elkaoD

Vengo de estar unas horas sin internet, lo he pasado fatal...

Pero he vuelto, en forma de kata.

KATA: El juego de la vida

El juego de la vida de Conway (inglés) es un autómata celular, es decir, un modelo matemático que evoluciona a pasos discretos (generaciones, iteraciones...)

Las reglas del autómata son simples: se desarrolla en un tablero de MN celdas donde cada celda puede estar viva o muerta. En cada iteración:

  • Una celda viva con menos de dos celdas vecinas muere (por despoblación.)

  • Una celda viva con dos o tres vecinas sobrevive hasta la siguiente generación.

  • Una celda viva con más de tres vecinas muere, por sobrepoblación.

  • Una celda muerta con exactamente tres vecinas viva pasa a estar viva (por reproducción).


Sin embargo, con estas sencillas reglas, el juego de la vida puede generar

patrones complejos de todo tipo...


Glider, el emblema hacker

Reglas

  • El programa recibe un tablero del juego de la vida y un entero N (como siempre, por cualquier medio y en el formato que decidáis).

  • La salida es el estado del tablero pasadas N iteraciones.

  • El tablero del juego debe ser toroidal: los bordes están conectados con su borde contrario (como el pacman).

Bonus points

  • Si la tabla de requisitos (cuándo viven o mueren) es personalizable por el usuario.

  • Si permite desactivar el tablero toroidal.

  • Interacción con el usuario (pausar, editar, ir paso a paso...)

  • Lo que se os ocurra.

Modo hardcore: si el programa es capaz de tratar N < 0, es decir, dado un tablero debe generar al menos UN tablero que llega hasta él en abs(N) iteraciones (ojo, que es difícil...)

Entrega

  • Todo programa posteado se debe acompañar de AL MENOS una screenshot de la salida o resultado en intérprete online.

  • La kata acaba el martes 5 de marzo a las 23:59.

1 respuesta
B

Eso, desactivar toroidal y hacedlo botella de klein que me lo paso pipa viendo vuestras frikadas xD, a partir de la semana que viene creo que podré empezar a participar en alguna.

Nucklear

#155 Si me peta lo hago, que siempre tuve ganas de codear este problema. Pero tengo que sacar tiempo de debajo de las piedras antes...

PiradoIV

¡Una kata que me gusta! :D

El código es pura basura, a ver si el finde lo puedo refactorizar :)
http://maquina13.piradoiv.com/katas/gameoflife/

Curiosidades:

  • Elige el template Little Ship y le desactivas el modo comecocos, conseguirás un Glider xD
6
dr_Rouman

Otra Kata que hice en la universidad xDD A ver si me animo que aquella no era toroidal

Khanser

Ala!

Yasta, con

No he hecho el codigo bonito, pero funciona :D

4
ItNaS

mi kata: http://dl.dropbox.com/u/1007985/HexLife/index.html
codigo en coffeescript: https://dl.dropbox.com/u/1007985/HexLife/hexlife.coffee

quería hacerla un poco distinta así que en vez de una malla cuadricular la hice hexagonal

8
HispanicO

Buenas,

Aprovecho este post como presentación al foro y como entrega de esta Kata al mismo tiempo.

He dispuesto de un par de horas para poder hacerla, así que no he hecho ningún bonus. Y como nunca había usado el ideone.com pues lo he preparado para consola, ya que me da que eso no soporta applets ni gráficos como para hacer el tablero.

Tampoco he visto ninguna posibilidad de añadir paquetes ni diversas clases, así que he incrustado una sobre la otra.

-En las dos starships muestro la progresión para diversas iteraciones.
-Para el oscillador lo que se pide exactamente en la Kata.
-La cuarta progresión es de un tablero generado aleatoriamente.
-He añadido varios tableros predefinidos para poder elegir (Life forms)

http://ideone.com/o1EqUh

Siempre y cuando disponga de tiempo me apunto a estas cosas. No tengo afán competitivo, simplemente me gusta estrujarme los sesos un poco.

¡Un saludo!

PD: Muy chulos vuestros trabajos, que se pueda interactuar (bonus) es interesante. Por cierto, nunca había oído hablar de coffeescript.

1
elkaoD

Bueno, pues

yo he hecho la kata en J...
7 2 respuestas
aitorman

#163 menudos lenguajes te sacas de la manga xDD

1 respuesta
PiradoIV

Menuda enganchada tengo a los hexágonos esos xDDDD

2
HispanicO

Enlazando con #164, para #163 ¿Cuando sacas estos lenguajes, es porque los dominas de antemano, o simplemente por mostrar nuevas cosas al mundo? Vi que otra kata se basaba en el brainfuck, y me extraña mucho que alguien programe en eso.

Me imagino que sean lenguajes como mera "curiosidad". Aunque en este caso ya dices para qué se creó.

Matlab apareció en los 70, ¿eso quiere decir que no era suficientemente potente para el tema matemático/estadístico (o R), que se tuvo que crear un lenguaje enfocado a ésto? No llego a entender por qué existen mil lenguajes, cuando normalmente no creo que se trabaje "profesionalmente" con más de 20.

1 1 respuesta
elkaoD

#166 pfff, buena pregunta xD

¿Cuando sacas estos lenguajes, es porque los dominas de antemano, o simplemente por mostrar nuevas cosas al mundo?

J lo acabo de aprender sólo para la kata, pero tiene bastante buena pinta... no como lenguaje de programación (el lenguaje es de los 90 y se nota añejo, no lo recomendaría) sino como "calculadora programable". Una vez te haces a la sintaxis es cómodo y potente...

    media =: +/ % #
   media 20 30 40
30

¿Cuánto tardarías en definir esa misma función en Java?

El resto de lenguajes sí que los he usado (por ejemplo, GLSL se usa para shaders en videojuegos).

Vi que otra kata se basaba en el brainfuck, y me extraña mucho que alguien programe en eso.

Me imagino que sean lenguajes como mera "curiosidad". Aunque en este caso ya dices para qué se creó.

Brainfuck desde luego que no se usa profesionalmente. Es un lenguaje esotérico y como tú mismo dices es mera curiosidad. Fue pensado, como su nombre indica, por joder :P Busca lenguajes esotéricos en Google, hay cientos.

J sin embargo no se pensó para eso. J se pensó para ser útil y créeme que tiene su hueco (luego profundizo en esto).

Matlab apareció en los 70, ¿eso quiere decir que no era suficientemente potente para el tema matemático/estadístico (o R), que se tuvo que crear un lenguaje enfocado a ésto?

Define potente: si potente es que se pueden hacer cosas a secas, pues ahora mismo estaríamos programando en ensamblador. Si potente es que se puede expresar mucho en poco espacio, gana J. Si potente es que el paralelismo es fácil de manejar gana Erlang. Si potente es que es fácilmente mantenible, gana Java. Si potente es que se puede ejecutar en miles de dispositivos, gana JavaScript. Si potente es que es fácil componer, gana Lisp...

Haces bien en nombrar MATLAB y R, son lenguajes que van un poco en la misma linea (en concreto J comparte con MATLAB el concepto de matrices, boxing para meter no-escalares, etc.) De hecho el IDE de J también tiene plot, visor de matrices, etc. Pero el enfoque es diferente (solo tienes que ver la sintaxis).

¿Que por qué surgió? Cubre otras necesidades. El mismo código en MATLAB lo hubiera tardado en escribir mucho más. Para tratar arrays/matrices J gana por goleada a MATLAB y a R. El manejo de matrices es sencillísimo y los bucles son implícitos... tiene cientos de operadores sólo para matrices (y todos están generalizados), así que modificar arrays es un placer.

¿Te has fijado en que el game of life no tenía una sola variable? Eso significa que se podría distribuir el cómputo en cien, mil, o un millón de ordenadores sin siquiera tener que tocar el código. Intenta hacer eso con MATLAB :)

Tampoco podemos comparar el MATLAB del 2012 con el MATLAB de los 70, ¿no? A saber cómo era MATLAB en aquella época.

No llego a entender por qué existen mil lenguajes, cuando normalmente no creo que se trabaje "profesionalmente" con más de 20.

Mal creído. No sabría decirte cuantos lenguajes se usarán profesionalmente pero apostaría a que se cuentan con tres cifras. Existen mil lenguajes porque cada uno tiene su hueco. Esto es algo difícil de ver cuando no has trabajado con el lenguaje, porque no sabes qué te ofrece. Sólo ves el resultado, que es el mismo que en cualquier otro lenguaje.

J no tengo ni idea de si se usa profesionalmente (en su día supongo que sí) pero familiares suyos sí que se usan. CoffeeScript también se usa profesionalmente, y mucho. Es la nueva moda en el mundo web para huir de JS. GLSL como te comento es el lenguaje estándar para programar shaders en videojuegos (que a su vez da lugar a CUDA, un lenguaje pensado para GPGPU). El F# que usó ItNaS en #142 también está pegando fuerte (y Microsoft está haciendo auténticos esfuerzos por publicitarlo para .NET). No sé, hay miles, si sigo no paro.

Por otro lado muchos otros lenguajes están pensados por pura experimentación, para probar alguna nueva funcionalidad, para obtener un nuevo enfoque. No habría Java sin C++, ni C++ sin C, ni C sin B, ni B sin BPL, ni...

Si nos quedamos con lo que tenemos... ¿cómo avanzamos? ¿Qué hubiera pasado si todos los creadores de lenguajes hubieran pensado "para qué tanto lenguaje"? Estaríamos programando en tarjetas perforadas.

Además, créeme que aprender lenguajes nuevos te abre otros puntos de vista. El que sólo ha programado Java no puede ver el mundo si no es con clases. Para el que sólo ha programado en C el mundo son punteros. Echa un vistazo al hilo de programación funcional sobre qué te pueden ofrecer nuevos lenguajes.

6 2 respuestas
MTX_Anubis

#167 elkaoD, ojalá trabajara con alguien como tú y ojalá tuviera tu puta cabeza. Al menos puedo presumir de que te conocí en una kdd xD

Lo mismo va por alguno de vosotros. Aunque no participe, os admiro!

1
PiradoIV

¡Encontré un patrón que se estabiliza en 100 movimientos! xD


http://maquina13.piradoiv.com/katas/gameoflife/

Ninja-edit:
Ya implementé todo lo que quería...

  • Se pueden modificar las reglas de vida
  • ¡Se pueden compartir patrones!

Lo ideal sería guardar el patrón en una base de datos y generar una URL más pequeña... como no quiero montar todo el tinglado, lo que hice fue utilizar una biblioteca para codificar en base64 las opciones.

Al hacer las pruebas me dije... ya que estamos, comprimimos (LZW) también las settings antes de codificarlas en base64 xD

El resultado es por ejemplo este:
http://maquina13.piradoiv.com/katas/gameoflife/#eyJhbGl2ZV9kb3RzIjpbbnVsbCzEj8SRxJPEkMSSxJTEmMSXxJbElcSZxJzEksSOxJvEnsSjxKLEpcSdxJt0cnVlXSzEocSnxLDEmsSxLMSpxKvEn8S3xLXErMSuxKTEs8S8xLLEv8S4xKrEusSvxYDEvsWBxLbFhsS5xK3FhMS3xYbFjsSoxYJdxK0idG9yb2lkxILEjMS5LCJzdGVwX2NvdW7FoXLEjDDFnm1heF/FoMWixIs6IjUwMCLFrWFpxajFvG5fxINmZcSMIjjFuiJjcmVhxaHGgWnGg8aFxawxLDIsMyw0LDUsNiw3LMaHfQ==

O este otro:
http://maquina13.piradoiv.com/katas/gameoflife/#eyJhbGl2ZV9kb3RzIjpbbnVsbCzEj8SRxJPEkMSSxJTEmMSXxJbElcSZxJzEmsSdxJvEjsSbxJ7EpcSkxJt0cnVlLMSpxKvErcSqZV0sxKPEocS2xKDEuMSfxLrErsSsxLzEsMSrXcSzInRvcm9pZMSCxIzEviJzdGVwX2NvdW7Fj3LEjDAsIm1heF/FjsWQxIs6IjUwMCLFm8WdacWWYcWsX8SDZmXEjCIyLDPFqSJjcmVhxY/FsGnFssW0xbh9

Y otro más:
http://maquina13.piradoiv.com/katas/gameoflife/#eyJhbGl2ZV9kb3RzIjpbbnVsbCzEj8SRxJPEkMSSxJTEmMSXxJbElcSZLMSOxJvEnsSixKHEpMSdxJt0cnVlXcSfxKPEpsSvxJrEsMScxJLEqMSqxKzEoMSyxK7EscS7xLMsxLXEq8StxKXEvMSexL/EvsSpZcS9xLrFhsSqxYvFgMS4xYPFgsWJxZHEv8S3xYrFlsWRxYTFh8WVxZjFnMS5xKfFmsSsInRvcm9pZMSCxIzFhSJzdGVwX2NvdW7FrnLEjDAsIm1heF/FrcWvxIs6IjQ1IsW6xbxpxbVhxopfxINmZcSMIjIsM8aHImNyZWHFrsaOacaQxpLGln0=

¡Saludos! :D

5 1 respuesta
HispanicO

#167 Muy buena respuesta.

Me he tenido que reír con lo de las tarjetas perforadas.

Lo de que unos se basan en otros si que lo tengo muy visto. Con el ejemplo que pones, más claro, agua. Recuerdo haber visto también un documento infográfico (como el de las distribuciones de GNU/Linux) que está muy bien.

No, si yo no digo que la evolución sea mala, para nada, más bien al contrario. Lo que pasa es que he tocado algunos lenguajes que no volvería en la vida a ellos. No sé si será por acomodarme, tanto a la forma de trabajar, sintaxis, orientación.. como a la hora de pensar. Aunque es cierto que el cerebro se adapta tanto que le cuesta mucho luego pensar de otra manera.

Le echaré un ojo a eso que comentas cuando el tiempo me lo permita.

En un futuro no muy lejano tendré que aprender JS (lo he tocado pero muy poco, no llegará a las 30 horas), CUDA (HPC), Lisp (solo en Elisp para Emacs, pero se me hace un tanto caos al venir de Java) y supongo que sea cuando vea el valor de los distintos lenguajes o paradigmas.

#169

Muy chulo, pero una pregunta: ¿Sabes por qué me va tan lento cuando lo ejecuto? No solo dicha página, se ralentizan las otras pestañas también. En cuanto la cierro vuelve a la normalidad.

Veo que al ser todo JS los cálculos los hago yo.. y aunque ya tiene varios años, mi "máquina" tendría que poder con eso y mucho más, ¿no?

Un saludo

1 1 respuesta
PiradoIV

#170 en cada step se tienen que comprobar los vecinos de cada cuadradito... y no está nada optimizado xD, da gracias a que tu ordenador sea bueno xD

B

Creo que ya es hora de que alguien lo haga:

http://www.mediavida.com/g/elkaoD

1
The-Force

Proyecto y Builds en Dropbox como de costumbre (Unity3D + C#)

Paso 4 : ????

Me he centrado en intentar optimizar un poco el algoritmo para no tener que mirar todas las celdas de una matriz, sino solo las que pudieran cambiar de estado. Al final y como siempre me he liado lo mas grande reescribiendo código y dejando chapuzas everywhere...Pero funcionar funciona.

Colores? claro! las nuevas células heredan una mezcla de los colores de los papis :D

Si mañana me da tiempo intento que deje importar imagenes para usarlas como semilla, que esa era la intención inicial.

Nadie se anima a hacerlo en 3D?

P.D: Tanta pijada y se me olvida pausarlo al inicio, y ponerle la pausa automatica al llegar a N iteraciones.

Edit:

Le he añadido la posibilidad de importar imagen y lo que faltaba de las iteraciones

12 2 respuestas
elkaoD

#173

2 2 respuestas
Khanser

#173 manita por el cimbrel xD
#174 Hay que cambiar las normas, si alguien consigue poner un cimbrel en las katas, la puntuacion se duplica XD

S

No puedo subirlo ahora a ningún sitio pero para dejar constancia de la participación dejo un ss

Edit:
Lo he subido a aqui :
http://htmlpreview.github.com/?https://github.com/sebastian121212/Juego-de-la-vida/blob/master/juego%20de%20la%20vida.html

Lo interesante es que esta hecho con bindings, con lo que el html esta bindeado al js y por lo tanto puedes editar la tabla mientras esta funcionando quitanto o poniendo vidas.

5
Khanser

#174 Ya ha pasado la fecha de entrega! Que se nos duermen xD

1 respuesta
elkaoD

#177 sí, sorry, lo comentaba ayer por IRC que he estado liado así que no me dio tiempo a preparar la kata.

Felicidades a todos, las entradas de la última kata son awesome :O

Kata work in progress...

elkaoD

Agh, la vida real se ha metido en mi camino pero por fin posteo kata.

KATA: Distancia de Levenshtein

Dadas dos cadenas calcula la distancia de Levenshtein entre estas. La distancia de Levenshtein es el número mínimo de ediciones para transformar una cadena de entrada en la otra, pudiendo en cada paso:

  • insertar un elemento
  • eliminar un elemento
  • sustituir un elemento por otro nuevo

Por ejemplo, para la pareja de entrada "media" y "vida", su cadena de ediciones sería:

media -> vedia -> vidia -> vida

Y por tanto la distancia de Levinshtein es tres.

Reglas

  • La entrada constará de dos cadenas.

  • Como salida el programa devolverá la distancia de Levinshtein y la cadena de ediciones para esa distancia.

  • El programa debe mostrar SIEMPRE la distancia MÍNIMA, es decir, no puede haber otra cadena de edición más corta.

  • Se deben mostrar todas las cadenas en caso de haber varias de estas correspondientes a la distancia mínima.

  • Todo programa posteado se debe acompañar de AL MENOS una screenshot de la salida o resultado en intérprete online.

  • La kata acabará el lunes 11 de marzo a las 23:59.

1
wineMan

Esta mola hacerla en PHP.

2 respuestas

Usuarios habituales

  • aitorman
  • The-Force
  • elkaoD
  • ItNaS
  • Khanser
  • cm07
  • Lecherito