Crédito
Meus agradecimentos à pergunta baseada em cartas de Rand Al'Thor pela inspiração para este desafio do código-golfe.
fundo
A natureza desse desafio é baseada no algoritmo mencionado por Rand em "Um triângulo formado por três letras":
- Comece com uma sequência de 10 letras, cada uma das quais é X, Y ou Z.
- Sob cada linha, construa a próxima linha da seguinte maneira. Se duas letras adjacentes forem iguais, escreva a mesma letra abaixo delas; se forem diferentes, escreva a terceira letra abaixo deles.
Você repetiria a etapa anterior até ter uma letra na sua décima linha.
Desafio
Vamos colocar um giro matemático no algoritmo acima:
- Vamos começar com uma sequência de 10 dígitos, cada um separado por um espaço, e cada um dos quais é 1, 2 ou 3.
- Sob cada linha, construa a próxima linha da seguinte maneira. Se dois dígitos adjacentes forem iguais, escreva o mesmo dígito abaixo deles; se forem diferentes, escreva o terceiro dígito abaixo deles.
- Repita a etapa anterior até ter um número final.
Portanto, seguindo este algoritmo, se começar com a linha 1 2 3 3 1 3 1 3 1 2
, por exemplo, o seguinte triângulo é gerado:
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1 2 3 3 1 3 1 3 1 2
3 1 3 2 2 2 2 2 3
2 2 1 2 2 2 2 1
2 3 3 2 2 2 3
1 3 1 2 2 1
2 2 3 2 3
2 1 1 1
3 1 1
2 1
3
Também estou curioso para saber a soma de todos os dígitos no triângulo numérico, portanto, adicione todos esses dígitos e coloque esse total na décima primeira linha, justificada à direita para o último dígito na primeira linha. Portanto, nosso triângulo numérico será parecido com o seguinte (espaços no meu exemplo são representados abaixo pelo .
caractere para mostrar a formatação).
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109
Seu desafio é escrever um código que possa começar com uma string / array / etc. de dez dígitos, como no meu exemplo, e aplique o algoritmo para gerar as dez linhas que criariam o triângulo numérico, seguidas por uma 11ª linha que exibirá o total de todos os dígitos com justificativa à direita.
Teste
O teste dessa string pode ser realizado com uma string gerada aleatoriamente com dez dígitos de sua escolha ou um gerado a partir do snippet abaixo ...
c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");
$("#btn").click(function(){
$("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.
Regras
- Aplicam-se as regras de código-golfe, portanto, o menor número de bytes vence o desafio. No caso de haver duas inscrições com a mesma pontuação baixa, o vencedor será premiado com base no número de votos positivos.
- Basicamente, procuramos 11 linhas, 19 caracteres ... Como você renderiza sua saída final: depende de você: matriz, console, saída de arquivo, STDOUT etc., portanto, use o método de saída que desejar. trabalhe a seu favor. A única regra na saída é que temos 11 linhas com 19 caracteres em cada linha em um formato semelhante ao anterior ...
- Se isso ajudar o seu código, use qualquer separador para os dígitos ... Lembre-se de que a legibilidade pode ser um fator que contribui.
- Sem brechas tolas .
- A codificação embutida da entrada não é permitida. Os propósitos deste código são tais que podem ser usados para produzir resultados diferentes a cada vez, com entradas variáveis. A codificação embutida,
1 1 1 1 1 1 1 1 1 1
por exemplo, nega completamente todo o ponto do algoritmo.
Ansiosos para ver o que todos vocês podem inventar!
Respostas:
05AB1E ,
3226 bytesExplicação
Experimente online!
fonte
Mathematica,
104979094 bytesExplicação
Particiona a entrada no comprimento 2, desloca 1 partições.
Toma cada partição e calcula a saída correspondente.
Um truque envolvido aqui. Acrescentei os dois números, peguei o mod 3 e subtraí o resultado de 3. Isso fornece o número desejado. (por exemplo, 3 - ((2 + 1) mod 3) = 3)
Repete o processo acima nove vezes, fornecendo todas as iterações como saída.
Formate cada iteração em linhas e coloque a coisa inteira em uma coluna (alinhada ao centro), criando um triângulo.
Pegue o total de todos os números.
Combine o triângulo e o total e alinhe à direita a coisa toda (o triângulo já está alinhado, para que seu alinhamento não seja afetado).
fonte
JavaScript (ES6),
143142 bytesGuardado 1 byte graças a @Neil
Tentei combinar várias partes, mas acabou 5 bytes mais:
fonte
3-((x+y)%3)
ajudar a reduzir esse código?p^c||p
já é um pouco mais curto :-)i?p^(p=c)||p:c
você pode usari&&p^(p=c)||c
?Ruby,
134101 bytesUsando o truque de módulo da JHM.
Veja-o em eval.in: https://eval.in/649993
fonte
CJam ,
4440 bytesExperimente online!
Explicação
fonte
Python 2, 164 bytes
Uma solução iterativa relativamente simples.
Experimente online
fonte
PHP, 143 bytes
fonte
JavaScript (ES6),
11210096 bytesToma uma matriz como entrada e cria recursivamente um triângulo separado por vírgula.
fonte