Donner une permutation sans deux entiers consécutifs côte à côte

18

Défi

Étant donné un entier n ≥ 4 , émettez une permutation des entiers [0, n-1] avec la propriété qu'aucun deux entiers consécutifs (entiers avec différence absolue 1) ne sont l'un à côté de l'autre.

Exemples

  • 4[1, 3, 0, 2]
  • 5[0, 2, 4, 1, 3]
  • 6[0, 2, 4, 1, 3, 5]
  • 7[0, 2, 4, 1, 5, 3, 6]

Vous pouvez utiliser 1-indexation à la place (en utilisant des entiers [1, n] au lieu de [0, n-1] ).

Votre code doit s'exécuter en temps polynomial en n , vous ne pouvez donc pas essayer toutes les permutations et tester chacune d'elles.

Anush
la source
Quand vous dites "sortir une permutation", voulez-vous dire comme une liste? Ou pouvons-nous produire une fonction qui implémente le mappage de permutation lui-même?
xnor
@xnor Il doit être édité sous une forme lisible par l'homme. Je me fiche de savoir comment.
Anush
Serait [[1,3],[0,2]]un format de sortie acceptable?
Shaggy
@Shaggy Ce n'est pas génial. Cela signifie-t-il 1,3,0,2?
Anush
En relation
Peter Taylor

Réponses:

31

Gelée , 3 2 octets

ḂÞ

Trie les entiers dans [1, ..., n] par leur LSB.

Essayez-le en ligne!

Dennis
la source
Hou la la! C'est étonnant.
Anush
2
«Trier par LSB» signifie que tous les autres se déplacent au début, mais la définition de Jelly exige-t-elle que les nombres dans chaque moitié restent dans leur ordre d'origine? Sinon, 100 (4) pourrait être à côté de 101 (5) et être toujours «trié par LSB». Pas de faute dans votre code, mais peut-être que le commentaire descriptif n'est pas complet?
WGroleau
1
@WGroleau Oui, Þtri stable, car il est implémenté à l'aide de la sortedfonction Python , qui est garantie d'être stable .
user202729
3
L'algorithme est plus impressionnant pour moi que la petite taille, dans son intelligence. Vous pouvez également, je suppose, inverser l'ordre des bits, trier et inverser.
WGroleau
4
Il ne peut y avoir que 65536 programmes Jelly à deux octets différents. Il est étonnant que beaucoup de ces réponses se révèlent être des réponses aux défis du PPPC.
Anush
8

Python 3 , 40 , 38 octets

lambda n:[*range(1,n,2),*range(0,n,2)]

Essayez-le en ligne!

Cela fonctionne dans le O(n)temps.

Merci à Dennis d'avoir économisé 2 octets!

DJMcMayhem
la source
Gagnant du prix le plus rapide! :)
Anush
Fonctionnement le plus rapide ou première publication?
WGroleau
2
@WGroleau Première publication.
user202729
6

Haskell, 22 octets

f est une fonction de n qui renvoie une liste correctement ordonnée. J'utilise l'option 1-indexation.

f n=[2,4..n]++[1,3..n]
Penguino
la source
6

Octave , 17 octets

@(x)[2:2:x,1:2:x]

Essayez-le en ligne!

Cela utilise la même approche que beaucoup d'autres. Concatène deux vecteurs, un avec tout le nombre pair dans la plage inclusive 2 ... x , et tous les nombres impairs dans la plage inclusive 1 ... x . La syntaxe devrait être assez évidente, donc je ne l'expliquerai pas.

Stewie Griffin
la source
1
N'est-ce pas 3et 2côte à côte f(4)?
pajonk
Oups ... fixe. Même nombre d'octets. :-)
Stewie Griffin
5

JavaScript (ES6), 40 octets

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

Edit: 1 octet enregistré grâce à @Arnauld.

Neil
la source
5

Gaia , 2 octets

r∫

Essayez-le en ligne!

Ceci (simplement) orts orte les entiers dans la plage [1, entrée] par leur pa r ité.

