Introdução
Eu defini a classe de permutas antsy em um desafio anterior . Como lembrete, uma permutação p dos números de 0 a r-1 é ansiosa, se para cada entrada p [i], exceto a primeira, houver alguma entrada anterior p [ik] tal que p [i] == p [ ik] ± 1 . Como um fato divertido, também afirmei que para r ≥ 1 , existem exatamente 2 r-1 permutações de comprimento r . Isso significa que existe uma correspondência individual entre as permutações antipáticas de comprimento r e os vetores binários de comprimento r-1. Nesse desafio, sua tarefa é implementar essa correspondência.
A tarefa
Sua tarefa é escrever um programa ou função que considere um vetor binário de comprimento 1 ≤ n ≤ 99 e produza uma permutação antipática de comprimento n + 1 . A permutação pode ser baseada em 0 ou baseada em 1 (mas isso deve ser consistente), e a entrada e saída podem estar em qualquer formato razoável. Além disso, entradas diferentes devem sempre fornecer saídas diferentes; além disso, você pode devolver a permutação que quiser.
A menor contagem de bytes vence.
Exemplo
As permutas antsy (baseadas em 0) de comprimento 4 são
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0
e seu programa deve retornar um deles para cada um dos vetores de oito bits de comprimento 3:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
fonte
0 1
e0 0 1
deve fornecer resultados de diferentes comprimentos.Respostas:
Geléia ,
121110 bytesExperimente online! ou gerar todas as permutações de comprimento 4 .
Como funciona
fonte
Python 2,
6260 bytesGraças a @xnor por jogar fora 2 bytes!
Teste em Ideone .
fonte
x=0,
?0,
é uma tupla. Sem a vírgula, o mapeamento sobre x falharia.n
para fazer[n*len(x)]
e mudar o mapa para uma lista comp.Python, 54 bytes
Usa o seguinte procedimento:
Por exemplo,
l=[1,0,1,0]
dáf(l) == [2,1,3,0,4]
Anexar um 0 também daria o mesmo resultado. O
enumerate
é desajeitado, vou ver se pode fazer melhor recursivamente.fonte
sum
sintaxe e fatiamento.JavaScript (ES6),
484745 bytesAcabou sendo semelhante ao método @ETHproductions ', exceto que eu comecei calculando diretamente o primeiro elemento e depois usando o vetor binário para determinar se cada dígito é um novo máximo ou um novo mínimo. Editar: salvou 1 byte graças a @ETHproductions. Salva 2 bytes começando com zero e ajustando depois. Meu método anterior acabou sendo semelhante ao método de @ Dennis, mas levou 54 bytes:
fonte
Perl, 33 bytes
Inclui +1 para
-p
Dê vetor como string sem espaços em STDIN:
antsy.pl
:fonte
JavaScript (ES6), 52 bytes
Teste:
Explicação
Isso tira vantagem do fato de que, quando uma permutação antsy é revertida, cada item é 1 a mais que o máximo das entradas baixas anteriores ou 1 a menos que o mínimo das entradas altas anteriores. Ao denotar um item mais alto como a
0
e um item mais baixo como a1
, podemos criar uma correspondência exata entre as permutações antipáticas de comprimento n e os vetores binários de comprimento n - 1 .O melhor que pude fazer com a técnica de Dennis é
5751 bytes:A solução do xnor é 56 (economizou 1 byte graças a @Neil):
fonte
i-i*x
poderia seri*!x
.Haskell, 40 bytes
A solução Python de Dennis joga maravilhosamente em Haskell com
map
efold
. É mais curto do que minhas tentativas de portar minha construção direta de entrada:fonte
Lote, 127 bytes
Aceita entrada como parâmetros da linha de comando, a saída é separada por linha. (É possível inserir como STDIN com espaço separado, sem nenhum custo extra.)
fonte