Kommentiere ein COBOL-Programm aus!

64

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 , 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.

Textlich
quelle
23
Zeilennummern sind keine Kommentare. Sie sind eine Säule. Terminologie bitte.
user207421
1
Ihre Beispiele haben alle ein Leerzeichen nach dem *. Ist das ein Zufall?
Neil
6
Alt bedeutet nicht automatisch schlecht. Ich habe in einem Agile COBOL-Shop gearbeitet. Sie konnten Dinge auf der AS / 400 erledigen, die wir in Java nicht erledigen konnten.
Thorbjørn Ravn Andersen
1
Heh ... Ich habe tatsächlich einen COBOL CopyBook-Parser geschrieben, der nur funktioniert, wenn die Felder nicht gepackt sind. Wandelt es einfach in JSON um key:{key:{key:length,key:length}}. Entfernt jedoch alle Formatierungs- und Typisierungsdaten.
Magic Octopus Urn
4
Kann es ein Leerzeichen in den ersten 6 Zeichen geben?

Antworten:

104

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 ( -freeund -frelax-syntax).

program-id.c.select i assign keyboard line sequential.fd i. 1 l pic X(80). 88 e value 0.open input i perform until e read i end set e to true end-read if not e and l(7:1)<>'*'display l(8:73).

Probieren Sie es online

Ungolfed-Programm

program-id. c.

select i assign to keyboard organization line sequential.

fd i.
    1 l pic X(80).
    88 e value 0.

open input i
perform until e
    read i
        end set e to true
    end-read
    if not e and l(7:1) <> '*'
        display l(8:73).

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:

  • Zeilen, die länger als 80 Zeichen sind, werden abgeschnitten.
  • Zeilen, die kürzer als 80 Zeichen sind, werden mit Leerzeichen rechts aufgefüllt.

Ich denke, das ist akzeptabel, denn es ist COBOL. Wenn nicht, wäre ich bereit, nach Alternativen zu suchen.

Danksagung

  • -166 Bytes dank Edward H.
  • -2 Bytes dank hornj
Jakob
quelle
10
Sternchen (*) werden niemals außerhalb der ersten sieben Zeichen in einer Zeile gefunden ... und doch ...;)
Cœur
@ Cœur Haha ja ... aber meine Lösung verwendet diese Annahme nicht, also ist es vielleicht angebracht!
Jakob
8
Sie gewinnen ein Internet.
Joshua
@ Cœur außer in einer COMPUTE-Anweisung.
ClickRick
1
Herzlichen Glückwunsch zu Ihrem goldenen Abzeichen!
Caird Coinheringaahing
20

Python 2 , 39 38 37 Bytes

-1 Byte dank LyricLy. -1 Byte dank Mego.

lambda s:[i[7:]for i in s if'*'>i[6]]

Probieren Sie es online!

I / O als Liste von Strings.

total menschlich
quelle
2
Speichern Sie ein Byte durch Ersetzen !=mit <, da einen Codepunkt des Raumes niedriger ist als ein jemandes Sternchen, und das siebte Zeichen wird immer ein Platz oder ein Sternchen sein.
Text
Das 7. Zeichen ist also immer ein Leerzeichen oder ein Sternchen?
Totalhuman
Ja. You may assume the seventh character is always an asterisk or a space.
Text
1
Speichern Sie 1 Byte mitif'*'!=i[6]
Mego
13

Perl 5 , 19 + 1 (-p) = 20 16 Bytes

-4 Bytes mit Pavel's Vorschlägen

s/.{6}( |.*)//s

Probieren Sie es online!

Xcali
quelle
2
Sie können drei Bytes speichern , wenn Sie ersetzen (\*.*$| )mit( |.*)
Pavel
Nicht so kurz wie @ Pavels Kommentar, aber / /;$_=/\* /?$,:$'eine weitere Alternative
Dom Hastings
Das brauchst du auch nicht ^.
Pavel
11

V , 13 11 10 Bytes

Î6x<<
çª/d

Probieren Sie es online!

Erläuterung

