Escriba un programa o función que, dado un entero positivo como entrada, genere la representación de ese entero en números mayas .
Números mayas
Los números mayas son un sistema vigesimal (base 20) que usa solo 3 símbolos:
< >
para cero (el símbolo correcto es algún tipo de shell que no se puede representar fácilmente con ASCII)..
para uno----
para cinco
Los números se escriben verticalmente en potencias de 20, y los números entre 0 y 19 se escriben como pilas de cinco y unos . Deberá consultar el artículo de Wikipedia. para obtener más detalles.
Como ejemplo, aquí están los números entre 0 y 25, separados por comas:
. .. ... ....
. .. ... .... ---- ---- ---- ---- ---- . . . . . .
. .. ... .... ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
< >, . , .. ,... ,....,----,----,----,----,----,----,----,----,----,----,----,----,----,----,----,< >, . , .. ,... ,....,----
Entradas
- Las entradas siempre son enteros positivos entre 0 y 2147483647 (2 ^ 31 - 1).
- Puede tomar la entrada de STDIN, como argumento de línea de comando, parámetro de función o algo similar.
Salidas
- Cada línea tiene como máximo 4 caracteres de longitud.
< >
y----
siempre debe imprimirse como se indica aquí (4 caracteres de largo cada uno). - Unos (
.
) deben estar centrados en la línea. Si hay 1 o 3.
, ya que la alineación horizontal perfecta es imposible, no importa si son una columna a la izquierda o una columna a la derecha o al centro. Debe haber exactamente una línea vacía entre las diferentes potencias de 20, independientemente de la altura de las pilas en la potencia de 20 años. Por ejemplo, la salida correcta para 25 y 30 son:
. . ---- ---- ----
No se permiten líneas iniciales o finales.
Las salidas deben imprimirse exactamente como están en los ejemplos dados.
Casos de prueba
Cada número individual entre 0 y 25 se da como ejemplo arriba.
Entrada:
42
Salida:
..
..
- Entrada:
8000
Salida:
.
< >
< >
< >
- Entrada:
8080
Salida:
.
< >
....
< >
- entrada:
123456789
Salida:
.
...
----
----
----
.
----
----
..
----
----
.
....
----
----
----
....
----
- Entrada:
31415
Salida:
...
...
----
----
----
----
----
----
----
----
- Entrada:
2147483647
Salida:
.
...
----
----
.
----
----
.
----
----
----
....
----
..
..
----
Tanteo
Este es el código de golf , por lo que gana el código más corto en bytes.
fuente
Respuestas:
Pyth, 41 bytes
Pruébelo en línea: demostración
Explicación:
fuente
Perl,
125117 bytesGracias a Dom Hastings por ayudarme a ahorrar 8 bytes.
fuente
redo,if(int($i/=20))
que puedes usar~~($i/=20)&&redo
.~~
se convierte en int: también se puede usar0|
al principio (o|0
al final). También reemplazarsubstr(".... ... .. . ",20-$i%5*5,5)
con(' .', ' ..','...','.'x4)[$i%5-1].$/
parece funcionar bien, pero no he probado todos los casos de prueba ... Si esos funcionan, tienes 114 ... Si pienso en otra cosa para compartir, ¡te lo haré saber!$-
que siempre se truncará en un int ... ¡podría ahorrar algunos más!JavaScript ES6, 143 bytes
Un montón de bytes agregados porque es necesario
console.log
, podrían ahorrar otros 23 bytes sin él.fuente
Mathematica
185 182 171153Con 18 bytes guardados gracias a la sugerencia de Arcinde de usar funciones anónimas,
Ejemplo
Comprobación
El número decimal, 31415, expresado en la base 20. Mathematica emplea minúsculas para esto.
Los dígitos decimales correspondientes al número base 20 anterior.
Otro ejemplo
fuente
c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&
utilizando funciones anónimas.JavaScript (ES6), 157 bytes
Las nuevas líneas son significativas y se cuentan como 1 byte cada una. Como se requiere imprimir en STDOUT,
console.log
me costó unos pocos bytes allí.Manifestación
Para fines de demostración, escribiré una versión ES5 para que funcione en todos los navegadores:
fuente
.join
necesita paréntesis?Python 2.x, 142 bytes:
Ejemplo:
Editar: línea final ...
fuente
[n%20==0]
a[n%20<1]
. En segundo lugar, cambie[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]
ah=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]
cona=n%5
, que mueve todos losn%5
correos electrónicos y cambia el condicional al*(a>0)
que devuelve una cadena vacía ena==0
para el mismo efecto.a
,h
yn
en una sola línea, así:a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20
. Todo esto debería dejarte con 131 bytes.CJam,
8276 bytesMi primer programa CJam, básicamente solo una transcripción de mi respuesta de Perl a CJam.
Probar en línea
Multilínea con comentarios:
fuente
PHP, 220 bytes
El mismo enfoque que mi respuesta de JavaScript. PHP tiene funciones integradas para todo.
Toma 1 entrada de la línea de comando (es decir, STDIN), como se ve con
$argv[1]
:fuente
C - 149
Utiliza la recursividad para imprimir primero los números más significativos. Luego, imprime cero o imprime todos los puntos con uno inteligente
printf
y todos los cinco en un bucle. No estoy seguro si puedo evitar usar if-else aquí.La desventaja de smart printf es que 1 y 3 no están alineados entre sí:
El resultado para 23 es:
119solución incorrecta - nueva línea finalfuente
PHP,
202192 bytesObtiene la entrada del primer argumento de línea de comando.
El código fuente completo, con comentarios y pruebas, está disponible en github .
fuente
\n
tiene dos caracteres, pero una nueva línea en el medio de una cadena es solo uno.Python 2, 114 bytes
Esta respuesta se basa en la respuesta Pyth de Jakube y la respuesta Python 2 de Locoluis.
fuente
Jalea ,
504947 bytesPruébalo en línea!
...
ahora queda alineado gracias al punto user202729.Cuando te engañas para pensar
< >
es un palíndromo ...fuente
...
....
y..
debe haber un espacio, así que pongo uno para...
también. ¿Hay un camino más corto?...
no debería estar alineado a la derecha. Solo cambia<4
a<3
?