Bem, resumir realmente.
Escreva um programa ou função que inclua uma lista não vazia de números inteiros decimais (0-9) e emita um "triângulo" de dígitos apontando para baixo com a lista de entrada na parte superior, onde cada dígito após a primeira linha é a soma dos dois dígitos acima dele módulo 10.
Por exemplo, a entrada [7, 5, 0, 9]
possui saída
7 5 0 9
2 5 9
7 4
1
porque 2
é (7 + 5) mod 10
, 5
é (5 + 0) mod 10
, 9
é (0 + 9) mod 10
, etc. todo o caminho para 1
ser (7 + 4) mod 10
.
Se a lista tiver apenas um item, a saída corresponderá à entrada; por exemplo, uma entrada de [4]
produzirá
4
Aqui estão alguns exemplos adicionais:
[0]
0
[1, 2]
1 2
3
[8, 7]
8 7
5
[0, 0]
0 0
0
[1, 4, 2]
1 4 2
5 6
1
[0, 1, 0]
0 1 0
1 1
2
[1, 0, 0, 0]
1 0 0 0
1 0 0
1 0
1
[1, 2, 3, 4]
1 2 3 4
3 5 7
8 2
0
[1, 2, 3, 5, 8]
1 2 3 5 8
3 5 8 3
8 3 1
1 4
5
[9, 2, 4, 5, 3, 2, 2]
9 2 4 5 3 2 2
1 6 9 8 5 4
7 5 7 3 9
2 2 0 2
4 2 2
6 4
0
Observe que na saída:
- A primeira linha não possui espaços à esquerda.
- Cada linha subseqüente possui mais um espaço inicial que a linha anterior.
- Os dígitos são separados por um único espaço.
- Cada linha pode ter até um espaço à direita.
- Pode haver uma única nova linha opcional à direita.
- Você deve usar os caracteres para dígitos decimais normais (0 a 9).
O código mais curto em bytes vence. O desempatador é a resposta anterior.
Respostas:
BrainF ** k,
396391 bytesEu não pude resistir à tentação de fazer este. Pelo menos o triângulo está do lado pontudo para baixo.
A entrada é inserida como uma sequência de caracteres numéricos seguida por uma única nova linha.
A saída conterá um único espaço à direita em cada linha.
Exemplos:
Explicação
Como é bastante difícil explicar o código de uma perspectiva funcional, podemos analisá-lo da perspectiva do estado da fita em vários momentos. A idéia central aqui é que o triângulo que produzimos seja inicializado como uma matriz compactada (para BF, enfim) que diminua de tamanho em 1 a cada iteração de um loop. Outro pensamento importante é que usamos
255
para indicar um "espaço reservado" que podemos procurar na fita.Inicialização
Este é o passo mais fácil. No início do programa, executamos o seguinte:
Isso força a fita no seguinte estado (onde
>N<
indica o local do ponteiro na fita)O primeiro número aqui é um local "buffer". Não vamos usá-lo a longo prazo, mas é útil simplificar as operações e copiar dados.
O segundo número é o número de espaços que produziremos no início de cada linha, começando após a primeira linha. A primeira linha não terá espaços à esquerda.
O terceiro número é o caractere de espaço que produzimos.
O quarto número é um espaço reservado 255, para que possamos voltar a essa posição com relativa facilidade.
Entrada
Nesta posição, leremos todos os personagens. No final desta etapa, esperamos estar na seguinte situação:
Onde
a b c d e f ...
indica a sequência de caracteres numéricos que foi inserida (não a nova linha).Conseguimos isso com o seguinte:
Existem algumas nuances para isso. Antes de tudo, produziremos cada caractere à medida que os obtivermos e, em seguida, produziremos um espaço após ele. Em segundo lugar, não queremos copiar o valor ASCII para a fita, queremos copiar o dígito numérico real. Terceiro, queremos parar quando atingimos uma nova linha e nos deixamos em um bom lugar naquele momento.
Digamos que nossa opinião seja
6723
. Então, ao ler o primeiro6
, nossa fita fica assim:Verificamos que esse valor não é igual a
10
(uma nova linha ASCII) com,----------[++++++++++
. Em seguida, imprimimos o valor e continuamos subtraindo 48 do valor de entrada e adicionando 32 ao valor ao lado (>>++++++++[-<++++<------>>]<
), deixando-nos aqui:Observe como, durante todo esse processo, podemos assumir que todos os dígitos à direita de nossa entrada são 0 - isso significa que não corremos o risco de arruinar qualquer estado anterior se usarmos valores à direita para calcular
6 * 8
e4 * 8
.Agora, produzimos o caractere de espaço que acabamos de gerar e recebemos uma nova entrada, excluindo o espaço que calculamos lá. Eventualmente, a entrada será finalizada por uma nova linha e o loop sairá, deixando um local
255
onde a nova linha estaria (,----------]-
). Este é o segundo caractere de espaço reservado que usaremos para navegar na fita. Neste ponto do nosso cenário, nossa fita é exatamente isso:Cálculo
A maneira como isso funciona é que a lista de dígitos entre nossos
255
espaços reservados diminui um a cada iteração do loop. Quando resta apenas um dígito, terminamos e devemos parar imediatamente (observe que, neste momento, todos os dígitos dessa lista já foram emitidos, portanto, não precisamos nos preocupar em produzi-lo novamente).Vamos agora usar esse truque para navegar para o primeiro
255
espaço reservado:<+[-<+]-
. Isso efetivamente pesquisa a fita à esquerda em busca de um255
, não alterando nada no meio. Agora que movemos o ponteiro, podemos verificar nossa condição de saída: se houver apenas um dígito na lista, a célula dois espaços à direita serão mantidos255
. Assim, verificamos isso e iniciamos um loop:>>+[-<<
O primeiro passo no nosso loop é gerar uma nova linha. Então, passamos para a primeira célula (nossa célula tampão), adicionamos 10 a ela e produzimos. O próximo passo é gerar todos os caracteres de espaço iniciais. Depois de produzi-los, aumentamos nossa contagem para o número de espaços à esquerda. Essas etapas são realizadas pelo seguinte:
O que nos deixa nesse estado:
Nosso próximo passo é copiar o primeiro valor da lista, além do segundo espaço reservado
255
:Basicamente, fazemos isso alternando entre os espaços reservados
255
, deixando-nos aqui:Agora, iniciamos um loop, percorrendo o restante da lista, parando quando clicamos em
255
:>+[-<
Nesse ponto, o dígito à nossa esquerda imediata é sempre 0. Portanto, como os amamos, colocamos um espaço reservado
255
lá para que possamos voltar ao nosso lugar na lista. O próximo passo é mover o segundo lugar na lista para os locais ao redor de onde movemos o primeiro lugar, além do segundo espaço reservado255
. Essas etapas são realizadas pelo seguinte:Deixando-nos aqui:
[ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ]
Agora, ambos6
e7
foram movidos para um local onde o cálculo pode ocorrer. Precisamos de duas cópias do7
porque o próximo número da lista também precisará dele. O7
imediatamente após o255
serve a esse propósito, enquanto o outro7
será consumido pelo cálculo.Primeiro, adicionamos os dois dígitos:
Deixando-nos aqui:
A próxima combinação de etapas é a mais complicada. Precisamos ver se o número para o qual estamos apontando é maior que 10 e, se for, subtraímos
10
. Na realidade, o que fazemos é subtraí-lo 10 e ver se ele atinge0
algum ponto da subtração. Se isso acontecer, adicionamos10
novamente mais tarde. No final, devemos ter a soma do módulo 10.Neste ponto, alcançamos o objetivo. Nós temos a soma módulo 10! Além disso, independentemente de o número ser maior que 10, acabaremos aqui:
Nossos próximos objetivos são produzir essa nova soma, segui-la com um espaço e injetá-la novamente em nossa lista. Fazemos isso tudo com nossas técnicas anteriores de
255
-hopping e adicionando48
à nossa soma, para que não seja abordado em detalhes.E estamos aqui:
[ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ]
observe como colocamos um255
espaço reservado adicional após a injeção recente,3
para não perder o lugar na lista. Neste ponto, produzimos nossa soma e seu espaço, portanto, precisamos limpar e reverter para um estado em que a próxima iteração desse loop funcione. Precisamos limpar nossas células51
e32
, mover7
uma vez para a direita e navegar para o espaço reservado da lista para que possamos começar de novo.Agora, estamos aqui:
[ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
que é exatamente onde queremos estar para a próxima iteração. Portanto, verifique 255 e siga em frente! (
>+]
)Quando formos retirados do loop, teremos uma lista totalmente nova - composta pelas somas da lista anterior. A primeira vez, ficará assim:
Agora, queremos repetir todo esse processo em nossa nova lista, para que
255
desça para a esquerda e recomeçemos! Precisamos fazer um pouco de limpeza e>>[-]<<
, em seguida, deixar nosso espaço reservado com<-
. Depois disso, estamos exatamente no mesmo lugar que estávamos após a entrada, para que possamos fazer as mesmas verificações:<+[-<+]->>+
e boom! Temos todo o nosso ciclo! Todos necessidade que é o colchete de fechamento, e quando termina Nós já tudo de saída, de modo que estamos a fazer:]
.fonte
Geléia ,
201918 bytesExperimente online!
fundo
A geração dos números é direta no Jelly. A saída é um pouco mais complicada.
O Jelly possui um átomo de grade embutido (
G
) que exibe uma lista 2D com novas linhas entre linhas e espaços entre colunas. Pegamos a matriz de números 2D (gerada com cada linha invertida) e a transpomos com valor de preenchimento@
. Após reverenciar a matriz resultante e transpor novamente, a aplicaçãoG
produz o seguinte.Para obter a forma triangular desejada, basta remover o valor de preenchimento.
Como funciona
fonte
Pitão - 18 bytes
Conjunto de Teste .
fonte
Python 3.5,
747271 bytesEntrada é uma lista de números inteiros (por exemplo
f([1,2,3,5,8])
), a saída é para STDOUT. O%10
fato demap
retornar ummap
objeto no Python 3 é um pouco chato, o que significa que não podemos fazer algomap(lambda*x:sum(x)%10,L,L[1:])
parecido.A função falha, mas então a saída já estava concluída. Graças a @xsot por -1 byte, encontrando um bom lugar para colocar o
print
.fonte
f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)
None
!print
retorna algo? Não sei daprint
função retornando.print
função retornando - sim ele retornaNone
em conclusãoNone
em fatiar?05AB1E ,
201917 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
MATL,
3230292827262524 bytes1 byte salvo graças a @Luis
Experimente Online!
Versão modificada para todos os casos de teste
Explicação
fonte
V
permite especificação de formato. Você pode salvar 1 byte usandoZ"
em vez deO
: veja este link (Estou tendo problemas com o formato no comentário)D
qual usa esse espaço único entre os números por padrão.Na verdade, 43 bytes
Experimente online!
Este programa imprime uma única linha nova à direita após a saída.
Explicação:
fonte
Mathematica, 67 bytes
Exemplo:
fonte
CJam, 25 bytes
Experimente online!
Explicação
Isso usa um truque bastante interessante para gerar o layout do triângulo.
fonte
JavaScript (ES6) 147 bytes
fonte
Julia,
6059 bytesCom base na resposta do @ Sp3000 . A função
\
aceita uma matriz como entrada e retorna uma string.Experimente online!
fonte
Pyke, 21 bytes
Experimente aqui!
Eu gostaria de pensar que esse método é um pouco diferente.
fonte
Perl 6 ,
65 63 6261 bytesExplicação:
Exemplo:
fonte
TSQL,
198194191 bytesAo usar o GOTO em vez de um dos WHILE, eu consegui jogar com 3 caracteres
Golfe
Experimente online (usando script antigo com 2 * WHILE)
fonte
Java 7,
230215213 bytesIsso acabou sendo um pouco mais longo do que eu pensava .. Talvez possa ser um pouco mais jogado, já que eu meio que errei, acho ..
Alguns bytes salvos graças ao @GiacomoGarabello .
Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
void p(String s){System.out.print(s);}
e substitua a impressão padrão. Para oprintln
usop("\n")
. Mova oint i
eint j
perto doint c=0;
(int c=0,i,j;
) e mover oprint(a[i]+" ")
interior dafor
condição, assim você pode remover os suportes para um total de -11<T>void p(T s){System.out.print(s);}
vez devoid p(String s){System.out.print(s);}
.C # 6,
125 + 31125 + 18 = 143 bytesO +18 é para
using System.Linq;
Agradecemos a @TheLethalCoder por salvar 13 bytes, apontando uma declaração de utilização desnecessária
fonte
JavaScript (ES6), 77 bytes
fonte
C, 138 bytes
Golfe
Ungolfed
fonte
C #, 167 bytes
Na verdade, estou muito orgulhoso dessa solução, as expressões lambda são tão divertidas quando você pega o jeito delas
aqui ungolfed para mais melhorias:
experimente aqui
fonte
List<int> a
->int[] a
,int x=a.Count
->int x=a.Length
,.ToList()
->ToArray()
Haskell, 139 bytes
Pega a entrada como argumento e gera para STDOUT.
Versão não destruída:
fonte
Python 3, 97 bytes
Imprime uma única nova linha à direita.
Como funciona
Experimente no Ideone
fonte
J, 44 bytes
Com base nesta solução .
fonte
Javascript (usando biblioteca externa) (198 bytes)
Link para lib: https://github.com/mvegh1/Enumerable/
Explicação do código: Foi fácil usar a biblioteca! Não ganha em bytes, mas o código não é muito detalhado e fácil de ler. Portanto, a entrada "n 'é uma matriz de números inteiros. Carregue-a na biblioteca, armazenada na variável" a "." B "é a string de retorno, armazene a string unida com" "como delimitador em b. C é o iteração atual, use isso para determinar o número de espaços a serem inseridos.OBSERVAÇÃO: Isso parece funcionar bem quando a entrada é de 0 a 9. Em seguida, enquanto verdadeiro, repita um determinado conjunto de códigos. conjuntos do enumerável atual "a", ou seja, se tivermos [1,2,3,4,5,6] obteremos [1,2], [2,3], [3,4], ... [ 6] ... então filtre isso para termos apenas os lotes de tamanho 2. Em seguida, mapeamos isso para uma coleção das somas dos lotes% 10. Se a estiver vazio, estamos prontos, caso contrário, adicionamos a nova linha ao nosso retorno. Finalmente retorne ...
Imagem chegando em alguns minutos.
fonte