La résolution du Sudoku est-elle trop difficile? Même la version brute force ? Voici un exercice de codage un peu plus simple. J'espère. :-P
Écrivez la fonction la plus courte pour implémenter bogosort. En particulier, votre fonction devrait:
- Prenez un tableau (ou l'équivalent de votre langue) comme entrée
- Vérifiez si ses éléments sont triés; si oui, retournez le tableau
- Sinon, mélangez les éléments et recommencez
L'entrée la plus courte gagne. En cas d'égalité, une fonction prenant en charge un comparateur personnalisé (et / ou un générateur de nombres pseudo-aléatoires) est privilégiée. Tout lien restant est résolu en favorisant la soumission antérieure.
Clarifications: Vous pouvez utiliser n'importe quel type d'élément que vous voulez, tant qu'il existe un moyen de les commander, bien sûr. De plus, le brassage doit être uniforme; rien de tout cela "je vais simplement le trier rapidement et l'appeler mélangé". :-)
Réponses:
APL (Dyalog), 20
Explication
⍵
est l'argument (à droite)⍵≡⍵[⍋⍵]
: vérifie si le⍵
tri est égal à⍵
lui:⍵
- même : si oui, alors retournez⍵
∇⍵[?⍨⍴⍵]
: sinon, générez un tableau de 1 à⍴⍵
(longueur de⍵
) dans un ordre aléatoire, réorganisez-le en⍵
fonction de cela (⍵[...]
) et appliquez-lui la fonction (∇
)Revoir soudain ce problème et ...
APL (Dyalog), 19 ans
Penser simplement à trier un tableau dans le chèque le rend un peu inutile (ne pas dire que Bogosort est significatif), une implémentation plus précise serait
∧/2≤/⍵
, et cela arrive à réduire le nombre de caractères.la source
Perl 6: 23 caractères
la source
[<=]
vérifie si une liste est triée:,[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
et.pick(n)
choisit n éléments aléatoires dans une liste, et.pick(*)
laisse Perl choisir tous les éléments. use.perl.org/~masak/journal/40459pick
utilisé auparavant, encore moins[<=]
. Où se trouvent ces documents dans la documentation?[]
est réduire l'opérateur qui prend l'opérateur entre crochets. Par exemple,[<=] 1, 2, 3
is1 <= 2 <= 3
(et oui, vous faites des plages comme celle-ci dans Perl 6). Dans ce cas, il est utilisé pour déterminer si les éléments sont en ordre..pick(*)
La méthode mélange la liste (pick(N)
sélectionne lesN
éléments de la liste)..=
appelle la méthode et affecte le résultat à la variable. En ce qui concerne la documentation - enfin, pour l'instant, seule la spécification Perl 6 existe - feather.perl6.nl/syn , mais elle existe.APL (22)
Usage:
Explication:
⍋⍵
: renvoie les index des éléments dans l'ordre trié,⍋30 10 20
donne donc2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Stockez la longueur de la liste d'entrée dans X. Si la plage[1..X]
est égale à l'ordre d'index trié, la liste est triée, alors renvoyez-la.⋄∇⍵[X?X]
: si ce n'est pas le cas, recurse avec un tableau mélangé.la source
Ruby - 33 caractères
la source
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
travaille avec unproc
mais pas avec une méthode classique avecdef...end
? Je pensaisredo
que cela ne fonctionne qu'avec des boucles?redo
[…] transfère le contrôle au début du proc ou du lambda». C'est simplement ainsi.Mathematica ,
4037Avec espace:
la source
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427par exemple:
La partie {~? ~ @ # Mélange la saisie:
la source
Python 61
Trie en place.
la source
from random import*
peut enregistrer un caractère.Python 94
D'autres réponses en python utilisent random.shuffle (). La documentation du module aléatoire python indique:
la source
return[x...
contrairement àreturn [x...
. Pareil avecpermutations(a) if
- ça pourrait l'êtrepermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
est de 88 octetsK,
3125{while[~x~x@<x;x:x@(-#x)?#x];x}
.
.
la source
Python (69 caractères)
Trie les entiers dans l'ordre numérique croissant. Notez que les solutions récursives, comme
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
échouera en raison d'un débordement de pile, même pour de petites entrées (disons N> 5), car Python ne fait pas d'optimisation d'appel de fin.
la source
D sans comparateur personnalisé: 59 caractères
Plus lisiblement:
D avec comparateur personnalisé: 69 caractères
Plus lisiblement:
la source
Scala 73:
Dans Scala, nous pouvons vérifier si le compilateur a fait une optimisation d'appel final:
et oui, il l'a fait. Cependant, pour une courte liste de 100 valeurs:
a pris près de 4 mois pour terminer. ;)
la source
C # (184 caractères)
Ce n'est pas vraiment sympa de faire ça en C #. Vous devez prendre en charge les génériques pour prendre en charge les types de valeur et de référence. Il n'y a pas de fonction de lecture aléatoire de tableau ou de fonction pour vérifier si quelque chose est trié.
Quelqu'un a-t-il des conseils pour améliorer cela?
Modifier la version qui ne trie que l'int (134 caractères):
la source
GNU / BASH 65
la source
C ++ 11, 150 caractères
Juste .. fait pour le plaisir.
la source
Python - 61 caractères
Récursif
la source
from random import*
pourrait être plus court.PowerShell ,
8582565552 octets-26 octets grâce aux suggestions
de mazzy -1 octet grâce à AdmBorkBork
-3 octets grâce à mazzy
Essayez-le en ligne!
PowerShell propose une comparaison de tableaux relativement bon marché en les convertissant en chaînes et en les comparant.
la source
param
initialisation dans votrefor
initialisation pour enregistrer un octet -for($l=$args;
-ne
convertit l'opérateur droit en un type scalaire de l'opérateur gauche. vous pouvez donc économiser quelques octets: essayez-le en ligne!Javascript 291 caractères
min
un-min
la source
var
s. Faites-leur tous des globaux implicites, il s'agit simplement de rendre le code aussi court que possible.Matlab, 59 octets
Approche relativement simple:
la source
J, 22 octets
Il s'agit d'une monade récursive et tacite utilisant un agenda. Voici comment cela fonctionne:
Soit
y
notre liste. Tout d'abord, le verbe à droite de l'ordre du jour est-:/:~
. C'est un verbe gracieusement fourni par Leaky Nun . Il correspond à (-:
) que l'entrée soit triée (/:~
) ou non à l' aide d'un crochet monadique. ((f g) y = y f (g y)
) Cela renvoie un un ou un zéro en conséquence. Le côté gauche de l'agenda est un gérondif de deux verbes: à droite se trouve le verbe d'identité]
, et à gauche se trouve la récurrence. L'agenda sélectionne soit le verbe d'identité en position1
si la liste est triée, soit le verbe plus long en position0
si la liste n'est pas triée.$:@({~?~@#)
appelle$:
(le verbe le plus long dans lequel il se trouve) au sommet du résultat de{~?~@#
ony
. Cela mélange la liste, tout comme?~@#
les permutations de la longueur dey
, étant des indices triés au hasard dey
.{~
, dans un crochet monadique, renvoie une listey
dont les indices sont l'argument de droite. Cette liste mélangée est ensuite rappelée avec l'ordre du jour et répétée jusqu'à ce qu'elle soit triée.la source
C ++ 14, 158 octets
la source
Jelly , 6 octets, défi de postdates de langue
Essayez-le en ligne!
Explication
Œ¿
attribue un numéro à chaque permutation d'une liste; 1 est trié, 2 a les deux derniers éléments échangés, etc., jusqu'à la factorielle de la longueur de la liste (qui est la liste dans l'ordre inverse). Ainsi, pour une liste triée, celle-ci a la valeur 1, et nous pouvons la décrémenter en utilisant’
afin de produire un test "non trié" utilisable comme booléen dans une condition de boucle while. Le$
est de provoquer l'analyse de la condition en tant que groupe.la source
C ++, 166 octets
Meh.
Cela devrait fonctionner sur tous les conteneurs STL qui ont
begin()
etend()
.Non golfé:
la source
APL (Dyalog Extended) , 15 octets
Essayez-le en ligne!
la source
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Brachylog , 5 octets
Essayez-le en ligne!
Quand j'ai vu pour la première fois la réponse Brachylog de ais523 (par opposition à sa réponse Jelly, parce que si je ne me trompe pas, l'utilisateur 62131 était aussi lui), je me suis demandé, et s'il utilisait le retour arrière au lieu de la récursivité? Alors au début, j'ai essayé
ṣ≤₁
. Il s'avère que choisir quelque chose au hasard ne produit pas plusieurs sorties autant qu'il ne produit qu'une seule sortie de manière non déterministe, le prédicat de shuffleṣ
ne peut pas être inversé, donc l'exécution qui échouera simplement à moins que vous n'ayez la chance de le mélanger correctement du premier coup. Après cela, j'ai essayépṣ≤₁
, ce qui fonctionnait la plupart du temps, mais comme une liste finement longue a fini de nombreuses permutations, elle échouait parfois au hasard parfois. Après avoir abandonné l'objectif de réduction de la longueur, j'ai finalement trouvé ceci:(Démonstration de l'aléatoire)
Bien que cela puisse être un peu plus court si nous prenons quelques libertés avec les E / S ...
Brachylog , 4 octets
Essayez-le en ligne!
Pour que la sortie soit utile, l'entrée ne doit contenir aucun élément en double, car en plus de trier l'entrée, ce prédicat de bogosort ajoute un nombre aléatoire d'éléments en double et de zéros. (Hypothétiquement, cela pourrait ajouter quelque chose, mais ce n'est pas le cas.) Normalement, je ne prendrais pas la peine de mentionner quelque chose de si loin de fonctionner correctement, mais je pense que c'est dans l'esprit du défi.
la source
Perl 6 , 28 octets
Essayez-le en ligne!
Bloc de code anonyme qui mélange la liste jusqu'à ce qu'elle soit triée. Notez qu'il trie la liste au moins une fois, ce qui est autorisé. Et non, le
{.pick(*)}
ne peut pas être remplacé par*.pick(*)
la source
Pyth , 11 octets
Assez content de cela, peut probablement être joué un peu plus
Explication
Essayez-le en ligne!
la source
=Q.SQ
à=.SQ
-1 octet (fonctionne également avec d'autres opérateurs, comme=QhQ
->=hQ
)Japt ,
119 octetsEssayez-le
la source
Brachylog (v2), 5 octets
Essayez-le en ligne!
Soumission de fonction. (Le lien TIO utilise un argument de ligne de commande qui encapsule automatiquement une fonction dans un programme complet.)
Explication
Prolog (le langage dans lequel Brachylog compile) est récursif en queue, donc cette fonction finit par être compilée en une boucle serrée.
la source
C (203 caractères, pas de boucle d'entrée: uniquement la fonction)
C'est la même chose que la suivante, où nous lisons également le tableau à partir de stdin et écrivons le tableau trié. Depuis que le Q a demandé la fonction et non un programme entier ...
C (296 caractères)
La compilation peut donner un avertissement (déclarations implicites). Limite de taille de tableau codée en dur de 999 éléments. Fragile.
s'il n'est pas nécessaire de pré-vérifier si le tableau est trié, cela peut être fait en 284.
C (251 caractères, 284)
(en utilisant des globaux au lieu d'arguments de fonction).
la source