Dans le tri des crêpes, la seule opération autorisée consiste à inverser les éléments d'un préfixe de la séquence. Ou, pensez à une pile de crêpes: nous insérons une spatule quelque part dans la pile et retournons toutes les crêpes au-dessus de la spatule.
Par exemple, la séquence 6 5 4 1 2 3
peut être triée en retournant d'abord les premiers 6
éléments (la séquence entière), donnant le résultat intermédiaire 3 2 1 4 5 6
, puis en retournant les premiers 3
éléments, pour arriver à 1 2 3 4 5 6
.
Comme il n'y a qu'une seule opération, l'ensemble du processus de tri peut être décrit par une séquence d'entiers, où chaque entier est le nombre d'éléments / crêpes à inclure pr flip. Pour l'exemple ci-dessus, la séquence de tri serait 6 3
.
Autre exemple: 4 2 3 1
peut être trié avec 4 2 3 2
. Voici les résultats intermédiaires:
4 2 3 1
flip 4: 1 3 2 4
flip 2: 3 1 2 4
flip 3: 2 1 3 4
flip 2: 1 2 3 4
La tâche:
Écrivez un programme qui prend une liste d'entiers et imprime une séquence de tri de crêpes valide.
La liste à trier peut être soit une liste séparée par des espaces de stdin, soit des arguments de ligne de commande. Imprimez la liste mais c'est pratique, tant qu'elle est quelque peu lisible.
C'est du codegolf!
Modifier:
Comme je l'ai dit dans les commentaires, vous n'avez pas besoin d'optimiser la sortie (trouver la séquence la plus courte est NP-difficile ). Cependant , je viens de réaliser qu'une solution bon marché serait de jeter des nombres aléatoires jusqu'à ce que vous obteniez le résultat souhaité (un [nouveau?] Type de bogosort). Aucune des réponses n'a jusqu'à présent fait cela, donc je déclare maintenant que votre algorithme ne devrait pas s'appuyer sur un (pseudo) hasard .
Pendant que vous vous frappez tous, voici une variante de bogopancakesort dans Ruby 2.0 (60 caractères), pour le frotter:
a=$*.map &:to_i
a=a[0,p(v=rand(a.size)+1)].reverse+a[v..-1]while a!=a.sort
4 3 2 1
au lieu de4 2 3 1
Réponses:
GolfScript, 34/21 caractères
(Merci @PeterTaylor d'avoir coupé 4 caractères)
Test en ligne
Une version plus courte de 21 caractères fonctionne uniquement pour les listes contenant des éléments uniques
Test en ligne
Les deux versions produisent des solutions sous-optimales.
Explication de la solution plus courte:
Cela utilise un algorithme différent de la plupart des autres publiés. Fondamentalement, il saisit le plus petit élément de la liste, et avec deux flips le déplace vers l'avant, préservant l'ordre des autres éléments.
Pour déplacer le nième élément vers l'avant:
Il répète cette opération pour chaque élément dans l'ordre et se termine par une liste triée inversée. Il retourne ensuite la liste entière pour la laisser entièrement triée.
En fait, l'algorithme est une variation d'une solution Python de 90 caractères (la mienne, bien sûr):
la source
&
n'importe où, vous devriez donc être en mesure de remplacers
tout en&
supprimant les espaces.^
comme variable dans le défi fibonacci;) Merci pour l'astuce!3 2 1
je reçois131211
ce qui n'est pas correct.2 1 1
ne peuvent plus être triées.Python,
9190 caractèresRetournez la plus grosse crêpe vers le haut, puis retournez toute la pile. Retirez la plus grosse crêpe du bas et répétez.
i
est l'indice de la plus grosse crêpe.L=L[:i:-1]+L[:i]
retourne lesi+1
crêpes, retourne leslen(L)
crêpes, puis laisse tomber la dernière crêpe.la source
print
coutume ne rendra pas la sortie illisible (1 octet enregistré :)Ruby 1.9 -
1098879 caractèresVersion beaucoup plus compacte basée sur l'excellente solution python de Keith:
Version originale:
Si vous ne vous souciez pas des opérations parasites (inversion de piles de taille 1, ou inversion de la même pile deux fois de suite), vous pouvez la raccourcir un peu (96 caractères):
Prend la liste non triée comme arguments de ligne de commande. Exemple d'utilisation:
la source
GolfScript,
3129 caractèresUne autre solution GolfScript, peut également être testée en ligne .
La version précédente:
Comment ça marche: il retourne le plus grand élément vers le haut, puis à la dernière place de la liste. Puisqu'il est maintenant dans la bonne position, nous pouvons le supprimer de la liste.
la source
Perl,
103100 caractèresAttend une entrée sur la ligne de commande.
Les solutions qu'il imprime sont décidément sous-optimales. (J'avais un programme avec une sortie beaucoup plus agréable il y a environ 24 caractères ....)
La logique est plutôt intéressante. Il commence par cataloguer l'index de chaque élément, s'il était trié. Il parcourt ensuite ce catalogue de droite à gauche. Donc, appliquer un retournement implique d'ajuster les index en dessous de la valeur de coupure, au lieu de déplacer réellement les valeurs. Après quelques finagling, j'ai également réussi à sauver quelques personnages en faisant les deux flips par itération simultanément.
la source
Python 2 (254)
Recherche BFS simple, certaines choses sont en ligne, pourraient probablement être compressées davantage sans changer le style de recherche. Espérons que cela montre peut-être comment commencer à jouer au golf un peu (trop pour être dans un simple commentaire).
Utilisation:
(2 espaces = tabulation)
la source
sys.exit()
par1/0
(dans codegolf vous ne vous souciez jamais de ce qui est imprimé dans stderr ...).print s[::-1];1/0
pour raser quelques caractères.4 2 3 1
donne2 3 2 4
, qui n'est pas valide.4 2 3 1
->2 4 3 1
->3 4 2 1
->4 3 2 1
->1 2 3 4
Python2: 120
Ce n'est pas efficace: il ne trouvera pas la meilleure séquence de tri, et la séquence donnée peut même contenir des non-opérations (c'est-à-dire retourner uniquement le premier élément), néanmoins la sortie est valide.
La sortie est donnée sous la forme:
Ce qui doit être lu comme la séquence de flips:
n_1 n_2 n_3 n_4 n_5 n_6 ...
. Si vous souhaitez obtenir une sortie comme:n_1 n_2 n_3 n_4 n_5 n_6 ...
Ajoutez simplement une virgule dans la
print
déclaration.la source
[:i][::-1]
->[i-1::-1]
,[:u][::-1]
->[u-1::-1]
, enregistre 2 caractèresL[:i]=L[i-1::-1];L[:u]=[u-1::-1]
enregistre encore 3 caractèresPython - 282 caractères
Mon tout premier golf à code; Je ne me fais aucune illusion, je vais gagner , mais je me suis beaucoup amusé. Donner tout les noms à un caractère rend la lecture effrayante, laissez-moi vous dire! Ceci est exécuté à partir de la ligne de commande, exemple d'implémentation ci-dessous:
Il n'y a rien de particulièrement spécial ou d'inventif dans la façon dont j'ai procédé, mais la FAQ suggère de publier une version non-golfée pour les lecteurs intéressés, alors je l'ai fait ci-dessous:
L'algorithme de base que j'ai utilisé est celui mentionné dans l' article wiki lié à la question :
la source
t=p[:x]
t=t[::-1]
(16 + indentation) peut être réduit àt=p[:x][::-1]
(13), voiret=p[x-1::-1]
(12). Intégrez tout ce que vous pouvez:p=p[x-1::-1]+p[x:]
len(a)-n
devient-n
;p=p[-n-1::-1]+p[-n:]
. Poursuivez le golf en utilisant les bonnes opérations:p=p[~n::-1]+p[-n:]
map(int,sys.argv[1:])
faire ce que font vos 6 premières lignes maintenant.i=x=g=0
fonctionne, mais vous devez de toute façon réduire le nombre de variables. Je vais vous donner une chose cependant: c'est la seule entrée en python que je comprends le moins: DC # -
264 259 252237 caractèresUtilise l'algorithme le plus simple et produit une sortie correcte sans retournements redondants. Pourrait raser 7 caractères si je l'autorisais à inclure des 1 (non-flips) dans la sortie, mais c'est moche.
J'ai eu recours à
goto
pour un maximum de golf. Également enregistré certains caractères en lui permettant d'effectuer des non-flips (mais pas de les imprimer).Dernière amélioration: conserver le tableau d'entrée sous forme de chaînes au lieu de le convertir en pouces.
Non golfé:
Voici ma solution initiale, non golfée (264 caractères golfés):
la source
Haskell ,
7271 octetsEssayez-le en ligne! Recherche le maximum, le retourne à l'arrière et trie récursivement la liste restante.
Edit: -1 octet grâce à BMO
la source
Perl 5.10 (ou supérieur), 66 octets
Comprend
+3
pour-n
l'use 5.10.0
apporter la langue au niveau perl 5.10 est considéré comme gratuitExécutez avec l'entrée en une seule ligne sur STDIN:
Trie la liste en trouvant à plusieurs reprises toute inversion, en la retournant vers l'avant, puis en retournant l'inversion et en retournant tout à son ancienne position. Et cela équivaut à permuter l'inversion, donc je n'ai pas besoin d'inverser (ce qui est gênant sur les chaînes car cela inverserait les chiffres des valeurs converties, par exemple
12
en21
)la source
C # - 229
version lisible
la source