Inspiré par cette question:
Créez une fonction (ou un programme complet) qui reçoit une liste de nombres et sort la liste réorganisée, de sorte que les nombres indexés pairs apparaissent en premier, et les nombres indexés impairs suivent. Les valeurs des nombres eux-mêmes n'affectent pas l'ordre - seuls leurs indices le font. Tous les indices sont basés sur zéro.
Par exemple:
Contribution: [0, 1, 2, 3, 4]
Sortie: [0, 2, 4, 1, 3]
Un autre exemple:
Contribution: [110, 22, 3330, 4444, 55555, 6]
Sortie: [110, 3330, 55555, 22, 4444, 6]
Utilisez la représentation la plus naturelle pour les listes de votre langue. Il n'y a pas de limites à la complexité (par exemple, allouer une liste temporaire est OK - pas besoin de le faire sur place).
PS Cela devrait fonctionner pour la liste vide (entrée vide => sortie vide).
la source
Réponses:
Japt , 1 octet
Essayez-le en ligne!
la source
Python, 23 octets
Essayez-le en ligne
la source
lambda
? Pourquoi pasmu
ounu
? : Plambda
parλ
et réduire le nombre d' octets par 5! : PPyth, 5
Essayez-le en ligne ou exécutez une suite de tests
Explication
la source
CJam, 7 octets
Pousse un bloc (l'élément le plus proche d'une fonction sans nom) qui transforme l'élément de pile supérieur selon les besoins.
Testez-le ici.
Explication
L'explication suppose que le haut de la pile est le tableau
[0 1 2 3 4]
. Les valeurs réelles n'affectent pas le calcul.la source
Labyrinthe ,
2825242322 octetsC'était amusant fou! :) C'est de loin le programme Labyrinthe le plus densément compressé que j'ai écrit jusqu'à présent. J'avais tellement de versions à 20 et 21 octets qui fonctionnaient presque que je doute toujours que ce soit optimal ...
Cela prend l'entrée comme une liste d' entiers positifs (avec un délimiteur arbitraire) et imprime le résultat dans STDOUT sous forme d'entiers délimités par des sauts de ligne.
La chasse aux 20/21 octets: j'ai vérifié tous les programmes du formulaire
où
X
est tout caractère raisonnable par force brute, mais n'a trouvé aucune solution valide. Bien sûr, cela ne signifie pas qu'il n'existe pas de solution plus courte, mais il n'est pas possible de forcer des programmes de 20 octets sans une quantité décente d'hypothèses sur sa structure.Explication
(L'explication est légèrement dépassée, mais je ne suis toujours pas convaincu que la solution soit optimale, donc j'attendrai avec la mise à jour.)
Donc, normalement, les programmes Labyrinth sont censés ressembler à des labyrinthes. Pendant que le pointeur d'instructions se trouve dans un couloir, il suivra ce couloir. Lorsque l'IP atteint n'importe quel type de jonction, la direction est déterminée en fonction de la valeur maximale de la pile principale de Labyrinth (Labyrinth a deux piles, avec une quantité infinie de zéros en bas). Cela signifie normalement que toute boucle non triviale sera assez coûteuse, car si vous avez des cellules non murales partout, tout est une jonction, et dans la plupart des cas, le haut de la pile n'aura pas la bonne valeur pour l'IP pour prendre le chemin que vous aimeriez qu'il prenne. Donc, ce que vous faites, c'est agrandir les boucles de sorte qu'elles aient un tout au centre avec un seul point d'entrée et de sortie bien défini chacun.
Mais cette fois, j'ai vraiment eu de la chance et tout allait si bien ensemble que je pouvais tout écraser en une seule grosse touffe. :)
Le flux de contrôle commence au
_
sud. Le_
pousse un zéro sur la pile principale. Cela peut sembler être un no-op, mais cela augmente la profondeur de pile (non implicite)1
dont nous aurons besoin plus tard.?
lit un entier dans STDIN. S'il n'y a plus d'entiers à lire, cela pousse zéro. Dans ce cas, l'IP continue de se déplacer vers le sud et@
termine immédiatement le programme (car la liste d'entrée est vide). Sinon, l'IP tourne vers l'Est.Nous entrons maintenant dans une boucle très serrée avec deux points de sortie:
!
imprime l'entier dans STDOUT, ne laissant qu'un zéro sur la pile. L'IP continue de se déplacer vers l'est et?
lit l'entier suivant. Si ce n'est pas zéro, nous prenons à droite et nous nous déplaçons vers le sud.?
lit un autre (le prochain index pair). Encore une fois, si ce n'est pas zéro, nous prenons à droite et nous nous déplaçons vers l'ouest.\
Imprime ensuite un saut de ligne sans changer la pile, nous prenons donc une autre à droite en se déplaçant vers le nord.!
imprime le prochain entier d'index pair. Comme il y a maintenant au moins un entier impair (positif) sur la pile, nous continuons à tourner à droite et la boucle se répète.Une fois que l'un d'eux
?
atteint la fin de la liste, il pousse un zéro et se déplace directement sur le correspondant;
, ce qui rejette ce zéro.Dans le cas où il n'y avait qu'un seul élément dans la liste, nous avons terminé (parce que nous l'avons imprimé tout de suite), donc l'IP continuerait de se déplacer vers l'est jusqu'à la
@
fin du programme (en imprimant une fin saut de ligne en chemin).Sinon, nous devons également imprimer les entiers à indice impair. Dans ce cas, les deux chemins (à partir des deux points de sortie de la première boucle) fusionnent au milieu
"
, tournant vers l'Est dans les deux cas._
pousse un zéro pour éviter de prendre une gauche dans le@
, et;
rejette ce zéro. Maintenant, nous entrons dans une nouvelle boucle:L'IP entre dans la cellule en bas à gauche, se déplaçant vers le nord, faisant le tour de la boucle dans le sens des aiguilles d'une montre. Le
}
déplace le haut de la pile principale vers la pile auxiliaire. Bien qu'il y ait encore un élément sur la pile, l'IP continue de faire son travail. Une fois que tout a été déplacé vers la pile auxiliaire (et inversé dans le processus), l'IP continue de se déplacer vers l'est à la place, entrant dans la dernière boucle:\
imprime à nouveau un saut de ligne,{
déplace un élément de la pile auxiliaire vers le principal. Si c'était encore un élément de la liste, il sera positif et l'adresse IP se dirigera vers le sud, là où l'élément est imprimé!
.#
Pousse ensuite la profondeur de pile (et maintenant c'est là que l'initiale_
est importante, car cela#
garantit une profondeur de pile positive), de sorte que l'IP tourne toujours à droite, à travers le\
et à{
nouveau.Une fois que nous avons tout imprimé, tiré
{
un zéro du bas de la pile auxiliaire, l'IP continue vers l'Est et@
termine le programme.la source
MATLAB, 24
similaire à celui en python.
Merci @LuisMendo d'avoir économisé 2 octets!
la source
@(x)x([1:2:end 2:2:end])
Haskell , 37 octets
Essayez-le en ligne!
Le
foldr
construit de manière récursive la liste paire et la liste impaire. L'ajout d'un élément à la liste est mis à jour en l'ajoutant à la liste impaire et en l'appelant la nouvelle liste paire et en appelant la liste paire précédente la nouvelle liste impaire. Ensuite, la paire[l,r]
est concaténée àl++r
.Merci à Ørjan Johansen pour avoir économisé 5 octets en utilisant des listes à deux éléments à la place des tuples.
42 octets:
Ajoute des indices à la liste
l
et filtre les pairs ou les impairs.Encore un autre format, pour 44. La fonction
g
prend chaque élément pair-indexé. Les indices impairs sont obtenus en supprimant d'abord un élément, puis en appliquantg
. Sil
était garanti non vide, nous pourrions le faire en toute sécuritétail
pour 41la source
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
avecf
comme fonction principale.concat
au lieu de tuples etuncurry(++)
.PowerShell v3 +,
75674947 octetsEssayez-le en ligne!
Attend l'entrée via l'éclaboussure, comme indiqué sur le lien TIO.
Crée une matrice en
$l
tant que tableau de tableaux, puis dirige l'entrée$args
dans une boucle|%{}
. Chaque fois dans la boucle, nous ajoutons un élément à l'un des deux tableaux enfants de$l
en inversant la$f
variable à l'aide de la logique booléenne. La première fois,$f
est$null
,!
dont est$true
, ou1
lors de l'indexation dans un tableau. Cela signifie que le premier élément est placé dans le deuxième tableau de$l
, c'est pourquoi la$l[1]
sortie est la première.Props à TessellatingHeckler pour l'aide au golf et cette variation.
-2 octets grâce à mazzy.
Avertissements
Aller strictement comme la question est écrite, c'est techniquement invalide, car PowerShell n'a pas un concept de "listes" en tant qu'objets pseudo-immuables, seulement des tableaux ou des tables de hachage (aka dictionnaires). Donc, je traite la ligne de la question « Utilisez la représentation la plus naturelle pour les listes de votre langue » comme une question sur les tableaux, car c'est le PowerShell le plus proche. De plus, la sortie est un élément par ligne, car c'est la façon par défaut PowerShell d'écrire un tableau. Cela signifie une entrée de
(0,1,2,3,4)
volonté de sortie0\r\n2\r\n4\r\n1\r\n3\r\n
.la source
$args
+ éclaboussures à la place$input
et à la,@()*2
place@(),@()
F #,
797756Basé sur l'une des réponses de Haskell
Nous indexons d'abord la liste, puis la partitionnons avec des critères: premier élément (l'index) et 1 égal à 0.
Cela nous donne une paire de liste de paires; la première liste contiendra tous les événements indexés et l'autre les cotes indexées.
À partir de là, nous remontons la liste des deux avec l'opérateur d'ajout et nous éliminons finalement l'index.
Edit: manqué une évidence, il n'est pas nécessaire de nommer l'arg "xs" (habitudes), donc peut se réduire à un nom à 1 lettre
J'ai également un potentiel de 76 octets qui est fondamentalement le même mais défini comme composition de fonction. Le problème est qu'il ne se compile pas en tant que valeur mais fonctionnera efficacement avec n'importe quel argument de liste donné, donc vous ne savez pas si c'est correct ou non:
Remarque: List.indexed est uniquement disponible à partir de F # 4.0 bien qu'il ne soit pas encore documenté dans MSDN
la source
fun
, n'est-ce pas?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Supposer|>
en F # équivaut à peu près à l'opérateur d'alimentation vers la droite==>
dans Perl 6. Je ne fais que deviner ce qui sefst>>(&&&)1>>(=)0
passeJavaScript (ES6), 52 octets
Il le fait également en un seul passage
Afficher l'extrait de code
la source
F=
depuis le début; vous pouvez enregistrer un octet en utilisant ceci:(i*=2)>=(z=x.length)?i-z+--z%2:i
Julia, 23 octets
la source
J, 8 octets
Il s'agit d'un verbe monadique (à un argument), utilisé comme suit:
Explication
la source
/:0:`1:\
également de 8 octets.Gelée , 4 octets
Essayez-le en ligne!
Basé sur la réponse CJam de Martin
la source
Mathematica, 40 octets
{}[[2;;;;2]]
va lancer une erreur.la source
Burlesque, 12 octets
Utilisation comme dans:
Explication:
Bien qu'une fois la nouvelle mise à jour publiée, vous pouvez le faire avec le nouveau intégré Unmerge (qui fait le contraire de la fusion
**
intégrée):la source
Perl,
3533 octets31 octets + 2 octets pour
-ap
. Lit une chaîne délimitée par des espaces depuis STDIN:Lorsque l'entrée est vide, imprime un seul espace, que je considérerais comme équivalent à une liste vide. Sinon, peut être fixé au coût de 4 octets avec:
(nécessite Perl 5.10+, imprime une nouvelle ligne de fin)
ou au coût de 5 octets avec:
(aucun espace de fin)
Comment ça marche
Cette solution utilise l'
-a
indicateur, qui divise l'entrée sur les espaces blancs et place les résultats dans le@F
tableau.La vraie magie opère dans
push
:La
$|
variable est normalement utilisée pour forcer le vidage de sortie, mais elle a une autre propriété intéressante: lorsqu'elle est décrémentée à plusieurs reprises, sa valeur bascule entre 0 et 1.Profitant du fait qu'il n'y a aucune restriction sur les identifiants spécifiés via le déréférencement symbolique , nous poussons alternativement les éléments du tableau sur les tableaux
@0
et@1
, donc nous nous retrouvons@0
avec tous les éléments pairs et@1
avec les cotes. Ensuite, nous concaténons simplement les tableaux stringifiés pour obtenir notre sortie.la source
C, 70
Rien de spécial, juste une fonction de mappage d'index.
Moins golfé
la source
Pyth, 8 octets
Relativement simple
la source
Vitsy, 22 octets
Vitsy n'était vraiment pas fait pour faire ça ...
la source
Perl 6 , 25 octets
C'est le lambda le plus court que j'ai pu trouver.
la source
Minkolang 0,12 , 15 octets
Essayez-le ici.
Explication
la source
R, 49 octets
Appelez-le comme q (bla). Ou, si x contient déjà la liste à réorganiser, alors
n'est que de 35 octets.
la source
F #, 64
Inspiré par la réponse de Sehnsucht (mais pas assez de représentant pour commenter).
Mappe chaque valeur à un tuple où la deuxième entrée est le modulo de l'index de liste, trie par modulo, puis mappe à la valeur d'origine.
la source
Prolog, 103 octets
Exemple
la source
bash et GNU coreutils, 68 octets
Nous supposons que la liste est séparée par des sauts de ligne et transmise sur une entrée standard.
Malheureusement, cela ignorera toutes les entrées au-delà de l'indice 1999, donc il ne répond pas tout à fait à la spécification.
Il détruit également un fichier temporaire codé en dur ('x'), ce qui pourrait être problématique s'il est exécuté en parallèle, et il ne le supprime pas par la suite. Désolé pour ça!
la source
PHP,
7869 octetsPHP peut fragmenter et découper, mais pas entrelacer les tableaux; ce qui en fait un peu volumineux:
Appelez par référence ou essayez-le en ligne .
première approche (programmes pour 78 octets):
imprime une virgule de début; insérer
[!$i]
avant le premier$argv
pour le retirer.Deux autres solutions de 78 octets (imprimer une virgule de début et une virgule de fin):
Courez avec
php -nr '<code>' <arguments>
ou essayez-les en lignela source
Japt , 3 octets
Essayez-le
Essayez-le
la source
Clojure / ClojureScript, 52 octets
Écrit dans un ClojureScript REPL, doit également être un Clojure valide.
la source
K, 10 octets
Basé sur la réponse Pyth à 5 octets.
la source
Hassium , 191 octets
Celui-ci était assez long :(
Il lit le tableau à partir des arguments, alors exécutez-le avec
hassium file.has 0 1 2 3 4
Exécutez et voyez développé avec le cas de test ici
la source