Introdução
A chuva finalmente diminuiu. A maior parte da humanidade se afogou devido a um erro no código do @ user12345 . Os sobreviventes estão espalhados por um arquipélago mundial. A comunicação via rádio está ativa e a humanidade está pronta para prosperar mais uma vez. Por nenhuma razão, piratas zumbis se reuniram no Meridiano Prime e estão se aproximando do oeste. A horda devora tudo.
Problema
Nosso cenário do dia do juízo final pode ser descrito por 5 números inteiros em uma única linha, que representam um conjunto de comunidades insulares cooperantes. Eles são ordenados de oeste (número inteiro mais à esquerda) a leste (número inteiro mais à direita).
Começando com a ilha mais a leste, os ilhéus fogem em pares para a próxima ilha mais próxima. Curiosamente, para cada par que embarca, apenas um deles sobrevive à viagem. Os ilhéus viajam apenas em pares. Populações ímpares elegem um único habitante para ficar para trás e fornecer as atualizações de rádio mais recentes sobre as travessuras da horda de piratas zumbis. As populações se recusam a viajar até que todas as ilhas ao leste delas concluam suas migrações ou morram. Quando a população chega à ilha final, mais a oeste, a viagem cessa.
O gerente de operações no fim do mundo precisa de um programa que possa gerar as contagens finais da população de cada aldeia.
Exemplo de entrada
3 8 6 0 2
Saída de exemplo
8 1 0 1 0
Suposições
- A entrada pode ser fornecida via stdin, lida a partir de um arquivo nomeado arbitrariamente ou aceita como argumento
- Para cada ilha, 0 <= população <= 1024
- As populações nunca pulam uma ilha
A resposta mais curta vence!
Respostas:
APL, 16 caracteres
A entrada é fornecida como sequência para este bloco:
ou um caractere a menos se a entrada for fornecida como argumento para este bloco:
É baseado na idéia de Ilmari Karonen neste comentário .
2⊥⍵
faz uma conversão base 2 da entrada.(1e9,4⍴2)⊤
assim, converte esse número novamente na base 2 (para os quatro últimos dígitos) e na base 1e9 para o primeiro, o que é suficiente para os intervalos de entrada fornecidos acima. (1e9,4⍴2
cria a lista1e9 2 2 2 2
.)Observe que a fuga para o oeste é feita automaticamente pela conversão de base durante esse processo.
fonte
APL
deveria ser ilegal ...GolfScript,
2322 caracteresUma abordagem iterativa. A matriz é iterada várias vezes e cada vez que um número de pares é transferido da direita para a esquerda. Experimente o exemplo online .
Breve explicação do código:
fonte
~]{2base}2*' '*
faria o truque ...GolfScript (25 caracteres)
Demonstração online
Solução bastante direta: há uma abordagem mais interessante que define o valor de saída para cada ilha como uma função dos valores de entrada, mas não acho que ele possa ser jogado tão longe quanto realmente seguindo o algoritmo de redistribuição descrito na pergunta.
fonte
Javascript / ES6 (69)
Jogando com operadores bit a bit:
x&=1
mantém o bit mais baixo (1 se ímpar, 0 se for par)x>>1
é a divisão por 2 para números inteirosVersão sem ES6:
Exemplos:
f("3 8 6 0 2")
retorna[8, 1, 0, 1, 0]
f("0 997 998 999 1000")
retornos[935, 0, 1, 1, 0]
fonte
f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}
68 caracteres.Python - 96 caracteres
Golfe pela primeira vez! Entrada de stdin.
fonte
' '
da divisão, reduzindo-o para 96 e superando as outras soluções python2.J (26 caracteres)
Aqui está minha solução em J:
((<.@-:@}.,0:)+{.,2|}.)^:_
Essa solução geral deve funcionar com qualquer número de ilhas.
fonte
Rubi,
97907472Versão online
Golpeou um pouco mais, não invertendo mais a matriz ...
fonte
C - 121 caracteres
A entrada é retirada do stdin.
fonte
Python2 - 98 caracteres
Entrada de stdin.
Python3 - 79 caracteres
Entrada de stdin.
fonte
Python 2,
8580 bytesX pessoas iniciando em qualquer ilha são equivalentes a X * 2 pessoas iniciando uma ilha à direita. Esse código converte todos na configuração inicial para o equivalente em ilhéus da extrema direita e usa a representação binária do resultado para determinar quantas pessoas acabam em cada ilha.
EDIT: encurtou o código inicializando
b
para 1 em vez de 0, permitindo o uso embin
vez de uma sequência de formato.fonte
Python (101)
Percorremos a lista de trás para frente e movemos as populações de acordo com a especificação, e depois imprimimos a lista. Aqui está um teste rápido:
fonte
Mathematica 105
Isso deve funcionar com qualquer número de ilhas.
Exemplos
5 ilhas
25 ilhas
fonte
270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
para seus longos dados de teste. Acho que confirmei que estou correto.Java -
647533, mas esperando alguns pontos de brownie para o Java 8 Streams.O formulário não compactado:
Com uma assistência de:
Um pouco preocupado com o teste de @ DavidCarraher:
gera
fonte
Java -
196195Eu disse a mim mesma que não iria publicá-lo se não pudesse obtê-lo abaixo de 200 ... Sinceramente, acho que não consigo me livrar de mais nada, é muito fino para Java.
Quebras de linha:
Saída de entrada de amostra:
fonte
Java - 179 caracteres
Comprimido:
Normal:
Saída de amostra:
fonte
Emacs Lisp 144 chars
Não é pequeno, mas funciona
fonte
awk - 44 caracteres
fonte
Java - 116 caracteres
Por exemplo
int[] i = {2, 33, 16, 5};
(eu acho que aqueles que não são adicionados à contagem, já que cada número pode variar) produziria23 0 0 1
fonte