(Uwaga: to moje pierwsze pytanie w golfa z kodem, ale o ile wiem, nikt inny tego nie zrobił, więc powinienem być dobry.)
Twoim zadaniem jest stworzenie programu lub funkcji, która pobierze ciąg znaków s
i liczbę całkowitą n
, i zwróci lub wyprowadzi tekst zawinięty w wiele wierszy. Każde słowo musi być w całości na linii; tzn. brak słów podzielonych na środku. Każda linia nie może być dłuższa niż n
znaki, a każda linia musi zawierać jak najwięcej słów.
Przykład:
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat."
n = 50
output:
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Sed eget erat lectus. Morbi mi mi, fringilla
sed suscipit ullamcorper, tristique at mauris.
Morbi non commodo nibh. Pellentesque habitant
morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Sed at iaculis mauris.
Praesent a sem augue. Nulla lectus sapien, auctor
nec pharetra eu, tincidunt ac diam. Sed ligula
arcu, aliquam quis velit aliquam, dictum varius
erat.
Twój wynik może być tablicą ciągów lub pojedynczym ciągiem z podziałem wierszy. Możesz również założyć, że żadne słowa nie będą dłuższe niż n
, więc nie martw się o radzenie sobie z dziwnymi przypadkami.
Obowiązują standardowe zasady we / wy, a standardowe luki są zabronione. Końcowe spacje są dozwolone.
Ponieważ jest to gra w golfa , wygrywa krótkie rozwiązanie w bajtach.
Oto przykładowy program w Pythonie, który działałby.
źródło
n
to maksymalna długość linii, przepraszam, że to nie było jasne. Wyjaśnię. Ponadto zasady zostały zaktualizowane, więc prosty podział nie działa.Odpowiedzi:
Python 2 , 26 bajtów
Wypróbuj online!
Meh ... wbudowane są nudne ... zamiast tego, tutaj masz ładne 87-bajtowe rozwiązanie:
Wypróbuj online!
Generuje końcowe spacje.
źródło
PHP , 8 bajtów
Co prawda nie jest to najbardziej oryginalne rozwiązanie, ale PHP ma natywną funkcję, która idealnie pasuje do twoich wymagań!
wordwrap
:Użyj tak:
Lub wypróbuj online!
źródło
JavaScript (ES6),
75 7372 bajtyPobiera dane wejściowe jako
(string)(n)
.Wypróbuj online!
Zmienne
Sformatowane dane wyjściowe są przechowywane wo (na zielono poniżej).
Zaktualizowana liniau jest zdefiniowana jako konkatenacja:
Musimy wstawić podział linii za każdym razem, gdy ustawiony jestn ty znak u (indeksowane 0, na czerwono poniżej).
Przykład
Dodanie „LOREM”:00L01O02R03E04M050607080910111213141516
Dodanie „IPSUM”:00L01O02R03E04M05∙06I07P08S09U10M111213141516
Dodanie „DOLOR”:00L01O02R03E04M05∙06I07P08S09U10M11∙12D13O14L15O16R
źródło
r+w+' '
?Perl 6 ,
4629 bajtówWypróbuj online!
Rozwiązanie oparte na regeksie, które pobiera dane wejściowe curry, polub
f(n)(s)
i zwraca listę linii. Każda linia oprócz ostatniej ma końcowe białe znakiWyjaśnienie:
źródło
Vim, 15 bajtów / naciśnięć klawiszy
Pytanie o formatowanie tekstu? Znam tylko narzędzie do pracy! I ma nawet moje imię w pierwszych dwóch naciśnięciach klawiszy: D
<C-r>
środki ctrl-r.To może kiedykolwiek tak nieznacznie krótszy w V , ale wolę odpowiadając w wanilia vim za odpowiedzi, które naprawdę pokazać się jak zwięzły vim może być na prawej wyzwanie. Różnica jest tak niewielka.
Może to być również następujące dla 15 bajtów:
Wypróbuj online!
źródło
DJ:
Ten program został stworzony przez DJ'a, naszego ulubionego kota z brylantem na szyi. [...]R ,
3627 bajtówR ma to jako funkcję wbudowaną (
strwrap
), zwracamy wektor linii podziału.Wypróbuj online!
źródło
Haskell , 70 bajtów
źródło
Python 2 , 74 bajty
Wypróbuj online!
źródło
Java (JDK) ,
4644 bajtówZasadniczo czyste wyrażenie regularne w Javie, prawie na pewno najkrótsze, jakie napisałem.
Pozdrawiam Kevina za to, że pomógł jeszcze bardziej ograniczyć bajty wyrażenia regularnego!
Wypróbuj online!
Za pomocą curry lamdba tworzy wyrażenie regularne, które zachłannie dopasowuje do
n
znaków, po których następuje spacja lub koniec łańcucha. Następnie zamienia te postacie na siebie, po których następuje nowa linia.źródło
[ $]
faktycznie po prostu dopasowuje spację lub,$
jeśli dobrze pamiętam, zamiast końca łańcucha. Wydaje się jednak, że działa, więc wygląda na to, że można po prostu zagrać w golfa w jednym miejscu na jeszcze mniej bajtów.$0
zamiast$1
.replaceAll
jest tak gadatliwy!Mathematica, 16 bajtów
Wbudowana funkcja. Pobiera ciąg znaków i liczbę całkowitą jako dane wejściowe i zwraca ciąg znaków jako dane wyjściowe.
źródło
PowerShell,
4083 bajtówWalizka testowa z
n=80
dodanym.Skrypt testowy:
Wydajność:
źródło
if
/else
z fałszywymreturn
welse
części oraz oświadczenie wthen
części.C (gcc) , 68 bajtów
Wypróbuj online!
Dzięki pułapowi cat zaoszczędź 2 bajty, przenosząc globalnie
char*l
do parametru.źródło
Japt , 20 bajtów
Wypróbuj online!
Dzięki Bubblerowi i Kudłatemu za pomoc
Wyjaśnienie:
źródło
[X,Y].join(...)
.Retina 0.8.2 , 37 bajtów
Wypróbuj online! Trwa
s
in
na osobnych liniach. Wyjaśnienie:Konwertuj
n
na unary.Dopasuj spacje, a następnie spójrz
n
i policz je jako$#1
. Następnie wróć i użyj grupy równoważącej, aby dopasować don
znaków, a następnie spacji.Wypisuj dopasowania jako listę linii.
źródło
.{1,50}
i$0¶
, ale gdzie50
zamiast tego jest odbierany jako dane wejściowe?Węgiel drzewny , 19 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe
n
is
oddzielne linie. Wyjaśnienie:Wejście
n
.Przesuń kursor w lewo o jeden kwadrat, aby zrównoważyć prawy ruch od pierwszej iteracji pętli.
Podziel ciąg znaków na spacje i zapętlaj słowa.
Oblicz, czy następne słowo osiągnie prawą krawędź.
Jeśli nie, to przesuń jeden kwadrat w prawo.
Jeśli to rozpocznie nową linię.
Wypisz słowo.
źródło
Czerwony ,
125, 117, 114112 bajtówWypróbuj online!
źródło
05AB1E , 18 bajtów
Wypróbuj online.
Wyjaśnienie:
źródło
Java 8, 135 bajtów
Wypróbuj online.
Wyjaśnienie:
źródło
JavaScript, 40 bytes
Try it online!
źródło
APL (Dyalog Unicode), 14 bytesSBCS
Infix function; left argument is
n
, right argument isn
.Try it online!
⎕CY
copy in the dfns library⋄
thenwrap
[c] use the wrap[n] function[c] code of that function
[n] notes for that function
Golfed version of
wrap
, 59 bytesSBCSTry it online!
{
…}
dfn;⍺
is left argument (width),⍵
is right argument (string)≢⍵
tally (number of characters) of string⍺≥
…:
Jeśli szerokość jest większa lub równa, to:⍵
zwraca ciąg⋄
Inaczej:' '=⍵
Maska boolowska, w której puste są równe ciągowi znakówb←
Przechowywać wb
(na b lanks)(
…)↑
Weź z tego następującą liczbę elementów:⍺+1
jeden więcej niż szerokość⍸
I ndices gdzie prawdag←
Przechowywać wg
(na g APS)⍺≥
Maska boolowska, której szerokość jest większa lub równag/⍨
przefiltruj przez to indeksy luk⍺,
dodaj to do szerokości⊃⌽
wybierz ostatni element (podświetlony wybierz pierwszy z odwróconego)t←
Przechowywać wt
(dla t ake)b⊃⍨
używać, aby podnieść element z maską b lankst+
dodaj to dot
⍵↓⍨
upuść tyle znaków z ciągu⍺∇
powróćcie do tego z tym samym lewym argumentem⎕TC,
append that to the list of terminal control characters (8:HT, 10:NL, 13:CR)2↓
drop the first two character from that (leaving just a leading 13:CR)(
…),
append that to the following:t↑⍵
the firstt
characters of the stringźródło
Thanks to @Erik the Outgolfer, a golfed version :
Python 3, 94 bytes
Try it online!
# Python 3, 130 bytesTry it online!
Not so golfed version...źródło
JavaScript + HTML + CSS,
11764 bytes-53 bytes courtesy of @Neil
źródło
(n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>`
for 74 bytes. If you're willing to dig out old versions of Firefox you can save another 8 bytes with(n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>`
.ch
units. Firefox 65 computes50ch
as500px
; Chromium 70 computes50ch
as400px
elit. Sed eget erat lectus. Morbi mi mi, fringilla sed
(2nd line) is more than 50 characters. I'm using the newest Chrome.<p>
inside the<tt>
.Jelly, 12 bytes
Try it online!
Unfortunately, this is too slow to work for the provided test case in under a minute over TIO.
źródło
C# (.NET Core), 162 bytes
This function uses a regex which matches the closest whitespace that is near the nth or multiple of nth character and splits the string based on it.
Try it online!
The TIO link is a full program, and the function has a static keyword so the function can be called from main.
Test Regex
źródło
C# (Visual C# Interactive Compiler), 78 bytes
Try it online!
Credit goes to @LukeStevens for coming up with the Java version... Apparently .NET makes you import the
RegularExpressions
namespace in order to do a replace :(Here is my original version that splits on the space character and uses LINQ to join them back together:
C# (Visual C# Interactive Compiler), 91 bytes
Try it online!
źródło
Dart, 112 bytes
Try it online!
źródło
APL(NARS), 48 chars, 96 bytes
test:
źródło
C, 63 bytes
The function of this exercise b(a,n) would break the line "a" as exercise said, in the way not change its length (if we see the result as one string) because change some spaces in \n or new line in place. The input string "a" should have no \n character too in it for b() function (it could have \n in input string for bs())
b(a,n) function would be ok only because the restriction of this exercise, that impose each word of "a" string has length < n if this is not true, that function can go
to one infinite loop...(very wrong in my way of see so i copy too the function more good because in that case would return -1 and not would go to one infinite loop; it is bs(a,n) below)I not exclude both functions are bugged...
result of b() passed on one function that add line lenght each line
źródło