Esta pergunta é inspirada nesta resposta . Coincidentemente, eu costumava usar a Multiplicação Etíope quando era criança, mas nunca conhecia o nome do método até recentemente.
A multiplicação etíope é um método de multiplicar números inteiros usando apenas adição, duplicação e metade.
Método:
- Pegue dois números para multiplicar e anote-os na parte superior das duas colunas.
- Na coluna da esquerda, reduza pela metade o último número repetidamente, descartando quaisquer restos, e escreva o resultado abaixo do último na mesma coluna, até escrever o valor 1.
- Na coluna da direita, dobre repetidamente o último número e escreva o resultado abaixo. para quando você adiciona um resultado na mesma linha em que a coluna da esquerda mostra 1.
- Examine a tabela produzida e descarte qualquer linha em que o valor na coluna esquerda seja par. Soma os valores na coluna da direita que restam para produzir o resultado da multiplicação dos dois números originais juntos.
Por exemplo: 17 x 34
17 34
Metade da primeira coluna:
17 34
8
4
2
1
Dobrar a segunda coluna:
17 34
8 68
4 136
2 272
1 544
Linhas de strikeout cuja primeira célula é par, faremos isso colocando os números à direita entre colchetes:
17 34
8 [68]
4 [136]
2 [272]
1 544
Soma os números restantes na coluna da direita:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
Então 17 multiplicado por 34, pelo método etíope é 578.
A tarefa:
Código de golfe que recebe dois números entre 1 e 1000 e executa o mesmo layout e algoritmo, exibindo o produto abaixo.
Método de entrada: No entanto, você escolhe ...
Exemplo de entrada:
19 427
Resultado resultante:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
Observe o alinhamento dos dígitos. Isso é mais importante no layout. Observe também que a linha dupla apresentada por sinais de igual deve ter dois caracteres a mais que a resposta geral e deve ser justificada ao centro.
Teste
Como você estará testando isso? Fornecendo uma execução do seu programa usando dois números. Esses números podem ser extraídos do seu número de identificação do usuário (isso pode ser obtido passando o cursor do mouse sobre o seu avatar na janela superior). Pegue o seu número e pegue os três últimos dígitos, este será o número B, pegue o que restar na frente, o número A. Em seguida, teste A vezes B.
Exemplo de teste:
Meu número de identificação de usuário é 8555, portanto, meus números são 8 e 555. Portanto, minha saída deve ficar assim:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
Restrições:
Nenhum operador de multiplicação nativo permitido, exceto no uso de "duplicação", conforme mencionado no algoritmo. Em outras palavras, se você estiver usando um operador como *, ele poderá ser usado apenas para a multiplicação por 2.
As inscrições que não aderem a isso não serão consideradas e o usuário será escoltado para fora das instalações com uma caixa de papelão cheia de seus pertences. Cada entrada terá código, além do teste com base no seu número de ID do usuário.
Isso é código de golfe. O menor número de bytes receberá o prêmio, a glória e a admiração de seus pares ... (E talvez um Lamborghini ... eu disse "talvez"!)
*
oux
), mas é impossível detectar se a multiplicação é usada ou não. Exceto essa parte, o desafio é interessante.Respostas:
Carvão , 91 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Define
t
para a lista vazia es
para0
. (ou
padrão já está na lista vazia.)Introduz os dois números.
Repete enquanto
q
é diferente de zero.Embrulhe
q
em estofamento e anexe-o à listat
.Embrulho
h
em preenchimento ou[]
dependendo deq
sua aparência e adicione-o à listau
.Adicionar
h
as
seq
é ímpar.Número inteiro dividido
q
por 2.Adicionar
h
a si mesmo.Anexe uma sequência adequada de
=
sinais à listau
.Anexar a soma acolchoada
s
à listau
.Gire a lista
t
em 180 ° e imprima-a de cabeça para baixo, justificando-a com a direita.Mova o cursor para que, quando
u
justificado à direita, seu canto superior esquerdo se alinhe ao canto superior direito que acabamos de alcançar e imprimau
com justificação à direita.fonte
Python 2 ,
203202187133 bytesExperimente online!
Se eu puder usar
*
para multiplicação de strings ('='*R
) e como um 'seletor' (b*(a%2)
vez de[0,b][a%2]
), recebo:118 bytes
Experimente online!
Explicação:
fonte
Java (OpenJDK 8) ,
353316267214210 bytesExperimente online!
fonte
(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
agradável e simples, obrigadoMathematica, 264 bytes
entrada
resultado
fonte
s=Quotient[s,2]
:) #Perl 5 , 157 bytes
155 bytes de código + 2 sinalizadores de linha de comando (
-nl
)Experimente online!
fonte
JavaScript 2017, 221 bytes
Principalmente um problema de formatação de saída
Menos golfe
Teste
fonte
C, C ++,
319313301299 bytes-8 bytes graças a Zacharý
Muito obrigado à
printf
magia que aprendi em 60 minutos entre as ediçõesOptimização C ++, substituir cabeçalho
stdio.h
porcstdio
estring.h
porcstring
, salva 2 bytesA compilação com MSVC requer adição
#pragma warning(disable:4996)
para usarsprintf
Testando com meu ID PPCG:
72 x 535 =>
Ele respeita as regras, o dígito está alinhado e os sinais de igual sempre serão 2 caracteres a mais que o número final. Exemplo com 17 x 34 =>
fonte
#define O printf("%*d %c%*d%c\n",5,a,a%2?' ':'[',9,b,a%2?' ':']');
evoid 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);}
%
e*
são os mesmos,r+=a%2*b
deve funcionar.[Bash],
144142140131128 bytesMelhor respeito à exibição, observe que há um caractere de espaço à direita
Primeira resposta
fonte
Haskell , 305 bytes
Experimente online!
O
!
operador cria as duas listas,?
calcula o produto.%
e#
são usados para o layout ascii.fonte
C,
205201190183156150143 bytesIsso será compilado com avisos como C89, e eu não acredito que seja válido C99, mas acaba sendo menor que a versão do HatsuPointerKun, pois economiza bytes ao omitir
#include
os, não usando comprimentos dinâmicos para printf, pois são desnecessários, & usandolog10()
para calcular o número=
necessário:Como meu número é
64586
, usei este programa de teste para calcular64 * 586
:& gera:
editar
salvou 4 bytes pela regra "implícita int"
editar 2
salvou 11 bytes alterando para um
do...while()
loop e movendo o printf para o loop a partir de uma macro. Também deve funcionar corretamente sea=1
.editar 3
economizou 7 bytes e fez o código funcionar corretamente.
editar 4
Economizou 26 bytes com alguns truques de impressão.
editar 5
economizou 6 bytes recolhendo preenchimento extra em 1 número.
editar 6
salvou 7 bytes imprimindo truques com o operador ternário e não declarando uma variável não utilizada
fonte
Excel VBA, 183 bytes
Uma função de janela imediata anônima do VBE que leva as entradas do intervalo
[A1:B1]
e as saídas para o console.Ungolfed
Resultado
fonte