Esta pregunta está inspirada en esta respuesta . Casualmente, solía usar la multiplicación etíope cuando era niño, pero nunca había conocido el nombre del método hasta hace poco.
La multiplicación etíope es un método para multiplicar enteros utilizando solo la suma, la duplicación y la reducción a la mitad.
Método:
- Tome dos números para multiplicarlos y escríbalos en la parte superior de dos columnas.
- En la columna de la izquierda, reduzca a la mitad el último número repetidamente, descartando cualquier resto, y escriba el resultado debajo del último en la misma columna, hasta que escriba un valor de 1.
- En la columna de la derecha, doble el último número repetidamente y escriba el resultado a continuación. se detiene cuando agrega un resultado en la misma fila donde la columna de la izquierda muestra 1.
- Examine la tabla producida y descarte cualquier fila donde el valor en la columna izquierda sea par. Suma los valores en la columna de la derecha que quedan para producir el resultado de multiplicar los dos números originales juntos.
Por ejemplo: 17 x 34
17 34
Reducir a la mitad la primera columna:
17 34
8
4
2
1
Doblando la segunda columna:
17 34
8 68
4 136
2 272
1 544
Filas tachadas cuya primera celda es par, haremos esto encerrando esos números a la derecha entre corchetes:
17 34
8 [68]
4 [136]
2 [272]
1 544
Suma los números restantes en la columna de la derecha:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
Entonces 17 multiplicado por 34, por el método etíope es 578.
La tarea:
Código de golf que toma dos números entre 1 y 1000 y realiza el mismo diseño y algoritmo, mostrando el producto a continuación.
Método de entrada: como quiera que elija ...
Entrada de ejemplo:
19 427
Resultado resultante:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
Tenga en cuenta la alineación de los dígitos. Esto es lo más importante en el diseño. También tenga en cuenta que la línea doble establecida por signos iguales debe ser dos caracteres más larga que la respuesta general y debe estar justificada al centro.
Pruebas
¿Cómo vas a probar esto? Al proporcionar una ejecución de su programa utilizando dos números. Estos números se pueden extraer de su número de identificación de usuario (esto se puede obtener colocando el cursor sobre su avatar en la ventana superior). Tome su número y tome los últimos tres dígitos, este será el número B, tome lo que quede en el frente, ese será el número A. Luego, pruebe A por B.
Ejemplo de prueba:
Mi número de identificación de usuario es 8555, por lo que mis números son 8 y 555. Por lo tanto, mi salida debería verse así:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
Restricciones:
Ningún operador de multiplicación nativo permitió guardar en el uso de "duplicación", como se menciona en el algoritmo. En otras palabras, si está utilizando un operador como *, solo se puede usar para multiplicar por 2 solamente.
Las entradas que no cumplan con esto no serán consideradas y el usuario será acompañado fuera de las instalaciones con una caja de cartón llena de sus pertenencias. Cada entrada tendrá un código, más la prueba basada en su número de identificación de usuario.
Este es el código de golf. El menor número de bytes recibirá el premio, la gloria y la admiración de sus compañeros ... (Y tal vez un Lamborghini ... ¡Dije "tal vez"!)
*
ox
), pero es imposible detectar si se usa la multiplicación o no. Excepto esa parte, el desafío es interesante.Respuestas:
Carbón , 91 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Se establece
t
en la lista vacía ys
en0
. (u
ya está predeterminado en la lista vacía).Ingresa los dos números.
Se repite mientras
q
no es cero.Envuelva el
q
relleno y añádalo a la listat
.Envuelva
h
en relleno o[]
dependiendo de siq
es impar, y añádalo a la listau
.Agregar
h
as
siq
es extraño.Entero dividido
q
por 2.Añadir
h
a sí mismo.Agregue una cadena adecuada de
=
signos a la listau
.Agregue la suma rellenada
s
a la listau
.Gire la lista
t
180 ° e imprímala al revés, justificándola a la derecha.Mueva el cursor de modo que cuando
u
esté justificado a la derecha, su esquina superior izquierda se alinee con la esquina superior derecha que acabamos de alcanzar e imprimau
justificado a la derecha.fuente
Python 2 ,
203202187133 bytesPruébalo en línea!
Si puedo usar
*
para la multiplicación de cadenas ('='*R
) y como 'selector' (b*(a%2)
lugar de[0,b][a%2]
), obtengo:118 bytes
Pruébalo en línea!
Explicación:
fuente
Java (OpenJDK 8) ,
353316267214210 bytesPruébalo en línea!
fuente
(a,b)->{int g=0;for(;a>0;g+=a%2*b,a/=2,b*=2)System.out.printf("%1$8d%2$10s\n",a,a%2<1?"["+b+"]":" "+b+" ");System.out.printf("%1$19s%2$18s","".valueOf(new char[(int)Math.log10(g)+3]).replace("\0","=")+"\n",g+" ");}
a%2*b
agradable y simple, graciasMathematica, 264 bytes
entrada
salida
fuente
s=Quotient[s,2]
:)Perl 5 , 157 bytes
155 bytes de código + 2 banderas de línea de comando (
-nl
)Pruébalo en línea!
fuente
JavaScript 2017, 221 bytes
Principalmente un problema de formato de salida
Menos golf
Prueba
fuente
C, C ++,
319313301299 bytes-8 bytes gracias a Zacharý
Gracias a la
printf
magia que aprendí en 60 minutos entre las ediciones.Optimización de C ++, reemplazar encabezado
stdio.h
porcstdio
ystring.h
porcstring
, ahorra 2 bytesLa compilación con MSVC requiere agregar
#pragma warning(disable:4996)
para poder usarsprintf
Prueba con mi ID de PPCG:
72 x 535 =>
Respeta las reglas, los dígitos están alineados y los signos iguales siempre serán 2 caracteres más grandes que el número final. Ejemplo con 17 x 34 =>
fuente
#define O printf("%*d %c%*d%c\n",5,a,a%2?' ':'[',9,b,a%2?' ':']');
yvoid m(int a,int b){int r=0,i=0;O while(a>1){r+=a%2*b;a/=2;b*=2;O}r+=b;char t[20],p[20];memset(t,0,20);memset(p,0,20);sprintf(t,"%d",r);for(;i<strlen(t)+2;++i)p[i]='=';printf("%*c%*s\n%*d",5,' ',12,p,16,r);}
%
y*
son los mismos, por lo quer+=a%2*b
debería funcionar.[Bash],
144142140131128 bytesMejor respeto de la visualización, tenga en cuenta que hay un carácter de espacio final
Primera respuesta
fuente
Haskell , 305 bytes
Pruébalo en línea!
El
!
operador crea las dos listas,?
calcula el producto.%
y#
se usan para el diseño ascii.fuente
C,
205201190183156150143 bytesEsto compilará con advertencias como C89, y no creo que sea C99 válido, pero termina siendo más pequeño que la versión de HatsuPointerKun, ya que ahorra bytes al omitir
#include
's, no usar longitudes dinámicas para imprimir, ya que no son necesarios, & usandolog10()
para calcular el número de=
's necesarios:Como mi número es
64586
, utilicé este programa de prueba para calcular64 * 586
:y sale:
editar
guardado 4 bytes por la regla "int implícito"
editar 2
ahorró 11 bytes cambiando a un
do...while()
bucle y moviendo el printf al bucle desde una macro. También debería funcionar correctamente sia=1
.editar 3
ahorró 7 bytes e hizo que el código funcionara correctamente.
editar 4
Guardado 26 bytes con algunos trucos printf.
editar 5
ahorró 6 bytes al contraer el relleno adicional en 1 número.
editar 6
ahorró 7 bytes mediante el truco printf con el operador ternario y no declaró una variable no utilizada
fuente
Excel VBA, 183 bytes
Una función de ventana inmediata anónima VBE que toma la entrada del rango
[A1:B1]
y las salidas a la consola.Sin golf
Salida
fuente