Die Herausforderung
Geben Sie bei zwei Zeichenfolgen / einem Array von Zeichenfolgen die erste Zeichenfolge aus, die langsam schrumpft und sich wieder in die zweite Zeichenfolge ausdehnt.
Sie können davon ausgehen, dass die Zeichenfolgen immer mit demselben Zeichen beginnen.
Beispiel
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Zuerst geben Sie das erste Wort aus:
Test
Dann entfernen Sie einen Buchstaben, bis die Zeichenfolge ein Zeichen lang ist:
Tes
Te
T
Fügen Sie dann einen Buchstaben des zweiten Wortes hinzu, bis es fertig ist:
Te
Tes
Test
Testi
Testin
Testing
(Wenn beide Zeichenfolgen ein Zeichen lang sind, geben Sie eine davon nur einmal aus.)
Testfälle
"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
(Hinweis: Ersetzen Sie im Leerzeichen / vierten Testfall das S durch Leerzeichen.)
Regeln
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes! Tiebreaker ist der am besten bewertete Beitrag. Der Gewinner wird am 09.10.2016 ermittelt.
Standardlücken sind verboten.
Antworten:
Pyth, 9 Bytes
Ein Programm, das die zweite und dann die erste Zeichenfolge in Anführungszeichen auf STDIN setzt und das Ergebnis ausgibt.
Probieren Sie es online aus
Wie es funktioniert
quelle
V , 14 Bytes
Probieren Sie es online!
Erläuterung:
Der Puffer sieht nun so aus:
Für die nächste Zeile müssen wir nur dasselbe in umgekehrter Reihenfolge tun:
Interessantere alternative Lösung :
quelle
Python, 93 Bytes
Beginnt mit der leeren Zeichenfolge
r
, fügta
eine neue Zeile hinzu und entfernt das letzte Zeichen vona
bis,a
und fügt dann die erforderlichen Teile vonb
und eine neue Zeile hinzu, indem ein Zähler beibehalten wirdi
, der beginnt,2
bis die Länge vonb
überschritten wird, und dann zurückkehrtr
. Hat einen nachgestellten Zeilenumbruch.Alle Tests sind auf ideone
quelle
r=""
. Einfachr
würde immer noch funktionieren.f=
. 2. Ohne dier=''
Gegenwartf('test','testing')
würde nicht funktionieren; jaf('test','testing','')
würde, aber wir müssen die spezifikationen befolgen.05AB1E , 9 Bytes
Erläuterung
Probieren Sie es online!
quelle
Retina,
504126 BytesVielen Dank an Martin Ender für das Speichern von 15 (!) Bytes.
Nimmt die Eingabe mit den beiden durch einen Zeilenumbruch getrennten Zeichenfolgen vor:
Probieren Sie es online!
Erläuterung
Die erste Zeile generiert die "Schritte" beider Wörter:
M
gilt für den Übereinstimmungsmodus,&
berücksichtigt überlappende Übereinstimmungen und!
druckt die Übereinstimmungen anstelle der Anzahl aus. Der Grund für die Umkehrung ist dier
Option von rechts nach links: Die Suchmaschine sucht am Ende der Zeichenfolge nach Übereinstimmungen und fährt am Anfang fort.Dies bringt alles in die richtige Reihenfolge: Es werden
O
alle Übereinstimmungen des nachfolgenden regulären Ausdrucks angezeigt: Ein Zeichen in einer eigenen Zeile und jedes Zeichen (einschließlich Zeilenvorschub) danach, das der gesamten zweiten Hälfte als ein Teil oder auf andere Weise als eine Zeichenzeile entspricht , die zu jeder einzelnen Zeile passt. Diese Übereinstimmungen werden dann nach Codepunkten sortiert, sodass zuerst das T gefolgt von der neuen Zeile und dann die Zeilen in aufsteigender Reihenfolge angezeigt werden.Jetzt haben wir nur die erste
A
Zeichenzeile oben, sodass wir den ntigrep-Modus verwenden, um die erste Übereinstimmung der Standard-Regex zu verwerfen.+
.Alte Version
Probieren Sie diese Version online aus!
Erläuterung
Die erste Zeile ist die gleiche, siehe die Erklärung dazu oben.
Dies kehrt die Zeilen der ersten Hälfte (zweites Eingangswort) um. Es ist eigentlich
O
rts die Linien, und die Regex begrenzt die Spiele: es muss eine Linie von zwei oder mehr Zeichen lang sein (..+
) durch eine neue Zeile gefolgt (¶
) , die dort beginnt , wo die letzte aufgehört hat (\G
). Im obigen BeispielT
stimmt die Single in der Mitte nicht überein, also nichts danach.Jetzt haben wir die richtigen zwei Komponenten, aber in der falschen Reihenfolge.
¶.¶
Passt zum einsamen T in der Mitte, das wir nicht brauchen, sondern die beiden Teile trennen. Die beiden(.*)
erfassen alles davor und danach, einschließlich der Zeilenumbrüche dank dess
Ingle-Line-Modus. Die beiden Captures werden in der richtigen Reihenfolge durch einen Zeilenumbruch dazwischen ersetzt.Jetzt sind wir fertig, es sei denn, die Eingabezeichenfolgen sind ein Zeichen lang. In diesem Fall hat sich die Eingabe nicht geändert. Um das Duplikat loszuwerden, ersetzen wir
¶.$
(wenn die letzte Zeile des Strings ein einzelnes Zeichen enthält) durch nichts.quelle
Python 2,
8882 BytesNimmt zwei Eingaben an, die jeweils von Anführungszeichen umgeben sind.
Vielen Dank an JonathanAllan für das Speichern einiger Bytes und den Hinweis auf einen Fehler.
quelle
len(x)
inx=x[:len(x)-1]
da negative Offset - Slicing arbeitet - man muss nur schreiben kannx=x[:-1]
. Das einzige Problem ist, dass Ihr Code den" ", " "
Testfall nicht sehr gut handhabt .input()
und ein Eingabeformat wie"<str1>", "<str2>"
for i in range(x):print x[-i:]
und die vierte Zeile in ändernfor i in range(1,y):print y[:-i]
. Ich bin mir jedoch nicht sicher, ob es funktionieren würde.Perl,
3428 BytesEnthält
+2
für-0n
Führen Sie mit den Zeichenfolgen in separaten Zeilen auf STDIN aus:
slow.pl
:Lassen Sie Regex Backtracking die Arbeit machen ...
quelle
Cheddar , 76 Bytes
Ein bisschen länger als ich wollte. Ich werde bald eine Erklärung hinzufügen
Probieren Sie es online!
quelle
|>
das?Brachylog , 32 Bytes
Probieren Sie es online!
Erläuterung
In Brachylog ist kein Präfix integriert, daher erhalten wir die Präfixe mit
concatenate
(siehe Prädikat 2): Ein Präfix vonS
ist,P
wenn esP
mitQ
(was auch immer es ist) verkettet wirdS
.Hauptprädikat:
Prädikat 1:
Prädikat 2:
quelle
Javascript,
10381 BytesBeispiel:
f("Test", "Testing")
Ausgabe:
Ursprüngliche Antwort
quelle
Java,
188179 BytesAktualisieren
Ungolfed :
Verwendung :
quelle
Haskell,
545347 BytesAnwendungsbeispiel:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.Etwas sinnlose Magie. Es ist das gleiche wie in
f x y = (init(t x))++reverse (t y)
demt
macht eine Liste aller anfänglichen Teil zBt "HI!"
->["H","HI","HI!"]
.quelle
t=reverse.tail.inits
?inits
braucht aberimport Data.List
.Pyke, 14 Bytes
Probieren Sie es hier aus!
Und 17 Bytes, nur weil es eine großartige Lösung ist:
Probieren Sie es hier aus!
quelle
GNU sed,
5745 + 2 (rn Flags) = 47 BytesLauf:
Die Eingabe sollte aus den zwei durch einen Zeilenumbruch getrennten Zeichenfolgen bestehen. Der Code wird von sed für jede Zeile ausgeführt.
Die Schleife
:
löscht iterativ ein Zeichen vom Ende der Zeichenfolge. Der Ausgang der ersten Saite in Beziehung steht direkt gedruckt, außer dem ersten Zeichen:1{/../p}
. Die Ausgabe für den zweiten String wird2G;2h
beim Löschen in umgekehrter Reihenfolge ( ) im Hold-Space abgelegt und am Ende ausgedruckt.quelle
C (gcc) ,
102979593 BytesProbieren Sie es online!
Die erste Schleife überschreibt die Zeichenfolge beginnend mit dem Ende mit 0 Byte und
puts()
druckt die Zeichenfolge aus. Die zweite Schleife kann nicht einfach von Anfang an überschreiben, sondern muss den alten Wert speichern, um ihn zurückzusetzen. Das 0-Byte läuft gerade gegen Ende.Vielen Dank an @homersimpson und @ceilingcat für jede Abspaltung von 2 Bytes!
quelle
n
wie als globalen int:n;f(char*a,char*b){n=strlen(a)...
. Und Sie können dies wahrscheinlichn=*a=0
als verkettete Zuweisung im Rumpf Ihrer for-Schleife tun .Python 3, 104 Bytes
Meh.
Vielen Dank an @DJMcMayhem für 21 Bytes Golf.
Ideone es!
quelle
n='\n'
und verwenden n statt'\n'
. Sie könnten weitere 8 ausziehen, wenn Sie Lambda anstelle von Drucken verwenden:n='\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 Bytes
Verwendet eine falsche Zeichenfolge, um die ursprüngliche Zeichenfolge zu verkürzen
Missbraucht Teilzeichenfolge mit größeren Zahlen, um die zweite zu vergrößern, und stoppt, wenn das gleiche Wort wie beim letzten Mal gedruckt werden soll.
Demo:
quelle
a=>b=>...
um die Funktion mit (a) (b) aufzurufenBrainfuck,
3855 BytesBearbeiten: Zeilenumbrüche wurden in die Ausgabe aufgenommen
quelle
Dyalog APL ,
2013 Bytes↑
matrifizieren(⌽,\⍞)
umgekehrte (⌽
) kumulative Verkettung (,\
) der Zeicheneingabe (⍞
),
vorangestellt1↓
ein Element fiel aus,\⍞
kumulative Verkettung der ZeicheneingabeTryAPL online!
quelle
Schläger 193 Bytes
Testen:
quelle
Floroid , 69 Bytes
Es ist ein Anfang. Übernimmt die Eingabe von STDIN.
Testfälle
quelle
JavaScript (ES6), 92 Byte
Die
replace
Anweisungen bilden ein Dreieck aus Zeichenfolgen. Dies ist genau das, was für die zweite Hälfte der Ausgabe erforderlich ist. Die erste Hälfte muss jedoch umgekehrt und die doppelte Einzelzeichenzeile entfernt werden. Hinweis: Gibt eine führende neue Zeile aus, wenn die erste Zeichenfolge ein einzelnes Zeichen ist. Wenn dies unerwünscht ist, gibt diese Version für ein zusätzliches Byte immer eine abschließende neue Zeile aus:quelle
C 142 Bytes
Zur Verfügung stellen
f(char* str1, char* str2)
.quelle
TI-Basic, 56 Bytes
Anwendungsbeispiel
quelle
Java,
168136 BytesUngolfed Testprogramm
quelle
(Lambdabot) Haskell - 41 Bytes
Mehr lesbar, aber zwei Bytes länger:
Ausgabe:
quelle
J, 18 Bytes
Ungolfed:
Dies ist ein 7-Zug:
Der innerste Zug
[: |. ]\@[
besteht aus einer Begrenzung[:
links, daher wenden wir|.
(in umgekehrter Reihenfolge) auf das Ergebnis von an]\@[
, das]\
(Präfixe) über[
(Argument links) steht.So sieht das bei der
testing, test
Eingabe aus:Dies gibt uns fast die erste Portion. Der 5-Zug außerhalb davon ist
([: }: ([: |. ]\@[))
, der für}:
den obigen Ausdruck gilt (Detail, letztes Element entfernen):(Dies liegt daran, dass wir keinen doppelten Mittelpunkt haben können.)
Der äußere Teil ist schließlich:
Dies setzt sich zusammen aus
]\@]
(Präfixe des linken Arguments) und,~
(Links an Rechts anhängen ) und liefert das gewünschte Ergebnis:Testfälle
quelle
(,~}:@|.)&(]\)
PHP,
117109 BytesPHP, 107 Bytes (funktioniert nicht mit Strings, die enthalten
0
)quelle
C 111 Bytes
Ungolfed Test
quelle
Brainfuck, 162 Bytes
Probieren Sie es hier aus
Für die Eingabe werden die beiden durch einen Zeilenvorschub getrennten Zeichenfolgen verwendet.
Erstes Programm mit Brianfuck und erstem Code-Golf, daher bin ich sicher, dass es noch viel zu optimieren gibt. Hatte aber Spaß dabei.
Ungolfed
quelle