Oto sposób cofania i ponownego wpisywania jednego łańcucha na drugi:
- Zacznij od pierwszego ciągu.
- Usuń znaki na końcu, aż wynik będzie prefiksem drugiego ciągu. (Może to zająć 0 kroków.)
- Dodaj znaki na końcu, aż wynik będzie równy drugiemu ciągowi. (Może to również wymagać 0 kroków.)
Na przykład ścieżka od fooabc
do fooxyz
wygląda następująco:
fooabc
fooab
fooa
foo
foox
fooxy
fooxyz
Zadanie
Biorąc pod uwagę listę słów, napisz program, który cofa się i ponownie typuje swoją drogę od pustego łańcucha, do wszystkich kolejnych słów z listy, z powrotem do pustego łańcucha. Wyprowadza wszystkie łańcuchy pośrednie.
Na przykład, biorąc pod uwagę listę danych wejściowych ["abc", "abd", "aefg", "h"]
, dane wyjściowe powinny być:
a
ab
abc
ab
abd
ab
a
ae
aef
aefg
aef
ae
a
h
Zasady
Możesz zwrócić lub wydrukować listę ciągów znaków lub pojedynczy ciąg znaków z wybranym ogranicznikiem. Opcjonalnie możesz dołączyć początkowe i końcowe puste ciągi. Dane wejściowe z pewnością zawierają co najmniej jedno słowo, a każde słowo może zawierać tylko małe litery ASCII ( a
- z
). Edycja: gwarantuje, że kolejne ciągi wejściowe nie będą sobie równe.
To jest golf golfowy ; najkrótszy kod w bajtach wygrywa.
Referencyjna implementacja w Pythonie 3: Wypróbuj online!
["abc","abc"]
?a,abc,abcde,abc,a,abc,abcde
Odpowiedzi:
Pyth,
2523 bajtówWypróbuj online.
źródło
Perl, 43 bajty
42 bajty kodu +
-n
flagi.Aby uruchomić:
źródło
abc
spowodowaniu 3-krotnego wydrukowania spacji pojawiła się spacja (ale tak naprawdę za pierwszym i trzecim razem bez spacji). Usunąłem to.Java 8, 144 bajty
Ta jest podobna do implementacji referencyjnej, ale łączy dwie
while
pętle. Jest to wyrażenie lambda akceptująceString[]
parametr.Bez golfa
Podziękowanie
źródło
class B
zamiastinterface B
? Możesz uruchomić z klasy prywatnej pakietu. Rozważ także użycie lambda, ponieważ już określiłeś Java8.interface B{static void main
jest krótszy niżclass B{public static void main
.a->{/*your code*/}
, który przypisze zmienną typujava.util.function.Consumer<String[]>
. Jednak w tej chwili nie mogę przetestować.Mathematica, 149 bajtów
źródło
Siatkówka , 39 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wejścia i wyjścia są listami oddzielonymi od linii. Dane wyjściowe obejmują początkowy i końcowy pusty ciąg.
źródło
Galaretka ,
312926 bajtówWypróbuj online!
Jak to działa
źródło
Haskell ,
102 93 9190 bajtówOstatni wiersz to anonimowa funkcja, która pobiera i zwraca listę ciągów znaków. Wypróbuj online!
Wyjaśnienie
Moje rozwiązanie jest rekurencyjne. Po pierwsze,
?
jest to funkcja pomocnicza:a?b
daje pierwszelength a
znakib
lub całośćb
jeślia
jest dłuższa. Następnie definiuję funkcję infix!
. Chodzi o to, żea!x
gdziea
jest ciąg znaków ix
lista ciągów, tworzy ścieżkę oda
pierwszego ciągux
i wraca do końcax
. W ostatnim wierszu definiuję anonimową funkcję, która dołącza pusty ciąg, a następnie stosuje!
się do pustego ciągu i danych wejściowych.Wyjaśnienie
!
:źródło
Python 2,
118107103979392 bajtyDane wejściowe są podawane jako
['abc', 'abcdef', 'abcfed']
lub jako ["abc", "abcdef", "abcfed"]
.Wersja 1: -11 bajtów. Podziękowania należą się @xnor za jego post na temat wskazówek golfowych w Pythonie, a @Lynn za znalezienie wskazówki dla mnie i dla mnie za bycie inteligentnym. Wprowadzono dwie zmiany: zamiast
not s.startswith(i)
, użyłems.find(i)
i zamiasti!=s
użyłemi>s
.Wersja 2: -4 bajty. Uznanie, że popełniłem naprawdę głupi błąd. Zamiast wcięcia pojedynczej tabulacji i podwójnej tabulacji użyłem wcięcia pojedynczej spacji i pojedynczej tabulacji.
Wersja 3: -6 bajtów. Podziękowania należą się @ @ mbomb007 za sugerowanie umieszczenia whiles w jednej linii. Naprawiłem również błąd, zmieniając
s.find(i)
nai.find(s)
.Wersja 4: -4 bajty. Podziękowania dla @xnor za to, że nie musiałem przechowywać danych wejściowych w zmiennej.
Wersja 5: -1 bajt. Uznanie zasługuje na zrozumienie, że
['']
jest to to samo, co[s]
podczas dodawania go do danych wejściowych.źródło
while
każdy z nich w jednej linii. Możesz także użyć<1
zamiastnot
.startswith
.while
s w jednym wierszu. Masz na myśliwhile s.find(i):s=s[:-1];print s
? Dziękuję również za sugestię<1
, ale zmieniłem się na coś jeszcze krótszego dzięki jednej z porad xnor w wątku wskazówek Python.GNU M4, 228 lub 232 bajty¹
(¹ w zależności od tego, czy zakończyć plik,
dnl\n
czy nie - wciąż jestem nowy zarówno w golfie, jak i M4)Dodatkowo można by zapisać 3 bajty, zastępując drugi argument „
substr
od0
” pustym ciągiem, ale spowodowałoby to wiele ostrzeżeń na stderr.Nie golfowany:
Stosowanie:
źródło
PHP,
11611110183 bajtówUwaga: używa kodowania Windows-1252.
Uruchom tak:
Wyjaśnienie
Poprawki
trim($c^$w,"\0")
zamiast sprawdzać dopasowanie podłańcucha$c&&strpos($w,$c)!==0
.~ÿ
do uzyskania łańcucha z bajtem NUL zamiast"\0"
$c=$c.ÿ&$w
sufiksu$c
z następnym znakiem$w
źródło
Partia,
296291 bajtówObliczenie wspólnego przedrostka było uciążliwe.
źródło
PHP, 153 bajty
okropnie długie :(
Uruchom z
php -nr '<ode>' <text1> <text2> ...
.źródło
JavaScript (ES6), 135 bajtów
Ciekawe wyzwanie! Zastosowanie:
g(["abc", "abd", "aefg", "h"])
. Nie mogłem zaoszczędzić żadnych bajtów, pisząc to jako jedną funkcję, więc są dwie. Nowe linie nie są uwzględnione w liczbie bajtów.Jestem pewien, że można to znacznie zmniejszyć. Dodanie wersji bez golfa później.
źródło
JavaScript, 98 bajtów
Odpowiedź Javy Port of Jakob
źródło