Los Cheela (del libro Dragon's Egg de Robert L. Forward) son criaturas que viven en la superficie de una estrella de neutrones. Su cuerpo es plano y circular con doce ojos en el perímetro, por lo que naturalmente usan un sistema de numeración de base 12.
Entre los Cheela, el cuidado de las crías y la educación de los jóvenes son tareas que llevan a cabo los Ancianos. Dado que los jóvenes Cheela necesitan que se les enseñe a multiplicar, los Antiguos podrían usar una tabla de multiplicar.
Su tarea es producir una tabla de multiplicación 12
x 12
en base 12
, como la siguiente. Las letras mayúsculas A
y B
se utilizan para los dígitos correspondientes a decimales 10
y 11
respectivamente.
1 2 3 4 5 6 7 8 9 A B 10
2 4 6 8 A 10 12 14 16 18 1A 20
3 6 9 10 13 16 19 20 23 26 29 30
4 8 10 14 18 20 24 28 30 34 38 40
5 A 13 18 21 26 2B 34 39 42 47 50
6 10 16 20 26 30 36 40 46 50 56 60
7 12 19 24 2B 36 41 48 53 5A 65 70
8 14 20 28 34 40 48 54 60 68 74 80
9 16 23 30 39 46 53 60 69 76 83 90
A 18 26 34 42 50 5A 68 76 84 92 A0
B 1A 29 38 47 56 65 74 83 92 A1 B0
10 20 30 40 50 60 70 80 90 A0 B0 100
La salida debe imprimirse en la pantalla. El formato debe ser el siguiente:
- Los números deben estar alineados a la derecha dentro de cada columna.
- Se permiten espacios iniciales antes de la primera columna, espacios finales después de la última columna o una nueva línea posterior después de la última fila.
La separación entre columnas puede ser un espacio (como se muestra arriba) o más de un espacio, pero el número de espacios debe ser consistente entre columnas. Para medir la separación de columnas, considere que los números que se muestran incluyen los espacios iniciales que pueden haber sido necesarios para cumplir con el requisito 1 (por lo que cada número ocupa tres caracteres, el primero de los cuales puede ser espacios). Por ejemplo, la tabla con separación de dos espacios sería la siguiente:
1 2 3 4 5 6 7 8 9 A B 10 2 4 6 8 A 10 12 14 16 18 1A 20 3 6 9 10 13 16 19 20 23 26 29 30 4 8 10 14 18 20 24 28 30 34 38 40 5 A 13 18 21 26 2B 34 39 42 47 50 6 10 16 20 26 30 36 40 46 50 56 60 7 12 19 24 2B 36 41 48 53 5A 65 70 8 14 20 28 34 40 48 54 60 68 74 80 9 16 23 30 39 46 53 60 69 76 83 90 A 18 26 34 42 50 5A 68 76 84 92 A0 B 1A 29 38 47 56 65 74 83 92 A1 B0 10 20 30 40 50 60 70 80 90 A0 B0 100
El almacenamiento de la computadora en una estrella de neutrones es realmente costoso, por lo que su código debe usar la menor cantidad de bytes posible.
Reto extendido y bonificación
Idealmente, su código debería reutilizarse en otras partes del universo, donde otros sistemas de numeración pueden estar en uso. Con ese fin, el desafío se extiende opcionalmente de la siguiente manera: su código acepta un número N
como entrada y genera una tabla de multiplicación N
x N
en la base N
, con el formato anterior.
La entrada puede ser desde el teclado o como un argumento de función. El programa o función deben trabajar para 2
≤ N
≤ 36
, utilizando como dígitos los primeros N
caracteres de la secuencia 0
, 1
, ..., 9
, A
, B
, ..., Z
(letras mayúsculas)
Este desafío extendido es opcional. Si sigue esta ruta, obtenga un 20% de descuento en su recuento de bytes (no es necesario redondear a un número entero).
fuente
Because they have twelve eyes, they naturally use a base-12 numbering system.
Pues naturalmente. Es por eso que usamos binario, después de todo ... ;-)Respuestas:
Pyth, 27 * 0.8 = 21.6
Pruébelo en línea: demostración
Explicación:
fuente
CJam, 33 * 0.8 = 26.4 bytes
Pruébalo aquí.
Esto utiliza la separación mínima requerida.
Explicación
Tabla de entrada
22
(la más grande que cabe en la publicación sin una barra de desplazamiento horizontal):fuente
MATL , 42 * .8 = 33.6
Renuncia
Dado que el creador del idioma y el autor del desafío son los mismos, esta respuesta no es elegible para ganar .
Para una discusión sobre si esta restricción es necesaria o no, vea esta meta pregunta .
Código
Esto usa la separación mínima.
Ejemplo
Tabla de multiplicación octal
Explicación
Editar: ¡ Pruébelo en línea!
Para ejecutar el compilador en línea (como de 19 de febrero, 2016), el cambio
Y)
aX:
, y quitar[]
. Esto es para adaptarse a los cambios que se han realizado en el idioma desde que se publicó este desafío.fuente
Bash + BSD utilidades, 36
Funciona listo
rs
para usar en OS X. Es posible que deba instalarse en sistemas Linux.Co{1..12}d{1..12}*p
aCo1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p
.dc
expresión que genera los términos requeridos.Co
establece la base de salida en 12.d
se utiliza como un separador entre números en lugar de un espacio, por lo que no se requiere escape en la expansión de llaves.d
en realidad duplica la parte superior de la pila, pero esto se ignora y descarta efectivamente.dc
es una sola línea separada por espacios.rs
vuelve a dar forma a una matriz de 12x12.-j
justifica a la derecha cada término.fuente
Pyth, 36 bytes
Pruébalo aquí
fuente
Km+1dUJ12
conKSJ12
.S
crea el rango[1, 2, ..., 12]
. Puede reemplazar ambosj""
yjk
cons
, desde sus cadenas de unión. Y otro byte: Cambiarrjbm...K1
ajmr...1K
. Con estos cambios obtienes 28 bytes:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Python,
153147132 bytes * 0.8 = 105.6¡Hasta 132 bytes gracias al consejo de Tim Pederick! :)
fuente
rjust
('%4s'%f(...)
). Vea si imprimir cada valor conprint ...,
(y luego unoprint
para la nueva línea) es más corto quejoin
. Si es así, intente colapsar los bucles .and
Aor
B) dentro de la funciónf
, usandon>=b
. Lo hice hasta que me di cuenta de que no era más corto de lo que tenía antes, ¡n//b
pero estás usando Python 2! Puede guardar un byte conn/b
.CJam,
38333238 * (.8) = 30.4 bytesPruébalo aquí
(Parece bastante similar al de Martin ahora).
fuente
Perl 6 , 60 bytes -20% = 48 bytes
(Esto es casi exactamente cómo lo escribiría incluso si no estuviera tratando de hacerlo lo más breve posible)
Uso:
fuente
for(
como el comienzo de llamar a una subrutina llamada enfor
lugar de lafor
construcción del bucle modificador . Lo que causaría un error de compilación.JavaScript (ES6) 84 (105-20%)
La forma obvia, para empezar.
Notas
alert
no es la mejor manera de generar la tabla, pero es la más corta, ya que existe una solicitud explícita de "visualización en pantalla"Menos golf
fuente
Python 3, 126 - 20% = 100.8 bytes
La función externa
t
, es la que realmente imprime la tabla de multiplicar. La función internai
, realiza la conversión de un número a una base de 2 a 36.Punta de sombrero a Boomerang por su solución , y por una punta de golf. Evité copiar cualquier cosa de la solución de Boomerang, pero me permití echarle un vistazo para ver dónde podía recortar más. E incluso antes de eso, descubrí que cuanto más jugaba al golf, ¡más el mío comenzó a parecerse al de Boomerang!
fuente
print(i(15,12),i(120,12),i(144,12),i(150,12))
tu código devuelve en13 A0 00 06
lugar de13 A0 100 106
. Desafortunadamente, la tarea requiere imprimir un número base de 3 dígitos n (100). No debería ser demasiado difícil de solucionar, pero podría agregar algunos bytes ...n>=b
, non>b
.def t(b): i=lambda n:(n>=b and i(n//b)or'')+chr(n%b+[48,55][n%b>9]) R=range(b) for r in R:print(*('%3s'%i(~r*~c)for c in R))
me gustaría hacer eso en mi solución, pero ahora ambas soluciones están bastante cerca, también podría mejorar la mejor ^^Javascript (ES6)
96.893.6 Bytes (20% de 117)Explicación
- guardado 4 bytes gracias a @ edc65
fuente
alert(b)
con noeval
es más corto. Y al menos, evite la variablea
, es inútilb+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
a
¿cómo se calcula...repeat(4-a.length)...
?MATLAB,
111 * 0.8 = 88.8110 * 0.8 = 88 bytesMi debut aquí:
Explicación:
[1:N]'*[1:N]
hacer tabla de multiplicar en base 10dec2base([1:N]'*[1:N],N)
convertir a base 12. La salida es una matriz de caracteres con 0-s inicialesstrjoin(cellstr(dec2base(___)))
convertir a celda y volver a cadenas de unión de caracteres con espacio que produce cadena 1x575[' ',strjoin(___)]
agregar espacio para tener 576 elementosstrrep(___,' 0',' ')
eliminar un cero a la izquierda. Lo hacemos dos veces porque tenemos cadenas con dos ceros a la izquierdareshape(___,4*N,N)'
convertir 1x576 serie de caracteres en 48x12 serie de caracteresdisp(___)
mostrar el resultado sinans =
Salida:
Si no contamos la declaración
N=12;
, los5*.8=4
bytes se guardan. Además, sians =
se tolera la salida, entonces podemos eliminardisp()
guardar otros6*0.8=4.8
bytes. Por supuesto, puede haber otras formas de guardar bytes :)fuente
ans
salida se tolera si la salida es un argumento de función. Pero en este caso, el desafío dice "la salida debe imprimirse en la pantalla", porans
lo que no está permitido. Además,N
debe tomarse como entrada en el desafío extendido. Puede resolver eso usando una función anónima: a la@(n)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0',' '),' 0',' '),4*N,N)')
que llamaría usandoans(12)
Python 3:
166161152 - 20% = 121,6 bytesSé que es inferior a las respuestas existentes de Python, pero pensé darle una oportunidad. Es la primera vez que publico en este sitio ...
fuente
APL,
3231 × 0.8 = 24.8 bytesEn origen 0. En inglés:
∘.×⍨1+⍳⍵
: tabla de multiplicación⍵⊥⍣¯1¨
: expresa en base ⍵ cada elemento de la tabla de multiplicar⊃∘(⎕D,⎕A)¨¨
: convierte la tabla de vectores de números en una tabla de vectores de caracteres¯4↑¨
: alinear a la derecha con la longitud 4 cada elemento del resultadoLa rutina de impresión APL predeterminada hace lo correcto.
fuente
{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Ruby,
6966 caracteres - 20% = 52.8Ejecución de muestra:
fuente
ksh93, 51 * 0.8 == 40.8 bytes
Esto debería funcionar hasta la base 64 (la raíz más grande admitida por ksh). Ejemplos:
fuente
Pyke, 14 bytes * 0.8 = 11.2 bytes, no competitivo
Pruébalo aquí!
Explicación:
O 12 bytes sin el bono
fuente