M. Xcoder
la source
Même commentaire que sur Jelly: l'algorithme ou la définition du langage garantit-il que les deux moitiés restent chacune dans leur ordre d'origine?
WGroleau
@WGroleau Oui, à Gaia, le méta-opérateur de tri est stable.
M. Xcoder
5

R , 39 36 35 octets

function(x)c(seq(2,x,2),seq(1,x,2))

Essayez-le en ligne!

ngm
la source
Il y a un NA de fin pour les nombres impairs.
JayCe
La faute de l'épouse. Nous avons dû faire notre balade à vélo avant de pouvoir résoudre ce problème. Mais vous avez également rasé quelques octets.
ngm
Ouais, je me sentais mal de te demander d'ajouter des octets donc j'ai dû trouver un moyen d'en supprimer ... ça a bien marché.
JayCe
4

Japt, 4 octets

Vous pouvez également remplacer upar vpour obtenir une commande différente.

õ ñu

Essayez-le

Ou, si nous pouvons sortir un tableau de 2 tableaux:

õ ó

Essayez-le

Hirsute
la source
Techniquement, le second affiche une liste de nombres séparés par des virgules ;-) Les deux échouent 4malheureusement; vous pouvez corriger le premier en changeant uen vou oen õ.
ETHproductions
3

Mathematica, 50 -> 47 -> 42 octets

p = Join[Range[2, #, 2], Range[1, #, 2]] &

Essayez-le en ligne!

Merci à user202729 pour avoir souligné le double potentiel d'optimisation Join [] créé par Flatten [] et l'utilisation de fonctions pures.

Je voudrais ajouter deux remarques.

1) Il est assez simple de construire une permutation spécifique sans succession descendante ou ascendante pour n> = 4 comme demandé n l'OP.

Il se compose de deux listes consécutives.

Pour n même, ce sont:
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)

Pour n impair, nous avons:
list1 = (2,4, ..., Floor [n / 2])
list2 = (1,3, ..., Floor [n / 2])

Pour cet "algorithme", une seule décision doit être prise (n pair ou impair), le reste consiste simplement à écrire n nombres.

Une solution Mathematica possible est fournie en haut.

2) Une question connexe est de savoir combien de telles permations existent en fonction de n.

Mathematica, 124 octets

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

Essayez-le en ligne!

Exemple:

