Mis desafíos tienden a ser un poco difíciles y poco atractivos. Así que aquí hay algo fácil y divertido.
Secuencia de Alcuin
La secuencia de Alcuin A(n)
se define contando triángulos. A(n)
es el número de triángulos con lados enteros y perímetro n
. Esta secuencia se llama después de Alcuin of York.
Los primeros elementos de esta secuencia, comenzando con n = 0
son:
0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...
Por ejemplo A(9) = 3
, porque los únicos triángulos con lados enteros y perímetro 9
son 1 - 4 - 4
, 3 - 3 - 3
y 2 - 3 - 4
. Puedes ver los 3 triángulos válidos a continuación.
Hay algunos patrones bastante interesantes en esta secuencia. Por ejemplo A(2*k) = A(2*k - 3)
.
Para obtener más información, consulte A005044 en OEIS.
Desafío
Pero su desafío es sobre la representación binaria de estos números. Si convertimos cada número de secuencia en su representación binaria, los colocamos en vectores de columna y los alineamos, se crea una imagen binaria bastante interesante.
En la siguiente imagen puede ver la representación binaria de los números de secuencia A(0), A(1), ..., A(149)
. En la primera columna puede ver la representación binaria de A(1)
, en la segunda columna la representación de A(1)
, y así sucesivamente.
Puede ver algún tipo de patrón repetitivo en esta imagen. Incluso se parece un poco a los fractales, si observa, por ejemplo, la imagen con los números de secuencia A(600), A(601), ..., A(899)
.
Tu trabajo es generar esa imagen. Su función, su script recibirá dos enteros 0 <= m < n
, y tiene que generar la imagen binaria de la secuencia de Alcuin A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1)
. Entonces la entrada 0, 150
genera la primera imagen, la entrada 600, 900
la segunda imagen.
Puede usar cualquier formato de gráficos popular que desee. Digamos que todos los formatos que se pueden convertir a png usando image.online-convert.com . Alternativamente, puede mostrar la imagen en la pantalla. ¡No se permiten filas blancas iniciales!
Este es el código de golf. Entonces gana el código más corto (en bytes).
white=1 and black=0
o al revés?white=0 and black=1
. Entonces al revés.A(0)
produce una columna blanca,A(9)=3
produce una columna blanca con 2 píxeles negros en la parte inferior.0,0,0,1,0,2
mientras que la lista al comienzo de la pregunta dice0,0,0,1,0,1
.Respuestas:
J (
5245 (página de códigos 437))Esto estaría permitido (creo)
Hex dump
(Nada especial en realidad, el cuadrado negro es DB 16 o 219 10 en la página de códigos 437.)
Uso
Esto se genera de la siguiente manera (las etiquetas de código lo confunden al agregar espacio entre las líneas):
En la consola J estándar, no hay espacio entre líneas, por lo que llamo a la regla 'Alternativamente, puede mostrar la imagen en la pantalla'. (En ninguna parte decía que esta imagen tenía que ser representada como un formato de imagen sensible internamente)
EDITAR: Jconsole (a diferencia de JQT) usa la página de códigos 437 como valor predeterminado, y REPRESENTA los rectángulos correctamente cuando los usa desde una cadena.
fuente
Mathematica,
12612212189 bytesEsto define una función sin nombre que toma los dos enteros como parámetros y muestra la imagen en la pantalla. Traza cada cuadrado como un solo píxel, pero si lo desea, puede acercarlo.
Ahora estoy usando una fórmula explícita dada en el artículo de OEIS (la primera en la sección de Mathematica, gracias a David Carraher por señalarlo). También es increíblemente rápido ahora.
Aquí está el código sangrado con algunos comentarios:
Aquí está la salida para
0, 600
:fuente
Image[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
CJam (
56 5553 caracteres) / GolfScript (64 caracteres)CJam:
GolfScript:
Ambos producen resultados en formato NetPBM, y son esencialmente puertos entre sí.
Disección
Gracias a Optimizer para CJam 56 -> 53.
fuente
'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
Pyth -
1016059Salidas a
.pbm
. Es probable que se pueda jugar más al golf.Altamente ignorante porque estaré traduciendo a Pyth.La explicación viene después. Ahora mire el código Python equivalente.Utiliza el algoritmo OEIS para calcular la secuencia y luego se convierte en binario, rellena los números, realiza una rotación de matriz y lo formatea en una
pbm
imagen. Como no estoy usando la fuerza bruta, es increíblemente rápido.Aquí está el
600,900
ejemplo:Pruébalo aquí en línea .
fuente
R -
127125No estoy seguro si esto cumple totalmente con las reglas. No genera una imagen en un archivo, pero crea un ráster y lo traza a un dispositivo de salida.
Encontré la misma fórmula que Martin, pero aquí .
Utiliza una función sin nombre.
Ejecutar de la siguiente manera
Produce la siguiente trama
fuente
raster
al espacio de nombres, ya queraster()
es lo único específico de ese paquete. En cambio, solo hazloraster::raster(...)
.Python 2
+ PIL,255184Mi primera versión usó PIL para mostrar una imagen:
La nueva versión solo produce una imagen PPM en blanco y negro en stdout:
fuente
for
. Puedes evitar los parensx%2
cambiando el orden ax%2*...
. Es más corto no definir imprimir como una función y solo usar dosfor
bucles anidados , usarprint ...,
para evitar nuevas líneas y un espacioprint
en blanco para comenzar una nueva línea. Un truco para forzar que las expansiones binarias tengan longitudh
sinzfill
es agregar2**h
, luego extraer los últimosh
dígitos.JAVASCRIPT - 291
Código:
Explicación:
Resultado:
Sí, el resultado está al revés, pero eso se debe a que
0,0
en unjs canvas
está arriba a la izquierda. : 3Manifestación:
Demo en jsfiddle
fuente