COBOL ist eine sehr alte Sprache, zum Zeitpunkt des Schreibens ist es 58 Jahre alt. Es ist in der Tat so alt, dass es eine sehr interessante Eigenart hat: Die ersten sechs Zeichen jeder Zeile sind Kommentare.
Warum ist das so, fragst du? Nun, diese 6 Zeichen sollten früher als Zeilennummern verwendet werden, als die Programme noch nicht vollständig digital waren und auf einem Computer eingegeben wurden.
Darüber hinaus kann das siebte Zeichen nur Teil einer sehr kleinen Menge sein (normalerweise *
, um die Zeile oder ein Leerzeichen, um die Zeilennummer vom Code zu trennen).
Aber was ist, wenn Sie auf einem digitaleren System arbeiten und nur das Rohprogramm möchten?
Das Kommentarsystem
Es gibt zwei Arten von Kommentaren in COBOL: Zeilenkommentare und die oben genannten "Zeilennummern" -Kommentare.
Das Auskommentieren von Zeilennummern ist ganz einfach: Entfernen Sie einfach die ersten sieben (sechs plus ein Leerzeichen) Zeichen aus jeder Zeile.
000000 apple
000001 banana
celery donuts
würde werden:
apple
banana
donuts
Zeilenkommentare erschweren es etwas. Ein Zeilenkommentar wird mit einem Sternchen *
an der siebten Zeichenposition in der Zeile wie folgt gestartet :
000323* this is a comment
Dies ist kein Zeilenkommentar:
*00000 this isn't a comment
Um einen Zeilenkommentar zu entfernen, entfernen Sie einfach die gesamte Zeile.
Ein Beispiel mit dem Kommentar "program":
000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges
Die unkommentierte Version:
blah blah
oranges?
love me some oranges
Mit anderen Worten, um eine Zeichenfolge aus dem Kommentar zu entfernen, entfernen Sie die ersten sechs Zeichen jeder Zeile und geben Sie dann alle Zeichen außer dem ersten Zeichen jeder Zeile zurück, die nicht mit einem Stern beginnt.
Die Herausforderung
Erstellen Sie ein Programm oder eine Funktion, die ein kommentiertes Programm akzeptiert und dessen unkommentierte Variante zurückgibt.
Klarstellungen
- Sternchen (
*
) werden niemals außerhalb der ersten sieben Zeichen in einer Zeile gefunden (wir bitten Sie nicht, die Syntax zu überprüfen). - Jede Zeile hat immer mindestens 7 Zeichen.
- Sie können davon ausgehen, dass das siebte Zeichen immer ein Sternchen oder ein Leerzeichen ist.
- Eingabe oder Ausgabe kann eine Matrix oder Liste sein.
- Es dürfen nur druckbare ASCII-Zeichen (plus Zeilenvorschub) behandelt werden.
- Sie können mit einem nachgestellten Zeilenumbruch ausgeben. Sie können auch davon ausgehen, dass die Eingabe einen nachgestellten Zeilenumbruch enthält, wenn Sie dies wünschen.
Wertung
Da es sich um Code-Golf , Bytes die Antwort mit dem geringsten gewinnt!
HAFTUNGSAUSSCHLUSS: Ich kenne COBOL nicht und behaupte es auch nicht. Wenn eine der Aussagen zu COBOL, die ich in dieser Frage gemacht habe, falsch ist, übernehme ich keine Verantwortung.
*
. Ist das ein Zufall?key:{key:{key:length,key:length}}
. Entfernt jedoch alle Formatierungs- und Typisierungsdaten.Antworten:
COBOL (GnuCOBOL), 191 + 17 = 208 Bytes
Ich habe COBOL für diese Antwort "gelernt", daher ist es wahrscheinlich nicht vollständig ausgereift.
Dies ist ein komplettes Programm, das Eingaben auf das, was ich als Standardeingabe annehme, und Schreiben auf das, was ich als Standardausgabe annehme. Vielleicht werde ich eines Tages darauf zurückkommen und (1) feststellen, ob COBOL Funktionen hat, und, wenn ja, (2) sehen, ob eine Funktionslösung kürzer wäre.
Die Byteanzahl umfasst Programm- und Compiler-Flags (
-free
und-frelax-syntax
).Probieren Sie es online
Ungolfed-Programm
Einschränkungen
Die Ausgabe ist technisch nicht korrekt. Nach meiner flüchtigen Recherche scheint es die einzige praktische Möglichkeit zu sein, einen String in COBOL in einem Puffer mit fester Größe zu speichern. Ich habe eine Puffergröße von 80 Zeichen gewählt, da dies die Zeilenlängenbeschränkung für Programme mit festem Format ist. Dies weist zwei Einschränkungen auf:
Ich denke, das ist akzeptabel, denn es ist COBOL. Wenn nicht, wäre ich bereit, nach Alternativen zu suchen.
Danksagung
quelle
Python 2 ,
393837 Bytes-1 Byte dank LyricLy. -1 Byte dank Mego.
Probieren Sie es online!
I / O als Liste von Strings.
quelle
!=
mit<
, da einen Codepunkt des Raumes niedriger ist als ein jemandes Sternchen, und das siebte Zeichen wird immer ein Platz oder ein Sternchen sein.You may assume the seventh character is always an asterisk or a space.
if'*'!=i[6]
Perl 5 ,
19+ 1 (-p) =2016 Bytes-4 Bytes mit Pavel's Vorschlägen
Probieren Sie es online!
quelle
(\*.*$| )
mit( |.*)
/ /;$_=/\* /?$,:$'
eine weitere Alternative^
.V ,
131110 BytesProbieren Sie es online!
Erläuterung
Hexdump:
quelle
7x
statt6x<<
?*
*
und dann zu tunÎ7x
? (vorausgesetzt, ein * kann nicht in den Zeichen 0-5)*
in den ersten 6 Zeichen eine geben kann.Paradoc (v0.2.8 +), 8 Byte (CP-1252)
Nimmt eine Liste von Zeilen auf und führt zu einer Liste nicht kommentierter Zeilen.
Erläuterung:
Hallo, ich habe eine Golf-Programmiersprache geschrieben. :)
Nachdem ich versucht habe, dies zu schreiben, habe ich noch einige integrierte Funktionen hinzugefügt / optimiert, damit es vernünftigere Möglichkeiten gibt, zwischen einem Leerzeichen und einem Sternchen als "
7#
" zu unterscheiden . Es ist ein Glück, dass es immer noch geklappt hat (dies verwendet nur Funktionen aus v0.2.8, die ich vor drei Tagen zugesichert habe).quelle
Oktave, 23 Bytes
Probieren Sie es online!
quelle
@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)
, wobeis
es sich um ein Zellenarray handelt, nicht um ein Stringarray. Die Verwendung von regulären Ausdrücken oder Ähnlichem wäre wahrscheinlich kürzer, aber die Methode, die ich geschrieben habe, ist vergleichbar mit der Methode in dieser Antwort nur für das alte MATLABJelly ,
119 BytesProbieren Sie es online!
Ein- und Ausgänge als Zeilenliste.
-2 Bytes dank @EriktheOutgolfer und @JonathanAllan
Wie es funktioniert
quelle
7$€
kann sein€7
ṫ€7Ḣ⁼¥Ðf⁶
PowerShell , 32 Byte
Probieren Sie es online!
Pipeline-Eingaben werden als ein Array von Zeichenfolgen eingegeben,
-replace
funktionieren für jede Zeichenfolge und werden-ne ''
(ungleich einer leeren Zeichenfolge) auf ein Array angewendet, um die Leerzeilen herauszufiltern.quelle
C
635955484746 BytesVielen Dank an " einen anonymen Benutzer ", der ein weiteres Byte entfernt hat.
Vielen Dank an Felix Palmen , der mich daran erinnert hat, dass das siebte Zeichen immer ein Sternchen oder ein Leerzeichen ist .
Verwenden Sie wie:
Probieren Sie es online!
quelle
Eigentlich 13 Bytes
Die Ein- und Ausgabe erfolgt als Liste von Strings.
Erläuterung:
Probieren Sie es online!
quelle
Gaia , 9 Bytes
Eine Funktion, die eine Liste von Zeichenfolgen akzeptiert und eine Liste von Zeichenfolgen zurückgibt.
Probieren Sie es online!
Erläuterung
quelle
⁈
und«
sind beide 1 Zeichen. Unsere Golfsprachen, die Nicht-ASCII-Zeichen verwenden (möglicherweise mit Ausnahme von Neim), verwenden benutzerdefinierte Codierungen, mit denen alle Nicht-ASCII-Zeichen als einzelne Bytes gezählt werden können. Hier ist Gaias Codepage .Pyth , 9 Bytes
Beachten Sie, dass dies nur funktioniert , wenn mindestens 1 Zeile ist nicht ein Kommentar und mindestens 1 Zeile ist ein Kommentar. Alle anderen Lösungen funktionieren in allen Fällen.
-2 Bytes dank @pizzakingme !
Probieren Sie es hier aus!
Erläuterung
Pyth , 11 Bytes
Probieren Sie es hier aus!
Erläuterung
Pyth , 11 Bytes
Probieren Sie es hier aus!
Erläuterung
Pyth , 12 Bytes
Probieren Sie es hier aus!
Erläuterung
Pyth , 12 Bytes
Probieren Sie es hier aus!
Erläuterung
quelle
m>d7.m@b6
sollte bei 9 Bytes arbeiten und missbrauchen, dass*
nach dem Leerzeichen in lexikografischer Reihenfolge istGNU Sed, 19 + 2 = 21 Zeichen
Erfordert das
-E
Argument,sed
um erweiterte reguläre Ausdrücke zu aktivieren.quelle
s/^.{6}( |.*)//g
Java 8, 40 Bytes
Reguläre Ausdrücke: fast, aber nicht ganz das falsche Werkzeug für den Job. Lambda von
String
bisString
(zuordnen zuFunction<String, String>
). Die Eingabe muss eine nachgestellte Newline haben.Probieren Sie es online
Danksagung
quelle
Haskell ,
2725 BytesLaikonis Version ist kürzer als meine:
Probieren Sie es online!
Meine Version:
Probieren Sie es online!
quelle
f n=[x|' ':x<-drop 6<$>n]
.C (GCC) ,
534846 ByteProbieren Sie es online!
-5 Bytes: Es war sehr schwierig, dieses " ganze Programm " auf die Größe von Gurkas Funktion zu bringen . Es schreibt jetzt außerhalb der Grenzen (in beide Richtungen) eines Arrays von falschem Typ und verlässt sich auf Little-Endian- und 4-Byte-Ganzzahlen , um den Stern zu finden ... aber hey, es funktioniert;)
-2 Bytes: Nun, wenn wir schon zu einem gewissen „random“ schreiben
.bss
Lage, warum ein plagen erklärt Array an alle! Hier kommt also das Zeichenketten-Bearbeitungsprogramm, das weder denchar
Typ noch ein Array verwendet.quelle
*x&2
machte mich daran erinnern, so soll ich in der Lage sein , einige Bytes aus meiner Antwort :-) rasieren „Sie können das siebte Zeichen annehmen , ist immer ein Sternchen oder ein Raum.“R
4745 Bytesquelle
pe=T
Argument auch fallen lassen . Ich bin mir jedoch nicht sicher, ob die Eingabe als Liste von Zeichenfolgen zulässig ist.Input or output may be a matrix or list.
SNOBOL4 (CSNOBOL4) ,
72706650 BytesProbieren Sie es online!
Die Mustererkennung in SNOBOL unterscheidet sich stark von regulären Ausdrücken, aber die Idee hier ist immer noch dieselbe: Wenn eine Zeile mit "sechs Zeichen und dann einem Stern" übereinstimmt, entfernen Sie sie, andernfalls entfernen Sie die ersten sieben Zeichen der Zeile und drucken Sie das Ergebnis.
Dies nutzt den bedingten Zuweisungsoperator von SNOBOL jetzt tatsächlich besser aus.
Das Muster
POS(6) (' ' REM . OUTPUT | '*')
wird interpretiert als:Ordnen Sie ab Position 6 ein Leerzeichen oder ein Sternchen zu, und weisen Sie, wenn Sie einem Leerzeichen entsprechen, den Rest der Zeile zu
OUTPUT
.quelle
Vim, 14 Bytes
Ctrl-V
G5ld:%g/\*/d
EnterLaden Sie die Eingabedatei als zu bearbeitenden Puffer und geben Sie die obigen Befehle ein. Ausgabe ist der neue Puffer.
quelle
Ruby ,
39383629232220 + 1 = 21 BytesProbieren Sie es online!
Verwendet
-p
Flagge.Erläuterung:
Das
-p
Flag fügt einen impliziten Block um den Code hinzu, sodass der Code, der tatsächlich ausgeführt wird, folgendermaßen aussieht:gets
Liest eine Textzeile und speichert das Ergebnis in$_
.$_[/.../]=''
Entfernt das erste Auftreten des regulären Ausdrucks...
in$_
./.{6}( |.*\n)/
Stimmt mit 6 Zeichen am Zeilenanfang überein, gefolgt von einem Leerzeichen oder dem Rest der Zeile. Da das Leerzeichen zuerst angezeigt wird, werden nur die ersten 6 Zeichen und ein Leerzeichen entfernt, bevor versucht wird, die gesamte Zeile zu entfernen.$_
wird dann ausgedruckt und dieser Vorgang für jede Zeile wiederholt.quelle
Pyke , 9 Bytes
Probieren Sie es hier aus!
Lesbar:
Probieren Sie es hier aus!
quelle
Retina ,
2315 Bytes5 Byte dank nmjcman101 gespeichert
1 Byte dank Neil gespeichert
Probieren Sie es online!
quelle
JavaScript (ES6), 48 Byte
Probieren Sie es online!
quelle
z
, was hier nicht zulässig ist. Sie könnten es jedoch in eine anonyme Pfeilfunktion umwandeln, um es gültig zu machen.(
und)
um die FN gelten. Sie wurden zur Sicherheit hinzugefügt.()
um die Funktion, aber sonst sieht es gut aus.> <>,
5753 Bytesversuche es online
Erläuterung
Edit: 53 Bytes
Grundsätzlich das gleiche Zeug wie zuvor, aber leicht umstrukturiert
Als Randnotiz: Ich bin enttäuscht, dass noch niemand dies in Cobol getan hat.quelle
C #,
160 145 9089 BytesVielen Dank an Pavel & auhmaan für die Verkleinerung.
quelle
t=>{...}
func<string, string>
.Python 3, 71 Bytes (kein regulärer Ausdruck)
Es klappt!
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
quelle
.$
gab es damals nicht. : PJavaScript,
4434 BytesDie durchgestrichene 44 ist immer noch die reguläre 44.
6 Bytes gespart dank tsh
Probieren Sie es online!
quelle
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
s.match(/(?<=^.{6} ).*/mg)
ESNext (Nonstandard, Stage3) Chrome62 +?
nach\n
).C ++ (GCC),
121112 BytesDanke an @gurka für das Speichern von 9 Bytes!
Nimmt die Eingabe als eine Liste von Zeilen.
Probieren Sie es online!
quelle
#import
? Ich denke auch, dass es in Ordnung ist, Standard-Includes wegzulassen.#import
ist kein Standard-C ++, aber zumindest GCC und MSVC unterstützen es. Das Weglassen einiger Includes funktioniert mit C, aber nicht mit C ++. Der Code funktioniert nicht ohne die Includes, daher müssen sie im gesamten bytecount mitgezählt werden.import
in Python-Antworten oderusing
in C # -Antworten keine finden .#include <bits/stdc++.h>
Wäre Ihre Antwort auch nicht kürzer?system.foo()
alsusing system;foo()
Java 8,
955453 Bytes-42 Bytes dank @ OliverGrégoire , mit einem
Stream<String>
anstelle vonString
als Ein- und Ausgang.Erläuterung:
Probieren Sie es hier aus.
quelle
String[]
oderList<String>
als Eingabe für -12 Bytes verwenden.Stream<String>
ob das helfen kann. Beispiel:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))
für 54 Bytes.<42
anstelle von!=42
"Sie können davon ausgehen, dass das siebte Zeichen immer ein Sternchen oder ein Leerzeichen ist."