Fondo
¡Los programadores de LISP se han apoderado del mundo! Los paréntesis se han declarado como caracteres sagrados y, a partir de ahora, solo se pueden usar en programas LISP. Se ha decidido que los paréntesis en las obras literarias se reemplazarán por notas al pie de página, y es su trabajo automatizar esto para un texto simplificado de Markdown.
Entrada
Su entrada es una sola cadena que contiene caracteres alfabéticos ASCII, espacios y caracteres especiales ,.!?()
. No contendrá nuevas líneas o dígitos. Los paréntesis coincidirán correctamente.
Salida
Deberá convertir cada par de paréntesis coincidentes en la cadena de entrada en una nota al pie. Esto sucede de la siguiente manera:
- Reemplace el primer par de paréntesis coincidentes y la subcadena entre ellos por un número continuo que comience
1
, envuelto entre las etiquetas Markdown<sup>
y</sup>
. - Añadir al final de la cadena
- dos líneas nuevas
- la etiqueta Markdown
<sub>
, - el número del paso 1
- un espacio,
- la subcadena entre paréntesis y
- la etiqueta de cierre
</sub>
, en este orden.
- Si aún quedan paréntesis en la cadena, vaya al paso 1.
Su salida es la cadena resultante, posiblemente con una nueva línea final. No tiene que implementar este algoritmo exacto, siempre que su salida sea correcta. Tenga en cuenta que puede haber paréntesis anidados; en ese caso, tendremos notas al pie que contienen referencias a otras notas al pie. La subcadena entre paréntesis también puede estar vacía. Vea los casos de prueba a continuación para ver ejemplos.
Reglas y puntuación
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Si su idioma no admite de forma nativa los números decimales ( tos Retina tos ), puede dar los números de las notas al pie de página en otra base, incluidos binarios o unarios; sin embargo, el uso de números unarios impone una penalización de + 20% .
Casos de prueba
Entrada:
This input contains no parentheses.
Salida:
This input contains no parentheses.
Entrada:
This has (some) parentheses (but not so many).
Salida:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 some</sub>
<sub>2 but not so many</sub>
Entrada:
This has (nested (deeply (or highly?) nested)) parentheses (and several groups).
Salida:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 nested <sup>3</sup></sub>
<sub>2 and several groups</sub>
<sub>3 deeply <sup>4</sup> nested</sub>
<sub>4 or highly?</sub>
Entrada:
Hmm()(()(,)) a()((trt)(v( (((((wut)))))(X)(Y)(Z) )!?!?!?!))oooooooo(oooo)oooo
Salida:
Hmm<sup>1</sup><sup>2</sup> a<sup>3</sup><sup>4</sup>oooooooo<sup>5</sup>oooo
<sub>1 </sub>
<sub>2 <sup>6</sup><sup>7</sup></sub>
<sub>3 </sub>
<sub>4 <sup>8</sup><sup>9</sup></sub>
<sub>5 oooo</sub>
<sub>6 </sub>
<sub>7 ,</sub>
<sub>8 trt</sub>
<sub>9 v<sup>10</sup>!?!?!?!</sub>
<sub>10 <sup>11</sup><sup>12</sup><sup>13</sup><sup>14</sup> </sub>
<sub>11 <sup>15</sup></sub>
<sub>12 X</sub>
<sub>13 Y</sub>
<sub>14 Z</sub>
<sub>15 <sup>16</sup></sub>
<sub>16 <sup>17</sup></sub>
<sub>17 <sup>18</sup></sub>
<sub>18 wut</sub>
Tenga en cuenta las líneas vacías entre las notas al pie.
fuente
foo (bar)\nfoot (note)
?Respuestas:
Perl,
817572 bytesCódigo de 71 bytes + argumento de línea de comando de 1 byte.
Requiere Perl 5.10 o más reciente (para soporte de expresiones regulares recursivas)
Uso:
Explicación
-p
El parámetro imprimirá el resultado de aplicar los comandos dados a la entrada, evitando la necesidad de una impresión explícita.La expresión regular
(\(((?1)|.)*?)\))
busca el conjunto de corchetes más externo desde el comienzo de la cadena. Cuando se encuentra esto, realizamos la sustitución, asegurando que solo agreguemos al final de la entrada (capturando todo hasta el final de la entrada usando(.*)
).Luego repetimos la sustitución de expresiones regulares en la cadena ahora sustituida usando
redo
, que aplicará continuamente la sustitución de expresiones regulares hasta que ya no coincida. Els
modificador asegura que.
en la expresión regular coincida con las nuevas líneas, lo cual es necesario porque volvemos a aplicar la coincidencia de expresión regular en el resultado de la sustitución anterior de expresión regular.fuente
[^)]
o incluso en.
lugar de hacerlo,[^()]
debido a la garantía de que la entrada se equilibrará correctamente..
haciendo que el partido sea flojo. @xebtl, el desafío dice "No contendrá nuevas líneas o dígitos"Emacs Lisp, 335 bytes
Prefacio. Esta respuesta y las del Esquema son actualmente las únicas respuestas autorizadas oficialmente tanto por la Poderosa República Popular de LISP como por la Iglesia de Emacs. Otras respuestas, más cortas o no, se consideran una amenaza para la paz. En particular, y con un profundo desdén por cualquier acusación calumniosa de macartismo que se escuche esporádicamente de los opositores hostiles del estado, le pedimos a cualquiera que tenga información sobre la identidad real de los autores anónimos que escriben respuestas Nonlisp que se comuniquen con su Oficina Local. Se recuerda que todos deberían tomarse el tiempo para reflexionar y votar de acuerdo con lo que él o ella cree profundamente que no amenazará sus futuras interacciones con los representantes oficiales del poder en el lugar. El código es datos. Los datos son código.
Más elegantemente:
fuente
Retina ,
968683 bytes * 120% = 99.6El código fuente de esta solución consta de dos archivos:
Explicación
Esta es una implementación muy directa del algoritmo como se describe en el desafío. El código consiste en una única sustitución de expresiones regulares que convierte el primer conjunto de paréntesis en una nota al pie. Esta sustitución se repite a través de
+
hasta que la cadena deja de cambiar, lo que aquí significa que la expresión regular ya no coincide (porque no puede encontrar más paréntesis).Las notas al pie se enumeran en unario, de modo que simplemente puedo buscar el número de la última nota al pie y agregar a
1
para crear el siguiente.La expresión regular para encontrar el primer conjunto de paréntesis se basa en la técnica estándar para unir paréntesis con grupos de equilibrio (hrhr, "paréntesis coincidentes"). Se ha acortado un poco al usar un grupo sin nombre y al suponer que los paréntesis están correctamente equilibrados (lo que significa que podemos omitir el
(
de la clase de caracteres negados y hacer coincidir el final)
con un simple.
y tampoco necesitamos asegurarnos de que el la pila de captura está vacía).Después de hacer coincidir los paréntesis y capturar su contenido en grupo
1
, capturamos el resto de la cadena(.*)
en grupo4
y luego buscamos en la cadena el primer conjunto de1
s con una mirada negativa hacia atrás. Si encontramos una subcadena, la almacenamos en grupo5
. Si no lo hacemos, miramos hacia atrás falla, pero está bien porque es opcional, solo significa que$5
dará una cadena vacía que es la representación unaria de0
y que también es correcta.Luego, la cadena de sustitución simplemente une todo en función de los grupos de captura. El número de la nota al pie se incrementa anteponiendo
1
a al último número con1$5
.fuente
JavaScript sagrado , 1510 bytes
¡Compañeros rebeldes, no cedan ante su tiránica demolición del paréntesis! ¡Debes perseverar! Desde el principio, la programación ha sido una empresa libre. Ahora, se ha convertido en un espectáculo impregnado de piedad. Debemos mostrar nada menos que absoluto temor. ¡Por lo tanto, he luchado!
No hay reglas contra el uso de los caracteres sagrados en un lenguaje que no sea Lisp. No para nada. (De una manera un poco menos compacta :)
Esto compila el JavaScript expandido en mi otra respuesta . Esta es una presentación de broma.
fuente
Lua,
222216204201 bytesGolfizado:
Sin golf:
fuente
repeat a,b=l(s,g) ... untill a<1
bucle más corto que tu tiempo?Esquema, 92 bytes
Frustrados con la implementación de la búsqueda de primer orden en Real Lisp, 1 los poderes fácticos deciden adoptar un enfoque más pragmático. Después de todo, los paréntesis son sagrados, pero los paréntesis no lo son. 2
1. ¡no escuches a esos herejes de la llamada "iglesia" de Emacs!
2. No son programadores de Racket, ¿verdad?
fuente
Haskell, 210 bytes
Ejemplo de uso:
Cómo funciona:
fuente
Esquema, 533 bytes
Con sangría:
Sí, esto es 533 bytes cuando se elimina todo el espacio en blanco opcional. Disfruta de la gloria funcional.
Implementé más o menos el algoritmo en la descripción:
x
agrupa la entrada por paréntesis yf
reemplaza el primer nivel de grupos por notas al pie, repitiendo hasta que no queden más grupos. Estoy seguro de que se puede acortar, pero no veo cómo se podría acortar mucho sin cambiar a un algoritmo diferente.Como está escrito, es un programa completo. Puede probarlo aquí , pero como repl.it aparentemente no puede manejarlo
(read-line)
, debe colocar la cadena de entrada en su lugar. Una versión completamente sin golf está aquí .EDITAR: Como se señaló en los comentarios, cambié los paréntesis
()
entre paréntesis[]
en las versiones repl.it. Esto fue puramente por conveniencia durante la programación y depuración. La versión publicada ahora funciona con()
.fuente
#\[
'#] `por el paréntesis respectivo (y pruebas de actualización), esto funciona sin problemas. ¿Hay alguna razón por la que dejaste los cuadrados? ¿está relacionado con tu respuesta anterior?JavaScript ES6, 244 bytes
Respuesta seria (solo funciona en Firefox, que yo sepa)
Expandido:
fuente
Hasio , 315 bytes
Actualmente esto no es competitivo ya que esto no maneja exactamente los anidados también.
Expandido:
}
fuente