Le COBOL est une langue très ancienne. Au moment de la rédaction de cet article, il a 58 ans. Il est si vieux, en fait, qu’il a une bizarrerie très intéressante: les six premiers caractères de chaque ligne sont des commentaires.
Pourquoi est-ce que vous demandez? Eh bien, ces 6 caractères étaient destinés à être utilisés comme numéros de ligne, à l’époque où les programmes n’étaient pas entièrement numériques et tapés sur un ordinateur.
De plus, le septième caractère ne peut faire partie que d'un très petit ensemble (il s'agit généralement *
de commenter la ligne ou d'un espace pour séparer le numéro de ligne du code).
Mais que se passe-t-il si vous utilisez un système plus numérique et que vous souhaitez uniquement le programme brut?
Le système de commentaires
Il existe deux types de commentaires dans COBOL: les commentaires de ligne et les commentaires "numéro de ligne" susmentionnés.
Décommenter les numéros de ligne est simple: il suffit de prendre les sept premiers caractères (six plus un seul espace) de chaque ligne.
000000 apple
000001 banana
celery donuts
deviendrait:
apple
banana
donuts
Les commentaires de ligne rendent les choses un peu plus difficiles. Un commentaire de ligne commence par un astérisque *
placé au septième caractère de la ligne, comme suit:
000323* this is a comment
Ce n'est pas un commentaire de ligne:
*00000 this isn't a comment
Pour supprimer un commentaire de ligne, supprimez simplement la ligne entière.
Un exemple commenté "programme":
000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges
La version non commentée:
blah blah
oranges?
love me some oranges
En d'autres termes, pour supprimer la mise en commentaire d'une chaîne, supprimez les six premiers caractères de chaque ligne, puis renvoyez tous les caractères sauf le premier caractère de chaque ligne qui ne commence pas par une étoile.
Le défi
Créez un programme ou une fonction qui prend un programme commenté et renvoie sa variante non commentée.
Des clarifications
- Les astérisques (
*
) ne seront jamais trouvés en dehors des sept premiers caractères d'une ligne (nous ne vous demandons pas de vérifier la syntaxe) - Chaque ligne aura toujours au moins 7 caractères.
- Vous pouvez supposer que le septième caractère est toujours un astérisque ou un espace.
- L'entrée ou la sortie peut être une matrice ou une liste.
- Seuls les caractères ASCII imprimables (plus la nouvelle ligne) doivent être gérés.
- Vous pouvez sortir avec une nouvelle ligne. Vous pouvez également supposer que l'entrée aura un retour à la ligne de fin, si vous le souhaitez.
Notation
Puisqu'il s'agit de code-golf , la réponse avec le moins d'octets gagne!
DISCLAIMER: Je ne connais pas réellement COBOL et ne prétends pas le faire. Si l'une des affirmations que j'ai faites à propos de COBOL dans cette question est inexacte, je décline toute responsabilité.
*
. Est-ce une coïncidence?Réponses:
COBOL (GnuCOBOL), 191 + 17 = 208 octets
J'ai "appris" en COBOL pour cette réponse, donc ce n'est probablement pas complètement joué au golf.
Ceci est un programme complet, prenant en entrée ce que je présume être une entrée standard et en écrivant dans ce que je présume être une sortie standard. Peut-être qu'un jour, j'y reviendrai pour (1) déterminer si COBOL a des fonctions et, dans l'affirmative, (2) voir si une solution de fonction serait plus courte.
Le nombre d'octets inclut les indicateurs de programme et de compilateur (
-free
et-frelax-syntax
).Essayez-le en ligne
Programme non-golfé
Limites
La sortie est techniquement pas correcte. De mes recherches superficielles, il semble que le seul moyen pratique de stocker une chaîne en COBOL est dans un tampon de taille fixe. J'ai choisi une taille de tampon de 80 caractères, car il s'agit de la limite de longueur de ligne pour les programmes au format fixe. Cela présente deux limitations:
J'imagine que c'est acceptable car, bon, c'est du COBOL. Sinon, je serais prêt à chercher des solutions de rechange.
Remerciements
la source
Python 2 ,
393837 octets-1 octet grâce à LyricLy. -1 octet grâce à Mego.
Essayez-le en ligne!
I / O en tant que listes de chaînes.
la source
!=
par<
, car le point de code d'un espace est inférieur à celui d'un astérisque, et le septième caractère sera toujours un espace ou un astérisque.You may assume the seventh character is always an asterisk or a space.
if'*'!=i[6]
Perl 5 ,
19+ 1 (-p) =2016 octets-4 octets avec les suggestions de Pavel
Essayez-le en ligne!
la source
(\*.*$| )
par( |.*)
/ /;$_=/\* /?$,:$'
une autre alternative^
.V ,
131110 octetsEssayez-le en ligne!
Explication
Hexdump:
la source
7x
au lieu de6x<<
?*
*
abord et ensuite de le faireÎ7x
? (en supposant qu'un * ne peut pas ne pas être dans les caractères 0-5)*
dans les 6 premiers caractères.Paradoc (v0.2.8 +), 8 octets (CP-1252)
Prend une liste de lignes et génère une liste de lignes non commentées.
Explication:
Bonjour, j'ai écrit un langage de programmation pour le golf. :)
Je développe toujours ceci et a ajouté / peaufiné un tas de fonctions intégrées après avoir essayé de l'écrire afin qu'il y ait plus de façons raisonnables de différencier un espace et un astérisque que "
7#
", mais je pense que cela rendrait cela non compétitif. Heureusement que cela fonctionne toujours (cela utilise uniquement les fonctionnalités de la v0.2.8, que j'ai validées il y a trois jours).la source
Octave, 23 octets
Essayez-le en ligne!
la source
@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)
, où ses
trouve un tableau de cellules, pas un tableau de chaînes. Utiliser une expression rationnelle ou autre serait probablement plus court, mais la méthode que j'ai écrite est comparable à la méthodologie décrite dans cette réponse, rien que pour l'ancien MATLABGelée ,
11 à9 octetsEssayez-le en ligne!
Entrées et sorties sous forme de liste de lignes.
-2 octets grâce à @EriktheOutgolfer et @JonathanAllan
Comment ça fonctionne
la source
7$€
can be€7
ṫ€7Ḣ⁼¥Ðf⁶
PowerShell , 32 octets
Essayez-le en ligne!
L'entrée de pipeline se présente sous la forme d'un tableau de chaînes,
-replace
fonctionne sur toutes les chaînes et,-ne ''
(différente de la chaîne vide) appliquée à un tableau, agit pour filtrer les lignes vides.la source
C,
635955484746 octetsMerci à " un utilisateur anonyme " de se débarrasser d’un octet supplémentaire.
Merci à Felix Palmen de me rappeler " Vous pouvez supposer que le septième caractère est toujours un astérisque ou un espace ", ce qui a supprimé un octet de plus.
Utilisez comme:
Essayez-le en ligne!
la source
En fait , 13 octets
L'entrée et la sortie se font sous la forme d'une liste de chaînes.
Explication:
Essayez-le en ligne!
la source
Gaia , 9 octets
Fonction acceptant une liste de chaînes et renvoyant une liste de chaînes.
Essayez-le en ligne!
Explication
la source
⁈
et«
sont tous deux 1 caractère. Les langues de golf utilisant des caractères non-ascii (peut-être sauf Neim) utilisent des codages personnalisés qui permettent à tous ces non-ASCII d'être comptés comme un seul octet. Voici la page de code de Gaia .Pyth , 9 octets
Notez que cela ne fonctionne que si au moins 1 ligne n'est pas un commentaire et au moins 1 ligne est un commentaire. Toutes les autres solutions fonctionnent dans tous les cas.
-2 octets grâce à @pizzakingme !
Essayez-le ici!
Explication
Pyth , 11 octets
Essayez-le ici!
Explication
Pyth , 11 octets
Essayez-le ici!
Explication
Pyth , 12 octets
Essayez-le ici!
Explication
Pyth , 12 octets
Essayez-le ici!
Explication
la source
m>d7.m@b6
devrait fonctionner à 9 octets, en abusant*
après l'espace dans l'ordre lexicographiqueGNU Sed, 19 + 2 = 21 caractères
Requiert un
-E
argument poursed
activer les expressions régulières étendues.la source
s/^.{6}( |.*)//g
Java 8, 40 octets
Expressions régulières: à peu près, mais pas tout à fait, le mauvais outil pour le travail. Lambda de
String
àString
(attribuer àFunction<String, String>
). L'entrée doit avoir une fin de ligne.Essayez-le en ligne
Remerciements
la source
Haskell ,
27 à25 octetsLa version de Laikoni est plus courte que la mienne:
Essayez-le en ligne!
Ma version:
Essayez-le en ligne!
la source
f n=[x|' ':x<-drop 6<$>n]
.C (gcc) ,
534846 octetsEssayez-le en ligne!
-5 octets: Il était très difficile d'obtenir ce " programme entier " à la même taille que la fonction de gurka . Il écrit maintenant en dehors des limites (dans les deux sens) d'un tableau de type incorrect et s'appuie sur des entiers little endian et 4 octets pour trouver l'astérisque ... mais bon, ça marche;)
-2 octets: Eh bien, si nous écrivons déjà dans un
.bss
emplacement "aléatoire" , pourquoi se donner la peine de déclarer un tableau ? Voici donc le programme de traitement de chaîne qui n’utilise ni lechar
type ni un tableau.la source
*x&2
m'a rappelé: "Vous pouvez supposer que le septième caractère est toujours un astérisque ou un espace.", Je devrais donc être en mesure de réduire de quelques octets ma réponse :-)R,
4745 octetsla source
pe=T
argument. Cependant, je ne sais pas si l'entrée sous forme de liste de chaînes est autorisée.Input or output may be a matrix or list.
SNOBOL4 (CSNOBOL4) ,
72706650 octetsEssayez-le en ligne!
La recherche de motifs dans SNOBOL est assez différente de regex mais l’idée est la même: si une ligne correspond à "six caractères, puis à un astérisque", supprimez-la, sinon, supprimez les sept premiers caractères de la ligne et imprimez le résultat.
En fait, cela profite maintenant mieux de l’opérateur d’affectation conditionnel de SNOBOL.
Le motif est
POS(6) (' ' REM . OUTPUT | '*')
ce qui est interprété comme:En partant de la position 6, faites correspondre un espace ou un astérisque et, si vous correspondez à un espace, affectez le reste de la ligne à
OUTPUT
.la source
Vim, 14 octets
Ctrl-V
G5ld:%g/\*/d
EnterChargement du fichier d'entrée en tant que tampon à modifier, puis entrez les commandes ci-dessus. La sortie est le nouveau tampon.
la source
Ruby ,
39383629232220 + 1 = 21 octetsEssayez-le en ligne!
Utilise le
-p
drapeau.Explication:
L'
-p
indicateur ajoute un bloc implicite autour du code, de sorte que le code réellement exécuté se présente comme suit:gets
lit une ligne de texte et stocke son résultat dans$_
.$_[/.../]=''
supprime la première occurrence de la regex...
dans$_
./.{6}( |.*\n)/
correspond à 6 de n'importe quel caractère au début d'une ligne, suivi d'un espace ou du reste de la ligne. Étant donné que l'espace apparaît en premier, il essaiera de supprimer uniquement les 6 premiers caractères et un espace avant d'essayer de supprimer la ligne entière.$_
est ensuite imprimé et ce processus est répété pour chaque ligne.la source
Pyke , 9 octets
Essayez-le ici!
Lisible:
Essayez-le ici!
la source
Retina ,
2315 octets5 octets enregistrés grâce à nmjcman101
1 octet enregistrés grâce à Neil
Essayez-le en ligne!
la source
JavaScript (ES6), 48 octets
Essayez-le en ligne!
la source
z
, ce qui n'est pas autorisé ici. Vous pouvez toutefois le transformer en une fonction de flèche anonyme, afin de le rendre valide.(
et)
autour du fn, les a ajoutées pour en être sûr.()
fonction, mais sinon, ça a l'air bien.> <>,
5753 octetsessayez-le en ligne
Explication
Edit: 53 octets
Fondamentalement les mêmes choses qu'avant, mais légèrement restructuré
En note de côté: je suis déçu que personne ne l'ait encore fait en cobol.la source
C #,
160 145 9089 octetsMerci à Pavel & auhmaan pour avoir réduit la taille.
la source
t=>{...}
func<string, string>
.Python 3, 71 octets (pas d'expressions rationnelles)
Ça marche!
la source
05AB1E , 11 octets
Essayez-le en ligne!
la source
.$
n'existait pas à l'époque. : PJavaScript,
4434 octets44 barré est toujours régulier 44.
6 octets sauvés grâce à tsh
Essayez-le en ligne!
la source
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
s.match(/(?<=^.{6} ).*/mg)
ESNext (Non standard, Stage3) Chrome62 +?
après\n
).C ++ (GCC),
121112 octetsMerci à @gurka pour la sauvegarde de 9 octets!
Prend les entrées sous forme de liste de lignes.
Essayez-le en ligne!
la source
#import
? De plus, je pense qu'il est correct d'omettre les inclusions standard.#import
Ce n'est pas le standard C ++, mais au moins GCC et MSVC le supportent. Omettre certains inclus fonctionne avec C, mais pas avec C ++. Le code ne fonctionne pas sans les inclus, ils doivent donc être comptés dans le total des sous-comptes.import
réponse en python niusing
en réponse C #. Aussi, ne serait-il pas#include <bits/stdc++.h>
plus court pour votre réponse?system.foo()
queusing system;foo()
Java 8,
955453 octets-42 octets grâce à @ OliverGrégoire , en utilisant un
Stream<String>
au lieu deString
comme entrée et sortie.Explication:
Essayez-le ici.
la source
String[]
ouList<String>
comme entrée pour -12 octets.Stream<String>
si cela peut aider. Exemple:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))
pour 54 octets.<42
plutôt que!=42
parce que "vous pouvez supposer que le septième caractère est toujours un astérisque ou un espace".