Wyrównanie linii!
Biorąc pod uwagę znak i ciąg wielowierszowy, Twoim zadaniem jest wypełnienie każdej linii ciągu, aby znalazły się w linii między danym ogranicznikiem.
Przykłady
Wkład:
,
Programming, Puzzles
And, Code golf
Wydajność:
Programming, Puzzles
And, Code golf
Wkład
Dane wejściowe będą ciągiem wieloliniowym i znakiem (do którego zostaną wyrównane), możesz je wziąć w dowolnej kolejności / formacie. Postać pojawi się dokładnie raz na linię. Każda linia wejścia może mieć inną długość.
Dane wejściowe mogą odbywać się za pomocą argumentów funkcji lub STDIN.
Wydajność
Dane wyjściowe powinny być wyśrodkowane na łańcuchach. Dozwolony jest jeden znak nowej linii i brak spacji.
Wyjście powinno być wypełnione minimalną ilością spacji. Nie można usunąć żadnych początkowych białych znaków na wejściu (jeśli istnieje).
Wyjście może pochodzić z funkcji return lub STDOUT.
źródło
Odpowiedzi:
Pyth, 18 bajtów
źródło
APL (37)
APL po prostu nie jest zbyt dobry w przetwarzaniu strun (lub oczywiście nie jestem dobry w golfie).
To traktuje znak jako lewy argument, a ciąg multilinii jako prawy argument. Zakłada się, że łańcuch wielowierszowy kończy się na wysunięciu wiersza (np.
A\nB\nC\n
ZamiastA\nB\nC
.) Ponieważ mogę użyć „dowolnego formatu, [który] chciałbym”, a jest to również konwencjonalny format dla plików tekstowych, myślę, że jest to uzasadnione.Wyjaśnienie:
S←⌽⍵
: odwróć ciąg i zapisz go wS
.R←S⊂⍨S=⊃S
: podzielS
na pierwszy znak i zapisz tablicę ciągówR
.⍺⍳¨⌽¨R
: odwróć każdy ciągR
, a następnie znajdź indeks ⍺ (znak) w każdym ciągu.(⌈/-+)
: odejmij każdy z indeksów od największego indeksu, podając ilość potrzebnych spacji' '/⍨¨
: dla każdej z tych wartości wygeneruj tyle spacjiR,¨
: dodaj spacje do każdego ciąguR
.∊
: połącz wszystkie ciągi razem⌽
: odwróć (aby odzyskać oryginalne zamówienie)Przykład:
źródło
CJam,
232220 bajtówDzięki Dennis za oszczędność 2 bajtów.
Odczytuje wiersze z argumentów wiersza poleceń i znak z STDIN.
Interpreter online nie obsługuje argumentów wiersza polecenia, ale tutaj możesz przetestować równoważną wersję.
Wyjaśnienie
źródło
Pip ,
222018 + 1 = 19 bajtówBierze ciągi jako argumenty wiersza poleceń i ogranicznik ze STDIN ( pomysł zapożyczony z odpowiedzi Martina na CJam ). Używa
-n
flagi do drukowania wartości wyjściowych w osobnych wierszach.I przykładowy bieg:
źródło
JavaScript ES 2015, 113 bajtów
Nie tak krótkie, jak napisane do tej pory języki gry w golfa. Pobiera dane wejściowe jako dwa argumenty funkcji, np
f(',','Programming, Puzzles\nAnd, Code golf')
. Poniższy fragment kodu nie jest golfem i zawiera łatwą metodę testowania.źródło
Pyth,
2724 bajtówZaktualizowano do najnowszego Pyth .
Demo na żywo.
Wersja 27-bajtowa
Demo na żywo.
źródło
jbm
na początku swojej odpowiedzi, powinieneś natychmiast zacząć myśleć o tymV
.b
Julia, 117 bajtów
Nie golfowany:
źródło
Python 3, 85 (IDLE 3.2.2, Windows)
Całkiem proste. Znajduje to pozycję znaku w ciągu dwa razy: raz, aby znaleźć maksimum (cóż, raz na linię), i raz, aby znaleźć przesunięcie. Próbowałem je połączyć, ale było dłużej.
Python 3 służy do rozpakowywania danych wejściowych. MOJE IDLE wydaje się przyjmować ciągi wielowierszowe jako dane wejściowe.
źródło
c
pobiera separator is
pustą listę. Kolejne połączenia, abyinput()
zwrócić pozostałe linie jeden po drugim.Galaretka , 12 bajtów
Wypróbuj online!
Wykonane i grało w golfa z Cairnem Coheringaahing w J elly H yper T raining (JHT) , naszym pokoju do ćwiczeń Jelly.
Jak to działa
Trzeci argument wiersza poleceń (pierwsze wejście) powinien być ciągiem zawierającym wiele wierszy, a znak powinien być czwartym argumentem wiersza poleceń (drugie wejście).
Nie jestem pewien, czy przyjmowanie danych wejściowych jako listy linii jest dozwolone, więc bierze to wieloliniowy ciąg znaków jako dane wejściowe. Gdyby było dozwolone:
10 bajtów
Wypróbuj online!
źródło
Matlab / Octave, 106 bajtów
Funkcja wykorzystująca trzy oddzielne argumenty dla znaku, łańcucha, łańcucha; i daje wynik w standardzie:
Przykład w Matlabie:
Lub wypróbuj online z tłumaczem Octave.
źródło
Julia, 80 bajtów
Nie golfowany:
źródło
JavaScript (ES6), 105
Za pomocą ciągów szablonów 2 nowe znaki są znaczące i zliczane.
Przetestuj uruchomienie fragmentu w dowolnej przeglądarce zgodnej z EcmaScript 6 (czyli FireFox. Chrome nie obsługuje parametrów domyślnych)
źródło
Python 2, 93 bajty
Nazywany tak:
źródło
C # 4.0,
329320307 bajtówWersja bez golfa:
Akceptuje maksymalnie 9999 linii ...
źródło
Dyalog APL ,
222016 bajtów-4 dzięki ngn.
APL nie jest tak zły w przetwarzaniu ciągów, jeśli wolno mu pracować z tablicami. W tym wyzwaniu możemy wybrać najbardziej odpowiedni format, który dla APL oznacza wektor wektorów tekstowych jako lewy argument, a separator jako prawy argument skalarny. To nawet obsługuje wiele ograniczników w linii i wyrównuje pierwszą z każdej linii.
⊣,¨⍨
wstaw każdą linię za pomocą' '⍴¨⍨
tyle miejsc, ile⌈.⍳
najbardziej prawy indeks znaku między wierszami-
minus⍳¨
indeks znaku w każdej liniiWypróbuj APL online! (
↑
dodano do wydruku pionowo)Premia? Działa dla dowolnej liczby ciągów znaków i ograniczników (wyrównuje do lewej).
źródło
⊣,¨⍨' '⍴¨⍨⌈.⍳-⍳¨
C #, 191
Jako funkcja. Z grubsza przeniesienie mojej odpowiedzi JS.
źródło
Rubinowy, 74 bajty
i nazwać to tak
źródło
R, 68 bajtów
Nienazwana funkcja, która pobiera
3
dane wejściowe;c
który jest znakiem do wyrównania,x
to pierwszy ciąg iy
drugi ciąg.W R funkcja
regexpr
zwraca pozycję danego wzorca w ciągu. Rozwiązanie działa poprzez zastosowanieregexpr
na obu ciągach znaków i powtarzanie białych spacji stanowiących różnicę, a następnie po prostu wydrukowanie obu danych wejściowych oddzielonych znakiem nowej linii.źródło
Python 2,
6766 bajtówDzwoni z:
źródło
Moonscript, 138 bajtów
Zwraca funkcję, która przyjmuje 2 argumenty. Pierwszy to ciąg znaków, drugi to znak do wyrównania. Argumenty te są domyślnymi argumentami @ i n.
Najpierw dołączam nową linię do łańcucha, aby ułatwić przetwarzanie.
Teraz generuję listę pozycji każdego znaku wyrównania, używając
gmatch
. Następnie zastępuję nową linię przed każdą linią prawidłową liczbą spacji, a następnie przycinam nową linię, którą dodałem na początku.źródło
Lua, 169 bajtów
Nie tak krótkie jak inne odpowiedzi, ale to moja pierwsza: D
źródło
Retina , 71 bajtów
Wypróbuj online! Uwaga: Pozostawia to znak wyrównania na wyjściu; można go usunąć kosztem 4 bajtów. Jeśli tylko dwa ciągi muszą zostać wyrównane, to dla 52 bajtów:
Wyjaśnienie:
To pasuje do znaku wyrównania.
Pasuje do pierwszego wiersza, a także śledzi, ile znaków było przed znakiem wyrównania. (.NET utrzymuje stos dopasowania dla każdej zmiennej, w tym przypadku,.
$3
)To pasuje do drugiej linii, próbując uwzględnić tyle znaków, ile znaleźliśmy w pierwszej linii.
?<-3>
powoduje, że dopasowanie wyskakuje na stosie dla każdego znaku, dopóki nie będzie puste, w którym to momencie dopasowanie kończy się niepowodzeniem, a(.)*
następnie dopasowuje pozostałe znaki przed znakiem wyrównania. W tym momencie mamy następujące zmienne:$1
zawiera znak wyrównania$2
zawiera pierwszą linię$3
zawiera stos, którego długość to przedrostek pierwszej linii minus przedrostek drugiej linii$4
zawiera drugą linię$5
zawiera stos, którego długość to prefiks drugiej linii minus prefiks pierwszej linii$#5$*
następnie poprzedza niezbędną liczbę spacji, aby pierwsza linia była wyrównana z drugą, i odwrotnie dla$#3$*
.Podobna logika ma zastosowanie do głównej odpowiedzi, z tym wyjątkiem, że musimy znaleźć dwie linie, które nie są wyrównane, abyśmy mogli je wyrównać (to jest miejsce, w którym się
?(5)
pojawia), a następnie powtórzyć wyrównanie na wszystkich liniach, aż wszystkie zostaną równo wyrównane .źródło
Common Lisp, 101 bajtów
Pierwszy parametr to znak, drugi to lista ciągów do wyrównania.
Wypróbuj online!
źródło