Ma fille avait la tâche suivante pour ses devoirs de mathématiques. Imaginez six amis vivant sur une ligne, nommés E, F, G, H, J et K. Leurs positions sur la ligne sont comme indiqué (pas à l'échelle) ci-dessous:
Ainsi, F vit à cinq unités de E, et deux unités de G, et ainsi de suite.
Votre mission: créer un programme qui identifie un chemin qui visite chaque ami exactement une fois avec une longueur totale de n unités, en prenant les emplacements des amis et n comme entrées. Il doit signaler le chemin s'il le trouve (par exemple, pour la longueur 17, il peut signaler «E, F, G, H, J, K», et il doit se terminer correctement si aucune solution n'existe. Pour ce que ça vaut, j'ai terminé une solution non gérée dans Mathematica en 271. Je pense que c'est possible de façon beaucoup plus concise que cela.
la source
[0, 5, 7, 13, 16, 17]
Et62
) afin que vous puissiez vous assurer qu'il n'est pas spécifiquement codé en dur dans ce cas."[0, 5, 7, 13, 16, 17], 62"
et une sortie sont-elles"(7, 16, 0, 17, 5, 13)"
correctes?Réponses:
J, 54 octets
Génère un itinéraire correct. Si aucune route n'existe, elle ne produit rien.
Code de 52 octets qui génère tous les itinéraires (un par ligne):
Code de 38 octets qui génère des positions à la place des lettres:
la source
Mathematica, 55 ou 90 octets
Mathematica vous avez dit? ;)
Il s'agit d'une fonction anonyme qui prend d'abord la position des amis (dans n'importe quel ordre), puis la longueur cible. Il retourne
Missing[NotFound]
, si aucun chemin n'existe.Je peux enregistrer quatre octets si le retour de tous les chemins valides est autorisé (
FirstCase
->Cases
).Le retour d'un tableau de chaînes est un peu plus lourd:
la source
Z
, continuera avec les prochains caractères ASCII (pas que vous souhaitiez quand même exécuter mon code pour n> 20: D).Python 2,
154148 octets(ou 118 octets pour la solution générale)
Ce programme accepte une ligne avec une liste et un entier comme '[0, 5, 7, 13, 16, 17], n' sur stdin et imprime un chemin sur la sortie de longueur n ou rien si impossible.
Il est difficile d'écrire de petits programmes en Python qui nécessitent des permutations. Cette importation et cette utilisation sont très coûteuses.
La source de l'exigence OP avant la minifiante:
La solution générale (non minifiée):
En raison de l'algorithme simple et du grand nombre de combinaisons, l'exécution pour plus de 20 positions initiales sera très lente.
la source
from itertools import*
. En outre, Python 3 peut être plus court avecinput()
et*a,c=map(...)
s'il peut fonctionner avec le reste de votre programme.chr(a.index(n)+69)
?J (48 ou 65)
Je suppose que cela peut être joué beaucoup plus. N'hésitez pas à l'utiliser comme un point de départ pour jouer au golf plus loin
Ou avec des lettres:
Ce qu'il fait:
(J'espère que ce format d'E / S est correct ...)
Comment ça marche:
Génère toutes les permutations de l'entrée
Calcule la distance
Voir les résultats qui sont les mêmes que l'entrée et recréer ces permutations (je soupçonne que certains caractères peuvent être rasés ici)
Avec des lettres:
Créer une liste des n premières lettres, où n est la longueur de la liste d'entrée
fait la même chose que ci-dessus
la source
Octave, 73
Il n'y a vraiment pas de non-golf à cela, alors laissez-moi essayer d'expliquer ... de l'intérieur vers l'extérieur, nous permutons toutes les distances, puis pour chaque permutation, nous prenons les différences entre les maisons, prenons la valeur absolue comme distance, ajoutez-les vers le haut, trouver l'indice de la première permutation avec la distance souhaitée, et permuter les lettres et trouver cette permutation particulière des lettres.
qui est 13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62.
(vide pour les entrées impossibles)
la source
perms()
dans Octave 3.6.2 sur ideone.com a des problèmes avec le vecteur de chaînes.Matlab (86)
Exemple dans lequel une solution existe:
Exemple dans lequel une solution n'existe pas:
Matlab (62)
Si le format de sortie peut être assoupli en produisant des positions au lieu de lettres et en produisant une matrice vide si aucune solution n'existe:
Exemple dans lequel une solution existe:
Exemple dans lequel une solution n'existe pas:
Matlab (54)
S'il est acceptable que le programme fournisse tous les chemins valides :
Exemple dans lequel une solution existe:
la source
Haskell, 109 octets
Exemple d'utilisation:
17 # [0, 5, 7, 13, 16, 17]
qui génère tous les chemins valides, c'est-à-dire["EFGHIJ","JIHGFE"]
. S'il n'y a pas de chemin valide, la liste vide[]
est renvoyée.La liste des lettres comprend
I
(j'espère que ça va).Comment ça marche: faites une liste de
(name, position)
paires, permutez et prenez celles où la longueur du chemin est égalen
et supprimez la partie de position.la source