Wprowadzenie
Większość golfistów tutaj dodaje wyjaśnienia do swoich zgłoszeń, dzięki czemu łatwiej zrozumieć, co się dzieje. Zazwyczaj linie kodowe idą po lewej stronie, a odpowiednie objaśnienie po prawej stronie z pewnego rodzaju separatorem. Aby wyglądać ładnie, separatory znajdują się w tej samej kolumnie. Również długi tekst wyjaśniający jest zwykle zawijany do następnego wiersza, więc czytelnicy nie muszą przewijać w poziomie, aby przeczytać wszystko.
Jednak, gdy chcesz edytować to wyjaśnienie, ponieważ stworzyłeś szalone gry w golfa, często spędzasz czas, aby wyjaśnić coś ładniej. Ponieważ jest to bardzo powtarzalne zadanie, chcesz do tego napisać program.
Wyzwanie
Biorąc pod uwagę kilka linii kodu z objaśnieniem i separator, wypisz ładnie sformatowany kod z objaśnieniem.
Przykład
Wejście
shM-crz1dc4. "ANDBYOROF # z = wejście rz1 # przekonwertować wejście na wielkie litery cd # podziel wejście na spacje c4. "ANDBYOROF # tworzy listę słów z zapakowanego ciągu, które należy zignorować - # odfiltruj te słowa hM # bierze tylko pierwszą literę wszystkich słów s # połącz je w jeden ciąg
Wynik
shM-crz1dc4. "ANDBYOROF # z = wejście rz1 # przekonwertować wejście na wielkie litery cd # podziel wejście na spacje c4. "ANDBYOROF # tworzy listę słów z zapakowanego łańcucha, który będzie # zignorowano - # odfiltruj te słowa hM # bierze tylko pierwszą literę wszystkich słów s # połącz je w jeden ciąg
Jeden plik cookie dla pierwszego, który może dowiedzieć się, co robi ten kod.
Algorytm formatowania
- Znajdź najdłuższą linię kodu (bez objaśnienia i spacji między kodem a separatorem).
- Dodaj 5 spacji po tym wierszu kodu i dołącz odpowiedni separator z objaśnieniem. To jest teraz linia odniesienia.
- Dopasuj co drugą linię do tej linii odniesienia, aby separatory znajdowały się w tej samej kolumnie.
- Zawiń wszystkie linie dłuższe niż 93 znaki w nowy wiersz w następujący sposób:
- Znajdź ostatnie słowo, którego koniec znajduje się w kolumnie 93 lub niższej.
- Weź wszystkie słowa po tym i zawiń je do nowego wiersza z wiodącym separatorem i prawidłowymi odstępami. Spację między tymi dwoma słowami należy usunąć, więc pierwszy wiersz kończy się słowem, a drugi wiersz zaczyna się od jednego po separatorze.
- Jeśli wynikowa linia jest nadal dłuższa niż 93 znaki, zrób to samo, aż każda linia będzie miała poniżej 94 znaków.
Notatki
- Słowo składa się ze znaków spacji. Słowa są oddzielone pojedynczą spacją.
- Zawijanie słów jest zawsze możliwe. Oznacza to, że żadne słowo nie jest tak długie, że uniemożliwiłoby to zawijanie.
- Dane wejściowe będą zawierały tylko ASCII do wydrukowania i nie będą miały żadnych białych spacji
- Separator pojawi się tylko raz na linię.
- Chociaż wyjaśnienie może mieć nieograniczoną długość, separator i kod mogą mieć tylko łączną maksymalną długość
93 - 5 = 87
znaków. 5 znaków to spacje między kodem a separatorem. Kod i separator zawsze będą miały co najmniej jeden znak. - Dane wejściowe mogą zawierać puste linie. Nie będą one nigdy zawierać żadnych znaków (z wyjątkiem nowego wiersza, jeśli weźmiesz dane jako ciąg wielowierszowy). Te puste wiersze również muszą być obecne na wyjściu.
- Każda linia będzie zawierała kod, separator i wyjaśnienie. Wyjątkiem są puste linie.
- Możesz wziąć dane wejściowe w dowolnym rozsądnym formacie, o ile nie są one wstępnie przetworzone. Podaj w odpowiedzi jasno, którego używasz.
- Dane wyjściowe mogą być ciągiem wieloliniowym lub listą ciągów.
Zasady
- Dozwolona funkcja lub pełny program.
- Domyślne reguły wejścia / wyjścia.
- Obowiązują standardowe luki .
- To jest golf golfowy , więc wygrywa najmniej bajtów. Tiebreaker to wcześniejsze zgłoszenie.
Przypadki testowe
Format wejściowy tutaj to lista ciągów reprezentujących linie i pojedynczy ciąg dla separatora. Oba są oddzielone przecinkiem. Dane wyjściowe to lista ciągów znaków.
['shM-crz1dc4. "ANDBYOROF # z = input', '', 'rz1 # przekonwertować dane na wielkie litery', 'cd # podzielić wejście na spacje', 'c4." ANDBYOROF # stworzyć listę słów z zapakowanego ciąg, który należy zignorować ',' - # odfiltruj te słowa ',' hM # weź tylko pierwszą literę wszystkich słów ',' s # połącz je w jeden ciąg '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = input ',' ',' rz1 # przekonwertować wejście na wielkie litery ',' cd # podzielić wejście na spacje ',' c4." ANDBYOROF # utwórz listę słów z zapakowanego ciągu znaków, który będzie " , „# ignored”, „- # odfiltruj te słowa ',' hM # weź tylko pierwszą literę wszystkich słów ',' s # połącz je w jeden ciąg '] ['codecodecode e # Explanation', 'sdf dsf sdf e # A Bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo długo, długo, długo, długo, długo, długo, długo, długo, długo, długie wyjaśnienie i to staje się coraz dłuższe ”,„ ”,„ niektóre więcej codee # i trochę więcej wyjaśnień ”],„ e # ”-> ['codecodecode e # Explanation', 'sdf dsf sdf e # A Bardzo bardzo bardzo bardzo bardzo bardzo bardzo bardzo bardzo bardzo długo długo długo długo', 'e # długo długie długie długie długie długie objaśnienia i ciągle się wydłużają ”,„ e # i dłużej ”,„ ”,„ trochę więcej kodu e # i trochę więcej wyjaśnień ”]
Happy Coding!
length of the longest code-line + 5
. Dotyczyło to również wierszy, które zawierają tylko wyjaśnienie, ponieważ zostały zawinięte.Odpowiedzi:
Rubinowy,
245237220216212209205 bajtówFunkcja anonimowa. Całkiem podstawowe podejście (znajdź maksymalną długość, dodaj 5, a następnie wykonaj przetwarzanie w każdej linii, z rekurencją, aby poradzić sobie z zawijaniem) i może istnieć inne podejście, które oszczędza więcej bajtów.
Usunąłem wcześniej odpowiedź, która nie spełniała wszystkich wymagań; Nie chciałem mieć kodu z niepełną odpowiedzią jako odpowiedzi (otrzymywałem również głosowanie za niepełność), ale teraz powinien zrobić wszystko, o co pyta pytanie.
Dziennik zmian:
map
połączenia i przyjmując niepotrzebnestrip
funkcje w oparciu o obietnicę, że słowa w objaśnieniu zawsze mają dokładnie jedną spację między nimi. Ponadto" "
jest teraz przypisany do stałej, ponieważ tak często jej używam.map
połączenia razem, wykorzystując moc funkcji wyższego rzędu, co oznacza, że pierwsze wywołanie mapy ustawil
poprawnie zmienną długości, nawet jeśli zostanie wywołane po zadeklarowaniu funkcji pomocniczejs
. -4 bajty.\n
rzeczywiste znaki nowego wiersza, a także mała sztuczka przy użyciuif
operatorów trójskładnikowych (gdyjoin
wywoływana jest tablica znil
wartościami, stają się pustymi ciągami).join
najwyraźniej można zastąpić*
.źródło
93 - 5 = 87
znaków. 5 znaków to spacje między kodem a separatorem. Kod i separator zawsze będą miały co najmniej jeden znak.” Sekcja kodu przekroczyła limit (97 znaków), więc program ma niezdefiniowane zachowanie.LiveScript,
243236233228219225 bajtówJak to działa: głównie jak kod Java. Zacznij od aliasingu długości (LiveScript pozwala tworzyć funkcje z operatorów za pomocą nawiasów).
.=
jesta = a.b
- którego używamy tutaj do mapowania.=> blabla ..
to kaskadowa konstrukcja Smalltalk: lewa strona=>
jest dostępna jako..
dla reszty bloku; i zostaną zwrócone. Tutaj jest to element podzielony na k. Uwaga: używam interpolacji ciągów, ponieważ/
oznacza to tylko „dzielenie” za pomocą literału.LS pozwala nam korzystać
a-=/regexp/
tej lambdy (działa również z literałami łańcuchowymi): to tylko cukier na.replace
rozmowę.Wreszcie
>?=
jest>?
operatorem kombinatoryjnym, który zwraca większy z dwóch operandów.LS ma styl Python / Haskell do rozumienia, nie ma w nich nic szczególnego, z wyjątkiem „ciągów * razy”, aby wystarczająco długo powtarzać przestrzeń.
To dla zrozumienia służy jako temat (patrz blok o kaskadach powyżej).
Następnie zapętlamy każdy element tablicy (ten, który właśnie zbudowaliśmy ze zrozumieniem), a jeśli jakakolwiek linia jest większa niż 93 znaki, znajdujemy ostatni indeks, dzielimy się tam i pchamy oddzieloną linię zaraz po bieżącej iteracji ( ... Aby następna iteracja ponownie się podzieliła, jeśli linia jest zbyt duża).
Ostatnią rzeczą, tylko wyobraźnia
a[j to]
to seria (z j do końca), ale ponieważ używa metod macierzowych musimy dołączyć go z powrotem do łańcucha, który możemy zrobić za pomocą przeciążony*
:*''
.przykład
wynik:
źródło
Java, 347 + 19 = 366 bajtów
Wymaga
Zatem +19 bajtów.
Pobiera w formacie
f.accept(List<String> code, String seperator)
. Formaty w miejscu. Wersja, która tworzy i zwraca nową,List<String>
byłaby łatwa do wdrożenia, ale kosztowała trochę bajtów.Wcięte + przykładowe użycie:
... prawdopodobnie powinienem to samo przez to przejść: P
źródło
replace(" *"+s)
nie działa, alereplaceAll(" *"+s)
czy chciałbym to usłyszeć - nie mogę tego zrozumieć.replace
używa ciągów, alereplaceAll
używa wyrażeń regularnych . </badguess>PowerShell,
224217235 bajtówZaktualizowano logikę, aby określić maksymalną długość ciągu kodu. Zaktualizowano, aby umożliwić stosowanie wielu separatorów zawierających wyrażenia regularne meta.
Małe wyjaśnienie
To pobiera cały ciąg znaków nowej linii do wprowadzania.
Przykładowe wyniki z pewnym Lorem Ipsum
źródło
MATLAB,
270265262 bajtówProgram akceptuje dane wejściowe
I
w postaci tablicy komórek zawierającej ciągi znaków, przy czym każdy element tablicy komórek jest osobną linią danych wejściowych. Akceptuje również drugie wejście, które wskazuje, jaki jest znak komentarza (tj#
.). Funkcja zwraca łańcuch o wielu wierszach, który jest poprawnie sformatowany.Krótkie wyjaśnienie
Przykładowe dane wejściowe
Przykładowy wynik
źródło