A principios de esta semana, aprendimos sobre cómo formatear idiomas esotéricos para comentar. Hoy vamos a hacer lo contrario de eso. Necesito que escriba un programa o función que analice un código esotérico bien comentado y analice los comentarios, devolviendo solo el código. Usando algunos ejemplos del desafío anterior, así es como se ve el código bien comentado:
a #Explanation of what 'a' does
bc #Bc
d #d
e #Explanation of e
fgh #foobar
ij #hello world
k #etc.
l #so on
mn #and
op #so forth
Esto es lo que debe hacer para extraer el código. Primero, elimine el carácter de comentario ( #
), el espacio antes y todo después del carácter de comentario.
a
bc
d
e
fgh
ij
k
l
mn
op
Luego, contraiga cada línea hacia arriba en una sola línea. Por ejemplo, dado que b
está en la segunda columna de la línea dos, una vez que la colapsamos, estará en la segunda columna de la línea uno . Del mismo modo, c
se colocará en la tercera columna de la línea uno, y d
se colocará en la cuarta. Repita esto para cada personaje, y obtendrá esto:
abcdefghijklmnop
Nota importante: Parece que la solución trivial es simplemente eliminar los comentarios, eliminar todos los espacios y unir cada línea. ¡Este no es un enfoque válido! Debido a que el código original puede tener espacios, estos se eliminarán con este enfoque. Por ejemplo, esta es una entrada perfectamente válida:
hello #Line one
#Line two
world! #Line three
Y la salida correspondiente debe ser:
hello world!
El reto:
Escriba un programa o función que tome el código comentado como entrada, y envíe o devuelva el código con todos los comentarios analizados. Debe generar el código sin espacios finales, aunque se permite una nueva línea final. El carácter del comentario siempre será #
, y siempre habrá un espacio adicional antes de que comiencen los comentarios. #
será no aparecerá en la sección de comentarios de la entrada. Para simplificar el desafío, aquí hay algunas entradas que no tiene que manejar:
Puede suponer que el código no tendrá dos caracteres en la misma columna. Por ejemplo, esta es una entrada que viola esta regla:
a #A character in column one bc #Characters in columns one and two
También puede suponer que todos los caracteres de comentario aparecen en la misma columna. Por ejemplo, esta entrada:
short #this is a short line long #This is a long line
viola esta regla Esto también significa que
#
no estará en la sección de código.Y, por último, no tiene que manejar secciones de código con espacios iniciales o finales. Por ejemplo,
Hello, # World! #
También puede suponer que la entrada solo contiene caracteres ASCII imprimibles.
Ejemplos:
Input:
hello #Line one
#Line two
world! #Line three
Output:
hello world!
Input:
E #This comment intentionally left blank
ac #
h s #
ecti #
on is #
one c #
haracte #
r longer #
than the #
last! #
Output:
Each section is one character longer than the last!
Input:
4 #This number is 7
8 #
15 #That last comment is wrong.
16 #
23 #
42 #
Output:
4815162342
Input:
Hello #Comment 1
world #Comment 2
, #Comment 3
how #Comment 4
are #Comment 5
you? #Comment 6
Output:
Hello world, how are you?
Input:
Prepare #
for... #
extra spaces! #
Output:
Prepare for... extra spaces!
Puede ingresar datos en el formato razonable que desee, por ejemplo, una lista de cadenas, una sola cadena con líneas nuevas, una lista 2d de caracteres, etc. ¡La respuesta más corta en bytes gana!
hello world!
que ha mostrado)? Además, dice : "#
no aparecerá en la sección de comentarios de la entrada ", pero ¿puede ocurrir en el fragmento de código?do {stuff} while (condition);
con la explicación en ordendo while (condition); #Explainything
entonces{stuff} #Explainything
.Respuestas:
Jalea ,
87 bytesPruébalo en línea!
Cómo funciona
fuente
Python 2,
4843 bytes¡Gracias a @xnor por jugar golf 5 bytes!
Pruébalo en Ideone .
fuente
map(max,*x)
porquemax
toma cualquier número de argumentos yNone
es pequeño.map
se puede usar así ... ¡Gracias!`...`[2::5]
truco?`...`
es equivalente arepr(...)
, por lo que para la lista de cadenas singleton['a', 'b', 'c']
, obtienes la cadena"['a', 'b', 'c']"
. Finalmente,[2::5]
corta los primeros dos caracteres ("['"
) y toma cada quinto carácter de la cadena restante.JavaScript (ES6),
977560 bytesGracias a @Neil por ayudar al golf con 22 bytes
La entrada es una matriz de líneas.
a
es entrada de matrizp
es el artículo anteriorc
es el artículo actualm
es una cadena de coincidenciaso
está compensadofuente
m
indicador regexp es innecesario (¿tenía un$
en algún momento?) Como es el espacio en(p, c)
. Finalmente, creoreplace
que funcionará más corto que[...p].map().join
.length
script de usuario, tal vez no contó la nueva línea, pero solo porque accidentalmente incluí el punto;
que no es necesario (JavaScript tiene ASI).replace
que ayudaría mucho, ¡eso es genial!Perl,
353432 bytesIncluye +1 para
-p
Dar entrada sobre STDIN
eso.pl
Tenga en cuenta que hay un espacio después de la final
;
. El código funciona como se muestra, pero se reemplaza\0
por el carácter literal para obtener la puntuación reclamada.fuente
$a|=...
está bastante bien hecho, ¡me llevó un tiempo descubrir qué estabas haciendo! Sin embargo, una pregunta:*_=a
parece ser más o menos equivalente a$_=$a
¿por qué?*_=a
es una asignación glob muy oscura que alias los_
globales y losa
globales. Así que no es tanto una copia de$a
a$_
, pero a partir de ese momento (global)$a
y$_
son en realidad la misma variable. Todo para ahorrar 1 byte ...Python 2, 187 bytes
Voy a jugar al golf más mañana tengo la escuela;)
fuente
1 for
se puede reducir a1for
. Además, si la suma de la lista (en la línea 5) no puede ser negativa, puede verificar en<1
lugar de==0
. Feliz dia de escuela! : D +1.Ruby, 63 bytes
Básicamente un puerto de Dennis 'Jelly respuesta . Toma la entrada como una matriz de cadenas.
Véalo en eval.in: https://eval.in/640757
fuente
CJam , 12 bytes
Gracias a Sp3000 por guardar 2 bytes.
Un bloque sin nombre que toma una lista de cadenas (una para cada línea) y la reemplaza con una sola cadena.
Pruébalo en línea!
Explicación
fuente
J, 30 bytes
Toma una lista de cadenas como entrada. Básicamente usa el mismo enfoque que Dennis en su respuesta de Jelly.
Comentó y explicó
Pasos intermedios:
Caso de prueba
fuente
Javascript (ES6), 63 bytes
Toma la entrada como una matriz de cadenas.
fuente
Retina , 32 bytes
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
fuente
Pyke,
1510 bytesPruébalo aquí!
Puerto de la jalea respuesta
fuente
C #
157122 BytesGolfé 35 bytes gracias a @milk, aunque juro que lo intenté antes.
Toma la entrada como una matriz de caracteres en 2-d.
157 bytes:
fuente
Trim()
funcionar en lugar deTrimEnd()
? Aún mejor, creo que puede guardar muchos bytes usando s [0] como var de salida y usandoreturn new string(s[0],0,i)
wherei
es el índice del último carácter de código. Esa idea puede requerir dosfor
bucles en lugar delforeach
, lo pensaré más y trataré de escribir el código real más tarde hoy.Trim()
también se recortará desde el principio, lo que creo que no sería válido. Originalmente también estaba cargando en s [0] y tenía inti;
fuera del ciclo (para reutilizarlo en el retorno) que creo que finalmente agregó bytesPyth, 11 bytes
Un programa que toma la entrada de una lista de cadenas en STDIN e imprime una cadena.
Pruébalo en línea
Cómo funciona
fuente
sed, 126 bytes
Requiere una nueva línea al final de la entrada.
Estoy seguro de que puedo jugar al golf un poco más, pero estoy feliz de que funcione por ahora.
fuente
Perl 6 , 39 bytes
Traducción de la solución Python por Dennis .
Toma la entrada como una lista de cadenas y devuelve una cadena.
( pruébalo en línea )
fuente
Jalea , 27 bytes
Pruébelo en TryItOnline
Utiliza la especificación más estricta: el espacio adicional antes de que el carácter de comentario se elimine a costa de un byte.
La entrada es una lista de cadenas.
fuente
Ruby, 77 bytes
fuente
TSQL,
216175 bytesGolfizado:
Sin golf:
Violín
fuente
Javascript,
5634 bytes, no competidorComo @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ señaló, no estoy preparado para espacios adicionales
fuente
Dyalog APL , 22 bytes
La inspiración .
(
⎕UCS
representación de personajes de¯2↓
todos menos los dos últimos⍳∘35↑
hasta la posición de los primeros 35 ("#"), en lo que está fuera del paréntesis, tomado de⊢
lo que está fuera del paréntesis)
a saber...⌈⌿
los máximos columnares∘
de⎕UCS
los valores UnicodeTryAPL en línea!
fuente