Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
W pełni uzasadniony oznacza, że jest wyrównany do lewej i prawej strony i jest osiągany przez zwiększenie odstępów między słowami, aż każda linia się dopasuje.
Związane z:
- Wyjustuj tekst, dodając spacje
- Wyrównaj tekst do bloku
- I w pewnym sensie można to uznać za kolejny krok w przetwarzaniu tekstu nr 1: dzielenie wyrazów (który wydaje się nigdy nie został opublikowany).
Wkład
Możesz pobierać dane w dowolnym formacie. Dostaniesz:
- Docelowa szerokość (w znakach), w zakresie 5-100 (włącznie);
- Blok tekstu zawierający możliwe słowa z łącznikami. Może to być ciąg oddzielony spacją, tablica słów lub tablica fragmentów słów (lub dowolna inna reprezentacja danych, której pragniesz).
Typowe dane wejściowe mogą być:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Gdzie łączniki oznaczają możliwe punkty dzielenia wyrazów, a spacje oznaczają granice słów. Możliwa alternatywna reprezentacja tekstu:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Wydajność
Tekst wejściowy ze spacjami dodanymi między słowami, nowymi liniami na szerokości kolumny i punktami dzielenia zaznaczonymi w celu pełnego wyrównania do szerokości kolumny. W przypadku funkcji zamiast tablicy rozdzielającej nowy wiersz można zwrócić tablicę ciągów (po jednym dla każdej linii).
Możliwe wyjście dla powyższych danych wejściowych może być:
There's no business like
show business, no bus-
iness I know.
Zauważ, że wszystkie myślniki zostały usunięte z wyjątkiem tego w ostatnim „bus-iness”, który jest utrzymywany, aby pokazać, że słowo zawija się do następnego wiersza, i został wybrany, aby drugi wiersz zawierał jak najwięcej tekstu.
Zasady
W każdym wierszu liczba spacji między słowami nie może się różnić o więcej niż 1, ale w przypadku wstawienia dodatkowych spacji zależy od Ciebie:
hello hi foo bar <-- not permitted (1,1,5) hello hi foo bar <-- not permitted (2,1,4) hello hi foo bar <-- OK (2,2,3) hello hi foo bar <-- OK (2,3,2) hello hi foo bar <-- OK (3,2,2)
Żadna linia nie może zaczynać się ani kończyć spacjami (z wyjątkiem ostatniej linii, która może kończyć się spacjami).
Ostatni wiersz powinien być wyrównany do lewej strony, zawierający pojedyncze spacje między każdym słowem. W razie potrzeby może następować dowolna biała spacja / nowa linia, ale nie jest to wymagane.
Słowa będą się składać z AZ, az, 0-9 i prostej interpunkcji (
.,'()&
)Możesz założyć, że żaden fragment słowa nie będzie dłuższy niż szerokość docelowa i zawsze będzie możliwe wypełnienie wierszy zgodnie z regułami (tj. W każdym wierszu będą znajdować się co najmniej 2 fragmenty słów lub 1 fragment słowa, który wypełnia linię doskonale)
Musisz wybrać punkty dzielenia wyrazów, które maksymalizują liczbę znaków słów we wcześniejszych wierszach (tzn. Słowa muszą być zachłannie konsumowane przez linie), na przykład:
This is an input stri-ng with hyph-en-at-ion poi-nts. This is an input stri- <-- not permitted ng with hyphenation points. This is an input string with hyph- <-- not permitted enation points. This is an input string with hyphen- <-- OK ation points.
Najkrótszy kod w bajtach wygrywa
Przykłady
Width: 20
Text: The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.
The quick brown fox
jumps over the lazy
dog.
Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).
Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Width: 80
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles & Code Golf is a question and answer site for programming
puzzle enthusiasts and code golfers. It's built and run by you as part of the
Stack Exchange network of Q&A sites. With your help, we're working together to
build a library of programming puzzles and their solutions.
Width: 20
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles
& Code Golf is a
question and answer
site for programming
puzzle enthusiasts
and code golfers.
It's built and run
by you as part of
the Stack Exchange
network of Q&A
sites. With your
help, we're working
together to build a
library of program-
ming puzzles and
their solutions.
Width: 5
Text: a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z
a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss t
u vv
ww x
yy z
Width: 10
Text: It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!
It's the
black be-
ast of
Araghhhhh-
hhhhhhhhh-
hhh!
źródło
anybod-y
o szerokości 7, możemy zdecydować się na wyjście alboanybody
czyanybod-\ny
?Odpowiedzi:
JavaScript (ES6), 218 bajtów
Bierze argumenty w curry syntax (
f(width)(text)
), a wprowadzanie tekstu jest w formacie podwójnej tablicy opisanym w wyzwaniu. Ciągi są konwertowane na ten format przez.split` `.map(a=>a.split`-`))
. Ponadto nowe linie są dosłowne nowe linie w ciągach szablonów.Nie grał w golfa i przestawiał
Chodziło o to, aby przejść przez każdą część całego łańcucha i zbudować każdą linię po jednej części na raz. Po zakończeniu linii zwiększa odstępy między wyrazami od lewej do prawej, aż zostaną wstawione wszystkie dodatkowe spacje.
Test Snippet
źródło
GNU sed
-r
, 621 bajtówPobiera dane wejściowe jako dwa wiersze: szerokość jako liczba jednoargumentowa jako pierwsza, a łańcuch jako druga.
Jestem pewien, że można by grać w golfa o wiele więcej, ale wrzuciłem już za dużo czasu.
Wypróbuj online!
Wyjaśnienie
Program działa w dwóch fazach: 1. Podziel i 2. Uzasadnij. Poniżej załóżmy, że nasz wkład to:
Ustawiać
Najpierw czytamy dane wejściowe, przenosząc pierwszy wiersz (szerokość jako liczba jednoczęściowa) do przestrzeni wstrzymania (
x
), a następnie dołączając następny wiersz (N
), a następnie kopię szerokości z przestrzeni wstrzymania (G
) do przestrzeni wzorców. PonieważN
pozostawiło nam przewagę\n
, zastępujemy go!@
, którego użyjemy jako kursorów w fazie 1.Teraz zawartość przestrzeni wstrzymania jest
1111111111111
(i nie będzie się odtąd zmieniać), a przestrzeń wzorca jest (w formacie polecenia sed „drukuj jednoznacznie”l
):Faza 1
W fazie 1 główny
@
kursor przesuwa się o jeden znak na raz, a dla każdego znaku a1
jest usuwany z „licznika” na końcu obszaru wzorów. Innymi słowy@foo\n111$
,f@oo\n11$
,fo@o\n1$
, itd.Te
!
szlaki kursora tył@
kursora, oznakowanie miejsc mogliśmy przełamać jeśli licznik osiągnie 0 w środku linii. Kilka rund wyglądałoby tak:Oto rozpoznany przez nas wzór: spacja, po której następuje
@
kursor. Ponieważ licznik jest większy niż 0, przesuwamy znacznik przerwy, a następnie przesuwamy główny kursor:Oto kolejny wzorzec:
-@
i nadal mamy 7 w liczniku, więc ponownie przesuwamy kursor przerwania i kontynuujemy:Oto inny wzorzec: łącznik bezpośrednio poprzedzający kursor podziału i inny poprzedzający główny kursor. Usuwamy pierwszy łącznik, przesuwamy kursor przerwania, a ponieważ usunęliśmy znak, dodajemy 1 do licznika.
Przesuwamy główny kursor:
Podobnie jak poprzednio, ale tym razem główny kursor poprzedza spację, a nie myślnik. Usuwamy łącznik, ale ponieważ przesuwamy również główny kursor, nie zwiększamy ani nie zmniejszamy licznika.
Wreszcie nasz licznik osiągnął zero. Ponieważ znak za kursorem głównym jest spacją, wstawiamy nowy wiersz i umieszczamy oba kursory zaraz po nim. Następnie uzupełniamy licznik (
G
) i zaczynamy od nowa.Faza 1 trwa, przesuwając kursory i dopasowując różne wzory, aż
@
kursor dotrze do końca łańcucha.Pod koniec fazy 1 nasza przestrzeń wzorów wygląda następująco:
Lub:
Faza 2
W fazie 2 używamy
%
jako kursora i używamy licznika w podobny sposób, zaczynając w ten sposób:Najpierw liczymy znaki w pierwszym wierszu, przesuwając kursor i usuwając 1s z licznika, po czym mamy;
Ponieważ licznik wynosi 0, nie robimy nic więcej na tej linii. Drugi wiersz ma również tę samą liczbę znaków co licznik, więc przejdźmy do trzeciego wiersza:
Licznik jest większy niż 0, więc przesuwamy kursor z powrotem na początek linii. Następnie znajdujemy pierwszy ciąg spacji i dodajemy spację, zmniejszając licznik.
Licznik jest większy niż 0; ponieważ kursor znajduje się już w ostatnim (jedynym) przebiegu spacji w linii, przenosimy go z powrotem na początek linii i robimy to ponownie:
Teraz licznik wynosi 0, więc przesuwamy kursor na początek następnego wiersza. Powtarzamy to dla każdej linii oprócz ostatniej. To koniec fazy 2 i koniec programu! Ostateczny wynik to:
źródło
gsed (GNU sed) 4.4
, dostajęgsed: -e expression #1, char 16: ":" lacks a label
. Czy możesz dodać notatkę dotyczącą tego, w jaki sposób ją wywołujesz? (Używamprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
flagi, dlatego powyższy link TiO prowadzi do strony bash.!
(chociaż skoro brakowało mi!
na liście możliwych znaków specjalnych, I nie będzie się temu przeciwstawiać).JavaScript (ES6), 147 bajtów
Pobiera dane wejściowe jako
(width)(text)
.Wypróbuj online!
Skomentował
źródło
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 bajtów SBCSWypróbuj online!
źródło
Stax ,
5150 bajtówUruchom i debuguj
źródło
Python 2 , 343 bajty
Wypróbuj online!
źródło
print'\n'.join(L[:-1])
zamiastfor e in L[:-1]:print e