Î       ' On every line
  x     ' delete the first...
 6      ' 6 characters
   <<   ' and unindent the line (removes the leading space)
ç /     ' on every line
 ª      ' matching \*
   d    ' delete the line

Hexdump:

00000000: ce36 783c 3c0a e7aa 2f64                 .6x<<.../d
nmjcman101
quelle
Könnten Sie nicht 7xstatt 6x<<?
DJMcMayhem
1
Dann löscht es den*
nmjcman101
Würde es funktionieren, zuerst die Lins mit zu löschen *und dann zu tun Î7x? (vorausgesetzt, ein * kann nicht in den Zeichen 0-5)
12431234123412341234123
@ 12431234123412341234123 leider nein, da es *in den ersten 6 Zeichen eine geben kann.
Nmjcman101
9

Paradoc (v0.2.8 +), 8 Byte (CP-1252)

µ6>(7#;x

Nimmt eine Liste von Zeilen auf und führt zu einer Liste nicht kommentierter Zeilen.

Erläuterung:

μ        .. Map the following block over each line (the block is terminated
         .. by }, but that doesn't exist, so it's until EOF)
 6>      .. Slice everything after the first six characters
   (     .. Uncons, so now the stack has the 6th character on top
         .. and the rest of the line second
    7#   .. Count the multiplicity of factors of 7 in the character
         .. (treated as an integer, so '*' is 42 and ' ' is 32)
      ;  .. Pop the top element of the stack (the rest of the line)...
       x .. ...that many times (so, don't pop if the 6th character was a
         .. space, and do pop if it was an asterisk)

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).

betaveros
quelle
"Hallo, ich habe eine Golf-Programmiersprache geschrieben." Wurde die von Ihnen verwendete Version veröffentlicht, bevor oder nachdem diese Herausforderung veröffentlicht wurde?
Mast
1
Es funktioniert auf dieser Version von vor drei Tagen: github.com/betaveros/paradoc/releases/tag/v0.2.8
betaveros
Richtig, Sie haben das erwähnt, aber irgendwie wurde es nicht explizit registriert ...
Mast
1
@ Mast Es ist nicht wirklich wichtig.
Martin Ender
7

Oktave, 23 Bytes

@(s)s(s(:,7)~=42,8:end)

Probieren Sie es online!

rahnema1
quelle
4
Ich hätte nie gedacht, dass Octave solche Streicher spielen kann ... Nimm das, MATLAB. xD
Sanchises
Seit der Einführung von String-Arrays in R2016b bin ich mir ziemlich sicher, dass dies auch in MATLAB @Sanchises funktionieren würde! Ich habe momentan nur Zugriff auf R2015b, kann dies aber nicht bestätigen. MATLAB kann dies in 74 Bytes tun, wahrscheinlich weniger @(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false), wobei ses 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 MATLAB
Wolfie
6

Jelly , 11 9 Bytes

ṫ€7Ḣ⁼¥Ðf⁶

Probieren Sie es online!

Ein- und Ausgänge als Zeilenliste.

-2 Bytes dank @EriktheOutgolfer und @JonathanAllan

Wie es funktioniert

ṫ€7Ḣ=¥Ðf⁶
 €           On each line:
ṫ 7            Replace the line with line[7:]
      Ðf     Keep all lines that meet condition:
     ¥         Dyad:
   Ḣ             First Element (modifies line)
    =            Equals
        ⁶    Space
fireflame241
quelle
7$€kann sein€7
Erik der Outgolfer
Nehmen Sie es auf 9 wie folgt:ṫ€7Ḣ⁼¥Ðf⁶
Jonathan Allan
5

PowerShell , 32 Byte

$input-replace'^.{6}( |.*)'-ne''

Probieren Sie es online!

Pipeline-Eingaben werden als ein Array von Zeichenfolgen eingegeben, -replacefunktionieren für jede Zeichenfolge und werden -ne ''(ungleich einer leeren Zeichenfolge) auf ein Array angewendet, um die Leerzeilen herauszufiltern.

TessellatingHeckler
quelle
4

C 63 59 55 48 47 46 Bytes