a[#] & /@ Range[4, 12]

{2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034}

Compter le nombre de ces permutations est un problème standard.

Pour n = 4, il y en a 2: {{2,4,1,3}, {3,1,4,2}}

Pour n = 5, il y en a 14: {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4,2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}

Le nombre a (n) de ces permutations augmente rapidement: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

Pour les grands n, le rapport a (n) / n! semble approcher la limite 1 / e ^ 2 = 0,135335 ... Je n'ai pas de preuve stricte mais ce n'est qu'une conjecture à partir de preuves numériques. Vous pouvez tester cela en essayant d'exécuter le programme en ligne.

Le programme ci-dessus (basé sur la référence donnée ci-dessous) calcule ces nombres.

Vous pouvez trouver plus d'informations dans la séquence correspondante sur OEIS: A002464 . Problème de Hertzsprung: façons d'organiser n rois non attaquants sur un tableau n X n, avec 1 dans chaque ligne et colonne. Aussi nombre de permutations de longueur n sans successions croissantes ou décroissantes.

Dr. Wolfgang Hintze
la source
@ Stewie Griffin Comme je suis nouveau ici, veuillez expliquer plus en détail ce que vous voulez dire. Dans ma première remarque, j'ai fourni un algorithme et un code qui résolvent le problème en temps polynomial. Elle doit donc être considérée comme une solution au défi. La deuxième partie étend le problème intéressant. Elle doit donc être considérée comme un commentaire.
Dr. Wolfgang Hintze
J'ai pris la liberté de modifier légèrement votre soumission afin que votre code Mathematica soit au sommet. Avec les défis de code-golf, il est obligatoire de fournir le code réel (le plus court possible). La façon dont je l'ai formaté devient une réponse Mathematica comme vous l'avez probablement voulu, et a toujours votre explication d'origine en dessous. Si vous pensez que quelque chose manque ou que j'ai mal édité votre réponse initiale, n'hésitez pas à l'éditer à nouveau vous-même. Bienvenue chez PPCG! :)
Kevin Cruijssen
@ Kevin Cruijssen Merci beaucoup pour l'accueil chaleureux et la retouche de ma soumission naïve. J'ai maintenant ajouté un programme Mathematica pour la deuxième remarque. Ce qui n'est probablement pas lege artis. Surtout, je ne sais pas comment créer le joli lien "essayez-le en ligne".
Dr. Wolfgang Hintze
Tout lien peut être créé à l'aide de [some text](the_link). En ce qui concerne le lien "Essayez-le en ligne" en particulier, le site Web https://tio.run/ qui est hébergé par notre propre @Dennis contient des liens vers toutes sortes de langages de programmation. Wolfram Language (Mathematica) est l'un d'entre eux. En haut, vous pouvez ensuite cliquer sur le bouton de lecture pour exécuter le code ou sur le bouton d'hyperlien pour copier "Essayez-le en ligne". liens (de balisage). Et vous pouvez diviser votre code en "Code" réel (votre soumission), avec un en-tête / pied de page facultatif pour (jolie-) impression d'un ou de plusieurs tests.
Kevin Cruijssen
Toutes mes excuses pour mon commentaire quelque peu brutal, et le manque de réponse par la suite! La réponse est apparue dans la file d'attente de révision et je n'ai pas remarqué le code à cause du formatage. Il n'est pas rare que de nouveaux utilisateurs publient des "observations intéressantes" sur des défis, sans y apporter de réponse réelle. Bien que cela soit fait de bonne foi, ce n'est pas l'objet du site. Je pensais que c'était une telle réponse. J'aurais dû répondre à votre commentaire, mais j'étais pressé et je n'ai pas pu écrire un nouveau commentaire, alors j'ai simplement supprimé l'ancien. Mes excuses! Et bienvenue sur le site! J'espère que vous resterez! :)
Stewie Griffin
2

Espace , 161 octets

Voici la soumission officielle et non commentée: Essayez-la en ligne!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



Essayez-le en ligne!

J'ai sacrifié quelques octets pour que le programme s'exécute sans aucune erreur, je pense que je pourrais perdre environ 7 à 8 octets, et il sortirait toujours correctement, mais cela produirait également des messages d'erreur, et personne ne veut ça.

Explication des octets complets:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate
X1M4L
la source
Certaines choses au golf: push_0, read_STDIN_as_int, push_0, retrievepeut être push_0, duplicate_0, read_STDIN_as_int, retrieved'économiser un octet. Et la première étiquette peut être vide avec NSSNau lieu de NSSSN(et la deuxième étiquette peut être NSSSN; troisième NSSTNet quatrième NSSSSN). Cela devrait également économiser 8 octets. En outre, vous pouvez supprimer le premier Jump_to_third_labelcar vous avez déjà le Set_third_labeldroit en dessous. Au total: 140 octets ; (ou avec commentaires: essayez-le en ligne .) -3 octets si vous supprimez NNNexit.
Kevin Cruijssen
1

Gol> <> , 14 octets

FL:2%Z}:3=?$|B

Essayez-le en ligne!

Exemple de programme complet et son fonctionnement

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return
Bubbler
la source
1

J , 10 octets

i./:2|1+i.

Essayez-le en ligne!

Explication:

  /:          sort
i.            the numbers in the range 0..n-1 
    2|        according the remainder mod 2 of 
      1+i.    the numbers in the range 1..n   
Galen Ivanov
la source
1

Java 8, 56 octets

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

Réponse JavaScript du port de @Neil (ES6) .

Essayez-le en ligne.


Ancienne réponse de 66 octets:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

Essayez-le en ligne.

Explication:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other
Kevin Cruijssen
la source
1

Rubis, 27 octets

->n{(1..n).sort_by{|i|i&1}}

Comme dans cette réponse , les npremiers entiers sont triés par leur bit le moins significatif.

Essayez-le en ligne!

Eric Duminil
la source