Na początku tego tygodnia dowiedzieliśmy się, jak formatować ezoteryczne języki do komentowania. Dzisiaj zrobimy coś odwrotnego. Potrzebuję napisać program lub funkcję, która analizuje dobrze skomentowany ezoteryczny kod i analizuje komentarze, zwracając tylko kod. Korzystając z przykładów z poprzedniego wyzwania, oto jak wygląda dobrze skomentowany kod:
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
Oto, co musisz zrobić, aby wyodrębnić kod. Najpierw usuń znak komentarza ( #
), spację przed nim i wszystko po znaku komentarza.
a
bc
d
e
fgh
ij
k
l
mn
op
Następnie zwinąć każdą linię w górę w jedną linię. Na przykład, ponieważ b
znajduje się w drugiej kolumnie na drugiej linii, raz my zwinąć ją w górę, to będzie w drugiej kolumnie na linii jednego . Podobnie c
zostanie umieszczony w trzeciej kolumnie pierwszego wiersza i d
umieszczony w czwartej. Powtórz to dla każdej postaci, a otrzymasz:
abcdefghijklmnop
Ważna uwaga: wydaje się, że trywialnym rozwiązaniem jest po prostu usunięcie komentarzy, usunięcie każdej spacji i dołączenie do każdej linii. To nie jest prawidłowe podejście! Ponieważ oryginalny kod może zawierać spacje, zostaną one usunięte dzięki temu podejściu. Na przykład jest to całkowicie poprawne wejście:
hello #Line one
#Line two
world! #Line three
Odpowiednim wyjściem powinno być:
hello world!
Wyzwanie:
Napisz program lub funkcję, która pobiera skomentowany kod jako dane wejściowe i wysyła lub zwraca kod ze wszystkimi parsowanymi komentarzami. Powinieneś wypisać kod bez spacji końcowych, chociaż dozwolony jest jeden znak nowej linii. Komentarz zawsze będzie #
i zawsze będzie jedno dodatkowe miejsce przed rozpoczęciem komentarzy. #
będzie nie pojawiają się w sekcji komentarzy na wejściu. Aby uprościć wyzwanie, oto niektóre dane wejściowe, z którymi nie musisz sobie poradzić:
Możesz założyć, że kod nie będzie zawierał dwóch znaków w tej samej kolumnie. Na przykład jest to dane wejściowe, które naruszają tę zasadę:
a #A character in column one bc #Characters in columns one and two
Możesz również założyć, że wszystkie znaki komentarza pojawiają się w tej samej kolumnie. Na przykład to wejście:
short #this is a short line long #This is a long line
narusza tę zasadę. Oznacza to również, że
#
nie będzie go w sekcji kodu.I na koniec, nie musisz obsługiwać sekcji kodu ze spacjami wiodącymi lub końcowymi. Na przykład,
Hello, # World! #
Możesz również założyć, że dane wejściowe zawierają tylko drukowalne znaki ASCII.
Przykłady:
Input:
hello #Line one
#Line two
world! #Line three
Output:
hello world!
Input:
E #This comment intentionally left blank
ac #
h s #
ecti #
on is #
one c #
haracte #
r longer #
than the #
last! #
Output:
Each section is one character longer than the last!
Input:
4 #This number is 7
8 #
15 #That last comment is wrong.
16 #
23 #
42 #
Output:
4815162342
Input:
Hello #Comment 1
world #Comment 2
, #Comment 3
how #Comment 4
are #Comment 5
you? #Comment 6
Output:
Hello world, how are you?
Input:
Prepare #
for... #
extra spaces! #
Output:
Prepare for... extra spaces!
Możesz wprowadzić dane w dowolnym rozsądnym formacie, na przykład, lista ciągów, pojedynczy ciąg znaków z nowymi liniami, 2d lista znaków itp. Wygrywa najkrótsza odpowiedź w bajtach!
hello world!
pokazałeś)? Ponadto stwierdzasz: „#
nie pojawi się w sekcji komentarza na wejściu. ”, Ale czy może wystąpić w samym fragmencie kodu?do {stuff} while (condition);
z wyjaśnieniami w celudo while (condition); #Explainything
potem{stuff} #Explainything
.Odpowiedzi:
Galaretka ,
87 bajtówWypróbuj online!
Jak to działa
źródło
Python 2,
4843 bajtówDzięki @xnor za grę w golfa z 5 bajtów!
Przetestuj na Ideone .
źródło
map(max,*x)
ponieważmax
wymaga dowolnej liczby argumentów iNone
jest niewielka.map
można tak wykorzystać ... Dzięki!`...`[2::5]
sztuczka?`...`
jest równoważnerepr(...)
, więc dla listy ciągów singletonowych['a', 'b', 'c']
otrzymasz ciąg"['a', 'b', 'c']"
. Na koniec[2::5]
odcina pierwsze dwa znaki ("['"
) i pobiera co piąty znak pozostałego ciągu.JavaScript (ES6),
977560 bajtówDzięki @Neil za pomoc w golfa z 22 bajtów
Dane wejściowe to tablica wierszy.
a
to wejście tablicowep
jest poprzednim przedmiotemc
jest bieżącym przedmiotemm
jest dopasowanym ciągiemo
jest przesuniętyźródło
m
flaga wyrażenia regularnego jest niepotrzebna (czy miałeś kiedyś$
punkt?) , Podobnie jak miejsce(p, c)
. Wreszcie myślę, żereplace
będzie działać krócej niż[...p].map().join
.length
i skryptu użytkownika, może nie policzyłeś nowego wiersza, ale tylko dlatego, że przypadkowo umieściłem średnik;
co nie jest wymagane (JavaScript ma ASI).replace
że to tak bardzo pomoże, to naprawdę fajnie!Perl,
353432 bytesIncludes +1 for
-p
Give input on STDIN
eso.pl
Notice that there is a space after the final
;
. The code works as shown, but replace\0
by the literal character to get the claimed score.źródło
$a|=...
is rather well done, it took me a while to figure out what you were doing! One question though :*_=a
seems to be roughly equivalent to$_=$a
, why is that?*_=a
is a very obscure glob assignment which aliases the_
globals and thea
globals. So it's not so much a copy from$a
to$_
but from that point on (global)$a
and$_
are actually the same variable. All to save 1 byte...Python 2, 187 bytes
I'm gonna golf this more tomorrow I have school ;)
źródło
1 for
can be reduced to1for
. Also, if the sum of the list (at line 5) can't be negative, you can just check for<1
instead of==0
. Happy school day! :D +1.Ruby, 63 bytes
Basically a port of Dennis' Jelly answer. Takes input as an array of strings.
See it on eval.in: https://eval.in/640757
źródło
CJam, 12 bytes
Thanks to Sp3000 for saving 2 bytes.
An unnamed block that takes a list of strings (one for each line) and replaces it with a single string.
Try it online!
Explanation
źródło
J, 30 bajtów
Bierze listę ciągów jako dane wejściowe. Zasadniczo używa tego samego podejścia, co Dennis w swojej odpowiedzi na galaretkę.
Skomentował i wyjaśnił
Kroki pośrednie:
Przypadek testowy
źródło
JavaScript (ES6), 63 bajty
Pobiera dane wejściowe jako tablicę ciągów.
źródło
Siatkówka , 32 bajty
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
źródło
Pyke,
1510 bajtówWypróbuj tutaj!
Port galaretki odpowiedź
źródło
C #
157122 BytesGrał w golfa 35 bajtów dzięki @milk - chociaż przysięgam, że próbowałem wcześniej.
Pobiera dane wejściowe jako tablicę 2-d znaków.
157 bajtów:
źródło
Trim()
działać zamiastTrimEnd()
? Co więcej, myślę, że można zaoszczędzić wiele bajtów, używając s [0] jako wyjściowego var i używającreturn new string(s[0],0,i)
gdziei
jest indeksem ostatniego znaku kodu. Pomysł ten może wymagać dwóchfor
pętli zamiast.foreach
Zastanowię się nad tym i spróbuję napisać dzisiejszy kod później.Trim()
will trim from the start as well, which I believe wouldn't be valid. I also was originally doing the loading into s[0] and I had inti;
outside of the loop (to reuse it in the return) which I believe ultimately added bytesPyth, 11 bytes
Program, który pobiera dane z listy ciągów na STDIN i drukuje ciąg.
Wypróbuj online
Jak to działa
źródło
sed, 126 bajtów
Wymaga nowego wiersza na końcu danych wejściowych.
Jestem pewien, że mogę trochę więcej zagrać w golfa, ale cieszę się, że teraz działa.
źródło
Perl 6 , 39 bajtów
Translation of the Python solution by Dennis.
Takes input as a list of strings, and returns a string.
(try it online)
źródło
Jelly, 27 bytes
Test it at TryItOnline
Uses the strictest spec - the extra space before the comment character is removed at the cost of a byte.
Input is a list of strings.
źródło
Ruby, 77 bytes
źródło
TSQL,
216175 bytesGolfed:
Ungolfed:
Fiddle
źródło
Javascript,
5634 bytes, non-competingAs @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ pointed out, I am not prepared for extra spaces
źródło
Dyalog APL, 22 bytes
Inspiration.
(
⎕UCS
character representation of¯2↓
all but the last two of⍳∘35↑
up until the position of the first 35 ("#"), in that which is outside the parenthesis, taken from⊢
that which is outside the parenthesis)
namely...⌈⌿
the columnar maximums∘
of⎕UCS
the Unicode valuesTryAPL online!
źródło