Existe uma boa maneira de realizar uma multiplicação longa para dois números inteiros sem ter que fazer nada além de contar, que ocasionalmente é compartilhado na Internet. Você escreve os dígitos de cada número como um monte de linhas inclinadas, com os dois números em um ângulo de 90 graus. Então você pode simplesmente contar as interseções nas colunas separadas que surgirem. Um diagrama provavelmente esclarecerá isso. Aqui está um exemplo para calcular 21 * 32
:
Se você pesquisar no Google por "multiplicação visual / gráfica longa", encontrará muito mais exemplos.
Neste desafio, você deve gerar esses diagramas usando a arte ASCII. Para o mesmo exemplo, a saída seria assim:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Provavelmente, é mais fácil descobrir as regras de construção para isso a partir de alguns exemplos (veja abaixo), mas aqui alguns detalhes:
- Os segmentos de interseção são
X
, os segmentos sem interseção das linhas são/
ou\
. - Deve haver exatamente um segmento após as interseções mais externas.
- Deve haver exatamente um segmento entre interseções pertencentes a dígitos diferentes. Se houver zero dígitos, isso resultará em consecutivos
/
ou\
segmentos. - Você deve oferecer suporte a qualquer entrada positiva (pelo menos até algum limite razoável, como 2 16 ou 2 32 ), e qualquer dígito de
0
até9
. No entanto, você pode supor que não existem0
s iniciais nem finais . - Você não deve imprimir espaços em branco iniciais estranhos ou linhas vazias iniciais ou finais.
- Você pode imprimir o espaço em branco à direita, mas não deve exceder a caixa delimitadora alinhada ao eixo do diagrama.
- Opcionalmente, você pode imprimir uma única nova linha à direita.
- Você pode escolher em qual ordem os dois números de entrada. No entanto, você deve suportar números arbitrários para qualquer orientação, para não poder escolher algo como "O número maior é fornecido primeiro".
- Se você estiver usando a entrada como uma sequência, poderá usar qualquer separador sem dígito entre os dois números.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Este é o código golf, a resposta mais curta (em bytes) vence.
Exemplos
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 \
/ \
Respostas:
Pitão - 79 bytes
Uma tradução da resposta de @ AlexeyBurdin. Provavelmente pode ser jogado muito mais.
Recebe a entrada como dois números, nova linha separada. Explicação em breve.
Experimente online aqui .
fonte
python, 303
Eu acho que é legível por humanos.
Verificação:
fonte
reversed
é o mesmo que[::-1]
, você pode colocar o conteúdo do loop for em uma linha para economizar no recuo,len(a)+len(b)
é mais curto do quesum(map(len,[a,b]))
, não usexrange
no golfe, o espaço no) for
pode ser removido e, como você está usando python2, você pode combinar espaços e tabulações no recuo.276
a partir de golfe sintática simples: gist.github.com/Maltysen/e8231c0a9b585e2a4941e=enumerate
no início o golfe 4 caracteresPython 3, 205 bytes
As expressões são bastante longas, então acho que há bastante espaço para melhorias, mas enfim ...
Leva a entrada separada por espaço via STDIN, por exemplo
Há um possível espaço à direita em algumas linhas, mas
A+B-2
isso garante que todos os espaços à direita estejam dentro da caixa delimitadora.fonte
C #, 451 bytes
Formatado para facilitar a leitura, a função no contexto:
O OR bit a bit era apenas por diversão, mas a adição também funcionaria.
fonte
JavaScript ( ES6 ) 271
Tenho certeza de que existe uma solução que constrói a saída linha por linha, mexendo nas matemáticas e coordenadas x, y (x + y == k, xy == k ...). Mas ainda não consigo acertar.
Então, aqui está uma solução que simplesmente desenha as linhas uma a uma.
Execute o trecho no Firefox para testar.
fonte
VC ++
(289)280Uso
Resultados
fonte
---48
?...)-- - 48)...
.Tela , 41 bytes
Experimente aqui!
fonte
C (329 b)
TENTE
fonte
R , 294 bytes
Experimente online!
fonte
Geléia , 58 bytes
Experimente online!
Explicação
Um programa completo que pega os dois números como uma lista de dois números inteiros e retorna uma string.
Link auxiliar 1: gire a matriz
Link auxiliar 2: gerar os modelos de linha e coluna
Link principal
fonte