Vielen 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 .

f(char**a){for(;*a;++a)(*a)[6]&2||puts(*a+7);}

Verwenden Sie wie:

char** program = { "000000 apple", "000001 banana", "celery donuts", 0 };
f(program);

Probieren Sie es online!

simon
quelle
3

Eigentlich 13 Bytes

⌠6@tp' =*⌡M;░

Die Ein- und Ausgabe erfolgt als Liste von Strings.

Erläuterung:

⌠6@tp' =*⌡M;░
⌠6@tp' =*⌡M    for each line:
 6@t             discard the first 6 characters
    p            pop the first character of the remainder
     ' =         is it a space?
        *        multiply the string by the boolean - returns the string if true, and an empty string if false
           ;░  filter out empty strings

Probieren Sie es online!

Mego
quelle
3

Gaia , 9 Bytes

6>¦'*«⁈ḥ¦

Eine Funktion, die eine Liste von Zeichenfolgen akzeptiert und eine Liste von Zeichenfolgen zurückgibt.

Probieren Sie es online!

Erläuterung

6>¦        Remove the first 6 characters of each string
   '*«⁈    Filter out ones that start with *
       ḥ¦  Remove the initial space from each
Geschäfts-Katze
quelle
Ich zähle zehn Zeichen und da drei keine ASCII-Zeichen sind, nehmen sie nicht mehr als ein Byte ein?
WGroleau
@WGroleau 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 .
Mr. Xcoder
@ Mr.Xcoder Neim hat auch eine Codierung.
Erik der Outgolfer
3

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 !

m>d7.m@b6

Probieren Sie es hier aus!

Erläuterung

m>d7.m@b6     - Full program with implicit input. Takes input as a list of Strings.

m>d7          - All but the first 7 letters of 
    .m   (Q)  - The input, filtered for its minimal value using the < operator on
      @b6     - the 7th character -- note that "*" is greater than " "
              - Implicitly Output the result.

Pyth , 11 Bytes

tMfqhTdm>d6

Probieren Sie es hier aus!

Erläuterung

tMfqhTdm> d6 - Volles Programm mit impliziter Eingabe. Übernimmt die Eingabe als Liste von Zeichenfolgen.

       m> d6 - Entfernen Sie die ersten 6 Zeichen jeder Zeile.
    hT - Holen Sie sich den ersten Charakter von jedem.
  fq d - Behalte diejenigen, die das erste Zeichen haben, mit einem Sternchen.
tM - Entfernen Sie jeweils das erste Zeichen.
            - Implizit ausgeben.

Pyth , 11 Bytes

m>d7fqd@T6Q

Probieren Sie es hier aus!

Erläuterung

m> d7fq @ T6dQ - Volles Programm. Übernimmt die Eingabe als Liste von Zeichenfolgen.

      @ T6 - Das sechste Zeichen von jedem.
    fq dQ - Behalte die Zeilen mit einem Leerzeichen als ^.
m> d7 - Beschneide die ersten 7 Zeichen.
             - Implizit ausgeben.

Pyth , 12 Bytes

tMfnhT\*m>d6

Probieren Sie es hier aus!

Erläuterung

tMfnhT \ * m> d6 - Volles Programm mit impliziter Eingabe. Übernimmt die Eingabe als Liste von Zeichenfolgen.

        m> d6 - Entfernen Sie die ersten 6 Zeichen jeder Zeile.
    hT - Holen Sie sich den ersten Charakter von jedem.
  fn \ * - Filtert diejenigen, die nicht einem Stern entsprechen.
tM - Entfernen Sie jeweils das erste Zeichen.
             - Implizit ausgeben.

Pyth , 12 Bytes

m>d7fn@T6\*Q

Probieren Sie es hier aus!

Erläuterung

m> d7fn @ T6 \ * Q - Volles Programm. Übernimmt die Eingabe als Liste von Zeichenfolgen.

      @ T6 - Ermittelt das sechste Zeichen jeder Zeichenkette
    fn \ * Q - Und filtere diejenigen, die nicht gleich einem Stern sind.
