Coding katas: MV Coders on Fire II

aitorman

Joder, a ver como me las arreglo con mis muy limitados conocimientos de mate de 4 de la ESO XDD

1 respuesta
elkaoD

#121 si lees con un poco de paciencia verás que son mates de 3º/4º de la ESO: números complejos y poco más. Ni siquiera hay que hacer límites en infinito :)

Sé que asusta, por eso la he puesto como kata, para "obligaros" a hacerlo. En su día no intenté hacer fractales porque me parecían complejos. Cuando me puse a ello y vi lo simples que eran fue como:

De hecho es la gracia de los fractales, un resultado complejo a partir de unas reglas simples.

Aún así... este hilo no está solo para postear resultados :P Cuando necesitéis un cable estamos los karatekas tanto por aquí como en #mv.nerd @ Quakenet.

1 2 respuestas
Khanser

#122 De hecho me he animado a esta ultima pork siempre queria meterme con fractales y siempre me daba pereza por pensar que eran complicados y en apenas media hora lo terminé :D

1
aitorman

#122 gracias! el problema es que aún no hemos dado numeros complejos, pero bueno, leyendo un poco por ahí parece que voy a poder aprender lo suficiente para poder hacer la kata al menos.

1
dr_Rouman

Yo tengo que tener por ahí una práctica de 2º de carrera que por lo menos calculaba los puntos, luego ya los mostrábamos con el matplotlib

1 respuesta
elkaoD

#125 code or it didn't happen :P

Aquí va

mi kata en GLSL
Minipunto al que me explique...
4 1 respuesta
Khanser

#126 Es cosa mia o los 2 links son iguales?

PD: En el curro mi pc tiene una shitty GPU asi que hasta que no llegue a casa no podre ver nada, pero te he dado manita pork tiene buena pinta :)

Y sobre la pregunta, porque la imagen donde ejecutas GLSL tiene como limite los pixeles que le das al canvas?
Si al hacer zoom, cambiaras el offset para pintar, en vez desde 0,0 a 3,2, una region especifica como (-0.5,0.5), (0.5,-0.5), todos los pixeles que has usado para pintar todo el conjunto seriviria para pintar ese rectangulo.

1 respuesta
elkaoD

#127 woopsies, es verdad, fixed (el primero era http://glsl.heroku.com/e#6895.23 )

#127 buen intento pero no es eso (si te he entendido bien).

Cada vez que hago zoom recalculo la región de la imagen... es decir, no es una imagen y hago zoom sobre ella, sino que como dices, en lugar de dibujar entre [-1, 1] dibujo entre [-0.5, 0.5] (menos region del fractal) y como tengo el mismo nº de pixeles en pantalla obtengo más detalle (a cada pixel de mi pantalla le corresponde una región más chiquitita del fractal).

En teoría el fractal es infinito, así que por mucho que esté en la región entre [0.000001, 0.000002] siempre debería poder seguir haciendo zoom.

¿Qué está ocurriendo?

2 respuestas
cm07

#128 No he programado shaders, pero en algún sitio se te acaba la precisión, digo yo.

1 1 respuesta
Khanser

#128 Además de eso, hay que incrementar las iteraciones? oO

1 respuesta
elkaoD

#130 los fractales con pocas iteraciones tienen más bien este aspecto (15 iteraciones)

¿Ves los bordes redondeados? Si haces más iteraciones se van definiendo "hacia dentro" (como si se esculpiera).

16: http://i.imgur.com/rtjyVhF.png
17: http://i.imgur.com/CpqaYkV.png
18: http://i.imgur.com/jeCvnEM.png
19: http://i.imgur.com/hfZtaoG.png

Es curioso como cada iteración va dejando su huella.

#129

ha dado en el clavo.
1
The-Force

Proyecto y Build en DropBox

Boton izq: mover.
Boton derecho: escalar.

Si se os queda colgadete es que esta calculando.

