Voici comment revenir en arrière et retaper d'une chaîne à une autre:
- Commencez à la première chaîne.
- Supprimez les caractères à la fin jusqu'à ce que le résultat soit un préfixe de la deuxième chaîne. (Cela peut prendre 0 étapes.)
- Ajoutez des caractères à la fin jusqu'à ce que le résultat soit égal à la deuxième chaîne. (Cela peut prendre 0 étapes, aussi.)
Par exemple, le chemin de fooabc
à fooxyz
ressemble à:
fooabc
fooab
fooa
foo
foox
fooxy
fooxyz
Tâche
À partir d'une liste de mots, écrivez un programme qui recule et recoupe son chemin de la chaîne vide à tous les mots successivement de la liste, puis revient à la chaîne vide. Affiche toutes les chaînes intermédiaires.
Par exemple, étant donné la liste des entrées ["abc", "abd", "aefg", "h"]
, le résultat devrait être:
a
ab
abc
ab
abd
ab
a
ae
aef
aefg
aef
ae
a
h
Règles
Vous pouvez renvoyer ou imprimer une liste de chaînes ou une seule chaîne avec un délimiteur de choix. Vous pouvez éventuellement inclure les chaînes vides initiale et finale. Il est garanti que l’entrée contient au moins un mot et que chaque mot ne contient que des lettres ASCII minuscules ( a
- z
). Modifier: les chaînes consécutives dans l'entrée sont garanties ne pas être égales.
C'est du code-golf ; le code le plus court en octets gagne.
Une implémentation de référence dans Python 3: essayez-le en ligne!
["abc","abc"]
?a,abc,abcde,abc,a,abc,abcde
Réponses:
Pyth,
2523 octetsEssayez-le en ligne.
la source
Perl, 43 octets
42 octets de code +
-n
drapeaux.Pour l'exécuter:
la source
abc
avoir fait imprimer 3 fois (mais en réalité, la première et la troisième fois, c'était sans l'espace). Je l'ai enlevé.Java 8, 144 octets
Celle-ci est similaire à l'implémentation de référence mais combine les deux
while
boucles. C'est une expression lambda qui accepte unString[]
paramètre.Ungolfed
Remerciements
la source
class B
au lieu deinterface B
? Vous pouvez exécuter à partir d'une classe package-private. Pensez également à utiliser un lambda car vous avez déjà spécifié Java8.interface B{static void main
est plus court queclass B{public static void main
.a->{/*your code*/}
, ce qui assignera à une variable de typejava.util.function.Consumer<String[]>
. Je ne peux pas tester pour le moment, cependant.Mathematica, 149 octets
la source
Rétine , 39 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Les entrées et sorties sont des listes séparées par des sauts de ligne. La sortie inclut les chaînes vides de début et de fin.
la source
Jelly ,
312926 octetsEssayez-le en ligne!
Comment ça marche
la source
Haskell ,
102 93 9190 octetsLa dernière ligne est une fonction anonyme, qui prend et retourne une liste de chaînes. Essayez-le en ligne!
Explication
Ma solution est récursive. Premièrement, il
?
y a une fonction infixe auxiliaire:a?b
donne les premierslength a
caractères deb
, ou la totalité deb
sia
est plus long. Ensuite, je définis une fonction infixe!
. L'idée est quea!x
, où sea
trouve une chaîne etx
une liste de chaînes, produit le chemin dea
la première chaîne à l'x
intérieur et revient à la fin dex
. Sur la dernière ligne, je définis une fonction anonyme qui ajoute la chaîne vide, puis s’applique!
à la chaîne vide et à l’entrée.Explication de
!
:la source
Python 2,
118107103979392 octetsL'entrée est donnée comme
['abc', 'abcdef', 'abcfed']
, ou comme ["abc", "abcdef", "abcfed"]
.Révision 1: -11 octets. Le mérite en revient à @xnor pour son article sur les astuces concernant le golf Python, et à @Lynn pour avoir trouvé l’astuce pour moi et pour moi pour être intelligent. Deux modifications ont été apportées: au lieu de
not s.startswith(i)
, j'ai utilisés.find(i)
et au lieu dei!=s
utiliséi>s
.Révision 2: -4 octets. Le crédit me revient en réalisant que j'ai commis une erreur vraiment stupide. Plutôt que d'utiliser l'indentation à un seul onglet et à deux onglets, j'ai utilisé l'indentation à un espace et à un seul onglet.
Révision 3: -6 octets. Le crédit va à @ mbomb007 pour avoir suggéré de mettre les whiles sur une seule ligne. J'ai aussi corrigé un bug en changeant
s.find(i)
pouri.find(s)
.Révision 4: -4 octets. Le mérite revient à @xnor pour avoir réalisé que je n'avais pas besoin de stocker l'entrée dans une variable.
Révision 5: -1 octet. Le mérite me revient d’avoir réalisé que
['']
c’est la même chose que[s]
lorsqu’il est ajouté à l’entrée.la source
while
s chacun sur une seule ligne. En outre, vous pouvez utiliser<1
au lieu denot
.startswith
.while
s sur une seule ligne. Tu veux dire commewhile s.find(i):s=s[:-1];print s
? Merci également pour la suggestion<1
, mais j'ai changé pour quelque chose d'encore plus court, grâce à l'un des conseils de xnor sur le fil des conseils Python.GNU M4, 228 ou 232 octets¹
(¹ selon qu'il faut
dnl\n
ou non terminer le fichier - je suis encore novice en golf et en M4)De plus, 3 octets pourraient être sauvegardés en remplaçant le deuxième argument de
substr
from0
par la chaîne vide, mais cela produirait de nombreux avertissements sur stderr.Ungolfed:
Usage:
la source
PHP,
11611110183 octetsRemarque: utilise le codage Windows-1252.
Courez comme ça:
Explication
Tweaks
trim($c^$w,"\0")
pour vérifier la correspondance de sous-chaîne au lieu de$c&&strpos($w,$c)!==0
.~ÿ
pour renvoyer une chaîne avec un octet NUL au lieu de"\0"
$c=$c.ÿ&$w
suffixe$c
avec le caractère suivant de$w
la source
Lot,
296291 octetsLe calcul du préfixe commun était fastidieux.
la source
PHP, 153 octets
terriblement long :(
Courez avec
php -nr '<ode>' <text1> <text2> ...
.la source
JavaScript (ES6), 135 octets
Défi intéressant! Utilisation:
g(["abc", "abd", "aefg", "h"])
. Il me semblait impossible de sauver des octets en écrivant cela comme une fonction, donc deux. Les nouvelles lignes ne sont pas incluses dans le nombre d'octets.Je suis sûr que cela peut être réduit beaucoup plus. Ajoutera une version non-golfée plus tard.
la source
Javascript, 98 octets
Réponse Java du port de Jakob
la source