Inspirado por esta pergunta:
Crie uma função (ou um programa completo) que receba uma lista de números e a reorganize, de forma que os números indexados pares apareçam primeiro e os números indexados ímpares sigam. Os valores dos números em si não afetam a ordem - apenas seus índices. Todos os índices são baseados em zero.
Por exemplo:
Entrada: [0, 1, 2, 3, 4]
Saída: [0, 2, 4, 1, 3]
Outro exemplo:
Entrada: [110, 22, 3330, 4444, 55555, 6]
Saída: [110, 3330, 55555, 22, 4444, 6]
Use a representação mais natural para listas que seu idioma possui. Não há limitações de complexidade (por exemplo, alocar uma lista temporária é OK - não é necessário fazer isso no local).
PS Deve funcionar para a lista vazia (entrada vazia => saída vazia).
code-golf
array-manipulation
anatolyg
fonte
fonte
Respostas:
Japt , 1 byte
Experimente online!
fonte
Python, 23 bytes
Experimente online
fonte
lambda
? Por que nãomu
ounu
? : Plambda
porλ
e reduzir byte contagem por 5! : PPitão, 5
Experimente online ou execute um Conjunto de Testes
Explicação
fonte
CJam, 7 bytes
Empurra um bloco (a coisa mais próxima de uma função sem nome) que transforma o elemento da pilha superior, conforme necessário.
Teste aqui.
Explicação
A explicação assume que o topo da pilha é a matriz
[0 1 2 3 4]
. Os valores reais não afetam o cálculo.fonte
Labirinto ,
2825242322 bytesIsso foi divertido louco! :) Esse é de longe o programa Labirinto mais densamente compactado que escrevi até agora. Eu tinha tantas versões em 20 e 21 bytes que quase funcionou que ainda estou duvidando que isso seja ótimo ...
Isso recebe a entrada como uma lista de números inteiros positivos (com um delimitador arbitrário) e imprime o resultado em STDOUT como números inteiros delimitados por alimentação de linha.
A busca por 20/21 bytes: verifiquei todos os programas no formulário
onde
X
existe qualquer caractere razoável por força bruta, mas não encontrou soluções válidas. É claro que isso não significa que não exista uma solução mais curta, mas não é possível forçar programas de 20 bytes sem uma quantidade razoável de suposições em sua estrutura.Explicação
(A explicação está um pouco desatualizada, mas ainda não estou convencida de que a solução seja ótima, então esperarei atualizando isso.)
Portanto, normalmente os programas de labirinto devem parecer labirintos. Enquanto o ponteiro de instruções estiver em um corredor, ele seguirá esse corredor. Quando o IP atinge qualquer tipo de junção, a direção é determinada com base no valor superior da pilha principal do labirinto (o labirinto possui duas pilhas, com uma quantidade infinita de zeros na parte inferior). Isso normalmente significa que qualquer loop não trivial será muito caro, porque se você tiver células que não sejam de parede em todo o lugar, tudo será uma junção e, na maioria dos casos, a parte superior da pilha não terá o valor certo para o IP. para seguir o caminho que você gostaria que ele seguisse. Então, o que você faz é aumentar os loops para que eles tenham um todo no centro, com apenas um ponto de entrada e saída bem definido cada.
Mas desta vez eu tive muita sorte e tudo se encaixou tão bem, que eu pude esmagar tudo em um grande grupo. :)
O fluxo de controle começa no
_
sul. O_
empurra um zero para a pilha principal. Isso pode parecer um não operacional, mas isso aumenta a profundidade da pilha (não implícita) da1
qual precisaremos mais tarde.?
lê um número inteiro de STDIN. Se não houver mais números inteiros a serem lidos, isso empurrará zero. Nesse caso, o IP continua se movendo para o sul e@
finaliza o programa imediatamente (porque a lista de entrada está vazia). Caso contrário, o IP vira para o leste.Agora estamos entrando em um loop muito fechado com dois pontos de saída:
!
imprime o número inteiro de volta para STDOUT, deixando apenas um zero na pilha. O IP continua se movendo para o leste e?
lê o próximo número inteiro. Se isso for diferente de zero, vire à direita e seguimos para o sul.?
lê outro (o próximo índice par). Novamente, se for diferente de zero, vire à direita e seguimos para oeste.Em seguida,
\
imprime um avanço de linha sem alterar a pilha, por isso vimos outra à direita, movendo para o norte.!
imprime o próximo número inteiro do mesmo índice. Como agora há pelo menos um número inteiro de índice ímpar (positivo) na pilha, continuamos girando para a direita e o loop se repete.Uma vez que qualquer um desses
?
itens chegue ao final da lista, eles pressionam um zero e passam direto para o correspondente;
, que descarta esse zero.No caso de haver apenas um elemento na lista, estamos prontos (porque o imprimimos imediatamente), para que o IP continue se movendo para o leste até o final
@
, novamente encerrando o programa (imprimindo um avanço de linha no caminho).Caso contrário, também precisamos imprimir os números inteiros do índice ímpar. Nesse caso, os dois caminhos (dos dois pontos de saída do primeiro loop) se fundem no meio
"
, virando o leste nos dois casos._
empurra um zero para evitar virar à esquerda no@
e;
descarta esse zero. Agora entramos em um novo loop:O IP digita isso na célula inferior esquerda, movendo-se para o norte, contornando o loop no sentido horário. O
}
deslocamento da parte superior da pilha principal para a pilha auxiliar. Embora ainda exista um elemento na pilha, o IP continua a funcionar. Depois que tudo foi deslocado para a pilha auxiliar (e revertida no processo), o IP continua se movendo para o leste, entrando no último loop:\
imprime um avanço de linha novamente,{
move um item da pilha auxiliar de volta para principal. Se esse ainda fosse um item da lista, será positivo e o IP mudará para o sul, onde o item é impresso!
. Em seguida,#
empurra a profundidade da pilha (e agora é aqui que a inicial_
é importante, pois isso#
garante uma profundidade positiva da pilha), para que o IP ainda vire à direita, através da\
e{
novamente.Depois de imprimir tudo,
{
extrair um zero da parte inferior da pilha auxiliar, o IP continuará no leste e@
encerrará o programa.fonte
MATLAB, 24
semelhante ao python.
Obrigado @LuisMendo por salvar 2 bytes!
fonte
@(x)x([1:2:end 2:2:end])
Haskell , 37 bytes
Experimente online!
o
foldr
recursivamente cria a lista par e a lista ímpar. A adição antecipada de um elemento à lista é atualizada, acrescentando-a à lista ímpar e chamando-a de nova lista par e chamando a lista par anterior da nova lista ímpar. Então, o par[l,r]
é concatenadol++r
.Agradecemos a Ørjan Johansen por salvar 5 bytes usando listas de dois elementos no lugar de tuplas.
42 bytes:
Adiciona índices à lista
l
e filtra os pares ou ímpares.Ainda outro formato, para 44. A função
g
pega todos os elementos indexados pares. Os índices ímpares são obtidos primeiro pela eliminação de um elemento e pela aplicaçãog
. Sel
fosse garantido não vazio, poderíamos fazer com segurança apenastail
por 41fonte
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
comf
sendo a função principal.concat
vez de tuplas euncurry(++)
.PowerShell v3 +,
75674947 bytesExperimente online!
Espera a entrada via splatting, como mostrado no link TIO.
Cria uma matriz
$l
como uma matriz de matrizes e canaliza a entrada$args
em um loop|%{}
. Cada vez que o loop é adicionado, adicionamos um elemento a uma das duas matrizes$l
filhas, alternando a$f
variável usando a lógica booleana. A primeira vez em que$f
é , é$null
o!
que é$true
ou1
ao indexar em uma matriz. Isso significa que o primeiro elemento é colocado na segunda matriz de$l
, e é por isso que$l[1]
obtém a saída primeiro.Suporte para TessellatingHeckler pela assistência no golfe e por essa variação.
-2 bytes graças ao mazzy.
Ressalvas
Indo estritamente à medida que a pergunta é escrita, isso é tecnicamente inválido, pois o PowerShell não tem um conceito de "listas" como objetos pseudo-imutáveis, apenas matrizes ou tabelas de hash (também conhecidas como dicionários). Portanto, estou tratando a linha da pergunta " Use a representação mais natural para listas que seu idioma possui " como perguntando sobre matrizes, pois esse é o PowerShell mais próximo. Além disso, a saída é um elemento por linha, pois é a maneira padrão do PowerShell de gravar uma matriz. Isso significa que uma entrada de
(0,1,2,3,4)
saída será0\r\n2\r\n4\r\n1\r\n3\r\n
.fonte
$args
+ splatting em vez disso$input
e,@()*2
em vez disso@(),@()
F #,
797756Baseado em uma das respostas de Haskell
Primeiro indexamos a lista e depois a particionamos com critérios: primeiro item (o índice) e com 1 igual a 0.
Isso nos dá um par de lista de pares; a primeira lista contém todos os pares indexados e a outra as probabilidades indexadas.
A partir disso, remontamos as duas listas com o operador append e finalmente descartamos o índice.
Edit: perdeu um óbvio, não há necessidade de nomear o arg "xs" (hábitos) para reduzir o nome de uma letra
Eu também tenho um potencial de 76 bytes, que é basicamente o mesmo, mas definido como composição da função. O problema é que ele não é compilado como um valor, mas funcionará efetivamente com qualquer argumento de lista fornecido, para não ter certeza se está ok ou não:
Nota: List.indexed está disponível apenas no F # 4.0, apesar de ainda não estar documentado no MSDN
fonte
fun
, não é?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Supondo que o|>
F # seja aproximadamente equivalente ao operador de alimentação à direita==>
no Perl 6. Também estou adivinhando o quefst>>(&&&)1>>(=)0
fazJavaScript (ES6), 52 bytes
Também o faz de uma só vez
Mostrar snippet de código
fonte
F=
desde o início; você pode salvar um byte usando este:(i*=2)>=(z=x.length)?i-z+--z%2:i
Julia, 23 bytes
fonte
J, 8 bytes
Este é um verbo monádico (um argumento), usado da seguinte maneira:
Explicação
fonte
/:0:`1:\
que também tem 8 bytes.Gelatina , 4 bytes
Experimente online!
Baseado na resposta CJam de Martin
fonte
Mathematica, 40 bytes
{}[[2;;;;2]]
irá lançar um erro.fonte
Burlesco, 12 bytes
Uso como em:
Explicação:
Embora uma vez lançada a nova atualização, você possa fazer isso com o novo interno do Unmerge (que faz o oposto do incorporado da mesclagem
**
):fonte
Perl,
3533 bytes31 bytes + 2 bytes para
-ap
. Lê uma string delimitada por espaço de STDIN:Quando a entrada está vazia, imprime um único espaço, que eu consideraria equivalente a uma lista vazia. Caso contrário, pode ser corrigido a um custo de 4 bytes com:
(requer Perl 5.10+, imprime uma nova linha à direita)
ou a um custo de 5 bytes com:
(sem espaço em branco à direita)
Como funciona
Esta solução usa o
-a
sinalizador, que divide a entrada em espaço em branco e coloca os resultados no campo@F
matriz.A verdadeira magia acontece no
push
:o
$|
variável é normalmente usada para forçar a descarga da saída, mas tem outra propriedade interessante: quando decrementada repetidamente, seu valor alterna entre 0 e 1.Aproveitando o fato de que não há restrições nos identificadores especificados por desreferenciação simbólica , alternamos os elementos da matriz para as matrizes
@0
e@1
, assim@0
terminamos com todos os elementos indexados pares e@1
com as probabilidades. Em seguida, simplesmente concatenamos os arrays stringificados para obter nossa saída.fonte
C, 70
Nada de especial, apenas uma função de mapeamento de índice.
Menos golfe
fonte
Pitão, 8 bytes
Relativamente simples
fonte
Vitsy, 22 bytes
Vitsy realmente não foi feito para fazer isso ...
fonte
Perl 6 , 25 bytes
Este é o lambda mais curto que eu poderia inventar.
fonte
Minkolang 0.12 , 15 bytes
Experimente aqui.
Explicação
fonte
R, 49 bytes
Chame isso de q (blá). Ou, se x já contém a lista a ser reorganizada, então
são apenas 35 bytes.
fonte
F #, 64
Inspirado pela resposta de Sehnsucht (mas não o suficiente para comentar).
Mapeia cada valor para uma tupla onde a segunda entrada é o módulo do índice de lista, classifica por módulo e, em seguida, mapeia de volta para o valor original.
fonte
Prolog, 103 bytes
Exemplo
fonte
bash e coreutils GNU, 68 bytes
Assumimos que a lista seja separada por nova linha e transmitida na entrada padrão.
Infelizmente, isso ignorará qualquer entrada além do índice 1999, portanto não atende exatamente às especificações.
Ele também bloqueia um arquivo temporário codificado ('x'), que pode ser problemático se for executado em paralelo e não o remove posteriormente. Me desculpe por isso!
fonte
PHP,
7869 bytesO PHP pode dividir e fatiar, mas não intercalar matrizes; isso torna isso um pouco volumoso:
Ligue por referência ou experimente online .
primeira abordagem (programas para 78 bytes):
imprime uma vírgula inicial; insira
[!$i]
antes do primeiro$argv
para removê-lo.Duas outras soluções de 78 bytes (imprimem uma vírgula inicial e final):
Corra com
php -nr '<code>' <arguments>
ou experimente-os onlinefonte
Japonês , 3 bytes
Tente
Tente
fonte
Clojure / ClojureScript, 52 bytes
Escrito em um REPL do ClojureScript, também deve ser um Clojure válido.
fonte
K, 10 bytes
Com base na resposta Pyth de 5 bytes.
fonte
Hássio , 191 bytes
Este foi bastante longo :(
Ele lê a matriz de args, então execute isso com
hassium file.has 0 1 2 3 4
Execute e veja expandido com o caso de teste aqui
fonte