Este desafío es simple. Dado un número, genera una representación ascii-art del número, utilizando el sistema de numeración Maya Base 20.
¿Qué es el sistema maya?
Los mayas usaban la base 20 para almacenar números, por lo que la primera posición era el 1
lugar 20
s, luego el lugar s, luego el 400
s, etc.
Entonces, el número maya 1
está 1
en la base 10, pero en 10
realidad está 20
en la base 10, 207
está 807
en la base 10, etc.
Y representaron sus números como pictogramas, con un símbolo especial para 0
.
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Ese era su cero. (Al menos la mitad picascii la mitad de mi artística ascii versión artística)
Esa es una imagen real del símbolo maya cero. 1
Estos fueron sus cinco:
--------------------------------
| |
--------------------------------
Y un 4:
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
Finalmente, para armarlo:
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
Entonces tienen x//5
barras y x%5
puntos en la parte superior de las barras. Y si x=0
, usan el shell / loaf en lugar de un espacio en blanco.
Para obtener más imágenes, prueba la página Wikimedia Commons de imágenes de números mayas .
Pero esto es solo para números hasta 19
. No se nos permite tener más que 4
barras y 4
puntos en una sola 'historia' ... ¡Así que subimos!
La salida para 20 es:
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Tenga en cuenta que esto normalmente no sería válido, ya que tiene a 1
y 0
a al mismo tiempo. Pero 3
(tenga en cuenta que su respuesta necesita al menos 3) nuevas líneas antes de la 0
media de un nuevo valor posicional.
La historia inferior tiene puntos, significado 1
y barras de significado 5
. Pero en realidad tiene puntos 20^0
y barras de significado 20^0 * 5
.
Cada historia sube a un poder. Los puntos de la segunda historia significan 20
( 20^1
) y 100
( 20^1 * 5
).
Entonces el número 506
se puede representar como:
----
| |
| |
----
--------------------------------
| |
--------------------------------
----
| |
| |
----
--------------------------------
| |
--------------------------------
Esto es (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506
.
Su misión, si elige no elegir (no importa), es generar una representación de arte ascii del número de base 10.
Otras reglas:
- El espacio inicial / final está bien, siempre y cuando los puntos, barras y conchas estén intactos.
- Las barras, puntos y conchas deben ser exactamente lo que tienen los casos de prueba. Sin cambio de tamaño.
- Los primeros 0 están bien. (shells principales en la salida)
- No tiene que tener exactamente 3 líneas nuevas entre cada valor posicional o historia, solo al menos 3.
Casos de prueba:
15
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
12
---- ----
| | | |
| | | |
---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
4
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
0
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
24
----
| |
| |
----
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
33
----
| |
| |
----
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
20
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
1: También usaron las cabezas de dioses para los símbolos, pero para este desafío se usará el cofre de concha / pan / zelda .
but for this challenge the shell/bread will be used.
. Sin cáscara, no pan. Enlace LOZ al cofre pasado.Respuestas:
Ruby,
223180177179 bytesFunción anónima, devuelve una cadena multilínea.
Olvidé agregar algo de espacio extra que era necesario, y también la recursividad. También jugué un poco más al cambiar las cosas.
fuente
Python 3.5,
404400392312311308290281285281 bytes:(¡ Gracias a Adnan por un consejo sobre el ahorro de 9 bytes (
290->281
) y Neil por un consejo sobre el ahorro de 4 bytes (285->281
)! )Pruébalo en línea! (Ideona)
Análisis
Para los fines de este análisis, utilizaremos el conjunto de caracteres
0123456789ABCDEFGHIJ
para representar cada dígito en la base 20.Entonces, podría haber ido y convertir la base 10 en base 20 usando uno de los dos algoritmos que tengo. El primer algoritmo que pensé en usar es lo que llamo . Pero básicamente, lo que sucede es que toma el número base 10 proporcionado y lo divide por la base a la que necesita convertir el número, que en este caso es 20, hasta que el resto sea 0 o 1. Luego toma el cociente y el resto , en ese orden, desde la última operación de división, y luego todos los demás restos de las otras operaciones de división en el orden de último a primero. Todos estos dígitos se unen, y esa secuencia unida algoritmo de poderes . Sin embargo, este no es el que utilicé en el código, ya que habría sido mucho más largo de lo que debería haber sido, por lo que no voy a hablar sobre este. Sin embargo, creé un script de Python que convierte cualquier número entero en la base 10 en cualquier otra base proporcionada usando este método, que puede usar aquí en repl.it. El que utilicé para este desafío es lo que llamo el algoritmo de división , que creo que se explica bastante bien aquí invertida es su número de base 10 en la base 20! Para ilustrar esto, suponga que desea convertir el número de base 10
431
en base 20. Entonces, lo que haríamos es esto:Luego, finalmente tomaríamos la lista que tenemos, que en este caso contiene
B11
, y la revertiríamos para que ahora la tengamos11B
. Al hacer esto, finalmente tenemos nuestra respuesta final. 431 en base 10 convertido a base 20 es11B
, lo que se puede confirmar usando mi script Python que usa el algoritmo de poderes con el que ya he compartido un enlace anterior, pero lo volveré a hacer aquí . Aquí hay uno que también usa el algoritmo de división descrito en esta respuesta y devuelve la misma respuesta que la potencia.Todo este proceso es esencialmente lo que sucede en mi script en este
while
ciclo:while not p or z:p+=[z%20];z=z//20
. La única diferencia es que los números>9
son no representan como letras, sino más bien como ellos mismos.Continuando, después de que el número de base 10 se haya convertido a base 20, para cada dígito en el entero de base 20, al que llamaremos
g
,g mod 5
se imprimen puntos y luegog//5
se imprimen barras. Luego, el programa imprime 3 líneas en blanco y pasa al siguiente dígito. Sin embargo, si el dígito es0
, entonces se imprime un solo "pan" seguido de 3 líneas nuevas, y luego el programa pasa al siguiente dígito. Entonces, tomando el número base 2011B
, pasamos al primer dígito. El primer dígito es1
y, por lo tanto, imprimiría 0 barras desde entonces1//5=0
y 1 punto desde entonces1%5=1
. Entonces, primero obtendríamos esto:y luego 3 nuevas líneas. Pasando al segundo dígito, también vemos que es 1, por lo que generaría lo mismo:
y también 3 nuevas líneas. Finalmente, pasando al último dígito, vemos que es un
B
. Dado queB=11
en la base 20, el programa generaría 1 punto desde11%5=1
y 2 barras desde entonces11//5=2
. Entonces, obtenemos esto:Finalmente, juntando todo esto, obtenemos esto:
¡Y ese es el número maya para 431! Finalmente tienes tu número base 10 representado en números mayas base 20.
Nota: Puede o no haber notado esa
lambda
función en mi código. Independientemente, esta función se utiliza para la creación de puntos, ya que se deben generar varios puntos uno al lado del otro.fuente
S,N,M,X=' -|\n'
lugar de hacerloS,N,M,X=' ','-','|','\n'
?401
contiene un cero interior.Python 3, 243 bytes
Discusión
n//20and m(n//20)
llamam()
recursivamente si hay poderes superiores de 20 para ser manejados. La recursión se realiza antes de imprimir el valor posicional actual, de modo que las potencias más altas se impriman primero.Si el valor posicional actual no es cero (r! = 0), el
for a,b,f
bucle imprime las unidades y luego los cinco.a
es la primera / cuarta fila yb
es la segunda / tercera fila. El truco está en elprint(*((a,b,b,a)*f),sep=x)
. Para las unidades, f = 1 resulta enprint(*(a,b,b,a),sep=x)
, que imprime las 4 filas que componen los símbolos de las unidades (x es un '\ n'). Para los cinco, f = el número de cinco para imprimir (r // 5), por lo que la tupla (a, b, b, a) se multiplica (es decir, se repite) por el número de cinco para imprimir. Si f = 2, obtenemosprint(*(a,b,b,a,a,b,b,a),sep=x)
, que imprime dos símbolos para cinco.Si el valor posicional actual es 0, se imprime el símbolo cero.
fuente
Python, 411 bytes
Creé esto para generar casos de prueba, puede usarlo como punto de referencia. Sorta golf.
fuente
s=math.sqrt
y llamando ens(s(w))
lugar demath.sqrt(math.sqrt(w))
w**0.25
es incluso mejor ques(s(w))
. Aunque se hizo más largo?JavaScript (ES6), 254 bytes
fuente
Missing } in template expression
. No sé mucho js, ¿cómo puedo solucionarlo?Python 3, 213 bytes
Se le ocurrió una versión aún más corta con un enfoque diferente:
explicación
Las primeras 9 líneas más o menos, crean cadenas que se utilizan para hacer los símbolos.
El núcleo de la solución es la función recursiva
m
, que construye una lista de cadenas, una cadena para cada línea en la salida. Esquemáticamente, sem
ve así:m
puede reescribirse como:La llamada recursiva
m(n//20)
viene primero para que los dígitos más significativos se hagan primero.[n%5*a,n%5*b,n%5*b,n%5*a]
son la cadena de unos símbolos.a
es la fila superior para un solo símbolo.n%5
es el número de un símbolo para este dígito. Entonces,n%5*a
es una cadena para la fila superior (e inferior) den%5
unos. Del mismo modo, 'n% 5 * b` es una cadena para la segunda (y tercera) fila.La expresión
[:n%5*4]
actúa como unif
para evitar líneas en blanco adicionales en la salida si no hay 'unos' para la salida. No es necesario, pero hace que la salida se vea mejor.n%20//5
es la cantidad de símbolos para cinco que se necesitan.[c,d,d,c]
son las cadenas para hacer un símbolo para cinco.[t,w,w,v+h*19+v,y,y,t]
son las cadenas para hacer el símbolo cero[x,x]
pone al menos tres líneas en blanco entre grupos de dígitos mayasfuente