Le défi
Étant donné deux chaînes / un tableau de chaînes, sortez la première chaîne en rétrécissant lentement et en la développant à nouveau dans la deuxième chaîne.
Vous pouvez supposer que les chaînes commenceront toujours par le même caractère.
Exemple
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Vous sortez d'abord le premier mot:
Test
Ensuite, vous continuez à supprimer une lettre jusqu'à ce que la chaîne comporte un caractère:
Tes
Te
T
Continuez ensuite à ajouter une lettre du deuxième mot jusqu'à ce que ce soit fait:
Te
Tes
Test
Testi
Testin
Testing
(si les deux chaînes ont un caractère, il suffit d'en sortir une fois.)
Cas de test
"Hello!", "Hi."
Hello!
Hello
Hell
Hel
He
H
Hi
Hi.
"O", "O"
O
"z", "zz"
z
zz
".vimrc", ".minecraft"
.vimrc
.vimr
.vim
.vi
.v
.
.m
.mi
.min
.mine
.minec
.minecr
.minecra
.minecraf
.minecraft
" ", " "
SSSSS
SSSS
SSS
SS
S
SS
SSS
"0123456789", "02468"
0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0
02
024
0246
02468
(remarque: sur l'espace / quatrième cas de test, remplacez le S par des espaces)
Règles
C'est le golf de code , donc la réponse la plus courte en octets gagne! Tiebreaker est le poste le plus voté. Le gagnant sera choisi le 09/10/2016.
Les failles standard sont interdites.
Réponses:
Pyth, 9 octets
Un programme qui prend la deuxième chaîne, puis la première chaîne, sous forme de chaînes entre guillemets sur STDIN et imprime le résultat.
Essayez-le en ligne
Comment ça marche
la source
V , 14 octets
Essayez-le en ligne!
Explication:
Maintenant, le tampon ressemble à ceci:
Nous avons juste besoin de faire la même chose en sens inverse pour la ligne suivante:
Solution alternative plus intéressante :
la source
Python, 93 octets
Commence par la chaîne vide
r
, ajoutea
et une nouvelle ligne et supprime le dernier caractère dea
jusqu'à ce qu'ila
soit vide, puis ajoute les parties requises deb
et une nouvelle ligne en gardant un compteuri
, qui commence2
jusqu'à ce que la longueur deb
soit dépassée, puis revientr
. A une nouvelle ligne de fin.Tous les tests sont sur ideone
la source
r=""
. Simpler
fonctionnerait toujours.f=
. 2. Sans ler=''
présentf('test','testing')
ne fonctionnerait pas; ouif('test','testing','')
, mais nous devons suivre les spécifications.05AB1E , 9 octets
Explication
Essayez-le en ligne!
la source
Rétine,
504126 octetsMerci à Martin Ender d'avoir économisé 15 (!) Octets.
Prend la saisie avec les deux chaînes séparées par une nouvelle ligne:
Essayez-le en ligne!
Explication
La première ligne génère les "étapes" des deux mots:
M
est pour le mode de correspondance,&
considère les correspondances qui se chevauchent et!
imprime les correspondances au lieu du nombre d'entre elles. La raison pour laquelle elle est inversée est l'r
option de gauche à droite: le moteur commence à rechercher des correspondances à la fin de la chaîne et continue vers le début.Cela obtient tout dans le bon ordre: il
O
contrôle toutes les correspondances de l'expression régulière suivante: un personnage sur sa propre ligne et chaque caractère (y compris les nouvelles lignes) après, qui correspond à la seconde moitié entière comme un bloc, ou sinon une ligne de caractères , qui correspond à chaque ligne individuelle. Ces correspondances sont ensuite triées par point de code, donc le T suivi de la nouvelle ligne va en premier, suivi des lignes, croissant par la longueur.Maintenant, nous avons juste cette première ligne de caractères en haut, donc nous utilisons le
A
mode ntigrep pour rejeter la première correspondance de l'expression régulière par défaut.+
.Ancienne version
Essayez cette version en ligne!
Explication
La première ligne est la même, alors voyez l'explication ci-dessus.
Cela inverse les lignes de la première moitié (deuxième mot d'entrée). Il
O
renseigne en fait les lignes et l'expression régulière limite les correspondances: il doit s'agir d'une ligne de deux caractères ou plus (..+
) suivie d'une nouvelle ligne (¶
) qui commence là où le dernier s'est arrêté (\G
). Dans l'exemple ci-dessus, le singleT
au milieu ne correspond pas, donc rien après.Nous avons maintenant les deux bons composants, mais dans le mauvais ordre.
¶.¶
correspond au seul T au milieu, dont nous n'avons pas besoin mais sépare les deux parties. Les deux(.*)
capturent tout avant et après, y compris les nouvelles lignes grâce aus
mode en ligne unique. Les deux captures sont remplacées dans le bon ordre par une nouvelle ligne entre les deux.Maintenant, nous avons terminé, à moins que les chaînes d'entrée ne comportent qu'un caractère, auquel cas l'entrée n'a pas changé. Pour se débarrasser du doublon, nous remplaçons
¶.$
(lors de la dernière ligne de la chaîne un seul caractère) par rien.la source
Python 2,
8882 octetsPrend deux entrées, chacune entourée de guillemets.
Merci @JonathanAllan pour avoir sauvé quelques octets et signalé un bug.
la source
len(x)
enx=x[:len(x)-1]
car fonctionne tranchage offset négatif - vous pouvez simplement écrirex=x[:-1]
. Le seul problème est que votre code ne gérera pas" ", " "
très bien le cas de test.input()
et utiliser un format d'entrée comme"<str1>", "<str2>"
for i in range(x):print x[-i:]
et la quatrième ligne parfor i in range(1,y):print y[:-i]
. Pas sûr que cela fonctionnerait, cependant.Perl,
3428 octetsComprend
+2
pour-0n
Exécutez avec les chaînes sur des lignes distinctes sur STDIN:
slow.pl
:Laissez le regex backtracking faire le travail ...
la source
Cheddar , 76 octets
Un peu plus longtemps que je ne l'aurais souhaité. Je vais ajouter une explication bientôt
Essayez-le en ligne!
la source
|>
-il?Brachylog , 32 octets
Essayez-le en ligne!
Explication
Brachylog n'a pas de préfixe intégré, donc nous obtiendrons les préfixes en utilisant
concatenate
(voir prédicat 2): un préfixe deS
isP
siP
concaténé àQ
(quoi que ce soit) entraîneS
.Prédicat principal:
Prédicat 1:
Prédicat 2:
la source
Javascript,
10381 octetsExemple:
f("Test", "Testing")
Sortie:
Réponse originale
la source
Java,
188179 octetsMise à jour
Non golfé :
Utilisation :
la source
Haskell,
545347 octetsExemple d'utilisation:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.De la magie sans point. C'est la même chose que
f x y = (init(t x))++reverse (t y)
oùt
fait une liste de toutes les sous-chaînes initiales, par exemplet "HI!"
->["H","HI","HI!"]
.la source
t=reverse.tail.inits
?inits
besoinimport Data.List
.Pyke, 14 octets
Essayez-le ici!
Et 17 octets juste parce que c'est une solution géniale:
Essayez-le ici!
la source
GNU sed,
5745 + 2 (drapeaux rn) = 47 octetsCourir:
L'entrée doit être les deux chaînes séparées par une nouvelle ligne. Le code est exécuté par sed pour chaque ligne.
La boucle
:
supprime un caractère de la fin de la chaîne de manière itérative. Le signal de sortie lié à la première chaîne de caractères est imprimée directement, à l' exception du premier caractère:1{/../p}
. La sortie de la deuxième chaîne est stockée dans l'espace d'attente dans l'ordre inverse (2G;2h
) pendant la suppression et imprimée à la fin.la source
C (gcc) ,
102979593 octetsEssayez-le en ligne!
La première boucle écrase la chaîne avec 0 octet à partir de la fin et utilise
puts()
pour imprimer la chaîne. La deuxième boucle ne peut pas simplement écraser depuis le début, elle doit stocker l'ancienne valeur pour pouvoir la remettre; l'octet 0 marche juste vers la fin.Merci à @homersimpson et @ceilingcat pour chaque rasage de 2 octets!
la source
n
comme un int global comme:n;f(char*a,char*b){n=strlen(a)...
. Et vous pouvez probablement fairen=*a=0
une affectation enchaînée dans le corps de votre boucle for.Python 3, 104 octets
Meh.
Merci à @DJMcMayhem d'avoir joué au golf à 21 octets.
Ideone ça!
la source
n='\n'
et utiliser n au lieu de'\n'
. Vous pourriez retirer 8 de plus si vousn='\n';lambda x,y:n.join(x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1)))
REPL / Javascript, 109 octets
Utilise une fausse chaîne pour réduire la chaîne d'origine
Abuse la sous-chaîne avec un plus grand nombre pour faire croître la seconde, s'arrête lorsqu'elle est sur le point d'imprimer le même mot que la dernière fois.
Démo:
la source
a=>b=>...
et appelez la fonction avec (a) (b)Brainfuck,
3855 octetsModifier: inclus des sauts de ligne dans la sortie
la source
Dyalog APL ,
2013 octets↑
matrify(⌽,\⍞)
reverse (⌽
) concaténation cumulative (,\
) de l'entrée de caractères (⍞
),
préposé à1↓
un élément abandonné,\⍞
concaténation cumulative de la saisie de caractèresTryAPL en ligne!
la source
Raquette 193 octets
Essai:
la source
Floroid , 69 octets
C'est un début. Prend l'entrée de STDIN.
Testcases
la source
JavaScript (ES6), 92 octets
Les
replace
instructions forment un triangle de chaînes, ce qui est exactement ce qui est requis pour la seconde moitié de la sortie, mais la première moitié doit être inversée et la ligne à un caractère en double supprimée. Remarque: génère une nouvelle ligne de début si la première chaîne est un seul caractère. Si cela n'est pas souhaitable, alors pour un octet supplémentaire, cette version génère toujours une nouvelle ligne de fin:la source
C, 142 octets
Fournir
f(char* str1, char* str2)
.la source
TI-Basic, 56 octets
Exemple d'utilisation
la source
Java,
168136 octetsProgramme de test non golfé
la source
(Lambdabot) Haskell - 41 octets
Plus lisible, mais deux octets de plus:
Sortie:
la source
J, 18 octets
Ungolfed:
Il s'agit d'un 7 trains:
Le train le plus à l'intérieur se
[: |. ]\@[
compose d'un capuchon[:
à gauche, nous appliquons donc|.
(inverse) au résultat de]\@[
, qui est]\
(préfixes) sur[
(argument de gauche).Voici à quoi cela ressemble sur l'
testing, test
entrée:Cela nous donne presque la première partie. Le 5-train en dehors de cela est
([: }: ([: |. ]\@[))
, ce qui s'applique}:
(betail, supprimer le dernier élément) à l'expression ci-dessus:(C'est parce que nous ne pouvons pas avoir de point médian en double.)
La partie extérieure est enfin:
Il est composé de
]\@]
(préfixes de l'argument de gauche) et,~
(ajoutez ce qui est à gauche avec ce qui est à droite), nous laissant avec le résultat souhaité:Cas de test
la source
(,~}:@|.)&(]\)
PHP,
117109 octetsPHP, 107 octets (ne fonctionne pas avec des chaînes contenant
0
)la source
C, 111 octets
Test non golfé
la source
brainfuck, 162 octets
Essayez-le ici
L'entrée prend les deux chaînes séparées par un saut de ligne.
Premier programme avec brianfuck et premier code golf, donc je suis sûr qu'il y a beaucoup d'optimisation à faire. Mais je me suis amusé à le faire.
Ungolfed
la source