Wprowadzenie
Obserwujmy ciąg abc
. Podciągi, które można z tego wykonać, to:
a, ab, abc, b, bc, c
Teraz musimy wyrównać je pod początkowym ciągiem, tak jak to:
abc
a
b
c
ab
bc
abc
Kolejność łańcucha nie ma znaczenia, więc jest to również całkowicie poprawne:
abc
a
ab
abc
b
bc
c
Zatem podłańcuch jest umieszczony pod lokalizacją podłańcucha w początkowym ciągu. A więc dla abcdef
i podciągów cde
wyglądałoby to tak:
abcdef
cde
Zadanie
Zadaniem jest wyrównanie wszystkich podciągów o długości większej niż 0 , jak pokazano powyżej. Możesz założyć, że sam łańcuch będzie zawierał tylko znaki alfabetyczne i ma co najmniej 1 znak. Do wypełnienia można użyć spacji lub innego niealfabetycznego drukowalnego znaku ASCII ( 32 - 127
). Może nie trzeba wspominać, ale sam łańcuch będzie zawierał tylko unikalne znaki, więc nie lubię aba
, ponieważ a
występuje dwa razy.
Przypadki testowe
Wkład: abcde
Możliwe wyjście:
a
ab
abc
abcd
abcde
b
bc
bcd
bcde
c
cd
cde
d
de
e
Wkład: abcdefghij
Możliwe wyjście:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
b
bc
bcd
bcde
bcdef
bcdefg
bcdefgh
bcdefghi
bcdefghij
c
cd
cde
cdef
cdefg
cdefgh
cdefghi
cdefghij
d
de
def
defg
defgh
defghi
defghij
e
ef
efg
efgh
efghi
efghij
f
fg
fgh
fghi
fghij
g
gh
ghi
ghij
h
hi
hij
i
ij
j
To jest golf golfowy , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
Odpowiedzi:
Pyth,
141310 bajtówDzięki @FryAmTheEggman za zapisanie 3 bajtów.
Wypróbuj online!
źródło
jmXQ-Qd;.:
Podobny pomysł, używającX
.Perl,
322824 bajtówObejmuje +1 dla
-n
Kod:
Uruchom z ciągiem na STDIN:
Języki gry w golfa są tak blisko, a jednocześnie tak daleko ...
Wyjaśnienie
/.+/
dopasowuje podciąg. Niestety przestaje działać, gdy pasuje do jednego. Dlatego używam konstrukcji wyrażenia regularnego w(??{})
celu rozszerzenia wyrażenia regularnego, aby się nie powiodło, a backtracking wypróbuje następujące podciągi, w końcu wypróbuje je wszystkie, zanim zrezygnuje z obrzydzenia.Wewnątrz
(??{})
drukuję bieżący podciąg poprzedzony tyloma spacjami, ile używa przesunięcie podła$"x"@-"
Dane wyjściowe dokładnie dokumentują działanie funkcji powrotu wyrażenia regularnego:
źródło
perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
ab1
(zakładam, ponieważsay...
ocenia na1
). (Testowany w 5.18.2.) Edycja: Och! przepraszam, pytanie brzmi: „Możesz założyć, że sam łańcuch będzie zawierał tylko znaki alfabetyczne”.MATL ,
2018 bajtówZainspirowany wzorcem podciągów generowanym przez odpowiedź @ aditsu
Wypróbuj online!
Wzór podciągów jest generowany przez górną trójkątną matrycę tego samego rozmiaru co dane wejściowe, a wszystkie podmacierze uzyskane przez sukcesywne usuwanie ostatniego rzędu i kolumny.
Wyjaśnienie
Stare podejście (moc kartezjańska)
Utrzymuję to podejście na wypadek, gdyby stanowiło inspirację dla innych odpowiedzi
W kompilatorze online zabraknie pamięci dla najdłuższego przypadku testowego.
Wypróbuj online!
Wyjaśnienie
To generuje wszystkie wzory wartości
0
,1
i2
w kolejności rosnącej, a następnie przekształca2
się0
. Daje to wszystkie możliwe wzorce0
i1
gdzie1
wartości są ciągłe. Służą do oznaczania, które znaki pochodzą z oryginalnego łańcucha.Na przykład dla łańcucha
'abc'
wzorce są generowane w następujący sposób. Najpierw[0 1 2]
uzyskuje się siłę kartezjańską podniesionej do liczby znaków wejściowych:Sortowanie każdego wiersza daje
Przekształcenie
2
w0
(tj.mod(...,2)
) I usunięcie zduplikowanych wierszy daje ostateczny wzórw którym każdy wiersz jest maską odpowiadającą (ciągłemu) podciągowi. Pierwszy wiersz musi zostać usunięty, ponieważ odpowiada pustemu podciągowi.
źródło
Retina ,
483231 bajtówDzięki Kenny Lau za uratowanie 3 bajtów i torowanie drogi dla wielu innych.
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Kolejność generowanych podciągów:
Wyjaśnienie
Daje nam to wszystkie prefiksy wejścia. Odbywa się to poprzez dopasowanie (
M
) dowolnego podłańcucha (.+
) zaczynającego się od końca (r
), z uwzględnieniem nakładających się dopasowań (&
) i zwracania wszystkich dopasowań połączonych z linefeeds (!
).Teraz wszystko, co musimy zrobić, to wykreślić kolejne prefiksy tych prefiksów (zastępując je spacjami). Robimy to krok po kroku za pomocą pętli:
Te
%
środki, cała ta sprawa jest wykonywana indywidualnie dla każdej linii (biorąc pod uwagę to osobny ciąg na chwilę obecną i łączenia go z powrotem wszystko razem z karetki na końcu).+
Mówi siatkówka do uruchomienia tej zmiany w pętli aż wyjście przestaje zmianę (co w tym przypadku oznacza, że już nie regex mecze). Wyrażenie regularne następnie próbuje dopasować ostatni wiersz danych wejściowych co najmniej dwoma znakami spacji i dołącza nowy wiersz, w którym pierwszy z nich jest zastąpiony spacją.źródło
!
implikowaneM
i 1char wersje.+
i.*
?.+
i.*
musiałbym tokenizować regex, i chociaż planuję to zrobić w pewnym momencie, nie sądzę, że nastąpi to w najbliższym czasie (a jeśli to zrobię, prawdopodobnie skupię się na funkcjach, które faktycznie dodać wyrazistości).Oracle SQL 11.2, 146 bajtów
Bez golfa
źródło
CJam, 20
Wypróbuj online
Wyjaśnienie:
źródło
Python, 57 bajtów
Wykazuje
set
podobny{' b', 'a', 'ab'}
. Chodzi o to, aby powtórzyć dwa rozgałęzienia, które odcinają pierwszą lub ostatnią postać. Daje nadmiarowe dane wyjściowe, aleset
automatycznie usuwa duplikaty. W celu wyrównania za każdym razem, gdy pierwszy znak jest odcinany, do prefiksu dodawana jest spacjap
, która jest łączona z przodu.źródło
PowerShell v2 +, 69 bajtów
Pobiera dane wejściowe
$a
, pętle na całej długości (ustawienie$b
w procesie do użytku później). Każdą pętlę zewnętrzną zapętlamy$b
ponownie, ustawiając$i
do późniejszego użycia. Każdą wewnętrzną pętlę wysyłamy$i
liczbę spacji połączonych z wycinkiem ciągu wejściowego. Ponieważ po prostu zapętlamy ciąg, w rzeczywistości obsłuży on dowolny dowolny ciąg (zduplikowane litery, spacje, cokolwiek).Przykład
źródło
C #,
136132131 bajtówGrał w golfa
Bez golfa
Pełny kod
Wydawnictwa
-1 byte
- ZmienionoString o="",e="";
abyString o="",e=o;
zapisać 1 bajt. Pomysł pochodzi od Gallanta ( przepraszam, zapomniałem zastosować tę część w ostatniej aktualizacji ).-4 bytes
- Upuścił nawiasy zfor
pętli i przesunął przyrost przestrzenie
var do strefy iteratora zewnętrznejfor
pętli. Pomysł pochodzi od Gallanta .136 bytes
- Wstępne rozwiązanie.źródło
e=o
do zapisania 3 bajtów.String o="",...
zvar o...
innego 3.String o = "", e = "";
na,var
ponieważ musiałbym je rozdzielić na dwie,var o = ""; var e = "";
co daje taką samą długość w porównaniu z tą, którą mam. Zrobiłoby to, ale VS nie zezwala na deklarację wielu zmiennych, gdy używa się zmiennych typu niejawnego - akavar
. Ale dzięki za pomoc. EDYCJA: Mając VS krzyczącą, że nie mogę tego zrobić, zakładam, że jest niepoprawna, może się mylić.Python 2.7,
7082 bajtówNie mogłem wymyślić, jak to zrobić w 1 linii. Zadzwoń z
e("abcde",0)
źródło
Python 3,
8078 bajtówZapętlaj liczbę spacji do poprzedzenia, a następnie liczbę znaków na końcu.
Edycja: Usunięto spacje przed pętlami for.
źródło
MATL,
1514 bajtówZapisane jeden bajt powodu @ LuisMendo w końcówce tutaj !
Tyle sposobów ... musiałem znaleźć nowy. Szczęśliwe kawałki! :)
Wypróbuj online!
Eksplodował
źródło
JavaScript (ES6), 89 bajtów
Proste podejście. Wyjście ma końcowy znak nowej linii.
źródło
=>
oznacza JavaScript? Czy to operator binarnyJavaScript (ES6), 72
źródło
Pyth
1211 bajtówNiestety pytanie pozwala nam przyjąć unikalne znaki, więc po prostu sprawdzam pierwszą pozycję podłańcucha i pad ze spacjami.
źródło
;
zamiast,\
gdy znajdziesz się na mapie najniższego poziomu.Matematyka 89 bajtów
Wyjaśnienie
i
odnosi się do ciągu wejściowegoSubsequences[y=Characters@i]
zwraca wszystkie podciągi (reprezentowane listy znaków) danych wejściowych. (Subsequences
został wprowadzony w wer. 10.4)Dla każdego podsekwencji
Complement...
zwraca te znaki z ciągu wejściowego, które nie są obecne. Każdą z tych postaci zastępuje puste miejsce przezStringReplace[i,#->" "]
.Column
wyświetla wyniki w jednej kolumnie. Każdy ciąg wyjściowy ma taką samą liczbę znaków, co powoduje wyrównanie liter.źródło
J,
32 2928 bajtówTo odnosi się do czasownika monadycznego. Wypróbuj tutaj. Stosowanie:
Wyjaśnienie
Jako kilka innych odpowiedzi obliczam wskaźnik występowania pierwszego znaku każdego podłańcucha. Podciągi są przechowywane w macierzy ze spacjami końcowymi, więc obracam je w prawo o ich indeks, aby uzyskać odpowiednią ilość wypełnienia. Ten jeden biały znak pomiędzy
"1
ia:
jest naprawdę denerwujący ...źródło
a e
nie jest podciągiem zdefiniowanym przez wyzwanieJavaScript (Firefox 30-57),
6563 bajtówZwraca tablicę ciągów. Jako ES6 ma 78 bajtów:
źródło
QBasic, 75 bajtów
Podstawowa
FOR
strategia podwójnego zapętlenia, nieco zmodyfikowana dla indeksowania opartego na 1 QBasic. Główną sztuczką jestLOCATE,j
przeniesienie kursora do kolumnyj
bieżącego wiersza przed wydrukowaniem. Ponieważ kolumna 1 jest pierwszą kolumną, jest to równoważne z drukowaniemj-1
spacji wiodących.źródło
Perl 6 , 34 bajtów
Powodem dla
+
wcześniejput
jest tak, że zwraca1
zamiastTrue
, co jest zagwarantowane, aby nie być na wejściu więc zawsze musi wracać.(Jeśli chcesz to w odwrotnej kolejności, użyj
(.*?)(.+?)
zamiast(.*)(.+)
)Zostało to zainspirowane odpowiedzią Perla 5 .
źródło
J,
352322 bajtówZajęło mi to trochę czasu, ale w końcu go zoptymalizowałem.
Stosowanie
Wyjaśnienie
źródło
[:+./"1' '~:]
zamiast[:-.[:*/"1' '=]
oszczędza kolejne 2 bajty.Java, 138 bajtów
Sformatowany:
źródło
Pyke, 15 bajtów
Wypróbuj tutaj!
Przyjmuje, że tablica wyściełanych łańcuchów jest dopuszczalna
Najpierw podkładki, a następnie kotlety.
źródło
Haskell, 65 bajtów
Wymaga to jednak
inits
itails
od Data.List. Aby go wydrukować, dodajmapM_ putStrLn.
do przodu.Stosunkowo proste;
reverse
jest upewnienie się oryginalny łańcuch jest pierwszy.źródło
(>>=zipWith(++)(inits$cycle" ").init.tails).inits
. I dodajimport Data.List;
do liczby bajtów.Ruby,
7567 bajtówFunkcja anonimowa.
Używa podstawienia wyrażenia regularnego, aby wyrównać podciągi..
jest znakiem wypełniającym.źródło
bash + GNU coreutils, 109 bajtów
Być może istnieje krótsze rozwiązanie, ale to najlepsze, co przyszło mi do głowy. Wyjątkowość znaków nie ma tutaj znaczenia.
źródło
PHP, 151 znaków
Bez golfa
Grał w golfa
Przykład
źródło
C ++, 145 bajtów
pierwszy parametr początkowy służy jako wejście, konsola jako wyjście
źródło
std::cout<<r[0]<<y<<'\n'
tego zrobić zamiast `std :: cout.write (r [0], y) << '\ n'? Czy możesz dodać krótkie wyjaśnienie? Dzięki!Python 2 (Ungolfed) 99 bajtów
Wynik:
źródło