Un shuffle Faro est une technique fréquemment utilisée par les magiciens pour "shuffle" un deck. Pour effectuer un shuffle Faro, vous devez d'abord couper le jeu en 2 moitiés égales, puis vous entrelacer les deux moitiés. Par exemple
[1 2 3 4 5 6 7 8]
Faro est mélangé
[1 5 2 6 3 7 4 8]
Cela peut être répété autant de fois que nécessaire. Chose intéressante, si vous répétez cela suffisamment de fois, vous vous retrouverez toujours dans le tableau d'origine. Par exemple:
[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]
Notez que 1 reste en bas et 8 reste en haut. Cela en fait un mélange externe . Cette distinction est importante.
Le défi
Étant donné un tableau d'entiers A et un nombre N , sortez le tableau après N Faro mélange. Un peut contenir des éléments répétés ou négatifs, mais il aura toujours un nombre pair d'éléments. Vous pouvez supposer que le tableau ne sera pas vide. Vous pouvez également supposer que N sera un entier non négatif, bien qu'il puisse être 0. Vous pouvez prendre ces entrées de toute manière raisonnable. La réponse la plus courte en octets gagne!
Test IO:
#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]
Et, un cas de test massif:
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]
Devrait produire:
[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]
la source
Réponses:
05AB1E , 5 octets
Code:
Explication, entrée:
N
,array
:Utilise le codage CP-1252 . Essayez-le en ligne! .
la source
vim,
625954Sensationnel. C'est probablement la chose la plus bizarre que j'ai écrite pour PPCG, et cela veut dire quelque chose.
L'entrée est considérée comme N sur la première ligne suivie par les éléments du tableau, chacun sur sa propre ligne.
En fait, j'ai peut-être trouvé plusieurs bogues vim en écrivant cette réponse:
l'enregistrement de macros n'est pas possible dans d'autres macros (lors de la définition manuelle de leur texte, pas avec
q
) ou dans:*map
s.:let @a='<C-v><cr>'<cr>i<C-r>a
génère deux nouvelles lignes, pas une, pour une raison quelconque.Je pourrais approfondir ces questions plus tard.
Merci au Dr Green Eggs et Ham DJ pour 3 octets!
la source
:P
En outre, vous pouvez retirer 2 octets en faisant à la"rck
place devgg"rc
, et vous pouvez en retirer 5 autres en faisant à ladw@"i@r<esc>
place deAA@R<C-v><esc><esc>0D@"
Python 2, 59 octets
Une approche différente, légèrement plus longue que les autres réponses Python. Fonctionne uniquement pour des nombres pairs positifs d'éléments.
par exemple pour
1, [1,2,3,4,5,6,7,8]
, prendre le tableau et ajouter deslen(L)/2-1
copies de lui-même moins le premier élément, par exemplePrenez ensuite chaque
len(L)/2
e élément.la source
Python,
6857 octetsMerci à @ Sp3000 pour avoir joué 11 octets!
Testez-le sur Ideone .
la source
Haskell, 62 octets
Soit s = 2 · t la taille de la liste. Le i- ème élément de la nouvelle liste est obtenu en prenant le- ème élément de l'ancienne liste, indexé zéro, modulo s .
Preuve: si i = 2 · k est pair, alors
et si i = 2 · k + 1 est impair, alors
Ainsi les valeurs utilisées pour l'indexation sont 0, t , 1, t + 1, 2, t + 2,…
la source
J - 12 octets
Adverbe (!) Prenant le nombre de shuffles à gauche et le tableau à shuffle à droite.
L'analyseur J a des règles pour écrire des adverbes tacites , mais leur priorité est très faible: si vous voulez utiliser un train de verbes comme argument de gauche, vous pouvez omettre un ensemble de parenthèses autrement nécessaire. Donc, ce qui précède est en fait l'abréviation de
(/:#/:@$0,#)^:
, qui prend le nombre de shuffles à gauche comme adverbe, puis devient une fonction monadique prenant le tableau à shuffle à droite.Cela dit, nous mélangeons comme suit.
#
est la longueur du tableau, tout0,#
comme une liste de deux éléments: 0 suivi de quelque chose de différent de zéro.#/:@$
Réplique ensuite cela dans une liste tant que le tableau d'entrée et prend son vecteur de tri .Le vecteur de tri d'une liste est l'information sur la façon de trier la liste: l'invdex (basé sur 0) du plus petit élément, suivi de l'index du plus petit suivant, et ainsi de suite. Par exemple, le vecteur de tri de
0 1 0 1 ...
sera donc0 2 4 ... 1 3 5 ...
.Si J devait maintenant trier ce vecteur de tri, il le mélangerait avec Faro; mais ce serait trivial, puisque nous
0 1 2 3 ...
reviendrions. Nous utilisons donc dyadique/:
pour trier le tableau d'entrée comme s'il l'était0 2 4 ... 1 3 5 ...
, ce qui le mélange de façon Faro.Exemple d'utilisation ci-dessous. Essayez-le vous-même sur tryj.tk !
la source
Pyth -
87 octetssauvé 1 octet grâce à @issacg
Essayez-le en ligne ici .
la source
Q
pour enregistrer un octet. Il doit y avoir quelque chose de mal avec la réponse Pyth si Jelly bat Pyth. :)u
avec None et faire un point fixe?Gelée,
97 octets2 octets grâce à Dennis!
Essayez-le en ligne!
Explication
Version précédente de 9 octets:
Essayez-le en ligne!
la source
JavaScript (ES6),
6151 octetsModifie le tableau d'entrée en place et renvoie une copie du tableau d'origine. Si cela est inacceptable,
&&a
peut être suffixé pour renvoyer le tableau modifié. Fonctionne uniquement pour les petites valeurs enn
raison des limitations de l'arithmétique des entiers JavaScript.61Version récursive de 60 octets qui fonctionne avec une plus granden
, basée sur la formule de @ Lynn:la source
MATL , 11 octets
Merci à @Dennis pour une correction
Essayez-le en ligne!
Explication
la source
w
nécessaire?J,
221917 octets3 octets grâce à @Gareth .
2 octets grâce à @algorithmshark .
Usage
Où
>>
est STDIN et<<
STDOUT.Version précédente de 22 octets:
Usage
Où
>>
est STDIN et<<
STDOUT.la source
{~2,@|:@i.@,-:@#^:
pour 18 octets .[:,@|:]]\~_2%~#^:
,@|:@$~2,-:@#^:
marche pour 15 octetsMathematica 44 octets
Avec 4 octets enregistrés grâce à @miles.
Riffle @@ TakeDrop[#, Length@#/2] &~Nest~## &[list, nShuffles]
divise la liste en deux sous-listes égales et les mélangeRiffle
.{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 }
la source
TakeDrop
nous pouvons trouver une solution en utilisant 40 octets commeRiffle@@TakeDrop[#,Length@#/2]&~Nest~##&
tout en prenant la séquence##
à analyser comme arguments supplémentairesNest
.TakeDrop
. Et il vaut mieux utiliser##
pour insérer la séquence.APL,
2321 caractèresSans l'hypothèse (Merci à Dennis) et 1 caractère plus court:
Essayez-le en ligne .
la source
java, 109 octets
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;}
Explication: Il existe un modèle de déplacement des éléments lorsqu'ils sont mélangés de loin:
soit x l'index d'origine
que y soit le nouvel indice
soit L la longueur du tableau
ou comme code:
y=(2*x+x/(L/2))%L
Cela suppose que les indices commencent à 0. Voici le code expliqué plus en détail:
voir ideone pour les cas de test
la source
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 octets - votre réponse actuelle est 119 btw, pas 109, donc -12 octets). Puisque vous modifiez le tableau d'entrée, il n'est pas nécessaire de le renvoyer, vous pouvez donc le changer en vide pour réduire les octets. Oh, et si vous vous convertissez en lambda Java 8 avec curry, vous pourriez le rendre encore plus court: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 octets )Julia,
4542 octetsEssayez-le en ligne!
Comment ça marche
Nous (re) définissons l'opérateur binaire
\
pour cette tâche. Soit a un tableau et n un entier non négatif.Si n est positif, on mélange le tableau. Ceci est réalisé en le remodelant en une matrice de longueur (a) ÷ 2 lignes et deux colonnes.
'
transpose la matrice résultante, créant deux lignes, puis aplatissant le résultat avec[:]
. Étant donné que Julia stocke les matrices dans l'ordre des colonnes principales, cela entrelace les deux lignes.Ensuite, nous appelons
\
récursivement avec le shuffled a et n - 1 (~-n
) comme arguments, réalisant ainsi les remaniements supplémentaires. Une fois que n atteint 0 , nous retournons la valeur actuelle de a .la source
Pyke, 7 octets
Essayez-le ici!
la source
En fait, 15 octets
Essayez-le en ligne!
Explication:
la source
Prolog, 116 octets
Usage
la source
Perl 5
-lan
, 52 octetsEssayez-le en ligne!
la source
PHP, 98 octets
Essayez-le en ligne .
la source