Um shuffle de Faro é uma técnica frequentemente usada por mágicos para "embaralhar" um baralho. Para executar um embaralhamento de Faro, você primeiro corta o baralho em 2 partes iguais e depois intercala as duas partes. Por exemplo
[1 2 3 4 5 6 7 8]
Faro embaralhado é
[1 5 2 6 3 7 4 8]
Isso pode ser repetido inúmeras vezes. Curiosamente, se você repetir isso várias vezes, sempre retornará à matriz original. Por exemplo:
[1 2 3 4 5 6 7 8]
[1 5 2 6 3 7 4 8]
[1 3 5 7 2 4 6 8]
[1 2 3 4 5 6 7 8]
Observe que 1 permanece na parte inferior e 8 permanece na parte superior. Isso faz disso um shuffle externo . Esta é uma distinção importante.
O desafio
Dada uma matriz de números inteiros A e um número N , produza a matriz após N Faro embaralhar. A pode conter elementos repetidos ou negativos, mas sempre terá um número par de elementos. Você pode assumir que a matriz não estará vazia. Você também pode assumir que N será um número inteiro não negativo, embora possa ser 0. Você pode receber essas entradas de qualquer maneira razoável. A resposta mais curta em bytes vence!
Teste de E / S:
#N, A, Output
1, [1, 2, 3, 4, 5, 6, 7, 8] [1, 5, 2, 6, 3, 7, 4, 8]
2, [1, 2, 3, 4, 5, 6, 7, 8] [1, 3, 5, 7, 2, 4, 6, 8]
7, [-23, -37, 52, 0, -6, -7, -8, 89] [-23, -6, -37, -7, 52, -8, 0, 89]
0, [4, 8, 15, 16, 23, 42] [4, 8, 15, 16, 23, 42]
11, [10, 11, 8, 15, 13, 13, 19, 3, 7, 3, 15, 19] [10, 19, 11, 3, 8, 7, 15, 3, 13, 15, 13, 19]
E, um enorme caso de teste:
23, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
Saída deve:
[1, 30, 59, 88, 18, 47, 76, 6, 35, 64, 93, 23, 52, 81, 11, 40, 69, 98, 28, 57, 86, 16, 45, 74, 4, 33, 62, 91, 21, 50, 79, 9, 38, 67, 96, 26, 55, 84, 14, 43, 72, 2, 31, 60, 89, 19, 48, 77, 7, 36, 65, 94, 24, 53, 82, 12, 41, 70, 99, 29, 58, 87, 17, 46, 75, 5, 34, 63, 92, 22, 51, 80, 10, 39, 68, 97, 27, 56, 85, 15, 44, 73, 3, 32, 61, 90, 20, 49, 78, 8, 37, 66, 95, 25, 54, 83, 13, 42, 71, 100]
fonte
Respostas:
05AB1E , 5 bytes
Código:
Explicação, entrada:
N
,array
:Usa a codificação CP-1252 . Experimente online! .
fonte
vim,
625954Uau. Essa é possivelmente a coisa mais hacker que eu escrevi para o PPCG, e isso está dizendo algo.
A entrada é tomada como N na primeira linha seguida pelos elementos da matriz, cada um em sua própria linha.
Na verdade, eu encontrei vários erros do vim ao escrever esta resposta:
não é possível gravar macros em outras macros (ao definir o texto manualmente, não com
q
) ou dentro de:*map
s.:let @a='<C-v><cr>'<cr>i<C-r>a
gera duas novas linhas, não uma, por qualquer motivo misterioso.Eu poderia investigar isso mais tarde.
Obrigado ao Dr. Green Eggs e Ham DJ por 3 bytes!
fonte
:P
Além disso, você pode tirar 2 bytes fazendo em"rck
vez devgg"rc
e você pode tirar outros 5 fazendo emdw@"i@r<esc>
vez deAA@R<C-v><esc><esc>0D@"
Python 2, 59 bytes
Uma abordagem diferente, um pouco mais longa que as outras respostas do Python. Funciona apenas para números pares positivos de elementos.
por exemplo
1, [1,2,3,4,5,6,7,8]
, para , pegue a matriz e acrescentelen(L)/2-1
cópias de si menos o primeiro elemento, por exemploEntão pegue todo
len(L)/2
elemento th.fonte
Python,
6857 bytesGraças ao @ Sp3000 por jogar fora 11 bytes!
Teste em Ideone .
fonte
Haskell, 62 bytes
Seja s = 2 · t o tamanho da lista. O i- ésimo elemento da nova lista é obtido usando o -ésimo elemento da lista antiga, indexada a zero, módulos s .
Prova: se i = 2 · k é par, então
e se i = 2 · k + 1 é ímpar, então
Assim, os valores usados para indexação são 0, t , 1, t + 1, 2, t + 2,…
fonte
J - 12 bytes
Advérbio (!) Tendo o número de shuffles à esquerda e a matriz para shuffle à direita.
O analisador J possui regras para escrever advérbios tácitos , mas eles têm uma precedência muito baixa: se você quiser usar um conjunto de verbos como argumento à esquerda, poderá omitir um conjunto de parênteses caso contrário necessário. Portanto, o texto acima é realmente abreviado
(/:#/:@$0,#)^:
, o que leva o número de shuffles à esquerda como advérbio e, em seguida, torna-se uma função monádica, levando a matriz a shuffle à direita.Dito isto, nós embaralhamos da seguinte maneira.
#
é o comprimento da matriz, assim0,#
como uma lista de dois elementos: 0 seguida por algo diferente de zero. Em seguida,#/:@$
replica isso em uma lista enquanto a matriz de entrada e pega seu vetor de classificação .O vetor de classificação de uma lista é a informação de como classificar a lista: o invdex (com base em 0) do menor elemento, seguido pelo índice do próximo menor e assim por diante. Por exemplo, o vetor de classificação de
0 1 0 1 ...
será assim0 2 4 ... 1 3 5 ...
.Se J agora classificasse esse vetor de classificação, Faro o embaralharia; mas isso seria trivial, já que voltaríamos
0 1 2 3 ...
. Portanto, usamos diádico/:
para classificar a matriz de entrada como se fosse0 2 4 ... 1 3 5 ...
, o que Faro a embaralha.Exemplo de uso abaixo. Experimente você mesmo em tryj.tk !
fonte
Pitão -
87 byteseconomizou 1 byte graças a @issacg
Experimente online aqui .
fonte
Q
para salvar um byte. Deve haver algo errado com a resposta Pyth se Jelly vencer Pyth. :)u
None e não o ponto fixo?Geléia,
97 bytes2 bytes graças a Dennis!
Experimente online!
Explicação
Versão anterior de 9 bytes:
Experimente online!
fonte
JavaScript (ES6),
6151 bytesModifica a matriz de entrada no local e retorna uma cópia da matriz original. Se isso for inaceitável,
&&a
pode ser um sufixo para retornar a matriz modificada. Funciona apenas para valores pequenosn
devido às limitações da aritmética inteira do JavaScript.6160 byte versão recursiva que funciona com o maiorn
, com base em @ fórmula de Lynn:fonte
MATL , 11 bytes
Obrigado a @Dennis por uma correção
Experimente online!
Explicação
fonte
w
necessário?J,
221917 bytes3 bytes graças a @Gareth .
2 bytes graças a @algorithmshark .
Uso
Onde
>>
está STDIN e<<
está STDOUT.Versão anterior de 22 bytes:
Uso
Onde
>>
está STDIN e<<
está STDOUT.fonte
{~2,@|:@i.@,-:@#^:
para 18 bytes .[:,@|:]]\~_2%~#^:
,@|:@$~2,-:@#^:
funciona para 15 bytesMathematica 44 bytes
Com 4 bytes salvos, graças ao @miles.
Riffle @@ TakeDrop[#, Length@#/2] &~Nest~## &[list, nShuffles]
divide a lista em duas sublistas iguais e as embaralhaRiffle
.{1, 5, 2, 6, 3, 7, 4, 8}
{1, 30, 59, 88, 18, 47, 76, 6, 35, 64, 93, 23, 52, 81, 11, 40, 69, 98, 28, 57, 86, 16, 45, 74, 4 , 33, 62, 91, 21, 50, 79, 9, 38, 67, 96, 26, 55, 84, 14, 43, 72, 2, 31, 60, 89, 19, 48, 77, 7, 36 , 65, 94, 24, 53, 82, 12, 41, 70, 99, 29, 58, 87, 17, 46, 75, 5, 34, 63, 92, 22, 51, 80, 10, 39, 68 , 97, 27, 56, 85, 15, 44, 73, 3, 32, 61, 90, 20, 49, 78, 8, 37, 66, 95, 25, 54, 83, 13, 42, 71, 100 }
fonte
TakeDrop
podemos encontrar uma solução usando 40 bytes ,Riffle@@TakeDrop[#,Length@#/2]&~Nest~##&
enquanto também tomamos a sequência##
a ser analisada como argumentos adicionais paraNest
.TakeDrop
. E é melhor usar##
para inserir a sequência.APL,
2321 caracteresSem a suposição (Graças a Dennis) e 1 caractere mais curto:
Experimente online .
fonte
java, 109 bytes
int[]f(int[]a,int n){for(int x,q=a.length,d[];0<n--;a=d){d=new int[q];for(x=0;x<q;x++)d[(2*x+2*x/q)%q]=a[x];}return a;}
Explicação: Há um padrão em como os elementos se movem quando são alterados aleatoriamente:
seja x o índice original
seja o novo índice
seja L o comprimento da matriz
ou como código:
y=(2*x+x/(L/2))%L
Isso pressupõe que as indicações começam em 0. Aqui está o código mais explicado:
veja ideona para casos de teste
fonte
void f(int[]a,int n){for(int x,q=a.length,d[];0<n--;a=d)for(d=new int[q],x=0;x<q;)d[(2*x+2*x/q)%q]=a[x++];}
( 107 bytes - sua resposta atual é 119 btw, não 109, portanto -12 bytes). Como você modifica a matriz de entrada, não há necessidade de retorná-la; portanto, você pode alterá-la para um vazio para reduzir bytes. Ah, e se você converter para um Java 8 lambda com currying você poderia torná-lo ainda mais curto:a->n->{for(int x,q=a.length,d[];0<n--;a=d){d=new int[q];for(x=0;x<q;x++)d[(2*x+2*x/q)%q]=a[x];}}
( 96 bytes )Julia,
4542 bytesExperimente online!
Como funciona
Nós (re) definimos o operador binário
\
para esta tarefa. Seja a uma matriz en um número inteiro não negativo.Se n for positivo, embaralharemos a matriz. Isso é obtido remodelando-o em uma matriz de comprimento (a) ÷ 2 linhas e duas colunas.
'
transpõe a matriz resultante, criando duas linhas e achatando o resultado com[:]
. Como Julia armazena matrizes na ordem da coluna maior, isso entrelaça as duas linhas.Depois, chamamos
\
recursivamente com os embaralhados a e n - 1 (~-n
) como argumentos, realizando embaralhamentos adicionais. Uma vez que n atinge 0 , voltamos o valor atual de um .fonte
Pyke, 7 bytes
Experimente aqui!
fonte
Na verdade, 15 bytes
Experimente online!
Explicação:
fonte
Prolog, 116 bytes
Uso
fonte
Perl 5
-lan
, 52 bytesExperimente online!
fonte
PHP, 98 bytes
Experimente online .
fonte