Votre tâche consiste à écrire un programme informatique de telle sorte que lorsqu'il est découpé en lignes (divisé sur le caractère de nouvelle ligne) chaque arrangement des lignes produira un nombre différent entre 1 et n! (où n est le nombre total de lignes). Aucun nombre ne doit être sorti par deux arrangements différents et chaque arrangement devrait sortir un nombre sur cette plage. Puisqu'il n'y en a pas ! façons d'organiser les lignes d'un programme, cela signifie que chaque numéro doit être sorti par un réarrangement.
Par exemple le programme python
print 1;"""
print 2;"""
A deux dispositions
print 1;"""
print 2;"""
et
print 2;"""
print 1;"""
Les premières sorties 1
et les secondes sorties 2
.
Vous pouvez utiliser tous les formats de sortie standard dans la langue que vous utilisez. Vous ne pouvez assumer aucune sorte de passe-partout. Je pense que ce défi est plus intéressant si vous devez contourner les formats sur lesquels la langue insiste.
Notation
Votre score sera le nombre de lignes de votre programme, un score plus élevé étant meilleur. Vous pouvez choisir de sortir des nombres de 0 à n! -1 si vous le souhaitez.
la source
n
? Sont-ils tous à égalité avec un score de ∞?Réponses:
CJam , score: ∞
Chaque ligne est de la forme
où
x
est un nombre de0
àn-1
. Le résultat est dans la plage0
den!-1
.Essayez-le en ligne! (Pour
n=3
.)Crédits à jimmy23013 pour le code qui calcule l'indice de permutation réel. J'ai seulement remplacé le bit qui lit l'entrée avec
];Lx+:L
laquelle rejette le résultat de la ligne précédente et ajoute ensuite l'index de la ligne actuelle à la variableL
(qui est initialement un tableau vide).la source
0+:+
) Je pense que vous pouvez obtenir une version beaucoup plus courte en utilisant,m!#
.Perl: ∞
Prolongez à n'importe quelle longueur que vous aimez
Manquera rapidement de mémoire car l'utilisation de la mémoire est comme O (n ^ n). Il serait cependant facile de remplacer l'indexeur de permutation par du code O (n), juste plus longtemps. J'illustre simplement la façon dont vous pouvez utiliser
END{}
pour cette tâche en perl. Tous lesEND{}
blocs s'exécutent au moment de la sortie, mais seul le premier qui est appelé (le dernier dans le code) affichera quoi que ce soit en raison du/A/
test qui n'est vrai qu'une foisNotez que le
$m
compteur doit compter comme une chaîne car comme un nombre, il déborderait (plus tard que la fin de l'univers mais c'est le principe qui compte). Pour la même raison, je "compte" le nombre de lignes en construisant une chaîne deA
s au lieu d'utiliser un vrai compteur bien que ce débordement se produise encore plus tard.Une autre façon de le faire en perl:
Cela utilise ce fait que in
foo = bar
bar
est exécuté aprèsfoo
. Cette version, en passant, ne devient pas folle dans le temps et l'espace, mais cela allonge le codeEncore une autre idée est d'utiliser
DESTROY
ce qui a l'avantage de ne faire exécuter qu'une seule d'entre elles. Je ne vais pas répéter le code d'indexation de permutation dont j'ai déjà donné deux exemples.Ou en utilisant
BEGIN
:la source
Gelée , ∞
(Exemple avec
n=3
.)Essayez-le en ligne!
231311 octets par ligne.Pour un programme avec des
n
lignes, les lignes auront le format;
<i>
ÇQŒ¿$⁼Q$?
où
<i>
représente le nombre littérali
et chaque ligne a une valeur différente pouri
aller de1
àn
. (Les valeurs dei
ne doivent pas nécessairement être ces nombres spécifiques, elles doivent simplement avoir des valeurs positives uniques.) Ce programme n'utilise plusn
dans la structure de ligne.Comment?
0
.;1
s'ajoute1
à0
ou à la liste active.⁼Q$
est la monade conditionnelle de l'instruction if (?
) qui vérifie si les éléments de la liste sont uniques. S'ils le sont, le lien ci-dessus est appelé (Ç
) et un autre numéro est ajouté à la liste. S'ils ne sont pas uniques, cela signifie que nous sommes passés au premier lien. L'élément répété est supprimé de la liste (Q
) et l'index de la permutation est trouvé (Œ¿
). Notez qu'il y a un0
au début de la liste quandŒ¿
est pris mais cela n'affecte pas la sortie car les valeurs dei
sont toutes positives.Nouvelle fonctionnalité Jelly
Avec le nouvel ajout
Ƒ
rapide, nous pouvons réduire⁼Q$
àQƑ
, économisant un octet.10 octets / ligne (pour les chiffres uniques)
Essayez-le en ligne!
la source
Brain-Flak , 3
Essayez-le en ligne!
J'ai posté cela dans le chat plus tôt, mais j'espère qu'en le publiant ici, les gens pourront en tirer parti.
Explication
Nous commençons par le programme de base
Cela vaut 2 à lui seul. Afin de passer au niveau suivant, je veux ajouter une nouvelle ligne. Ma conjecture de départ était
Cela définit le TOS
2
s'il est nul et ne fait rien d'autre. C'est en fait un bon début. Avec les deux autres lignes, nous pouvons obtenir tous les nombres de1
à6
excepté4
, car il existe des2
moyens de produire2
:et
Afin de remédier à cela, nous faisons également en sorte que notre gamme
2
soit4
. Cela peut être fait avecPour plus de clarté, cela implémente essentiellement la fonction Haskell
Cela résout notre problème car l'un des programmes qui était précédemment en sortie génère
2
désormais4
aucun autre programme.la source
Java 7, score: ∞
Essayez-le en ligne!
C'est peut imprimer 0 à n! -1 . Les lignes supplémentaires ont le format suivant (où INDEX est un nombre compris entre 1 et n! -1 ):
Cette méthode fonctionne en lisant sa propre source afin de déterminer les classes d'ordre qui y sont répertoriées. Malheureusement, il n'y avait pas de méthode plus cool que je pouvais trouver en analysant le fichier compilé ou en créant un ClassLoader personnalisé grâce à la façon dont java compile JIT. Je suppose que je pourrais avoir chaque classe supplémentaire juste imprimer un nombre défini statiquement, mais cela semblait plus amusant. Cela permettrait également de supprimer l'
B
interface, mais le score n'est pas basé sur des octets, je vais donc laisser cela pour le plaisir.Comment ça marche (haut niveau):
Lit son propre code source ligne par ligne. Puisque chaque ligne déclare une nouvelle classe, nous utilisons la réflexion pour créer une instance de la nouvelle classe et invoquer sa
a
méthode dont elle a besoin car elle implémente l'B
interface.la source
Ruby , score: ∞
Essayez-le en ligne!
Ce programme a 61 octets par ligne (pour n <10). Il a le même format de base que la solution de dylnan ; le premier nombre de chaque ligne sera une valeur différente entre
1
etn
, et le deuxième nombre de chaque ligne seran
.J'espérais trouver un moyen d'éviter d'inclure
n
dans le programme, mais je n'ai pas pu en trouver un.la source
Brain-Flak , 2 (avec
-d
)Essayez-le en ligne!
la source
2
vous pouvez utiliser({}())
et(({}){})
.05AB1E , score: 1114112
Essayez-le en ligne! 0 indexé. Le ˆ au début de chaque ligne pousse les caractères distincts dans le tableau global. Le reste du code est inutilement exécuté sauf sur la dernière ligne, où il concatène les valeurs dans une chaîne, puis trouve son indice de permutation. 1.114.112 est le nombre de caractères Unicode possibles au moment de la rédaction (les points de code 48-57 sont les plus faciles à démontrer avec bien sûr).
la source