Hay una buena manera de realizar una multiplicación larga para dos enteros sin tener que hacer nada más que contar, que ocasionalmente se comparte en Internet. Escribe los dígitos de cada número como un grupo de líneas inclinadas, con los dos números en un ángulo de 90 grados. Luego, simplemente puede contar las intersecciones en las columnas separadas que surgen. Un diagrama probablemente aclarará esto. Aquí hay un ejemplo para calcular 21 * 32
:
Si buscas en Google "multiplicación larga visual / gráfica" encontrarás muchos más ejemplos.
En este desafío, debe generar estos diagramas utilizando el arte ASCII. Para el mismo ejemplo, la salida se vería así:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Probablemente sea más fácil descubrir las reglas de construcción para estos a partir de algunos ejemplos (ver más abajo), pero aquí algunos detalles:
- Los segmentos que se intersectan son
X
, los segmentos no intersectantes de las líneas son/
o\
. - Debe haber exactamente un segmento después de las intersecciones más externas.
- Debe haber exactamente un segmento entre las intersecciones que pertenecen a diferentes dígitos. Si hay cero dígitos, estos resultarán en segmentos consecutivos
/
o\
. - Debe admitir cualquier entrada positiva (al menos hasta un límite razonable como 2 16 o 2 32 ), y cualquier dígito desde
0
hasta9
. Sin embargo, puede suponer que no hay0
s ni iniciales ni finales . - No debe imprimir espacios en blanco iniciales extraños ni líneas vacías iniciales o finales.
- Puede imprimir espacios en blanco al final, pero no debe exceder el cuadro delimitador alineado con el eje del diagrama.
- Opcionalmente, puede imprimir una nueva línea final.
- Puede elegir en qué orden tomar los dos números de entrada. Sin embargo, debe admitir números arbitrarios para cualquier orientación, por lo que no puede elegir algo como "El número más grande se da primero".
- Si está tomando la entrada como una cadena, puede usar cualquier separador sin dígitos entre los dos números.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
Este es el código de golf, gana la respuesta más corta (en bytes).
Ejemplos
1*1
\ /
X
/ \
2*61
\ /
\ X /
X X /
/ X X /
/ X X /
/ X X /
/ X X
/ X \ /
/ \ X
X \
/ \
45*1
\ /
\ X
\ X \
\ X \
\ X \
X \
\ / \
\ X
\ X \
\ X \
X \
/ \
21001*209
\ /
X /
/ X
/ / \
\ / / \ /
X / X /
\ / X / X /
\ X / \ / / X /
X X \ / / / X /
/ X \ X / / / X /
/ \ \ / X / / / X /
\ X / X / / / X /
X X / X / / / X /
/ X X / X / / / X
/ X X / X / / / \
/ X X / X / /
/ X X / X /
/ X X / X
/ X X / \
/ X X
/ X \
/ \
Respuestas:
Pyth - 79 bytes
Una traducción de la respuesta de @ AlexeyBurdin. Probablemente se pueda jugar mucho más al golf.
Toma la entrada como dos números, nueva línea separada. Explicación próximamente.
Pruébelo en línea aquí .
fuente
pitón, 303
Creo que es bastante legible para los humanos.
Verificación:
fuente
reversed
es lo mismo[::-1]
, puede colocar el contenido del bucle for en una línea para ahorrar sangría,len(a)+len(b)
es más corto quesum(map(len,[a,b]))
, no lo usexrange
en el golf, el espacio) for
puede eliminarse, y ya que está usando python2, puede combinar espacios y pestañas en sangría.276
de golf sintáctico simple: gist.github.com/Maltysen/e8231c0a9b585e2a4941e=enumerate
al principio para golf 4 caracteresPython 3, 205 bytes
Las expresiones son bastante largas, así que creo que hay bastante margen de mejora, pero de todos modos ...
Toma entradas separadas por espacios a través de STDIN, p. Ej.
Hay un posible espacio final en algunas líneas, pero
A+B-2
garantiza que todos los espacios finales estén dentro del cuadro delimitador.fuente
C #, 451 bytes
Formateada para facilitar la lectura, la función en contexto:
El OR bit a bit era solo por diversión, pero la suma también funcionaría.
fuente
JavaScript ( ES6 ) 271
Estoy seguro de que hay una solución que construye la salida fila por fila, jugando con las coordenadas matemáticas y x, y (x + y == k, xy == k ...). Pero todavía no puedo clavarlo.
Así que aquí hay una solución que simplemente dibuja las líneas una por una.
Ejecute el fragmento en Firefox para probar.
fuente
VC ++
(289)280Uso
Resultados
fuente
---48
de?...)-- - 48)...
.Lienzo , 41 bytes.
Pruébalo aquí!
fuente
C (329 b)
INTENTALO
fuente
R , 294 bytes
Pruébalo en línea!
fuente
Jalea , 58 bytes
Pruébalo en línea!
Explicación
Un programa completo que toma los dos números como una lista de dos enteros y devuelve una cadena.
Enlace auxiliar 1: rotar la matriz
Enlace auxiliar 2: generar las plantillas de fila y columna
Enlace principal
fuente