m> d7 - Beschneide die ersten 7 Zeichen.
              - Implizit ausgeben.
Mr. Xcoder
quelle
Behalte diejenigen, die das erste Zeichen haben, mit einem Sternchen. " Ich denke, du meintest „Behalte diejenigen, deren erstes Zeichen KEIN Sternchen ist."
Kevin Cruijssen
m>d7.m@b6sollte bei 9 Bytes arbeiten und missbrauchen, dass *nach dem Leerzeichen in lexikografischer Reihenfolge ist
Dave
Ich kann es mit Erklärung / Test-Link bearbeiten, wenn Sie wollen!
Dave
@pizzakingme Ich würde mich freuen, wenn du dich daran bearbeitest, denn ich bin auf dem Handy. Vielen Dank und vergessen Sie nicht, sich die neue Lösung zuzuschreiben!
Mr. Xcoder
Funktioniert dies, wenn alle Zeilen Zeilenkommentare sind? (Ich bin nicht sicher, ob Sie diesen Fall behandeln müssen)
betaveros
3

GNU Sed, 19 + 2 = 21 Zeichen

Erfordert das -EArgument, sedum erweiterte reguläre Ausdrücke zu aktivieren.

/^.{6}\*/d;s/^.{7}/
Daniel Schepler
quelle
Sie könnten das gleiche tun wie der Perl-Typ,s/^.{6}( |.*)//g
Markasoftware
3

Java 8, 40 Bytes

Reguläre Ausdrücke: fast, aber nicht ganz das falsche Werkzeug für den Job. Lambda von Stringbis String(zuordnen zu Function<String, String>). Die Eingabe muss eine nachgestellte Newline haben.

s->s.replaceAll("(?m)^.{6}( |.*\\n)","")

Probieren Sie es online

Danksagung

Jakob
quelle
Das richtige Werkzeug! :)
Olivier Grégoire
3

Haskell , 27 25 Bytes

Laikonis Version ist kürzer als meine:

f n=[x|' ':x<-drop 6<$>n]

Probieren Sie es online!

Meine Version:

f n=[drop 7x|x<-n,x!!6<'*']

Probieren Sie es online!

jferard
quelle
25 Bytes f n=[x|' ':x<-drop 6<$>n].
Laikoni
@ Laikoni Das ist schön !! Ich wusste nicht, dass es möglich ist, Muster in einem Generator eines Listenverständnisses abzugleichen.
jferard
3

C (GCC) , 53 48 46 Byte

x;main(y){for(y=&x;gets(y-6);x&2||puts(y+1));}

Probieren 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 .bssLage, warum ein plagen erklärt Array an alle! Hier kommt also das Zeichenketten-Bearbeitungsprogramm, das weder den charTyp noch ein Array verwendet.

Felix Palmen
quelle
Nett! Und das *x&2machte 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.“
simon
@ Gurka danke: D -2, hehe
Felix Palmen
3

R 47 45 Bytes

function(x)gsub("(?m)^.{6}( |.*\\n)","",x,,T)
Sven Hohenstein
quelle
Wenn Sie die Eingabe als eine Liste von Zeichenfolgen betrachten, können Sie die Regex für -6 auf "^. {6} (|. * ​​$)" Kürzen.
CriminallyVulgar
@CriminallyVulgar Richtig. In diesem Fall könnte ich das pe=TArgument auch fallen lassen . Ich bin mir jedoch nicht sicher, ob die Eingabe als Liste von Zeichenfolgen zulässig ist.
Sven Hohenstein
Aus dem OP:Input or output may be a matrix or list.
totalhuman
@ CriminallyVulgar Das Problem ist das Vorhandensein leerer Zeichenfolgen in der Ausgabe.
Sven Hohenstein
@SvenHohenstein Ah, das hatte ich natürlich nicht bedacht.
CriminallyVulgar
3

SNOBOL4 (CSNOBOL4) , 72 70 66 50 Bytes

R	INPUT POS(6) (' '  REM . OUTPUT | '*') :S(R)
END

Probieren 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.

Giuseppe
quelle
3

