Si vous le souhaitez, écrivez un programme qui trie les villes selon les règles du jeu des noms de villes.
Chaque nom de la ville doit commencer par la dernière lettre du nom de la ville précédente. Par exemple
Lviv -> v -> Viden -> n -> Neapolis -> s -> Sidney -> y -> Yokogama -> a -> Amsterdam -> m -> Madrid -> d -> Denwer
Dans la liste triée, la première lettre de la première ville et la dernière lettre de la dernière
ne doivent pas correspondre. Rienne doit être la même lettre.- Vous pouvez supposer que les noms de villes n'ont que des lettres.
- La sortie du programme doit avoir la même capitalisation que l'entrée
Exemple:
% ./script Neapolis Yokogama Sidney Amsterdam Madrid Lviv Viden Denwer
["Lviv", "Viden", "Neapolis", "Sidney", "Yokogama", "Amsterdam", "Madrid", "Denwer"]
code-golf
graph-theory
sorting
defhlt
la source
la source
["Viden" ... "Lviv"]
invalide?)Réponses:
Ruby,
585544 caractèresEncore une autre implémentation rubis. Utilise également des expressions rationnelles insensibles à la casse (comme l'ancienne solution de Ventero ) mais le test est effectué différemment.
La version précédente:
la source
!~
au lieu de nier toute l'expression.Python (
162141124 124)Force brute pour la victoire.
la source
&(j[0][0]!=j[-1][-1])
condition; voir les commentaires sur la question ci-dessus.from itertools import*;print[j for j in permutations(raw_input().split())if all(x[-1]==y[0].lower()for x,y in zip(j,j[1:]))]
j
,x
,y
? Comment sont-ils définis? Je suis désolé si ces questions sont boiteuses, je suis nouveau sur Python et j'aimerais travailler encore plus avec.j
contient une permutation des villes, qui est générée avec lapermutations
commande. Le grandif
à la fin valide essentiellement que pour toutes les valeurs dansj
, la dernière lettre d'une valeur dansj
est la même que la première lettre de la valeur suivante dansj
. Honnêtement, je ne sais pas non plus ce quezip
ça fait, çazip
fonctionne de façon mystérieuse.Ruby 1.9,
6354 caractèresLa nouvelle solution est basée sur la solution d' Howard :
Cela utilise le fait qu'il y aura toujours une solution valable.
Ancienne solution, basée sur la solution de w0lf :
la source
max_by
. Et votre nouvelle version m'a inspiré pour une version encore plus récente (et plus courte).Rubis
74 72104103 7170Démo: http://ideone.com/MDK5c (dans la démo que j'ai utilisée à la
gets().split()
place de$*
; je ne sais pas si Ideone peut simuler des arguments de ligne de commande).la source
$*.permutation{|p|p p if p.inject(p[0][0]){|m,e|m.casecmp(e[0])==0?e[-1]:?_}>?_}
mais la vôtre est plus courte de 9 caractères!p$*.permutation.find{|i|i.inject{|a,e|a&&e[0]=~/#{a[-1]}/i&&e}}
est un peu plus court. Une solution Ruby 1.8 (!)p$*.permutation.find{|i|i.inject{|a,e|a&&a[-1]-32==e[0]&&e}}
-32
solution est également très ingénieuse, mais elle repose sur le fait que les noms commencent par une lettre majuscule et se terminent par une minuscule, ce qui n'est pas toujours le cas.Python, 113
Très similaire à la réponse de @ beary605, et encore plus forcé par la force brute.
la source
Haskell ,
9474 octetsTrouve récursivement toutes les solutions. -7 octets si vous pouvez sortir toutes les solutions au lieu de la première. Merci à @Lynn de se débarrasser de l'importante importune, en réduisant de 18 octets le score!
Essayez-le en ligne!
la source
Data.Char
importation aveclast b==[r!!0!!0..]!!32
. De plus, vous n'avez pas besoin de parensg[x|x<-c,x/=b]
fromEnum
serait un must. Drôle, j'ai déjà enlevé ces parenthèses une fois, mais je dois avoir copié du mauvais onglet…GolfScript, 78 caractères
Une première version dans GolfScript. Il fait également une approche par force brute. Vous pouvez voir le script s'exécuter sur l'exemple d'entrée en ligne .
la source
Husk , 10 octets
Essayez-le en ligne!
Explication
Alternativement, 10 octets
Nous pourrions également compter le nombre de paires adjacentes qui satisfont le prédicat (
#
), trier sur (Ö
) cela et prendre le dernier élément (→
) pour le même nombre d'octets:Essayez-le en ligne!
la source
Gelée ,
2518 octets (Améliorations bienvenues!)Essayez-le en ligne!
Merci à @Lynn pour la plupart de ces améliorations!
Solution de 25 octets:
Essayez-le en ligne!
la source
Ðf
avoir utiliséX
pour choisir une solution aléatoire au lieu de la première, mais çaḢ
marche aussi bien.)Ðf
rapidement dans beaucoup de mes autres programmes pour économiser de l'espace!Mathematica 236 caractères
Définissez la liste des villes:
Trouvez le chemin qui inclut toutes les villes:
Production:
L'approche ci-dessus suppose que les villes peuvent être organisées sous forme de graphique de chemin.
Le graphique p est illustré ci-dessous:
la source
C, 225
Exécuter avec des noms de pays comme arguments de ligne de commande
Remarque:
la source
#define L(x)for(int i=x;i<n;i++)
et ne le déclarez pasi
au début,main
vous économisez 1 octet.J,
6965605954 caractèresUn peu hors du rythme.
Exemple:
la source
C #, 398
Et voici C # avec Linq 5 cents
la source
K, 96
.
la source
C # (.NET Core) , 297 octets
Essayez-le en ligne!
la source