COBOL jest bardzo starym językiem, w chwili pisania ma 58 lat. Jest tak stary, że ma bardzo ciekawe dziwactwo: pierwsze sześć znaków każdej linii to komentarze.
Dlaczego to pytasz? Cóż, te 6 znaków miało być używanych jako numery linii, w czasach, gdy programy nie były całkowicie cyfrowe i zostały napisane na komputerze.
Ponadto siódmy znak może być tylko częścią bardzo małego zestawu (zwykle jest *
to komentarz linii lub spacja w celu oddzielenia numeru linii od kodu)
Ale co, jeśli korzystasz z bardziej cyfrowego systemu i chcesz tylko surowy program?
System komentarzy
W języku COBOL istnieją dwa rodzaje komentarzy: komentarze do linii i wspomniane komentarze do „numeru linii”.
Odkomentowanie numerów linii jest proste: wystarczy usunąć pierwsze siedem znaków (sześć plus jedna spacja) z każdej linii.
000000 apple
000001 banana
celery donuts
stanie się:
apple
banana
donuts
Komentarze liniowe utrudniają to. Komentarz do linii rozpoczyna się gwiazdką *
umieszczoną na siódmej pozycji znaku w linii, tak:
000323* this is a comment
To nie jest komentarz liniowy:
*00000 this isn't a comment
Aby anulować komentarz do komentarza, po prostu usuń całą linię.
Przykład skomentował „program”:
000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges
Wersja bez komentarza:
blah blah
oranges?
love me some oranges
Innymi słowy, aby odkomentować ciąg, usuń pierwsze sześć znaków każdej linii, a następnie zwróć wszystkie oprócz pierwszego znaku każdej linii, która nie zaczyna się od gwiazdki.
Wyzwanie
Utwórz program lub funkcję, która pobiera skomentowany program i zwraca jego nieskomentowany wariant.
Wyjaśnienia
- Gwiazdki (
*
) nigdy nie zostaną znalezione nigdzie poza pierwszymi siedmioma znakami w linii (nie prosimy o weryfikację składni) - Każda linia zawsze będzie miała co najmniej 7 znaków.
- Możesz założyć, że siódma postać jest zawsze gwiazdką lub spacją.
- Dane wejściowe lub wyjściowe mogą być macierzą lub listą.
- Obsługiwane są tylko drukowalne znaki ASCII (plus nowa linia).
- Możesz generować z końcowym znakiem nowej linii. Możesz również założyć, że na wejściu pojawi się nowa linia, jeśli tak wybierzesz.
Punktacja
Ponieważ jest to golf golfowy , wygrywa odpowiedź z najmniejszą liczbą bajtów!
ZASTRZEŻENIE: W rzeczywistości nie znam języka COBOL i nie twierdzę. Jeśli jakiekolwiek stwierdzenia dotyczące COBOL, które wypowiedziałem w tym pytaniu, są nieprawidłowe, nie biorę odpowiedzialności.
*
. Czy to przypadek?key:{key:{key:length,key:length}}
. Usuwa wszystkie dane formatowania i dane do pisania.Odpowiedzi:
COBOL (GnuCOBOL), 191 + 17 = 208 bajtów
„Nauczyłem się” języka COBOL dla tej odpowiedzi, więc prawdopodobnie nie jest w pełni golfa.
Jest to pełny program, który bierze udział w tym, co uważam za standardowe wejście i pisze do tego, co uważam za standardowe wyjście. Być może kiedyś wrócę do tego i (1) ustalę, czy COBOL ma funkcje, a jeśli tak, (2) sprawdzę, czy rozwiązanie funkcji byłoby krótsze.
Liczba bajtów obejmuje flagi programu i kompilatora (
-free
i-frelax-syntax
).Wypróbuj online
Program bez golfa
Ograniczenia
Dane wyjściowe są technicznie nieprawidłowe. Z moich pobieżnych badań wynika, że jedynym praktycznym sposobem przechowywania łańcucha w języku COBOL jest bufor o stałym rozmiarze. Wybrałem rozmiar bufora 80 znaków, ponieważ jest to limit długości linii dla programów o stałym formacie. To stwarza dwa ograniczenia:
Domyślam się, że jest to dopuszczalne, ponieważ cóż, to COBOL. Jeśli nie, chętnie przyjrzę się alternatywom.
Podziękowanie
źródło
Python 2 ,
393837 bajtów-1 bajt dzięki LyricLy. -1 bajt dzięki Mego.
Wypróbuj online!
I / O jako listy ciągów.
źródło
!=
go<
, ponieważ kod spacji jest niższy niż gwiazdka, a siódmym znakiem zawsze będzie spacja lub gwiazdka.You may assume the seventh character is always an asterisk or a space.
if'*'!=i[6]
Perl 5 ,
19+ 1 (-p) =2016 bajtów-4 bajty z sugestiami Pavela
Wypróbuj online!
źródło
(\*.*$| )
się( |.*)
/ /;$_=/\* /?$,:$'
jest inną alternatywą^
.V ,
131110 bajtówWypróbuj online!
Wyjaśnienie
Hexdump:
źródło
7x
tego zrobić zamiast6x<<
?*
*
najpierw usunąć linie z, a potem zrobićÎ7x
? (zakładając, że * nie może być w*
w pierwszych 6 znakach.Paradoc (v0.2.8 +), 8 bajtów (CP-1252)
Pobiera listę wierszy i daje listę niepomocowanych wierszy.
Wyjaśnienie:
Cześć, napisałem golfowy język programowania. :)
Nadal pracuję nad tym i dodałem / poprawiłem kilka wbudowanych elementów po próbie napisania tego, aby były bardziej rozsądne sposoby na odróżnienie spacji od gwiazdki niż „
7#
”, ale wydaje mi się, że to uniemożliwiłoby konkurowanie. Całe szczęście, że nadal działało (używa tylko funkcji z wersji 0.2.8, które popełniłem trzy dni temu).źródło
Oktawa, 23 bajty
Wypróbuj online!
źródło
@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)
, gdzies
jest tablica komórek, a nie tablica łańcuchów. Użycie wyrażenia regularnego lub czegoś takiego byłoby prawdopodobnie krótsze, ale metoda, którą napisałem, jest porównywalna do metodologii opisanej w tej odpowiedzi tylko dla starej MATLABGalaretka ,
119 bajtówWypróbuj online!
Wejścia i wyjścia jako lista linii.
-2 bajty dzięki @EriktheOutgolfer i @JonathanAllan
Jak to działa
źródło
7$€
może być€7
ṫ€7Ḣ⁼¥Ðf⁶
PowerShell , 32 bajty
Wypróbuj online!
Dane wejściowe potoku pojawiają się jako tablica ciągów,
-replace
działają na każdym łańcuchu i-ne ''
(nie równe pustemu łańcuchowi) zastosowane do tablicy, odfiltrowują puste linie.źródło
C,
635955484746 bajtówDzięki „ anonimowemu użytkownikowi ” za usunięcie kolejnego bajtu.
Dzięki Felixowi Palmenowi za przypomnienie mi: „ Możesz założyć, że siódma postać jest zawsze gwiazdką lub spacją. ”, Która straciła jeszcze jeden bajt.
Użyj jak:
Wypróbuj online!
źródło
Właściwie 13 bajtów
Dane wejściowe i wyjściowe są wykonywane jako lista ciągów.
Wyjaśnienie:
Wypróbuj online!
źródło
Gaia , 9 bajtów
Funkcja przyjmująca listę ciągów i zwracająca listę ciągów.
Wypróbuj online!
Wyjaśnienie
źródło
⁈
i«
oba mają 1 postać. Nasze języki gry w golfa, które używają znaków innych niż ascii (może poza Neimem), używają niestandardowych kodowań, które pozwalają na liczenie wszystkich tych znaków poza ASCII jako pojedynczych bajtów. Oto strona kodowa Gaia .Pyt , 9 bajtów
Pamiętaj, że działa to tylko wtedy, gdy co najmniej 1 linia nie jest komentarzem, a co najmniej 1 linia to komentarz. Wszystkie pozostałe rozwiązania działają we wszystkich przypadkach.
-2 bajty dzięki @pizzakingme !
Wypróbuj tutaj!
Wyjaśnienie
Pyth , 11 bajtów
Wypróbuj tutaj!
Wyjaśnienie
Pyth , 11 bajtów
Wypróbuj tutaj!
Wyjaśnienie
Pyth , 12 bajtów
Wypróbuj tutaj!
Wyjaśnienie
Pyth , 12 bajtów
Wypróbuj tutaj!
Wyjaśnienie
źródło
m>d7.m@b6
powinien działać na 9 bajtach, nadużywając, że*
jest po spacji w porządku leksykograficznymGNU Sed, 19 + 2 = 21 znaków
Wymaga
-E
argumentu, abysed
włączyć rozszerzone wyrażenia regularne.źródło
s/^.{6}( |.*)//g
Java 8, 40 bajtów
Wyrażenia regularne: po prostu niewłaściwe narzędzie do pracy, ale nie do końca. Lambda od
String
doString
(przypisanie doFunction<String, String>
). Dane wejściowe muszą mieć końcowy znak nowej linii.Wypróbuj online
Podziękowanie
źródło
Haskell ,
2725 bajtówWersja Laikoni jest krótsza niż moja:
Wypróbuj online!
Moja wersja:
Wypróbuj online!
źródło
f n=[x|' ':x<-drop 6<$>n]
.C (gcc) ,
534846 bajtówWypróbuj online!
-5 bajtów: Bardzo trudno było sprowadzić ten „ cały program ” do tego samego rozmiaru, co funkcja gury . Teraz pisze poza granicami (w obu kierunkach) tablicy niewłaściwego typu i polega na małej liczbie całkowitej Endian i 4 bajtach, aby znaleźć gwiazdkę ... ale hej, to działa;)
-2 bajty: Cóż, jeśli już piszemy do jakiejś „losowej”
.bss
lokalizacji, po co w ogóle zadawać sobie trud deklarowania tablicy ! Więc tutaj jest program obsługi ciąg, który używa ani tenchar
typ ani tablicę.źródło
*x&2
sprawiło, że pamiętam: „Możesz założyć, że siódma postać jest zawsze gwiazdką lub spacją.”, Więc powinienem być w stanie ogolić kilka bajtów z mojej odpowiedzi :-)R,
4745 bajtówźródło
pe=T
argument. Nie jestem jednak pewien, czy dane wejściowe jako listę ciągów znaków są dozwolone.Input or output may be a matrix or list.
SNOBOL4 (CSNOBOL4) ,
72706650 bajtówWypróbuj online!
Dopasowywanie wzorców w SNOBOL różni się od wyrażeń regularnych, ale idea jest taka sama: jeśli linia pasuje do „sześciu znaków, a następnie gwiazdki”, usuń ją, w przeciwnym razie usuń pierwsze siedem znaków linii i wydrukuj wynik.
To teraz faktycznie lepiej wykorzystuje operator przypisania warunkowego SNOBOL.
Wzór jest
POS(6) (' ' REM . OUTPUT | '*')
jest interpretowany jako:Zaczynając od pozycji 6, dopasuj spację lub gwiazdkę, a jeśli dopasujesz spację, przypisz resztę wiersza do
OUTPUT
.źródło
Vim, 14 bajtów
Ctrl-V
G5ld:%g/\*/d
EnterŁadowanie pliku wejściowego jako bufora do edycji, a następnie wprowadź powyższe polecenia. Dane wyjściowe to nowy bufor.
źródło
Rubinowy ,
39383629232220 + 1 = 21 bajtówWypróbuj online!
Używa
-p
flagi.Wyjaśnienie:
-p
Flaga dodaje niejawny blok wokół kodu, więc kod, który faktycznie staje się uruchomić wygląda następująco:gets
czyta wiersz tekstu i zapisuje jego wynik$_
.$_[/.../]=''
usuwa pierwsze wystąpienie wyrażenia regularnego...
w$_
./.{6}( |.*\n)/
dopasowuje 6 dowolnych znaków na początku linii, po których następuje spacja lub reszta linii. Ponieważ spacja pojawia się pierwsza, spróbuje usunąć tylko pierwsze 6 znaków i spację przed próbą usunięcia całej linii.$_
jest następnie drukowany i proces ten powtarza się dla każdej linii.źródło
Pyke , 9 bajtów
Wypróbuj tutaj!
Czytelny:
Wypróbuj tutaj!
źródło
Siatkówka ,
2315 bajtów5 bajtów zapisanych dzięki nmjcman101
1 bajt zapisany dzięki Neilowi
Wypróbuj online!
źródło
JavaScript (ES6), 48 bajtów
Wypróbuj online!
źródło
z
, co tutaj nie jest dozwolone. Możesz jednak zmienić go w anonimową funkcję strzałki, aby była ważna.(
i)
otaczania fn, dodałem je na pewno.()
funkcji, ale poza tym wygląda dobrze.> <>,
5753 bajtówspróbuj online
Wyjaśnienie
Edycja: 53 bajty
Zasadniczo takie same rzeczy jak poprzednio, ale nieco zrestrukturyzowane
Na marginesie: jestem rozczarowany, że nikt jeszcze tego nie zrobił w kobolu.źródło
C #,
160 145 9089 bajtówDzięki Pavel & auhmaan za zmniejszenie rozmiaru.
źródło
t=>{...}
func<string, string>
.Python 3, 71 bajtów (bez wyrażeń regularnych)
To działa!
źródło
05AB1E , 11 bajtów
Wypróbuj online!
źródło
.$
wtedy nie istniał. : PJavaScript,
4434 bajtówPrzekreślone 44 jest nadal regularne 44.
6 bajtów zapisanych dzięki tsh
Wypróbuj online!
źródło
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
s.match(/(?<=^.{6} ).*/mg)
ESNext (niestandardowy, etap 3) Chrome62 +?
po\n
).C ++ (GCC),
121112 bajtówDzięki @gurka za uratowanie 9 bajtów!
Pobiera dane wejściowe jako listę linii.
Wypróbuj online!
źródło
#import
? Myślę też, że można pominąć standardowe dołączenia.#import
nie jest standardowym C ++, ale przynajmniej GCC i MSVC go obsługują. Pominięcie niektórych obejmuje pracę z C, ale nie z C ++. Kod nie działa bez uwzględnienia, więc należy je liczyć w całkowitej liczbie bajtów.import
w odpowiedziach na python lubusing
w odpowiedziach w języku C #. Czy odpowiedź nie#include <bits/stdc++.h>
byłaby krótsza?system.foo()
niżusing system;foo()
Java 8,
955453 bajtów-42 bajty dzięki @ OliverGrégoire , używając
Stream<String>
zamiast zamiastString
jako wejścia i wyjścia.Wyjaśnienie:
Wypróbuj tutaj.
źródło
String[]
lubList<String>
jako danych wejściowych dla -12 bajtów.Stream<String>
jeśli to może pomóc. Przykład:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))
54 bajty.<42
zamiast,!=42
ponieważ „Możesz założyć, że siódma postać jest zawsze gwiazdką lub spacją”.