Vim, 14 Bytes

Ctrl-VG5ld:%g/\*/dEnter

Laden Sie die Eingabedatei als zu bearbeitenden Puffer und geben Sie die obigen Befehle ein. Ausgabe ist der neue Puffer.

David Heyman
quelle
2

Ruby , 39 38 36 29 23 22 20 + 1 = 21 Bytes

$_[/.{6}( |.*
)/]=''

Probieren Sie es online!

Verwendet -pFlagge.

Erläuterung:

Das -pFlag fügt einen impliziten Block um den Code hinzu, sodass der Code, der tatsächlich ausgeführt wird, folgendermaßen aussieht:

while gets
    $_[/.{6}( |.*
)/]=''

    puts $_
end

getsLiest 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.

Pavel
quelle
1
Methodenaufrufe in Ruby benötigen keine Klammern. Wenn Sie diese entfernen, sparen Sie ein Byte.
m-chrzan
2

JavaScript (ES6), 48 Byte

s=>s.map(c=>c[6]<"*"?console.log(c.substr(7)):1)

Probieren Sie es online!

sgtdck
quelle
1
Dies ist weder eine Funktion noch ein vollständiges Programm, da davon ausgegangen wird, dass die Eingabe in gespeichert ist z, was hier nicht zulässig ist. Sie könnten es jedoch in eine anonyme Pfeilfunktion umwandeln, um es gültig zu machen.
Caird Coinheringaahing
1
@cairdcoinheringaahing du hast absolut recht. Die Lösung wurde aktualisiert. Sie sind sich nicht sicher, welche Regeln für die (und )um die FN gelten. Sie wurden zur Sicherheit hinzugefügt.
Sgtdck
1
Sie brauchen das nicht ()um die Funktion, aber sonst sieht es gut aus.
Caird Coinheringaahing
2

> <>, 57 53 Bytes

