Mucha gente en este sitio usa idiomas esotéricos , y dado que estos idiomas son inusuales y difíciles de entender, con frecuencia escriben una explicación en un formato determinado. Por ejemplo, si el código era
abcdefghijklmnop
Y este lenguaje usa #
para comentarios, escribirían una explicación como esta:
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
Con frecuencia también hago esto, pero cada vez que hago esto, siento que crear el diseño del texto es realmente desagradable y requiere mucho tiempo. Así que quiero que crees un "Esolang-Comment-Template-Generator" para mí. Por ejemplo, si ignoramos los comentarios, el código anterior tiene esta plantilla:
a #
bc #
d #
e #
fgh #
ij #
k #
l #
mn #
op #
El reto:
Debe escribir un programa o función que tome dos cadenas como entrada, y genere este "Esolang-Comment-Template". La primera entrada será el código, pero con barras ( |
) insertadas donde van las nuevas líneas. La segunda entrada es la que usaremos para los comentarios. Entonces nuestro último ejemplo tendría esto como entrada:
"a|bc|d|e|fgh|ij|k|l|mn|op", "#"
Desafortunadamente, esto excluye a las barras de ser parte de la entrada del código, pero está bien. Puede suponer que la entrada de comentarios será un solo carácter. Por simplicidad, el comentario char no será un bar. La entrada de código solo contendrá ASCII imprimible y no contendrá ninguna línea nueva.
Espero que pueda inferir qué hacer con los casos de prueba, pero intentaré aclarar algunas cosas.
Debe dividir la entrada de código en "secciones de código" en cada barra. Luego, cada sección de código se genera en su propia línea y se rellena a la izquierda con la longitud de todo el código anterior (sin incluir las barras). Luego, cada línea se rellena a la derecha con suficientes espacios para que los dos últimos caracteres de cada línea sean "Un espacio adicional" + "El carácter de comentario".
Se permite una nueva línea final.
Aquí hay otro ejemplo. Para la entrada
"Hello|World", "/"
La primera sección del código es "Hola" y la segunda es "Mundo". Entonces debería dar el resultado:
Hello /
World /
Aquí hay algunas muestras más:
Input:
"a|b|c|d|e|f|g", ","
Output:
a ,
b ,
c ,
d ,
e ,
f ,
g ,
Input:
"abcdefg", ":"
Output:
abcdefg :
Input:
"4|8|15|16|23|42", "%"
Output:
4 %
8 %
15 %
16 %
23 %
42 %
Input:
"E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!"
Output:
E !
ac !
h s !
ecti !
on is !
one c !
haracte !
r longer !
than the !
last! !
Input:
"This|Code|has||empty||sections", "@"
Output:
This @
Code @
has @
@
empty @
@
sections @
Reglas:
Puede tomar estas entradas y salidas en cualquier formato razonable. Por ejemplo, leer / escribir un archivo, STDIN / STOUT, argumentos de función / valor de retorno, etc. Como de costumbre, esto es código-golf , así que trate de hacer su código lo más corto posible y ganará si puede obtener la solución más corta ¡en tu idioma! También seleccionaré la solución más corta como el ganador general. Las lagunas estándar están prohibidas.
|
carácter sería bueno, por lo que puede explicarse|
)?Respuestas:
Pyth -
28272423 bytesPodría ser capaz de jugar un poco de golf.Mucho, aparentemente!Pruébelo en línea aquí .
fuente
Retina ,
3534 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Las dos cadenas de entrada están separadas por un espacio (que no es ambiguo ya que sabemos que el delimitador de comentarios es siempre un solo carácter).
Pruébalo en línea!
fuente
Java 10,
189159bytes-30 bytes convirtiendo Java 7 a Java 10 y optimizando los bucles.
Pruébalo en línea.
Explicación:
fuente
Pyke,
312824 bytesPruébalo aquí!
fuente
JavaScript (ES6), 92 bytes
fuente
GNU sed (85 + 1 para -r) 86
Las entradas son cadenas separadas por un espacio.
Pruebas:
input.txt:
Salida:
fuente
:
es una característica / error de GNU sed y\S
creo que es una extensión, por lo que tal vez el título debería serGNU sed
. Aparte de eso, gran código.Haskell,
139135 bytesSe guardaron 4 bytes al incluir una definición.
Sin golf:
fuente
Maravilloso,
120113111 Bytessin golf *
(Primer borrador con 120 bytes)
sin golf *
Pruebas
fuente
.padRight(s.replace('|','').size()+1)+c)
Python 2,
125 124132 bytes-1 byte gracias a @TuukkaX (se perdió el golf desde el espacio
i, v
)Todos los casos de prueba en ideona
fuente
c
como comentario char, no#
.Python 2,
10710510299 bytesProbado con todos los casos de prueba anteriores
EDITAR Golfed 2 bytes cambiando d = a.split ("|"); i = 0 to d, i = a.split ("|"), 0 No estoy seguro de cómo me perdí ese. Gracias @ Oliver Ni
Se han ido otros 3 bytes. Gracias de nuevo.
La sugerencia de @Jonathan en realidad ahorra 3 bytes y la lleva al 99 mágico. Gracias.
fuente
" "*i
para tener 2 byteslen(e)
gustefor e in d:z=len(e)....
guardar un byte porque se usa dos veces05AB1E ,
29383129 bytesDefinitivamente se puede jugar golf, pero al menos funciona ahora ...
+9 bytes porque
¡
(dividir) elimina los elementos vacíos automáticamente, así que tuve que agregar'|„ǝʒ:'ǝ¡'ʒм
...-2 bytes gracias a @MagicOctopusUrn al cambiar
'|„ǝʒ:'ǝ¡'ʒм
a'|¶:.BεðÜ}
(la solución actual no funciona en elementos con espacios finales, pero supongo que está permitido según los casos de prueba).Pruébalo en línea.
Explicación:
fuente
ǝʒ
.'|¶:.B
podría funcionar aunque'|¶:.B
?.B
una segunda vez después de agregar los espacios anteriores..B
presente.'|¶:.BεðÜ}εD®>úsg®+©s}.BεðIJ,
? 29 bytes. Volver a la iteración 1 :)..B
se divide en líneas nuevas, que es una característica que mucha gente no conoce. Es la única forma que conozco para mantener elementos vacíos. Solicitaría esto como una característica..¡
debería significar dividir, pero mantener elementos vacíos ..PowerShell v2 +,
10399 bytesToma la entrada como dos cadenas,
-split
es la primera en la tubería literal (ya que la división usa la sintaxis de expresiones regulares) y alimenta los elementos en un bucle|%{...}
.Cada iteración, construimos una cadena como un número de espacios definidos por
$l
concatenados con el elemento actual. Para el primer bucle, se$l
inicializa en$null
, que se evalúa aquí como0
.Esa cadena se concatena aún más con otro número de espacios (definido por cuánto tiempo
$a
sería si damos-replace
cada tubería sin nada, más1
el relleno adicional entre código y comentarios, menos el.length
del elemento actual, menos$l
cuál es cuántos espacios rellenamos dejado en esta iteración), concatenado con nuestro carácter de comentario$b
. Eso queda en la tubería.Luego actualizamos
$l
para la próxima iteración.Todas las cadenas resultantes se dejan en la tubería, y la salida por vía implícita
Write-Output
ocurre en la ejecución del programa, con una nueva línea entre ellas por defecto.Ejemplos
fuente
Vim,
3938 pulsaciones de teclas-1 byte gracias a DJMcMayhem
Espera como entrada un búfer (por ejemplo, un archivo) cuyo primer carácter es el delimitador de comentarios, seguido del código, por ejemplo
#foo|bar|baz
.Explicación
("
_
" denota un espacio literal).fuente
mm
am`
y luego cambiar`m
a<C-o>
Floroid - 94 bytes
Utiliza un enfoque similar a la solución Python de @ JonathanAllan .
Casos de prueba
fuente
C #
176167154 bytesSin golf
Una solución LINQ habría sido 146 pero necesitaba
using System.Linq;
volver a ponerla en 164:Viejas soluciones:
167 bytes:
176 bytes usando interpolación de cadenas
fuente
PHP,
120117116110109 byteso
fuente
MATL ,
3331 bytesPruébalo en línea!
Explicación
La función incorporada
Yd
(blkdiag
), que construye una matriz de bloques en diagonal a partir de sus entradas, realiza la mayor parte del trabajo. Los valores de relleno en la matriz son 0, y char 0 se trata como un espacio para fines de visualización. El código simplemente se dividiría|
, crearía una matriz a partir de los bloques resultantes, se convertiría en char y agregaría dos columnas con espacio y símbolo de comentario.Sin embargo, la posibilidad de secciones vacías en la cadena de entrada
complicael problema más interesante: el bloque resultante estaría vacío y, por lo tanto, no se mostraría en la matriz resultante.Para resolver esto, introducimos un char 0 antes de cada uno
|
, por lo que ningún bloque estará vacío; y luego, en la matriz char resultante, eliminamos las columnas que están formadas por char 0 solamente. Una sección de código no vacía tendrá algunos caracteres ASCII imprimibles y, por lo tanto, las columnas que abarca sobrevivirán. Una sección vacía contribuirá con una fila, pero no introducirá una columna adicional.fuente
|
( subexpresión de coincidencias antes o después del|
) sí lo necesita, al menos en el motor de expresión regular Matlab / OctavePyth, 30 bytes
o
Ambos son programas completos que reciben información en STDIN de la cadena de comentarios, y luego la cadena del programa, separada por una nueva línea.
Prueba la primera versión en línea
Prueba la segunda versión en línea
Cómo trabajan ellos
fuente
Dyalog APL 16.0 (no competidor),
4337 bytesSolicita el carácter de comentario, luego el código.
No compite porque la versión 16.0 es más nueva que este desafío.
fuente
Perl, 63 bytes
Incluye +5 para
-Xpi
Ejecute con entrada en STDIN y comente el carácter después de -i:
esolang.pl
:Solución directa totalmente aburrida
fuente
Turtlèd , 35 bytes (sin competencia)
Toma una entrada, el último carácter es el comentario. No funciona con el carácter de comentario como espacio, pero supongo que no es necesario.
Explicación:
fuente
Funky , 89 bytes
Pruébalo en línea!
fuente
Scala, 123 bytes
Código de prueba + Salida:
fuente
Ruby,
9680 bytesVéalo en eval.in: https://eval.in/639012
Realmente debería aprender Retina.
fuente
Jalea , 41 bytes
Parece que tiene muchos incrementos, y probablemente demasiados enlaces ...
Pruébelo en TryItOnline
¿Cómo?
fuente
CJam, 32 bytes
Explicación
Pruébalo en línea
fuente
GolfScript, 85 bytes
Pruébalo en línea
Actualización 2017 - GolfScript - 71 bytes
Explicación
fuente
Jalea , 10 bytes
Pruébalo en línea!
fuente