Il y a 40 façons un dirigé chemin hamiltonien peut être effectué sur une grille 3 x 3:
Ce graphique ( grâce SP3000! ) Ne montre que les 20 chemins non orientés. Parcourez chaque ligne de couleur dans les deux sens pour les 40 trajectoires dirigées.
Défi
En utilisant uniquement du code ASCII imprimable , écrivez une grille de caractères 3 × 3, telle que:
ABC
DEF
GHI
Lorsque chacun des 40 chemins dirigés sont lus à partir de cette grille 40 une seule ligne, les programmes 9 caractères, l'objectif est d'avoir chaque sortie de programme un entier unique de 1 à 40. Faire cela pour tous les 40 chemins semble difficile et peu probable, il vous suffit donc de le faire fonctionner pour autant de chemins que possible.
La soumission dont les 40 programmes de trajectoire génèrent les nombres les plus distincts de 1 à 40 sera gagnante. Tiebreaker va à la soumission précédente.
Les programmes de trajectoire qui génèrent une erreur ou ne génèrent pas un entier compris entre 1 et 40 ou un autre qu'un autre programme de trajectoire déjà traité ne sont pas comptés. Plus précisément:
- Les programmes qui rencontrent des erreurs lors de la compilation, de l'exécution ou de la sortie ne sont pas comptés. Les avertissements sont ok.
- Les programmes qui ne génèrent pas un entier compris entre 1 et 40 ni un élément légèrement mal formé tel que
-35
ou35 36
ne sont pas comptés. - Les programmes qui nécessitent une entrée utilisateur pour produire la sortie ne sont pas comptés.
- Les programmes qui ne finissent jamais ne sont pas comptés.
- A partir de maintenant , les programmes qui ne sont pas déterministes ne sont pas comptés.
- Sinon, les programmes valides qui génèrent un nombre entier compris entre 1 et 40 et qui sont déjà générés par un autre programme valide ne sont pas comptés. (Le premier programme est compté.)
- Seuls les programmes qui produisent des représentations entières de nombres compris entre 1 et 40 (inclus) sont comptés dans votre total. Les chiffres devraient être l'habituel
1
,2
...,39
, le40
format, à moins que ce n'est pas la norme pour votre langue. (Un retour à la ligne dans la sortie est acceptable.) - Les numéros de sortie de vos programmes et leur ordre d'importance importent peu. Seul le nombre d'entiers distincts des programmes valables est important.
Tous les programmes de chemin doivent être exécutés dans la même langue. Cependant, les "programmes" peuvent en fait être des fonctions (sans arguments requis) ou REPL commandes , ainsi que des programmes complets, qui impriment ou renvoient leur entier cible. Vous pouvez combiner des fonctions, des commandes REPL et des programmes complets.
Vos 9 caractères ASCII imprimables ne doivent pas nécessairement être distincts.
Exemple
Si votre grille 3 × 3 était
ABC
DEF
GHI
et vos 40 programmes et sorties ressemblaient à ceci
ABCFEDGHI -> 26
ABCFIHEDG -> 90
ABCFIHGDE -> 2
ABEDGHIFC -> syntax error
ADEBCFIHG -> prints 40 but then errors
ADGHEBCFI -> 6
ADGHIFCBE -> 6
ADGHIFEBC -> 6
CBADEFIHG -> runtime error
CBADGHEFI -> 3
CBADGHIFE -> 4
CFEBADGHI -> -32
CFIHEBADG -> 38.0
CFIHGDABE -> "36"
EDABCFIHG -> 33
EFCBADGHI -> no output
EHGDABCFI -> compilation error
EHIFCBADG -> 8
GDABCFEHI -> 22
GHEDABCFI -> 41
IHGDEFCBA -> 0
GDEHIFCBA -> '9'
EDGHIFCBA -> +10
CFIHGDEBA -> 11
GHIFCBEDA -> error
IFCBEHGDA -> error
EBCFIHGDA -> prints 23 but then loops infinitely
CBEFIHGDA -> randomly prints either 24 or 44
GHIFEDABC -> error
IFEHGDABC -> 30
EFIHGDABC -> 39
IHGDABEFC -> 7
GDABEHIFC -> 29
EBADGHIFC -> -1
GHIFCBADE -> 26
IHGDABCFE -> 1
IFCBADGHE -> error
GDABCFIHE -> no output
IHEFCBADG -> no output
IFCBADEHG -> "quack"
votre score serait de 14, car il y a 14 nombres entiers distincts de 1 à 40 validés, à savoir 26 2 6 3 4 33 8 22 11 30 39 7 29 1
.
la source
123654789
Réponses:
PARI / GP - 24
PARI / GP ignore les espaces entre les chiffres, de sorte que
1 8 2
, par exemple, est traité comme182
. La même chose pourrait fonctionner pour perl en remplaçant les espaces par des traits de soulignement. Je n'ai pas épuisé la totalité de l'espace de recherche, il pourrait donc y avoir de meilleurs candidats.Un programme peut être transmis à gp en tant que
gp -q -f program.gp
, ou de manière interactive dans le repl.Sortie
Toutes les valeurs sauf 4 se situent dans la plage requise, avec 12 entrées en double.
Mise à jour
J'ai fini de travailler, il y a six 23 différents, et un seul 24 (tel que lu par rangées):
Le programme que j'ai utilisé pour le crunching est ci-dessous. PARI / GP a des capacités de traitement de chaîne limitées, il est donc préférable de traiter avec des tableaux de caractères (aka
Vecsmall
). Les opérateurs testés sont+
,-
,*
,\
(div étage),%
,;
(séparateur d'expression, tout essentiellement les rejets avant), et(espace, tel que décrit ci - dessus). L'opérateur exposant
^
pourrait également être ajouté, mais il devient trop lent pour effectuer un test exhaustif.la source
Les poissons morts , 18
C’était en fait la première langue que j’ai essayée avant de considérer les opérateurs infix. Je le publie maintenant pour la pure hilarité de l'idée que Deadfish pourrait être utile à quelque chose.
Pour ceux qui ne connaissent pas Deadfish, l'
i
incrément, les
carré et lao
sortie, l'accumulateur commence à 0 (il y a aussi une 4ème instructiond
de décrémentation non utilisée ici). Le fait que nous n’ayons pas d’impression automatique et que nous n’ayons pas besoin d’utilisero
est un inconvénient majeur, mais étonnamment, Deadfish n’a pas une très bonne image ici, tout bien considéré. Il s'avère que l'emplacement optimal de l'opérateur de sortie est au milieu.la source
Python REPL et beaucoup d'autres,
2223Observation clé: si vous colorez la grille comme un damier, le chemin alterne les couleurs de la grille au fur et à mesure, et commence et se termine de la même couleur.
Toujours brute forçant pour le meilleur.Essayer avec+*%
(et même**
pour les langues où il^
y a une exponentiation) n’a malheureusement rien donné de mieux. J'ai également essayé de lancer dans les opérateurs de bitwise et seulement^
(xor) a semblé aider légèrement, mais la recherche prenait trop de temps alors j'ai abandonné.la source
6+7*5%6%4
,6+7*4%6%5
et6+8*4%6%5
( de gauche à droite, de haut en bas), et rien d' autre.+
et-
dans les coins / centre? Etant donné qu’ils sont unaires ainsi que des opérateurs binaires, toutes les expressions valides doivent toujours en résulter. Cela ne devrait pas donner lieu à une meilleure solution, mais au moins, cela élargit l’espace de recherche. Hmm, en fait, cela pourrait être un problème car vous pourriez vous retrouver avec des séquences d'opérateurs.J, 15
Cela ne génère que des nombres valides, mais beaucoup sont des doublons. Les valeurs uniques sont
17 11 16 28 31 23 13 10 21 33 18 24 22 29 27
. Vous pouvez certainement faire mieux en changeant les opérateurs et les nombres entiers impliqués.la source
Yes
.> <>, 36 *
Si vous êtes assez chanceux!
Comme le défi ne nécessite pas que le code soit déterministe, il suffit de prouver qu'il est possible (même si cela est improbable) de renvoyer 36 nombres et nous avons terminé.C'était bien pendant que ça durait je suppose.(Pour ceux qui ne connaissent pas> <>, une excellente introduction peut être trouvée ici )
J'ai décidé d'utiliser l'instruction "x" dans> <>, ce qui modifie la direction des pointeurs d'instruction en haut, en bas, à gauche ou à droite de manière aléatoire. Puisque notre code ne sera qu'une ligne, cela signifie que nous ne pouvons regarder que dans les cas où il va à droite ou à gauche, car si le pointeur monte ou descend, il ne fera que taper à nouveau sur l'instruction "x".
L'instruction "n" fait apparaître le numéro en haut de la pile et l'imprime. Cependant, si la pile est vide et qu'il n'y a rien à faire apparaître, une erreur est générée.
L'instruction "l" insère simplement la longueur de la pile dans la pile (et heureusement pour nous, elle n'envoie pas d'erreur si la pile est vide). Ainsi, par exemple, si la pile était vide et que "l" serait appelé, il pousserait 0 sur la pile. Si nous appelons à nouveau "l", alors comme la pile a un élément (0), elle pousserait 1 en haut de la pile et cela signifierait qu'il y aurait deux choses sur la pile et que cela signifierait que si nous devions appeler "l" à nouveau, nous appellerions 2 sur la pile, etc. Ainsi, nous pouvons utiliser "l" pour envoyer un nombre arbitraire sur la pile via la méthode indiquée précédemment.
Le ";" l'instruction termine le programme.
L'idée d'utiliser "x" est que, par exemple, s'il n'y avait qu'un "x" dans le code (où A, B, C, D sont des instructions):
Le programme exécuterait A puis B puis C, et en atteignant "x", nous aurions deux possibilités: le code continue à aller à droite et frappe le ";" et quitte ou il va à gauche et exécute C puis B puis A puis D et seulement ensuite. Donc, si notre code contient un "x", le programme obtient deux flux de programme possibles parmi lesquels nous pouvons choisir le programme le mieux adapté.
Si il y a deux "x" ou plus, nous obtenons un nombre infini de flux de programme possibles.
Notre code a cinq "x", de plus, chacun d'entre eux est dans une "cellule de départ" des chemins hamiltoniens, ce qui signifie que chaque programme commence par un "x" et que chaque programme a la structure suivante:
Où A, B, C, D appartiennent à {; , n, l, l} Cela signifie qu'il n'y a que 12 programmes uniques. De plus, comme nous commençons toujours par un "x", nous pouvons examiner le cas où le programme va à gauche, ainsi les programmes symétriques peuvent également être considérés comme identiques. Jusqu'à la symétrie, il n'y a que 6 programmes possibles. Seuls 4 d’entre eux apparaissent dans les programmes générés sous forme de chemins hamiltoniens:
Regardons le premier programme "xnxlxlx; x" si nous allons directement à la première étape, nous appuyons sur la commande print qui provoquera une erreur car nous n’avons rien sur la pile. Si nous allons à gauche, nous frappons la commande du programme final. Nous ne pouvons donc générer aucun nombre à partir de ces programmes.
Le deuxième programme, "xlxnxlx; x", est beaucoup plus prometteur, puisqu’en allant au début, un zéro est placé sur la pile, si nous allons à gauche au prochain "x", notre pile gagne un, puis En reprenant à droite, nous avons un 2 que nous pouvons ensuite imprimer et continuer tout droit pour mettre fin au programme. Nous pouvons observer que nous pouvons réellement imprimer n'importe quel nombre pair , puisque dans la partie "xlx" au début, nous pouvons atteindre un nombre de taille arbitraire en allant à droite puis à gauche, puis à nouveau à droite un certain nombre de fois.
De même, on peut voir que le troisième programme xnxlx; xlx peut générer n’importe quel nombre impair , en allant à gauche au début, puis en répétant la routine "xlx" seulement cette fois en allant à gauche puis à droite puis à gauche.
Et le quatrième programme est essentiellement identique au deuxième programme et peut générer n'importe quel nombre pair .
Donc, pour les programmes requis, nous avons:
C'est 4 programmes qui ne peuvent pas sortir des nombres, 20 qui peuvent sortir n'importe quel nombre pair, 16 qui peuvent sortir n'importe quel nombre impair. Puisqu'il y a exactement 20 nombres pairs et au moins 16 nombres impairs dans la plage allant de 1 à 40, il est possible, avec une certaine probabilité, qu'il y ait 36 nombres différents dans la plage allant de 1 à 40 émis par ce bloc de code.
la source
GolfScript, 8
Actuellement la solution la plus performante. : Pétait bien pendant que ça durait.Programmes
la source
0)1#2#3(4
à 15 ans. Belle symétrie aussi.CJam, 14
Ci-dessous les programmes de travail:
Les valeurs générées sont: [1, 3, 4, 11, 13, 14, 20, 21, 22, 23, 24, 30, 31, 33]
la source
dc (20)
32 sorties, 20 d’entre elles distinctes (marquées d’un
$
)2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 20, 22, 24, 25, 32, 34, 40
la source