COBOL es un idioma muy antiguo, al momento de escribirlo tiene 58 años. Es tan viejo, de hecho, que tiene una peculiaridad muy interesante: los primeros seis caracteres de cada línea son comentarios.
¿Por qué es esto, preguntas? Bueno, esos 6 caracteres estaban destinados a ser utilizados como números de línea, en aquellos días en que los programas no eran completamente digitales y se escribían en una computadora.
Además, el séptimo carácter solo podría ser parte de un conjunto muy pequeño (generalmente es *
comentar la línea o un espacio para separar el número de línea del código)
Pero, ¿qué pasa si estás en un sistema más digital y solo quieres el programa en bruto?
El sistema de comentarios
Hay dos tipos de comentarios en COBOL: comentarios de línea y los comentarios de "número de línea" antes mencionados.
Descomentar los números de línea es simple: simplemente quite los primeros siete caracteres (seis más un espacio) de cada línea.
000000 apple
000001 banana
celery donuts
se convertiría:
apple
banana
donuts
Los comentarios de línea lo hacen un poco más difícil. Se inicia un comentario de línea con un asterisco *
colocado en la posición del séptimo carácter en la línea, así:
000323* this is a comment
Este no es un comentario de línea:
*00000 this isn't a comment
Para descomentar un comentario de línea, simplemente elimine toda la línea.
Un ejemplo comentado "programa":
000000 blah blah
000001* apples
000002 oranges?
000003* yeah, oranges.
000*04 love me some oranges
La versión no comentada:
blah blah
oranges?
love me some oranges
En otras palabras, para descomentar una cadena, elimine los primeros seis caracteres de cada línea, luego devuelva todos menos el primer carácter de cada línea que no comience con una estrella.
El reto
Cree un programa o función que tome un programa comentado y devuelva su variante no comentada.
Aclaraciones
- Los asteriscos (
*
) nunca se encontrarán en ningún lugar fuera de los primeros siete caracteres de una línea (no le pedimos que verifique la sintaxis) - Cada línea siempre tendrá al menos 7 caracteres.
- Puede suponer que el séptimo carácter es siempre un asterisco o un espacio.
- La entrada o salida puede ser una matriz o una lista.
- Solo se deben manejar los caracteres ASCII imprimibles (más la nueva línea).
- Puede generar una nueva línea final. También puede suponer que la entrada tendrá una nueva línea final, si así lo desea.
Puntuación
Como se trata de código de golf , ¡la respuesta con la menor cantidad de bytes gana!
DESCARGO DE RESPONSABILIDAD: en realidad no conozco COBOL y no pretendo hacerlo. Si alguna de las afirmaciones sobre COBOL que he hecho en esta pregunta es incorrecta, no me hago responsable.
*
. ¿Es esto una coincidencia?Respuestas:
COBOL (GnuCOBOL), 191 + 17 = 208 bytes
"Aprendí" COBOL para esta respuesta, por lo que probablemente no esté totalmente golfizado.
Este es un programa completo, que toma información sobre lo que presumo que es entrada estándar y escribe sobre lo que presumo que es salida estándar. Quizás algún día volveré a esto y (1) determinaré si COBOL tiene funciones y, de ser así, (2) veré si una solución de función sería más corta.
El recuento de bytes incluye indicadores de programa y compilador (
-free
y-frelax-syntax
).Pruébalo en línea
Programa sin golf
Limitaciones
La salida es, técnicamente hablando, no correcta. De mi investigación superficial, parece que la única forma práctica de almacenar una cadena en COBOL es en un búfer de tamaño fijo. Elegí un tamaño de búfer de 80 caracteres, ya que este es el límite de longitud de línea para programas de formato fijo. Esto presenta dos limitaciones:
Supongo que esto es aceptable ya que, bueno, es COBOL. Si no, estaría dispuesto a buscar alternativas.
Expresiones de gratitud
fuente
Python 2 ,
393837 bytes-1 byte gracias a LyricLy. -1 byte gracias a Mego.
Pruébalo en línea!
E / S como listas de cadenas.
fuente
!=
con<
, ya que el punto de código de un espacio es más bajo que el de un asterisco, y el séptimo carácter siempre será un espacio o un asterisco.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 con las sugerencias de Pavel
Pruébalo en línea!
fuente
(\*.*$| )
con( |.*)
/ /;$_=/\* /?$,:$'
es otra alternativa^
.V ,
131110 bytesPruébalo en línea!
Explicación
Hexdump:
fuente
7x
lugar de6x<<
?*
*
primero y luego hacerloÎ7x
? (suponiendo que un * no puede no estar en los caracteres 0-5)*
en los primeros 6 caracteres.Paradoc (v0.2.8 +), 8 bytes (CP-1252)
Toma una lista de líneas y da como resultado una lista de líneas no comentadas.
Explicación:
Hola, escribí un lenguaje de programación de golf. :)
Todavía estoy desarrollando esto y agregué / modifiqué un montón de elementos incorporados después de intentar escribir esto para que haya formas más razonables de diferenciar entre un espacio y un asterisco que "
7#
", pero siento que eso haría que esto no sea competitivo. Es una suerte que todavía funcionó (esto solo usa características de v0.2.8, que cometí hace tres días).fuente
Octava, 23 bytes
Pruébalo en línea!
fuente
@(s)cellfun(@(r)r(8:end),s(cellfun(@(r)r(7)~=42,s)),'uniformoutput',false)
, dondes
hay una matriz de celdas, no una matriz de cadenas. Usar regexp o algo probablemente sería más corto, pero el método que he escrito es comparable a la metodología en esta respuesta solo para el viejo MATLABJalea ,
119 bytesPruébalo en línea!
Entradas y salidas como una lista de líneas.
-2 bytes gracias a @EriktheOutgolfer y @JonathanAllan
Cómo funciona
fuente
7$€
puede ser€7
ṫ€7Ḣ⁼¥Ðf⁶
PowerShell , 32 bytes
Pruébalo en línea!
La entrada de canalización viene como una matriz de cadenas,
-replace
funciona en cada cadena y-ne ''
(no es igual a una cadena vacía) aplicada a una matriz, actúa para filtrar las líneas en blanco.fuente
C,
635955484746 bytesGracias a " un usuario anónimo " por deshacerse de otro byte.
Gracias a Felix Palmen por recordarme " Puede suponer que el séptimo carácter es siempre un asterisco o un espacio ", lo que redujo un byte más.
Usar como:
Pruébalo en línea!
fuente
En realidad , 13 bytes
La entrada y salida se realiza como una lista de cadenas.
Explicación:
Pruébalo en línea!
fuente
Gaia , 9 bytes
Una función que acepta una lista de cadenas y devuelve una lista de cadenas.
Pruébalo en línea!
Explicación
fuente
⁈
y«
ambos son 1 personaje. Los lenguajes de golf que usan caracteres no ascii (tal vez excepto Neim) usan codificaciones personalizadas, que permiten que todos esos no ASCII se cuenten como bytes individuales. Aquí está la página de códigos de Gaia .Pyth , 9 bytes
Tenga en cuenta que esto solo funciona si al menos 1 línea no es un comentario y al menos 1 línea es un comentario. Todas las demás soluciones funcionan en todos los casos.
-2 bytes gracias a @pizzakingme !
Pruébalo aquí!
Explicación
Pyth , 11 bytes
Pruébalo aquí!
Explicación
Pyth , 11 bytes
Pruébalo aquí!
Explicación
Pyth , 12 bytes
Pruébalo aquí!
Explicación
Pyth , 12 bytes
Pruébalo aquí!
Explicación
fuente
m>d7.m@b6
debería funcionar a 9 bytes, abusando*
después del espacio en orden lexicográficoGNU Sed, 19 + 2 = 21 caracteres
Requiere
-E
argumento parased
habilitar expresiones regulares extendidas.fuente
s/^.{6}( |.*)//g
Java 8, 40 bytes
Expresiones regulares: casi, pero no del todo, la herramienta incorrecta para el trabajo. Lambda de
String
aString
(asignar aFunction<String, String>
). La entrada debe tener una nueva línea final.Pruébalo en línea
Expresiones de gratitud
fuente
Haskell ,
2725 bytesLa versión de Laikoni es más corta que la mía:
Pruébalo en línea!
Mi version:
Pruébalo en línea!
fuente
f n=[x|' ':x<-drop 6<$>n]
.C (gcc) ,
534846 bytesPruébalo en línea!
-5 bytes: fue muy difícil reducir este " programa completo " al mismo tamaño que la función de gurka . Ahora está escribiendo fuera de los límites (en ambas direcciones) de una serie de tipos incorrectos y se basa en pequeños endianos y enteros de 4 bytes para encontrar el asterisco ... pero bueno, funciona;)
-2 bytes: Bueno, si ya escribimos en alguna
.bss
ubicación "aleatoria" , ¿por qué molestarse en declarar una matriz ? Así que aquí viene el programa de manejo de cadenas que no usa ni elchar
tipo ni una matriz.fuente
*x&2
me hizo recordar "Puede suponer que el séptimo carácter es siempre un asterisco o un espacio", por lo que debería ser capaz de eliminar algunos bytes de mi respuesta :-)R,
4745 bytesfuente
pe=T
argumento. Sin embargo, no estoy seguro de si se permite la entrada como una lista de cadenas.Input or output may be a matrix or list.
SNOBOL4 (CSNOBOL4) ,
72706650 bytesPruébalo en línea!
La coincidencia de patrones en SNOBOL es bastante diferente de la expresión regular, pero la idea aquí sigue siendo la misma: si una línea coincide con "seis caracteres y luego un asterisco", elimínela; de lo contrario, elimine los primeros siete caracteres de la línea e imprima el resultado.
Esto ahora aprovecha mejor el operador de asignación condicional de SNOBOL.
El patrón es el
POS(6) (' ' REM . OUTPUT | '*')
que se interpreta como:Comenzando en la posición 6, haga coincidir un espacio o un asterisco, y si coincide con un espacio, asigne el resto de la línea a
OUTPUT
.fuente
Vim, 14 bytes
Ctrl-V
G5ld:%g/\*/d
EnterCargue el archivo de entrada como el búfer para editar, luego ingrese los comandos anteriores. La salida es el nuevo búfer.
fuente
Ruby ,
39383629232220 + 1 = 21 bytesPruébalo en línea!
Usa
-p
bandera.Explicación:
El
-p
indicador agrega un bloque implícito alrededor del código, por lo que el código que realmente se ejecuta se ve así:gets
lee una línea de texto y almacena su resultado en$_
.$_[/.../]=''
elimina la primera aparición de la expresión regular...
en$_
./.{6}( |.*\n)/
coincide con 6 de cualquier carácter al comienzo de una línea, seguido de un espacio o el resto de la línea. Debido a que el espacio aparece primero, intentará eliminar solo los primeros 6 caracteres y un espacio antes de intentar eliminar la línea completa.$_
se imprime y este proceso se repite para cada línea.fuente
Pyke , 9 bytes
Pruébalo aquí!
Legible:
Pruébalo aquí!
fuente
Retina ,
2315 bytes5 bytes guardados gracias a nmjcman101
1 byte guardado gracias a Neil
Pruébalo en línea!
fuente
JavaScript (ES6), 48 bytes
Pruébalo en línea!
fuente
z
, lo que no está permitido aquí. Sin embargo, puede convertirlo en una función de flecha anónima para que sea válido.(
y sus)
alrededores, se agregaron para estar seguros.()
función alrededor, pero de lo contrario se ve bien.> <>,
5753 bytespruébalo en línea
Explicación
Editar: 53 bytes
Básicamente lo mismo que antes, pero reestructurado ligeramente
Como nota al margen: estoy decepcionado de que nadie haya hecho esto en cobol todavía.fuente
C #,
160145 9089 bytesGracias a Pavel & auhmaan por reducir el tamaño.
fuente
t=>{...}
func<string, string>
.Python 3, 71 bytes (sin expresión regular)
¡Funciona!
fuente
05AB1E , 11 bytes
Pruébalo en línea!
fuente
.$
no existía en ese entonces. : PJavaScript,
4434 bytesTachado 44 sigue siendo regular 44.
6 bytes guardados gracias a tsh
Pruébalo en línea!
fuente
s=>s.replace(/^.{6}( |\*.*\s)?/mg,'')
s.match(/(?<=^.{6} ).*/mg)
ESNext (no estándar, Etapa 3) Chrome62 +?
después\n
).C ++ (GCC),
121112 bytes¡Gracias a @gurka por guardar 9 bytes!
Toma la entrada como una lista de líneas.
Pruébalo en línea!
fuente
#import
? Además, creo que está bien omitir las inclusiones estándar.#import
no es C ++ estándar, pero al menos GCC y MSVC lo admiten. Omitir algunos incluye trabajos con C, pero no con C ++. El código no funciona sin las inclusiones, por lo que deben contarse en el total de bytes.import
en las respuestas de Python ousing
en las respuestas de C #. Además, ¿no#include <bits/stdc++.h>
sería más corto para su respuesta?system.foo()
queusing system;foo()
Java 8,
955453 bytes-42 bytes gracias a @ OliverGrégoire , utilizando un en
Stream<String>
lugar deString
como entrada y salida.Explicación:
Pruébalo aquí.
fuente
String[]
oList<String>
como entrada para -12 bytes.Stream<String>
si eso puede ayudar. Ejemplo:s->s.map(x->x.charAt(6)!=42?x.substring(7):"")
s->s.filter(x->x.charAt(6)!=42).map(x->x.substring(7))
por 54 bytes.<42
lugar de!=42
porque "Puede suponer que el séptimo carácter es siempre un asterisco o un espacio".