No uso nada tan avanzado como un shader aunque era la intención. Por eso ni me he molestado en animar el color, aunque quería meterle mas colores en el degradado pero no se si me dará tiempo hoy

Edit:
Le he metido un editor de los colores del gradiente pero no consigo mapearlos correctamente cuando son mas de 2 algo hago mal... Por ejemplo en esta captura el centro de la figura, donde se pasa de iteraciones deberia ser negro si mis calculos no me fallan, como en la captura de arriba pero naa :(

Edit2:
Tengo una segunda build con doubles que mete zoom chachi

3
aitorman

Iva a hacer el mio en aplicación OpenGL de escritorio, pero despues de ver la pagina de elkaoD decidí hacerlo ahí y la verdad mola un rato. Link

Tuve que mirar unas cuantas cosas en wikipedia para poder hacerlo (no el pseudocódigo en si, pero si lo de la condición de escape).

Hay unas cuantas cosas que no me funcionaban que creo que son por la pagina en si y no porque no sea GLSL valido (aunque hace bastante que no toco GLSL y tampoco hice mucha cosa con el):

Dudas
2 1 respuesta
elkaoD

#133

sobre las dudas
1 1 respuesta
aitorman

#134 Gracias! Al principio pensé que tendria algo que ver con que intentara desenrollarlo y no pudiera, pero no sabía que en ES era obligatorio que se pudiera desenrollar. Para lo de los colores al principio hice que variara en la escala del rojo tipo r=iteraciones/MAX_ITERACIONES, pero el problema era que con 200 iteraciones casi ni se percibia el cambio si cambiaba solo el rojo, así que he hecho que lo divida entre 20 en ved de entre las iteraciones maximas y que simplemente se repita cuando se acaba el gradiente, aunque es verdad que se ve mucho mejor con algo progresivo como lo tuyo (supongo que se notará mas el cambio entre iteraciones porque varias los tres canales y no solo el rojo).

cm07

Esta vez he decidido probar Processing, que parece más indicado para el problema. No está mal.

Eso sí, no he conseguido hacerlo funcionar en processing.js, así que se queda en binarios. Lo siento.

Codigo

Ejecutables para Windows, Linux y MacOS.

Podéis usar + y - para aumentar y reducir el numero máximo de iteraciones, y con el ratón elegir un pedazo de la imagen para ampliarlo.

3
ItNaS

Madre mía como se lo curra la gente xD Creía que uno de los objetivos era ser conciso.

Khanser

Venga gente que esto se acaba!

elkaoD

#138 y se acabó :) En breves subo kata.

KATA: Fractales Mandelbrot

  • ItNaS (Matlab) - #119

  • Khanser (Python) - #120

  • elkaoD (GLSL) - #126

  • The-Force (Unity/C#) - #132

  • aitorman (GLSL) - #133

  • cm07 (Processing) - #136

elkaoD

KATA: Cuboides ASCII

Dibuja un cuboide ASCII art dado el tamaño en X Y Z azulejos.

Ejemplos:

3 3 3 ->
    ____ ____ ____
  /____/____/____/|
 /____/____/____/||
/____/____/____/|||
|____|____|____|||/
|____|____|____||/
|____|____|____|/

5 2 3 ->
    ____ ____ ____ ____ ____
  /____/____/____/____/____/|
 /____/____/____/____/____/||
/____/____/____/____/____/||/
|____|____|____|____|____||/
|____|____|____|____|____|/

4 6 5 ->
      ____ ____ ____ ____
    /____/____/____/____/|
   /____/____/____/____/||
  /____/____/____/____/|||
 /____/____/____/____/||||
/____/____/____/____/|||||
|____|____|____|____||||||
|____|____|____|____|||||/
|____|____|____|____||||/
|____|____|____|____|||/
|____|____|____|____||/
|____|____|____|____|/

Entrega

  • 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 jueves 28 de febrero a las 23:59.

1 respuesta
Khanser

#140 Se nota lo depre que te ha dejado la kata anterior por las pocas descripciones que has puesto XD

ItNaS

Mi kata en F#

Explicación de la kata y de F#

Antes de empezar me gustaría introducir un poco F# para todos aquellos que lo ven por primera vez.

Introducción Wikipedia
F# (pronunciado F Sharp) es un lenguaje de programación multiparadigma de código abierto, para la plataforma .NET, que conjunta la programación funcional con las disciplinas imperativa y orientada a objetos. Es una variante del lenguaje de programación ML y es compatible con la implementación Objective Caml. F# fue inicialmente desarrollado por Don Syme de Microsoft Research, pero actualmente está siendo desarrollado por la División de Desarrolladores de Microsoft y es distribuido como un lenguaje totalmente soportado en la plataforma .NET y Visual Studio 2010.

Vamos, viene a ser al .NET lo que scala a la JVM.

En F# se utiliza mucho el operador pipe "|>" para facilitar la lectura. En verdad su definición es tan sencilla como:

let (|>) x f = f x

Pero nos permite cambiar este churro

List.reduce((fun a b -> a + b) List.map((fun x -> x*x) [1 .. 10]))

por este poema

[1 .. 10]
|> List.map (fun x -> x*x)
|> List.reduce (fun a b -> a + b)

que sigue de forma más fiel el razonamiento de una persona (sana)

Y vista esta pequeña introducción ahora os explico mi kata

let cuboide a b c =

Aquí defino la función cuboide que toma 3 parámetros. Verdad que no véis tipos por ningún lado? Gracias a la inferencia de tipo F# sabe que se trata de ints. Para mi el tipado es la vida pero si no los tengo que especificar directamente es el cielo.

     let rep = String.replicate

Para simplificar el código que viene luego creo una funcion rep que hace lo mismo que String.replicate

  let top =
    [0 .. c]
    |> List.rev

Aquí creo la parte de arriba de los cubos. Empiezo con una lista que va de c a 0.

  |> List.map (fun i -> rep i " " + "/" + rep a "____/")
  |> fun x -> (x.Head.Replace("/", " ")::x.Tail)

Creo los espacios del principio y la parte superior del cubo. A la primera fila le reemplazo los "/" por " ".

  |> List.mapi (fun i x -> x + rep (min i b) "|")
  |> List.mapi (fun i x -> if i > b then x + "/" else x)

Relleno el lateral del cubo tal y como toca. Es dificil de explicar en texto pero si coges un papel verás que tiene sentido.

La parte frontal del cubo es muy parecida a la de arriba.

4 2 respuestas
Amazon

El mio en Python
http://ideone.com/Rk9Wsg

Nada nuevo por el horizonte, optimización -4 (en verdad antes hacía un print en vez de almacenarlo en la variable y sacarlo más tarde, así que -3 mejor)

Espero impaciente el de otra persona en python o cualquier cosa que se pueda leer (va por ti #142)

1
aitorman

Me ha dado por aprender python así que he hecho la kata con el, pero es la primera cosa que hago (menos algun cacascript que hice hace tiempo para blender) así que no me crucifiquéis demasiado xD

1 2 respuestas
ItNaS

#144 te falta la linea de "/" de abajo a la derecha.

1 respuesta
aitorman

#145 Ostia es verdad que fail, fixed

The-Force

#144 Tienes una columna de mas a la derecha

#148 Almenos la tienes hecha xD yo aun no la he empezado

1 1 respuesta
aitorman

#147 jode que fail de kata xD. Como tenia los "azulejos" de arriba echados hacia la derecha tambien no me di cuenta

1 2 respuestas
ItNaS

#148 No es por fastidiarte más xd pero te falla cuando b < c

1 respuesta
aitorman

#149 Jodeer, voy a ver que es xD
EDIT: Si que funciona, era que en el input lo habias puesto con espacios: "3 1 3", y en el mío hay que poner con enters porque los lee por separado y por eso fallaba porque leia todo el "3 1 3" como un numero y al intentar pasarlo a int daba error

1