Wiele osób na tej stronie używa języków ezoterycznych , a ponieważ języki te są niezwykłe i trudne do zrozumienia, często piszą wyjaśnienia w określonym formacie. Na przykład, jeśli kod był
abcdefghijklmnop
I te języki używają #
komentarzy, napisaliby takie wyjaśnienie:
a #Explanation of what 'a' does
bc #Bc
d #d
e #Explanation of e
fgh #foobar
ij #hello world
k #etc.
l #so on
mn #and
op #so forth
Często też to robię, ale za każdym razem, gdy to robię, czuję, że tworzenie układu tekstu jest naprawdę nieznośne i czasochłonne. Więc chcę, żebyś stworzył dla mnie „Esolang-Comment-Template-Generator”. Na przykład, jeśli zignorujemy komentarze, poprzedni kod ma ten szablon:
a #
bc #
d #
e #
fgh #
ij #
k #
l #
mn #
op #
Wyzwanie:
Musisz napisać program lub funkcję, która pobiera dwa ciągi wejściowe i wysyła ten „Szablon komentarza Esolang”. Pierwszym wejściem będzie kod, ale z paskami ( |
) wstawionymi tam, gdzie idą nowe linie. Drugie dane wejściowe wykorzystamy w komentarzach. Więc nasz ostatni przykład miałby to dla danych wejściowych:
"a|bc|d|e|fgh|ij|k|l|mn|op", "#"
Niestety wyklucza to umieszczanie słupków w danych wejściowych kodu, ale to jest OK. Możesz założyć, że komentarzem będzie pojedynczy znak. Dla uproszczenia znak komentarza nie będzie paskiem. Wprowadzony kod będzie zawierał tylko ASCII do wydruku i nie będzie zawierał żadnych nowych wierszy.
Mam nadzieję, że możesz wyciągnąć wnioski z przypadków testowych, ale postaram się wyjaśnić kilka rzeczy.
Musisz podzielić wejście kodu na „sekcje kodu” na każdym pasku. Następnie każda sekcja kodu jest wyprowadzana w osobnym wierszu i dopełniana lewą długością całego poprzedniego kodu (bez pasków). Następnie każdy wiersz jest dopełniany z odpowiednią ilością spacji, tak aby ostatnie dwa znaki w każdym wierszu to „Jedna dodatkowa spacja” + „Znak komentarza”.
Dozwolony jest jeden znak nowej linii.
Oto inny przykład. Dla danych wejściowych
"Hello|World", "/"
Pierwsza sekcja kodu to „Hello”, a druga to „World”. Powinien więc dać wynik:
Hello /
World /
Oto kilka innych próbek:
Input:
"a|b|c|d|e|f|g", ","
Output:
a ,
b ,
c ,
d ,
e ,
f ,
g ,
Input:
"abcdefg", ":"
Output:
abcdefg :
Input:
"4|8|15|16|23|42", "%"
Output:
4 %
8 %
15 %
16 %
23 %
42 %
Input:
"E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!"
Output:
E !
ac !
h s !
ecti !
on is !
one c !
haracte !
r longer !
than the !
last! !
Input:
"This|Code|has||empty||sections", "@"
Output:
This @
Code @
has @
@
empty @
@
sections @
Zasady:
Możesz wziąć te dane wejściowe i wyjściowe w dowolnym rozsądnym formacie. Na przykład, czytanie / zapisywanie pliku, STDIN / STOUT, argumenty funkcji / wartość zwracana itp. Jak zwykle jest to golf-golf , więc staraj się, aby Twój kod był jak najkrótszy, a wygrasz, jeśli uda ci się znaleźć najkrótsze rozwiązanie w Twoim języku! Wybiorę również najkrótsze rozwiązanie jako zwycięzcę ogólnego. Standardowe luki są zabronione.
|
postaci, byłby miły, więc możesz się wyjaśnić|
)?Odpowiedzi:
Pyth -
28272423 bajtówMoże być w stanie trochę golfa.Najwyraźniej dużo!Wypróbuj online tutaj .
źródło
Siatkówka ,
3534 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Dwa ciągi wejściowe są oddzielone spacją (co jest jednoznaczne, ponieważ wiemy, że ogranicznik komentarza jest zawsze pojedynczym znakiem).
Wypróbuj online!
źródło
Java 10,
189159 bajtów-30 bajtów konwersja Java 7 na Java 10 i optymalizacja pętli.
Wypróbuj online.
Wyjaśnienie:
źródło
Pyke,
312824 bajtówWypróbuj tutaj!
źródło
JavaScript (ES6), 92 bajty
źródło
GNU sed (85 + 1 dla -r) 86
Wejściami są ciągi znaków oddzielone spacją.
Testy:
input.txt:
Wynik:
źródło
:
jest cechą / błędem GNU sed i\S
myślę, że jest rozszerzeniem, więc może tytuł powinien byćGNU sed
. Poza tym świetny kod.Haskell,
139135 bajtówZaoszczędzono 4 bajty, wstawiając definicję.
Nie golfowany:
źródło
Groovy,
120113111 bajtówbez golfa *
(Pierwszy projekt ze 120 bajtami)
bez golfa *
Testy
źródło
.padRight(s.replace('|','').size()+1)+c)
Python 2,
125 124132 bajtów-1 bajt dzięki @TuukkaX (brakowało gry w golfa od
i, v
)Wszystkie przypadki testowe na ideone
źródło
c
jako znaku komentarza#
.Python 2,
10710510299 bajtówTestowane ze wszystkimi powyższymi przypadkami testowymi
EDYCJA Gra w golfa poza 2 bajtami, zmieniając d = a.split ("|"); i = 0 na d, i = a.split ("|"), 0 Nie jestem pewien, jak tego przegapiłem. Dzięki @Oliver Ni
Kolejne 3 bajty zniknęły. Dzięki jeszcze raz.
Sugestia @ Jonathana faktycznie oszczędza 3 bajty i sprowadza je do magicznej 99. Dzięki.
źródło
" "*i
do około 2 bajtówlen(e)
jakfor e in d:z=len(e)....
zapisać bajt, ponieważ jest używany dwa razy05AB1E ,
29383129 bajtówMożna zdecydowanie grać w golfa, ale przynajmniej działa teraz ..
+9 bajtów, ponieważ
¡
(podzielone) automatycznie usuwa puste elementy, więc musiałem dodać'|„ǝʒ:'ǝ¡'ʒм
..-2 bajty dzięki @MagicOctopusUrn , zmieniając
'|„ǝʒ:'ǝ¡'ʒм
na'|¶:.BεðÜ}
(obecne rozwiązanie nie działa na elementy ze spacjami końcowymi, ale założyłem, że jest to dozwolone zgodnie z przypadkami testowymi).Wypróbuj online.
Wyjaśnienie:
źródło
ǝʒ
.'|¶:.B
może pracować.'|¶:.B
?.B
po raz drugi po dodaniu w poprzedzających spacjach..B
już obecnych.'|¶:.BεðÜ}εD®>úsg®+©s}.BεðIJ,
? 29 bajtów. Powrót do iteracji 1 :)..B
dzieli się na nowe linie, co jest cechą, o której niewiele osób wie. To jedyny znany mi sposób na zachowanie pustych elementów. Poprosiłbym o to jako funkcję..¡
powinno oznaczać podział, ale zachowaj puste elementy ..PowerShell v2 +,
10399 bajtówPobiera dane wejściowe jako dwa ciągi,
-split
jest pierwszym na literałowym potoku (ponieważ split używa składni wyrażenia regularnego) i przekazuje elementy do pętli|%{...}
.W każdej iteracji konstruujemy ciąg znaków jako liczbę spacji zdefiniowanych przez
$l
połączenie z bieżącym elementem. W przypadku pierwszej pętli$l
inicjuje się$null
, co zostanie ocenione jako0
.Łańcuch ten jest następnie łączony z inną liczbą spacji (definiowanych przez długość
$a
, gdybyśmy-replace
d każdej potoki nic nie dodali , plus1
dodatkowe wypełnienie między kodem a komentarzami, minus.length
bieżący element, minus$l
to, ile spacji wstawiliśmy pozostawione w tej iteracji), połączone z naszą postacią komentarza$b
. Zostało to w przygotowaniu.Następnie aktualizujemy
$l
do następnej iteracji.Wynikowe ciągi znaków są pozostawione w potoku, a dane wyjściowe poprzez niejawne
Write-Output
zdarzają się podczas wykonywania programu, z domyślnym znakiem nowej linii.Przykłady
źródło
Vim,
3938 naciśnięć klawiszy-1 bajt dzięki DJMcMayhem
Oczekuje jako danych wejściowych bufora (np. Pliku), którego pierwszym znakiem jest separator komentarza, po którym następuje kod, np
#foo|bar|baz
.Wyjaśnienie
(„
_
” oznacza dosłowną spację.)źródło
mm
na,m`
a następnie zmienisz`m
na<C-o>
Floroid - 94 bajty
Wykorzystuje podejście podobne do rozwiązania Python @ JonathanAllan .
Przypadki testowe
źródło
C #
176167154 bajtówUnGolfed
Rozwiązaniem LINQ byłoby 146, ale konieczne
using System.Linq;
było przywrócenie go do 164:Stare rozwiązania:
167 bajtów:
176 bajtów przy użyciu interpolacji ciągów
źródło
PHP,
120117116110109 bajtówlub
źródło
MATL ,
3331 bajtówWypróbuj online!
Wyjaśnienie
Wbudowana funkcja
Yd
(blkdiag
), która na podstawie danych wejściowych tworzy macierz blokowo-diagonalną, wykonuje większość pracy. Wartości wypełnienia w macierzy wynoszą 0, a char 0 jest traktowane jako przestrzeń do celów wyświetlania. Kod po prostu podzieliłby się|
, zbudowałby macierz z powstałych bloków, przekonwertowałby na char, i dodałby dwie kolumny ze spacją i symbolem komentarza.Jednak możliwość pustych sekcji w ciągu wejściowym
komplikujeproblem, który sprawia, że problem jest bardziej interesujący: wynikowy blok byłby pusty, a zatem nie pojawiałby się w wynikowej macierzy.Aby rozwiązać ten problem, przed każdym wprowadzamy znak 0
|
, więc żaden blok nie będzie pusty; a następnie w wynikowej macierzy char usuwamy kolumny utworzone tylko przez char 0. Niepusta sekcja kodu będzie zawierała znak ASCII do wydrukowania, a zatem kolumny, które obejmuje, przetrwają. Pusta sekcja doda wiersz, ale nie wprowadzi dodatkowej kolumny.źródło
|
( dopasowanie podwyrażenia przed lub po|
) potrzebuje go, przynajmniej w silniku wyrażeń regularnych Matlab / OctavePyth, 30 bajtów
lub
Oba są pełnymi programami, które pobierają dane wejściowe STDIN ciągu komentarza, a następnie ciąg programu, oddzielony znakiem nowej linii.
Wypróbuj pierwszą wersję online
Wypróbuj drugą wersję online
Jak oni pracują
źródło
Dyalog APL 16.0 (niekonkurencyjny),
4337 bajtówMonituje o znak komentarza, a następnie o kod.
Nie konkuruje, ponieważ wersja 16.0 jest nowsza niż to wyzwanie.
źródło
Perl, 63 bajty
Obejmuje +5 za
-Xpi
Uruchom z danymi wejściowymi STDIN i znakiem komentarza po -i:
esolang.pl
:Całkowicie nudne proste rozwiązanie
źródło
Turtlèd , 35 bajtów (niekonkurencyjny)
Pobiera jedno wejście, ostatni znak jest znakiem komentarza. Nie działa ze znakiem komentarza jako spacją, ale zakładam, że nie jest to konieczne.
Wyjaśnienie:
źródło
Funky , 89 bajtów
Wypróbuj online!
źródło
Scala, 123 bajty
Kod testowy + wyjście:
źródło
Rubinowy,
9680 bajtówZobacz na eval.in: https://eval.in/639012
Naprawdę powinienem się nauczyć Retina.
źródło
Galaretka , 41 bajtów
Wygląda na to, że ma zbyt wiele przyrostów i prawdopodobnie zbyt wiele linków ...
Przetestuj w TryItOnline
W jaki sposób?
źródło
CJam, 32 bajty
Wyjaśnienie
Wypróbuj online
źródło
GolfScript, 85 bajtów
Wypróbuj online
Aktualizacja 2017 - GolfScript - 71 bajtów
Wyjaśnienie
źródło
Galaretka , 10 bajtów
Wypróbuj online!
źródło