Coding katas: MV Coders on Fire II

elkaoD

¡Todos estábais esperando la segunda parte de MV Coders on Fire!

Además de por el foro, también hablamos (entre otras cosas) de las katas por #mv.nerd en QuakeNET. No olvidéis pasaros :)

Reglas

  • Se permite cualquier lenguaje, desde Befunge hasta Chino Mandarín, siempre que haya compìlador/intérprete disponible.

  • Podrás subir la solución de tu kata EN SPOILER o como un enlace a un Gist/PasteBin/intérprete online/...

  • Todo programa posteado se debe acompañar de AL MENOS una screenshot de la salida o resultado en intérprete online (mirad http://www.ideone.com aunque hay mil alternativas).

  • Todos los archivos fuente/código en

     tienen que estar hechos por ti y poder ser ejecutados por quien quiera (es decir, en entornos gratuitos).
    [*] Puedes presentar varios códigos por cada kata.[/list]
    [b]Puntos extra por (orientación para votar):[/b]
    [list][*] Concisión.
    [*] Elección loca de lenguaje/tecnología.
    [*] Llevar las reglas al límite.
    [*] Graciosidad/hilaridad gratuita.
    [*] Lo que la gente decida en forma de manitas.[/list]
    [bar]Katas[/bar]
    
    #2 (resultados #48) - [spoiler=Rectángulos de texto][list][*] Lecherito (C) - #3
    [*] _oip_ (Python) - #10 (sin probar, Gist caído/borrado)
    [*] m3l0 (C++) - #12
    [*] Cobre (PHP) - #14 (el tamaño no cumple la regla 4 de la kata)
    [*] Sarwaz (JS + CSS) - #16 (no cumple la regla 4), #26 (sólo Chrome)
    [*] Pirado_IV (Node.JS) - #19 (no cumple la regla 4)
    [*] Code07 (VB6) - #23
    [*] EnZo (JS) - #27
    [*] ItNaS (MATLAB/Octave) - #29 - Explicación en #32
    [*] efcasado (Erlang) - #33
    [*] elkaoD (CoffeeScript) - #38 - Explicación en #45[/list][/spoiler]
    #50 (resultados #92) - [spoiler=Interpreta Brainfuck][list][*] ItNaS (MATLAB/Octave) - #63 (falta lectura de entrada y cumplir anchos de celda) + (JavaScript) #79 (al parecer no está completo)
    [*] elkaoD (CoffeeScript) - #71
    [*] The-Force (Python) - #72
    [*] meuxx (JavaScript) - #84
    [*] aitorman (C++) - #85
    [*] Amazon (Python) - #86
    [*] cm07 (Python) - #87[/list][/spoiler]
    #94 (resultados #115) - [spoiler=Gradientes ASCII][list][*] elkaoD (CoffeScript) - #103
    [*] cm07 (Python) - #101
    [*] The-Force (Python) - #95
    [*] The-Force (Unity con JS) - #107
    [*] aitorman (C++)  - #99
    [*] Lecherito (C ofuscado)  - #104[/list][/spoiler]
    #116 - [spoiler=Fractales Mandelbrot][list][*] ItNaS (Matlab) - #119
    [*] Khanser (Python) - #120
    [*] elkaoD (GLSL) - #126
    [*] The-Force (Unity/C#) - #132
    [*] aitorman (GLSL) - #133
    [*] cm07 (Processing) - #136[/list][/spoiler]
    #140 - [spoiler=Cuboides ASCII][list][*] ItNaS (F#) - #142
    [*] aitorman (Python) - #143
    [*] The-Force (C#/Unity) - #151[/list][/spoiler]
    #155 [b](¡kata activa!)[/b] - [spoiler=Game of Life][list][*] PiradoIV (JavaScript) - #158
    [*] Khanser (JavaScript) - #160
    [*] ItNaS (CoffeeScript) - #161
    [*] HispanicO (Java) - #162
    [*] elkaoD (J) - #163
    [*] The-Force (C#/Unity) - #173
    [*] sarwaz (JavaScript) - #176[/list][/spoiler]
7
elkaoD

Kata: Rectángulos de texto

El programa acepta como entrada (stdin, argumento en una función...) una cadena de caracteres de longitud par, con al menos 8 caracteres (se asume la entrada válida). El objetivo es mostrar el texto como un rectángulo.

Por ejemplo, dada la cadena "HelloWorld" el programa debe mostrar:

Hell
d  o
lroW

Reglas

  • El texto se imprime en orden horario (empezando por donde elijáis)

  • El ancho de los lados es de un carácter

  • Debe formar un rectángulo cerrado

  • El rectángulo debe ser el de mayor area poslbie, para evitar la solución trivial "Hello\nWorld".

  • No se imprimirán otros caracteres además de los saltos de linea/espacios en el interior del rectángulo

  • La kata acabará el miércoles 6 de febrero a las 23:59 y se publicará una nueva kata inmediatamente, con la misma duración.

Lecherito

Ale, mi solución, he cambiado de Java a C, ¡Y sin usar caracteres espaciadores!! (Bendita consola y sus caracteres de escape para colocar el cursor donde quiera xD)

Codigo
Makefile

Uso: linux -> make, y luego make test o make testdos

O: compilar y ejecutar como te de la gana xD

Screens:

1 2 respuestas
MTX_Anubis

El rectángulo de mayor area posible es el cuadrado :P

1 respuesta
elkaoD

#4 sólo para (strlen % 4) == 0 (en cuyo caso, en efecto, hay que mostrar un cuadrado).

B

edit: nada había leído mal xD

Ahora mismo no puedo hacerlas pero iré siguiendo el hilo!

#7 había cruzado letras y leído strlen == 4 xD, ida de pinza mía.

1 respuesta
elkaoD

#6 (strlen % 4) == 0 equivale exactamente a "la longitud es múltiplo de 4 caracteres" :P

EDIT: Has sido rápido, vaquero.

#3 si lo pones con class, main, etc. triunfas (por aquello de que la gente copypastée más cómodamente).

Aún así, tu código es un fail (primer escarnio público) porque viola la regla 4 de la kata. Para el ejemplo que das, devuelve:

HelloWorl
d.......d
lroWolleH
9*3 = 27 caracteres de área

Cuando tienes varios rectángulos mayores, p.ej.:

HelloWor
d......l
l......d
roWolleH
8*4 = 32 caracteres de área

HelloWo
d.....r
l.....l
r.....d
oWolleH
7*5 = 35 caracteres de área

etc. etc.

#8 espero ansioso (junto a tu solución con RegEx, obviamente... xD)

2 respuestas
Lecherito

#7 Ya, lo he leído por encima y no estoy en un buen día, lo editaré para el 7.

#7 No joder, para imprimir strings no vale Regex xDD

spoiler
2 respuestas
elkaoD

#8 No joder, para imprimir strings no vale Regex xDD

Habrá que ver qué puedo montar.

2 1 respuesta
B

Mi aportación: https://gist.github.com/4675457

B

Aviso: en el código hay pajas mentales absurdas.

Además no lo he probado demasiado, mañana lo repaso xD

EDIT: Esperaos a mañana, que igual no va.

m3l0

mmm como noob que soy lo mas que he conseguido a sido esta chapuza xD

spoiler
1
Buffoncete

yo estoy en la empresa siguiendo

http://12meses12katas.com/

1 respuesta
Cobre

Creo que ya lo tengo, alguien lo puede probar?? xd
esta en php

spoiler

edit: hize lo mismo que #3, entendi que el ancho debe ser como maximo un caracter que solo se debia poner una letra en medio tipo:
dsklfjafdslk
a a
adsfkljadslf

1 respuesta
Lecherito

#14 Pues nos toca cambiarlo xDD

S

LOL

1 respuesta
elkaoD

#16 el ejemplo de "HelloWorld" resulta ilegible, no sé si tendrás algún bug... pero buen intento con HTML :)

1 comentario moderado
PiradoIV

$ node 1.js HelloWorld
Hell
d o
lroW

Código

Ni idea de si los cálculos del tamaño de los lados se hacían así, ha sido un try&test total xD

1 1 respuesta
Khanser

Alguien me podria haber avisado, yo fui el OP del primero ;_;

#21 Fuck, se me colaria entre otros avisos. Gracias pues :D

1 respuesta
elkaoD

#19 tienes mal el cálculo de lados. 'HelloWorldHelloWorldHelloWorld' saca:

HelloWorldHe
d          l
l          l
r          o
oWolleHdlroW

12*5 = 60

Pero los hay más grandes (el más grande de 9x8 en concreto).

#20 te avisé en el otro post y te cité xD

1 respuesta
Linkyd

Post a favoritos iGGGsofactus

C

Nuestro amigo kaoD (alias MrLombardas) en su gran inteligencia, ha sugerido como criterios de valoración conceptos contrapuestos (concisión / graciosidad). He optado por la graciosidad más que por la concisión. Es decir, podía optar por hacer un algoritmo en una línea (a lo eisen) o hacerlo didáctico. Así que lo he hecho didáctico. Y para que sea gracioso: en VB6! (me he dado asco a mí mismo, pero tengo una GUI de 1997 molona!)

Análisis previo

Bien, ¿y cómo montamos el cuadrado? Aquí entra el juego el algoritmo que cada uno elija. En mi caso he optado por la siguiente estrategia: (es claramente mejorable con un while e ir controlando los límites del cuadrado, pero así se percibe mejor la estrategia seguida)

  • 1º) Calculamos la base y altura del cuadrado

  • 2º) Crear un array bidimensional (matriz para los amigos) que inicializo con espacio en blanco en todas las posiciones del array.

  • 3º) Recorrer en las cuatro direcciones (left->right ; up->down ; right->left ; down->up) desde la posición 1,1 siguiendo el orden de las agujas del reloj. A cada paso voy soltando un caracter del texto a printear (utilizo el término printear de los 80' porque está hecho en VB6, es lo suyo xd).

  • 4º) Finalmente, recorremos el array de left->right y up->down montando la variable que contendrá el cuadrado

He aquí un par de ejemplos:

Aquí el código fuente

Ahora si eso subo el proyecto y el ejecutable.

8 1 respuesta
Khanser

#23 La manita es por la parte didáctica, y porque has explicado lo mismo que tengo pensado picar, pero me ha salido urticaria en los ojos al ver VB

1 respuesta
C

#24 Gracias!

La próxima en android con java. No me digas que no está panchitens en VB6 xD. Conste que lo había avisado. A mí me ha dado asco hasta programarlo.

#26. funciona, es conciso y encima en js/css, +1

S

Me he empeñado en hacerlo con css (solo chrome)

4 1 respuesta
EnZo

He de decir que no me siento orgulloso de este kata, porque para mí la parte mas dificil me la ha resuelto CodE. Que son las matematicas, me podria haber tirado toda la tarde y no haber llegado a la conclusion de tener que dividir entre 4 xD

Pero bueno mi reto ha sido intentar hacerlo optimo y con poco codigo.

spoiler
1
B

A alguien le fue lo que puse en #10? Es que estos días estoy de exámenes y no sé si lo tocaré. Lo hice a prisas así que como ya dije no sé ni si estará bien xD

#30: El problema es que no tengo pc ahora para hacerlo, a ver si mañana xD

1 respuesta
ItNaS

en matlab/octave

http://ideone.com/qlSIrn

No se si se podra hacer más corto en algún otro lenguaje

6 1 respuesta
C

#28 decodifiqué el fuente, pero tampoco me he puesto a probarlo. No seas perro! Depúralo y haz screenshot con el resultado. Son 10 min!

1 respuesta

Usuarios habituales

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