>i~i~i~i~i~i~i67*=\
<o$/?:$/?=a:;?(0:i<
\~$/~\ $
/  <o\?/

versuche es online

Erläuterung

>i~i~i~i~i~i~i67*=    Read in the first seven bytes of the line
 i~i~i~i~i~i~         Read, and discard 6 characters
             i        Read the seventh
              67*=    Check if the seventh character was an 
                      asterisk (and leave that value on the stack );

<o$/?:$/?=a:;?(0:i<    Read characters until a newline or eof
                 i     Read the next character of the line
            ;?(0:      If it's a -1, terminate the program
       /?=a:           If it's a newline, break out of the loop
   /?:$                If the seventh character was not an asterisk
<o$                    Output this character
\~$/                   otherwise discard it

   /~\ $    Having reached the end of the line, output
/  <o\?/    the newline only if it was not a comment

Edit: 53 Bytes

>   i~i~i~i~i~i~i67*=\
/?=a<o/?$@:$@:$;?(0:i<
~   \~/

Grundsätzlich das gleiche Zeug wie zuvor, aber leicht umstrukturiert

Als Randnotiz: Ich bin enttäuscht, dass noch niemand dies in Cobol getan hat.

Sasha
quelle
2

C #, 160 145 90 89 Bytes

t=>{var o="";foreach(var s in i.Split('\n'))if(s[6]!=42)o+=s.Substring(7)+"\n";return o;}

Vielen Dank an Pavel & auhmaan für die Verkleinerung.

Schnarchen
quelle
Willkommen bei PPCG! Ich würde vorschlagen, einen Online- Testlink zu Ihrer Antwort hinzuzufügen , damit andere Ihren Code testen können. Ansonsten tolle erste (naja, zweite) Antwort!
Text
Sie können dies verkürzen, indem Sie ein Lambda in der Form schreibent=>{...}
Pavel
@LyricLy Ich habe versucht, das zu tun, aber aus irgendeinem Grund funktioniert das dort nicht. In einer VS-Konsolen-App funktioniert dies jedoch einwandfrei.
Schnarchen
@Pavel Wie so? Ich bin mir nicht sicher, ob ich es richtig gemacht habe. Ich habe noch nie einen Lambda-Ausdruck gebraucht.
Schnarchen
Ja genau. Sie können es testen, indem Sie es einem zuweisen func<string, string>.
Pavel
2

Python 3, 71 Bytes (kein regulärer Ausdruck)

def f(s):
 for w in s.split('\n'):
  t=w[6:]
  if t[0]!='*':print(t[1:])

Es klappt!

>>> s="""000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges"""
>>> f(s)
blah blah
oranges?
love me some oranges
Schütze
quelle
1

JavaScript, 44 34 Bytes

Die durchgestrichene 44 ist immer noch die reguläre 44.

6 Bytes gespart dank tsh

a=>a.replace(/^.{6}( |.*\n)/gm,'')

Probieren Sie es online!


quelle
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
Dienstag,
s.match(/(?<=^.{6} ).*/mg) ESNext (Nonstandard, Stage3) Chrome62 +
tsh
@tsh. Bis es einen stabilen Interpreter gibt, der dies erlaubt, zählt er vermutlich nicht als gültige Programmiersprache.
Es sieht nicht so aus, als ob dies die richtige Ausgabe ergibt, wenn die letzte Zeile eine Kommentarzeile ist.
LyricLy
@LyricLy. Das liegt daran, dass ich davon ausgegangen bin, dass die Eingabe immer eine nachgestellte neue Zeile enthält. Sie können sehen, dass es funktioniert, wenn nach der Eingabe eine leere Zeile steht. Wenn ich es nicht annehmen sollte, dann kostet fix 1 Byte (Zugabe ?nach \n).
1

C ++ (GCC), 121 112 Bytes

Danke an @gurka für das Speichern von 9 Bytes!

#import<bits/stdc++.h>
void f(std::list<std::string>l){for(auto s:l)if(s[6]-42)std::cout<<s.substr(7,s.size());}

Nimmt die Eingabe als eine Liste von Zeilen.

Probieren Sie es online!

Steadybox
quelle
#import? Ich denke auch, dass es in Ordnung ist, Standard-Includes wegzulassen.
Simon
#importist 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.
Steadybox
Aha, ich dachte, Sie könnten einfach Einschlüsse überspringen, da Sie importin Python-Antworten oder usingin C # -Antworten keine finden . #include <bits/stdc++.h>Wäre Ihre Antwort auch nicht kürzer?
Simon
@ Gurka Ja, es wäre kürzer. Vielen Dank!
Steadybox
@gurka die Importe werden in Python-Antworten gezählt, es ist nur so, dass Python viele Funktionen hat, die nicht importiert werden müssen. C # hat in der Regel keine using-Anweisung, da das Schreiben in der Regel kürzer ist system.foo()alsusing system;foo()
Pavel
1

Java 8, 95 54 53 Bytes

s->s.filter(x->x.charAt(6)<33).map(x->x.substring(7))

-42 Bytes dank @ OliverGrégoire , mit einem Stream<String>anstelle von Stringals Ein- und Ausgang.

Erläuterung:

Probieren Sie es hier aus.

s->                          // Method with Stream<String> as parameter and return-type
  s.filter(x->x.charAt(6)<33)//  Filter out all lines containing an asterisk as 7th char
   .map(x->x.substring(7))   //  And remove the first 7 characters from the remaining lines
                             // End of method (implicit / single-line body)
Kevin Cruijssen
quelle
Sieht so aus, als könnten Sie ein String[]oder List<String>als Eingabe für -12 Bytes verwenden.
Jakob
Oder Stream<String>ob das helfen kann. Beispiel:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
Olivier Grégoire
1
Oh, es muss gefiltert werden ... dann s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))für 54 Bytes.
Olivier Grégoire
1
Verwenden Sie <42anstelle von !=42"Sie können davon ausgehen, dass das siebte Zeichen immer ein Sternchen oder ein Leerzeichen ist."
Olivier Grégoire
1
@ OlivierGrégoire Ah, diese Regel habe ich verpasst, sonst hätte ich es selbst getan. Danke für die Korrektur.
Kevin Cruijssen