En gribouillant avec des nombres, j'ai trouvé une permutation intéressante que vous pouvez générer à partir d'une liste de nombres. Si vous répétez cette même permutation suffisamment de fois, vous vous retrouverez toujours dans le tableau d'origine. Utilisons la liste suivante:
[1, 2, 3, 4, 5]
par exemple
Inversez le tableau. Maintenant, notre tableau est
[5, 4, 3, 2, 1]
Réorganisez (échangez) chaque paire. Notre liste comprend 2 paires:,
[5, 4]
et[3, 2]
. Malheureusement, nous ne pouvons pas regrouper le1
en une paire, nous allons donc le laisser seul. Après avoir échangé chaque paire, le nouveau tableau est:[4, 5, 2, 3, 1]
Répétez les étapes 1 et 2 jusqu'à ce que nous revenions au tableau d'origine. Voici les 4 prochaines étapes:
Step 2: Start: [4, 5, 2, 3, 1] Reversed: [1, 3, 2, 5, 4] Pairs Swapped: [3, 1, 5, 2, 4] Step 3: Start: [3, 1, 5, 2, 4] Reversed: [4, 2, 5, 1, 3] Pairs Swapped: [2, 4, 1, 5, 3] Step 4: Start: [2, 4, 1, 5, 3] Reversed: [3, 5, 1, 4, 2] Pairs Swapped: [5, 3, 4, 1, 2] Step 5: Start: [5, 3, 4, 1, 2] Reversed: [2, 1, 4, 3, 5] Pairs Swapped: [1, 2, 3, 4, 5] # No more steps needed because we are back to the original array
Si la longueur de la liste, n est impaire, il faudra toujours exactement n étapes pour revenir au tableau d'origine. Si n est pair, il faudra toujours 2 étapes pour revenir au tableau d'origine, à moins que n ne soit 2, auquel cas cela prendra 1 étape (car inverser et permuter est la même chose).
Votre tâche pour aujourd'hui (si vous l'acceptez) est de visualiser cet ensemble d'étapes pour des listes de longueurs arbitraires. Vous devez écrire un programme ou une fonction qui prend en entrée un seul entier positif n et effectue cet ensemble d'étapes pour la liste [1, n]
. Vous devez sortir chaque étape intermédiaire en cours de route, que cela signifie imprimer chaque étape ou les renvoyer sous forme de liste d'étapes. Je ne suis pas très pointilleux sur le format de sortie, tant qu'il est clair que vous générez chaque étape. Cela signifie (par exemple) l'un de ces éléments:
Sortie de chaque étape sous forme de liste dans STDOUT
Renvoyer une liste de listes
Renvoyer une liste de représentations de chaîne de chaque étape
Retour / sortie d'une matrice
serait acceptable.
Vous devez également sortir le tableau d'origine, que cela vienne à la fin ou au début. (techniquement, les deux sont corrects)
Vous devrez gérer le cas de bord de 2 en 1 étape au lieu de 2 , alors assurez-vous que votre solution fonctionne avec une entrée de 2 (et 1 est un autre cas de bord potentiel).
Comme d'habitude, il s'agit de code-golf , donc les lacunes standard s'appliquent et essayez de rendre votre solution plus courte que toute autre dans la langue de votre choix (ou même essayez de battre une autre langue qui est généralement plus courte que la vôtre si vous vous sentez bien) pour un défi).
Test IO
1:
[1]
2:
[1, 2]
3:
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
4:
[3, 4, 1, 2]
[1, 2, 3, 4]
5:
[4, 5, 2, 3, 1]
[3, 1, 5, 2, 4]
[2, 4, 1, 5, 3]
[5, 3, 4, 1, 2]
[1, 2, 3, 4, 5]
7:
[6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 6]
[4, 6, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 7, 5]
[7, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
9:
[8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 8]
[6, 8, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 9, 7]
[9, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Et pour faire bonne mesure, voici un cas de test géant:
27:
[26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 11, 8, 13, 10, 15, 12, 17, 14, 19, 16, 21, 18, 23, 20, 25, 22, 27, 24, 26]
[24, 26, 22, 27, 20, 25, 18, 23, 16, 21, 14, 19, 12, 17, 10, 15, 8, 13, 6, 11, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 11, 4, 13, 6, 15, 8, 17, 10, 19, 12, 21, 14, 23, 16, 25, 18, 27, 20, 26, 22, 24]
[22, 24, 20, 26, 18, 27, 16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 11, 1, 13, 2, 15, 4, 17, 6, 19, 8, 21, 10, 23, 12, 25, 14, 27, 16, 26, 18, 24, 20, 22]
[20, 22, 18, 24, 16, 26, 14, 27, 12, 25, 10, 23, 8, 21, 6, 19, 4, 17, 2, 15, 1, 13, 3, 11, 5, 9, 7]
[9, 7, 11, 5, 13, 3, 15, 1, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 26, 14, 24, 16, 22, 18, 20]
[18, 20, 16, 22, 14, 24, 12, 26, 10, 27, 8, 25, 6, 23, 4, 21, 2, 19, 1, 17, 3, 15, 5, 13, 7, 11, 9]
[11, 9, 13, 7, 15, 5, 17, 3, 19, 1, 21, 2, 23, 4, 25, 6, 27, 8, 26, 10, 24, 12, 22, 14, 20, 16, 18]
[16, 18, 14, 20, 12, 22, 10, 24, 8, 26, 6, 27, 4, 25, 2, 23, 1, 21, 3, 19, 5, 17, 7, 15, 9, 13, 11]
[13, 11, 15, 9, 17, 7, 19, 5, 21, 3, 23, 1, 25, 2, 27, 4, 26, 6, 24, 8, 22, 10, 20, 12, 18, 14, 16]
[14, 16, 12, 18, 10, 20, 8, 22, 6, 24, 4, 26, 2, 27, 1, 25, 3, 23, 5, 21, 7, 19, 9, 17, 11, 15, 13]
[15, 13, 17, 11, 19, 9, 21, 7, 23, 5, 25, 3, 27, 1, 26, 2, 24, 4, 22, 6, 20, 8, 18, 10, 16, 12, 14]
[12, 14, 10, 16, 8, 18, 6, 20, 4, 22, 2, 24, 1, 26, 3, 27, 5, 25, 7, 23, 9, 21, 11, 19, 13, 17, 15]
[17, 15, 19, 13, 21, 11, 23, 9, 25, 7, 27, 5, 26, 3, 24, 1, 22, 2, 20, 4, 18, 6, 16, 8, 14, 10, 12]
[10, 12, 8, 14, 6, 16, 4, 18, 2, 20, 1, 22, 3, 24, 5, 26, 7, 27, 9, 25, 11, 23, 13, 21, 15, 19, 17]
[19, 17, 21, 15, 23, 13, 25, 11, 27, 9, 26, 7, 24, 5, 22, 3, 20, 1, 18, 2, 16, 4, 14, 6, 12, 8, 10]
[8, 10, 6, 12, 4, 14, 2, 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 27, 13, 25, 15, 23, 17, 21, 19]
[21, 19, 23, 17, 25, 15, 27, 13, 26, 11, 24, 9, 22, 7, 20, 5, 18, 3, 16, 1, 14, 2, 12, 4, 10, 6, 8]
[6, 8, 4, 10, 2, 12, 1, 14, 3, 16, 5, 18, 7, 20, 9, 22, 11, 24, 13, 26, 15, 27, 17, 25, 19, 23, 21]
[23, 21, 25, 19, 27, 17, 26, 15, 24, 13, 22, 11, 20, 9, 18, 7, 16, 5, 14, 3, 12, 1, 10, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 10, 3, 12, 5, 14, 7, 16, 9, 18, 11, 20, 13, 22, 15, 24, 17, 26, 19, 27, 21, 25, 23]
[25, 23, 27, 21, 26, 19, 24, 17, 22, 15, 20, 13, 18, 11, 16, 9, 14, 7, 12, 5, 10, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 18, 15, 20, 17, 22, 19, 24, 21, 26, 23, 27, 25]
[27, 25, 26, 23, 24, 21, 22, 19, 20, 17, 18, 15, 16, 13, 14, 11, 12, 9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
[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]
Amusez-vous au golf!
la source
1 2 3 4 5
, non1 2 4 3 5
.array[0]
ce ne sera que 1 au début et à la fin du processusn = 999
. En regardant le motif, il semble que pour chaque n impair , le premier élément monte1, n-1, 3, n - 3, 5, n - 5, 7...
jusqu'àn - 2, 3, n, 1
, ce qui prendra toujours n étapes. Je ne vois aucune raison pour que ce modèle change avec un n plus grand .1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...
et il est facile de montrer par induction qu'un élément à la position paire x se déplace vers nx après une étape , et un élément en position impaire x se déplace vers n-x + 2 . Donc, si n = 2k + 1 , alors après la 2k- ème étape, 1 sera à 2k , et à l'étape suivante à n-2k = 1 .Réponses:
TI-Basic (série 83),
585754 octets (104 caractères)Explication
Prend entrée
Ans
(par exemple, écrire5:prgmNAME
pour utiliser des listes de taille cinq).Crée trois listes auxiliaires de la taille donnée (qui sont recréées à partir
ᶫB
de chaque étape):ᶫB = ᶫC = {1,2,3,4,5,...}
etᶫD = {-1,-1,-2,-2,-3,...}
. À chaque étape, trieᶫC
etᶫD
en ordre décroissant, en appliquant la même permutation àᶫA
. Dans le cas deᶫC
, cela inverseᶫA
, et dans le cas deᶫD
, cela permute les paires adjacentes car TI-Basic utilise une implémentation de tri de sélection vraiment stupide pourSortD(
laquelle réorganise autant d'éléments identiques que possible. QuandᶫA
est égal àᶫB
nouveau, nous nous arrêtons.Non, sérieusement, leur algorithme de tri intégré est ma deuxième plus grande plainte avec l'interpréteur TI-Basic. (Ma plus grande plainte est de savoir comment de nombreuses boucles imbriquées ralentissent l'interpréteur, car les données de la boucle sont stockées dans une pile, mais la pile est agrandie du mauvais côté, de sorte que la calculatrice doit déplacer la pile entière chaque fois qu'un élément est poussé ou sauté.) Mais cette fois, c'est pratique.
-1 octet:
Pause
stocke la valeur à laquelle il imprimeAns
, qui est plus courte à référencer queᶫA
.-3 octets: prendre en entrée
Ans
la source
Gelée , 10 octets
Essayez-le en ligne!
Explication
Remarque
Si la plage d'origine doit être à la fin, ajoutez
ṙ1
au code pour 12 octets.la source
05AB1E ,
1311 octetsEssayez-le en ligne!
Explication
la source
JavaScript (ES6),
8985Modifier 4 octets enregistrés thx @JustinMariner
En utilisant le fait que lorsqu'un élément est au bon endroit, tous les éléments le sont.
Moins golfé
Tester
la source
for(l=[];n;l[n-1]=n--);
, essayez-le en ligne! .Mathematica, 142 octets
la source
JavaScript (ES6), 79 octets
Affiche une liste pour chaque étape.
Notez que nous n'avons pas besoin d'initialiser le tableau pour lancer la balle. S'il
x
n'est pas initialisé ( n'est pas défini), nous pouvons utiliser les indices (paramètresi
) du tableau pour effectuer la première étape:Cas de test:
Afficher l'extrait de code
la source
R,
1099594797462 octetsSi le fait que le code envoie des avertissements au-dessus de la solution réelle (aucun avertissement si
n
est 1, 3 avertissements sin
est pair etn
avertissements sin
est impair) n'est pas un problème, alors ce qui suit fonctionne de manière similaire à la solution précédente, grâce au vecteur recyclage:Essayez-le en ligne!
Merci encore à @Giuseppe pour 12 octets supplémentaires!
Solution précédente sans avertissement à 94 octets:
Essayez-le en ligne!
Solution originale à 109 octets :
Essayez-le en ligne!
la source
print
renvoie son argument afin que nous puissions en profiter ici. Je ne pense pas avoir jamais vuencode
auparavant; c'est une bonne façon d'indexer!2
enembed
avecmin(n,2)
?n
place de{}
la boucle while carn
ne fait rien. :)0:n+2*1:0
est le même que1+0:n+c(1,-1)
pour -4 octets.any(print(...) != s)
équivaut àany(print(...)-s)
-1 octet. Et si nous pouvons prouver quem[1]==1
seulement à la fin de l'algorithme, alors nous pouvons supprimer leany
, donc nous obtenonswhile(print(...)-1)
et nous pouvons supprimers
, donc nous obtenons 62 octets,n=scan();m=1:n;w=0:n+2*1:0;while(print(m<-rev(m)[w[w<=n]])-1)n
Japt ,
20181512 octetsEssayez-le (
-R
indicateur à des fins de visualisation uniquement)1 octet économisé grâce à ETHproductions.
la source
w ò mw
peut êtreò2n)w
Coque , 9 octets
Essayez-le en ligne!
la source
Rubis ,
64 57 5250 octetsEssayez-le en ligne!
Comment ça marche:
Créez d'abord la plage, puis répétez la permutation x fois: utilisez un indice négatif, mais inversez le dernier bit, nous obtenons donc la séquence -2, -1, -4, -3 ... si x est pair, cela se terminera sinon, nous ajouterons l'élément restant à la fin. Dernière étape: filtrer les tableaux répétés (nous couvrons donc tous les cas: x = 1, x = 2, nombres pairs et impairs)
la source
Haskell,
7574 octetsEssayez-le en ligne!
g
effectue les échanges par paire,h
une seule étape (inverse + réorganiser),!
s'applique à plusieurs reprisesh
(et recueille les résultats intermédiaires) jusqu'à ce que l'ordre soit restauré. Remarque:!
prend le paramètre supplémentaire supplémentaire mais inutilisé0
juste pour en faire un opérateur d'infixe. La fonction principale lep
démarre.Edit: Merci à @Angs pour un octet.
la source
0!x
au lieu d'f x
enregistrer un octet - Essayez-le en ligne!Java 8,
215214 octetsJ'ai essayé de jouer au golf en utilisant des tableaux réels au lieu d'une liste, mais inverser et échanger prendrait trop d'octets .. Peut-être qu'il peut être combiné dans une boucle (au lieu d'inverser d'abord, puis d'échanger), mais je n'ai pas encore comprendre cela.
Cela peut certainement être joué un peu plus, cependant.
Explication:
Essayez ici.
la source
Java (OpenJDK 8) ,
257245243226206205 octetsEssayez-le en ligne!
la source
n->{java.util.Arrays x=null;int i=0,k,f,a[]=new int[n],t[]=new int[n];for(;i<n;a[i]=t[i]=++i);do{for(f=0;f<n/2;k=t[f],t[f]=t[n+~f],t[n+~f++]=k);for(k=1;k<n;t[k]=t[--k],t[k]=f,k+=3)f=t[k];System.out.println(x.toString(t));}while(!x.equals(a,t));}
( 245 octets ) Résumé des modificationsjava.util.Arrays x=null;
:;n-f-1
àn+~f
; suppression des crochets de boucle; Changé 2xk-1
en--k
(et également changék+=2
pourk+=3
neutraliser cela.,f
et en les réutilisanti
.for(i=0;i<n/2;k=t[i],t[i]=t[n+~i],t[n+~i++]=k);
for(i=0;i<n/2;t[i]=t[n+~i],t[n+~i++]=k)k=t[i];
MATL , 17 octets
Essayez-le en ligne!
Explication
la source
Stax , 17 octets
Exécuter et déboguer
Explication
Surpris, il fonctionne aussi vite qu'il le fait, testé jusqu'à 399 avant de ne plus vouloir tempérer mon navigateur.
la source
JavaScript (ES6), 122 octets
r.push(a)
pourrait être utilisé au lieu der.push(b)
mettre la permutation d'origine à l'avant.la source
Haskell , 97 octets
Cela semble un peu long :(
Essayez-le en ligne!
Explication / Non golfé
la source
Empilé , 42 octets
Essayez-le en ligne!
Effectue la transformation donnée à l'aide de la fonction
periodsteps
intégrée. Cependant, cette fonction intégrée renvoie tous les éléments, ce qui inclut la plage d'entrée en tant que premier et dernier élément. Nous décapitons donc la liste, renvoyant tout sauf le premier élément.la source
AWK , 123 octets
Pas très serré, mais c'est le mieux que j'ai pu trouver.
Essayez-le en ligne!
la source
Python 2 ,
16515913881 bytesEssayez-le en ligne!
-20 octets grâce à @ChasBrown . (Soupir, j'ai fait tout un défi sur la syntaxe de découpage étendue)
Whoa! GolfStorm (-57 octets)! Merci à Ian Gödel, tsh et Jonathan Frech.
la source
list(reversed(a))
essayera[::-1]
.' '*[2-(x<3),x][x%2]
[b,0][b==a]
->b*(a!=b)
.JavaScript, 136 octets
la source