Wyzwanie
Biorąc pod uwagę dwa łańcuchy / tablicę łańcuchów, wypisz pierwszy łańcuch powoli zmniejszając się i rozszerzając z powrotem do drugiego łańcucha.
Możesz założyć, że ciągi zawsze będą zaczynać się od tego samego znaku.
Przykład
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Najpierw wypisujesz pierwsze słowo:
Test
Następnie usuwasz jedną literę, dopóki ciąg nie będzie miał jednego znaku:
Tes
Te
T
Następnie dodawaj jedną literę drugiego słowa, aż się skończy:
Te
Tes
Test
Testi
Testin
Testing
(jeśli oba ciągi mają jeden znak, wypisz jeden z nich raz).
Przypadki testowe
"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
(uwaga: na spacji / czwartym przypadku testowym zamień S na spacje)
Zasady
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach! Tiebreaker jest najbardziej cenionym postem. Zwycięzca zostanie wybrany 09.10.2016.
Standardowe luki są zabronione.
Odpowiedzi:
Pyth, 9 bajtów
Program, który pobiera drugi ciąg, a następnie pierwszy ciąg, jako ciągi cytowane na STDIN i wypisuje wynik.
Wypróbuj online
Jak to działa
źródło
V , 14 bajtów
Wypróbuj online!
Wyjaśnienie:
Teraz bufor wygląda następująco:
Musimy tylko zrobić to samo w odwrotnej kolejności dla następnej linii:
Bardziej interesujące alternatywne rozwiązanie :
źródło
Python, 93 bajty
Zaczyna się od pustego ciągu
r
, dodajea
i nową linię i usuwa ostatni znak za
do, aża
jest pusty, następnie dodaje wymagane częścib
i nową linię, utrzymując liczniki
, który zaczyna się2
do momentub
przekroczenia długości , a następnie wracar
. Ma końcowy znak nowej linii.Wszystkie testy są na ideone
źródło
r=""
. Proster
nadal będzie działać.f=
. 2. Bezr=''
teraźniejszościf('test','testing')
nie działałoby; takf('test','testing','')
, ale musimy postępować zgodnie ze specyfikacjami.05AB1E , 9 bajtów
Wyjaśnienie
Wypróbuj online!
źródło
Siatkówka,
504126 bajtówPodziękowania dla Martina Endera za oszczędność 15 (!) Bajtów.
Pobiera dane wejściowe z dwoma ciągami znaków oddzielonymi znakiem nowej linii:
Wypróbuj online!
Wyjaśnienie
Pierwszy wiersz generuje „kroki” obu słów:
M
jest w trybie dopasowania,&
uwzględnia nakładające się dopasowania i!
drukuje dopasowania zamiast ich liczby. Powodem odwrócenia jestr
opcja ight-to-left: silnik zaczyna szukać dopasowań na końcu łańcucha i kontynuuje w kierunku początku.Otrzymuje to wszystko w odpowiedniej kolejności:
O
zestawia wszystkie dopasowania kolejnego wyrażenia regularnego: znak w osobnej linii i każdy znak (w tym nowe wiersze) po nim, który dopasowuje całą drugą połowę jako jeden fragment lub w inny sposób linię znaków , który pasuje do każdej linii. Te dopasowania są następnie sortowane według punktu kodowego, więc najpierw następuje T, po którym następuje nowa linia, a następnie linie, rosnąco według długości.Teraz mamy tylko pierwszą linię znaków na górze, więc używamy
A
trybu ntigrep, aby odrzucić pierwsze dopasowanie domyślnego wyrażenia regularnego.+
.Stara wersja
Wypróbuj tę wersję online!
Wyjaśnienie
Pierwszy wiersz jest taki sam, więc wyjaśnij to powyżej.
Odwraca to linie pierwszej połowy (drugie słowo wejściowe). W rzeczywistości
O
ustawia wiersze, a wyrażenie regularne ogranicza dopasowania: musi to być wiersz składający się z dwóch lub więcej znaków (..+
), po których następuje nowa linia (¶
) rozpoczynająca się w miejscu, w którym ostatni został przerwany (\G
). W powyższym przykładzie singielT
w środku nie pasuje, więc nic po nim nie może.Teraz mamy odpowiednie dwa elementy, ale w niewłaściwej kolejności.
¶.¶
pasuje do samotnej litery T na środku, której nie potrzebujemy, ale dzieli dwie części. Obaj(.*)
rejestrują wszystko przed i po, w tym nowe linie dziękis
trybowi ingle-line. Dwa przechwytywania są zastępowane w odpowiedniej kolejności nową linią pośrodku.Teraz skończyliśmy, chyba że ciągi wejściowe mają jeden znak, w którym to przypadku dane wejściowe się nie zmieniły. Aby pozbyć się duplikatu, zastępujemy
¶.$
(gdy w ostatnim wierszu łańcucha jeden znak) niczym.źródło
Python 2,
8882 bajtówPobiera dwa dane wejściowe, każdy otoczony cudzysłowami.
Dzięki @JonathanAllan za uratowanie niektórych bajtów i wskazanie błędu.
źródło
len(x)
INx=x[:len(x)-1]
od ujemne przesunięcie krojenie działa - można po prostu napisaćx=x[:-1]
. Jedynym problemem jest to, że Twój kod nie" ", " "
radzi sobie bardzo dobrze z przypadkiem testowym.input()
i użyć formatu wejściowego takiego jak"<str1>", "<str2>"
for i in range(x):print x[-i:]
, a czwartą linię nafor i in range(1,y):print y[:-i]
. Nie jestem jednak pewien, czy to zadziała.Perl,
3428 bajtówObejmuje
+2
dla-0n
Uruchom z ciągami w osobnych liniach na STDIN:
slow.pl
:Pozwól, aby cofanie się wyrażenia regularnego wykonało pracę ...
źródło
ser Cheddar , 76 bajtów
Trochę dłużej niż chciałbym. Wkrótce dodam wyjaśnienie
Wypróbuj online!
źródło
|>
zrobić?Brachylog , 32 bajty
Wypróbuj online!
Wyjaśnienie
Brachylog nie ma wbudowanego prefiksu, dlatego otrzymamy prefiksy za pomocą
concatenate
(Patrz predykat 2): prefiksS
jest,P
jeśliP
połączy się zQ
(czymkolwiek jest) wynikiemS
.Główny predykat:
Predykat 1:
Predykat 2:
źródło
JavaScript,
10381 bajtówPrzykład:
f("Test", "Testing")
Wydajność:
Oryginalna odpowiedź
źródło
Java,
188179 bajtówAktualizacja
Nie golfowany :
Zastosowanie :
źródło
Haskell,
545347 bajtówPrzykład użycia:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.Jakaś bezcelowa magia. Jest to to samo, co
f x y = (init(t x))++reverse (t y)
gdziet
tworzy listę wszystkich początkowych podciągów, np.t "HI!"
->["H","HI","HI!"]
.źródło
t=reverse.tail.inits
?inits
potrzebujeimport Data.List
.Pyke, 14 bajtów
Wypróbuj tutaj!
I 17 bajtów tylko dlatego, że to niesamowite rozwiązanie:
Wypróbuj tutaj!
źródło
GNU sed,
5745 + 2 (flagi rn) = 47 bajtówBiegać:
Dane wejściowe powinny być dwoma ciągami znaków oddzielonymi znakiem nowej linii. Kod jest uruchamiany przez sed dla każdej linii.
Pętla
:
iteracyjnie usuwa jeden znak z końca łańcucha. Wyjście podobne do pierwszego ciągu są drukowane bezpośrednio, z wyjątkiem pierwszego znaku:1{/../p}
. Dane wyjściowe dla drugiego łańcucha są przechowywane w przestrzeni wstrzymania w odwrotnej kolejności (2G;2h
) podczas usuwania i drukowane na końcu.źródło
C (gcc) ,
102979593 bajtówWypróbuj online!
Pierwsza pętla zastępuje ciąg 0 bajtami zaczynającymi się od końca i używa
puts()
do wydrukowania ciągu. Druga pętla nie może po prostu nadpisać od początku, musi przechowywać starą wartość, aby mogła ją przywrócić; bajt 0 właśnie idzie w kierunku końca.Dzięki @homersimpson i @ceilingcat za każde golenie 2 bajtów!
źródło
n
jako globalnego int jak:n;f(char*a,char*b){n=strlen(a)...
. I prawdopodobnie możesz to zrobićn=*a=0
jako powiązane zadanie w ciele pętli for.Python 3, 104 bajty
Meh
Dzięki @DJMcMayhem za grę w golfa o 21 bajtów.
Ideone to!
źródło
n='\n'
i użyć n zamiast'\n'
. Możesz wziąć kolejne 8, jeśli użyjesz lambda zamiast drukowania: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 bajtów
Używa fałszywego ciągu, aby rozłożyć oryginalny ciąg
Nadużywa podciągów o większych liczbach, aby urosnąć do drugiego, zatrzymuje się, gdy ma zamiar wydrukować to samo słowo, co ostatnim razem.
Próbny:
źródło
a=>b=>...
i wywołanie funkcji za pomocą (a) (b)Brainfuck,
3855 bajtówEdycja: uwzględniono nowe wiersze w danych wyjściowych
źródło
Dyalog APL ,
2013 bajtów↑
matrify(⌽,\⍞)
reverse (⌽
) kumulatywna konkatenacja (,\
) wprowadzania znaków (⍞
),
uprzedzony do1↓
jeden element spadł z,\⍞
kumulatywna konkatenacja wprowadzania znakówWypróbuj APL online!
źródło
Rakieta 193 bajtów
Testowanie:
źródło
Floroid , 69 bajtów
To poczatek. Pobiera dane wejściowe z STDIN.
Przypadki testowe
źródło
JavaScript (ES6), 92 bajty
Te
replace
wypowiedzi zbudować trójkąt strun, która jest dokładnie to, co jest wymagane na drugą połowę wyjścia, jednak pierwsza połowa musi być odwrócone, a duplikat linia pojedynczych znaków usunięte. Uwaga: wypisuje wiodący nowy wiersz, jeśli pierwszy ciąg jest pojedynczym znakiem. Jeśli jest to niepożądane, to dla dodatkowego bajtu ta wersja zawsze wyświetla końcowy znak nowej linii:źródło
C, 142 bajty
Zapewnić
f(char* str1, char* str2)
.źródło
TI-Basic, 56 bajtów
Przykładowe użycie
źródło
Java,
168136 bajtówNie testowany program testowy
źródło
(Lambdabot) Haskell - 41 bajtów
Bardziej czytelny, ale o dwa bajty dłuższy:
Wydajność:
źródło
J, 18 bajtów
Nie golfowany:
To 7 pociągów:
Najbardziej wewnętrzny pociąg
[: |. ]\@[
składa się z czapki[:
po lewej stronie, więc nakładamy|.
(odwrotnie) na wynik]\@[
, który jest]\
(przedrostki) ponad[
(lewy argument).Oto jak to wygląda na
testing, test
wejściu:To prawie pierwsza część. 5-pociąg poza tym jest
([: }: ([: |. ]\@[))
, co stosuje się}:
(betail, usuń ostatni element) do powyższego wyrażenia:(Jest tak, ponieważ nie możemy mieć zduplikowanego punktu środkowego.)
Część zewnętrzna to w końcu:
Składa się z
]\@]
(prefiksów lewego argumentu) i,~
(dodaj to, co jest po lewej stronie, a to, co jest po prawej stronie), pozostawiając nam pożądany wynik:Przypadki testowe
źródło
(,~}:@|.)&(]\)
PHP,
117109 bajtówPHP, 107 bajtów (nie działa z ciągami zawierającymi
0
)źródło
C, 111 bajtów
Test bez golfa
źródło
pieprzenie mózgu, 162 bajty
Wypróbuj tutaj
Wejście pobiera dwa ciągi znaków oddzielone wierszem.
Pierwszy program z brianfuck i golfem pierwszego kodu, więc jestem pewien, że jest wiele do zrobienia. Świetnie się to robiło.
Bez golfa
źródło