Las presentaciones exitosas de códigos de golf están, por naturaleza, llenas de símbolos locos por todo el lugar. Para que su presentación sea más fácil de entender, muchos golfistas de código deciden incluir una explicación de su código. En su explicación, la línea de código se convierte en un diagrama en despiece vertical.
Por ejemplo, si este fuera mi código:
1_'[3:~2@+]`
Uno de los muchos diagramas posibles que podría crear se vería así:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
La meta
En este desafío, escribirá una herramienta de formateo automático de explicación que toma una línea de código y crea un diagrama al que se puede agregar fácilmente texto explicativo.
Para hacer de este un desafío más útil , el usuario podrá especificar el contenido de cada línea, proporcionando una cadena de formato. La cadena de formato será una segunda línea, que contiene solo letras A-Za-z
, que tiene la misma longitud que el programa. Las letras muestran el orden en que los caracteres del programa deben imprimirse en la explicación.
Aquí hay un ejemplo de E / S sin ningún formato tipo corchete :
123423
AabcBC
1
2
3
2
3
4
Soportes
Si más de un carácter en el programa tiene el mismo nivel de prioridad, ese conjunto de caracteres actúa como un solo bloque de código (si forman un grupo) o un conjunto de paréntesis (si contienen otros caracteres intermedios). Las reglas generales son simples:
Los caracteres no aparecen en una línea del diagrama hasta que todos los demás caracteres de mayor prioridad ya hayan aparecido en las líneas sobre el diagrama.
Los caracteres de igual prioridad siempre se imprimen en las mismas líneas. Si un determinado carácter aparece en una línea, todos los demás caracteres de igual prioridad aparecen en la línea.
Un conjunto de caracteres de igual prioridad continúa apareciendo en cada línea hasta que todos los demás caracteres encerrados por ella hayan aparecido al menos una vez. Esto permite construcciones tipo "corchete". Si
bceab
son las prioridades, losb
caracteres aparecerán en la segunda línea (son la segunda prioridad más alta) y continuarán apareciendo hasta que todos loscea
caracteres hayan aparecido. Si la cadena de prioridad esabcadeafga
, entonces todosbcdefg
se consideran contenidos dentro de ella, y los 4a
s continuarán apareciendo hasta que aparezcag
.
Más requisitos de formato
Todas las líneas de salida deben tener la misma longitud (la longitud de las líneas de entrada), rellenadas con espacios según sea necesario. La línea del programa de entrada puede contener espacios, aunque esos espacios también recibirán una letra de prioridad. Las nuevas líneas finales en la salida / entrada son opcionales.
Tanteo
Este es el código de golf, menos bytes gana.
Ejemplos
Aquí hay un ejemplo comentado de un fragmento de código con un formato más complejo.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Un ejemplo en Perl:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Aquí hay algunos ejemplos en CJam, cortesía de Martin Büttner:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Aquí hay un ejemplo loco solo para meterse contigo:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Aquí hay un ejemplo más explícito de lo que sucede cuando los corchetes se superponen abab
. (Normalmente, esta no es la forma en que elegiría formatear su explicación).
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
fuente
oNo
puede ser reemplazado conn
en TIO .CJam, 48 bytes
Explicación
fuente
IDL 8.4,
316318304 bytes¡Nueva versión, todavía demasiado larga, pero más corta! Y, en el verdadero espíritu de IDL, completamente vectorizado, lo que significa (ya que no hay bucle for) que ahora puedo hacerlo como una línea y ejecutarlo en sí mismo, una vez que obtenga mi versión completamente actualizada a 8.4. Eso será editado más tarde.
Versión de una línea:
Con saltos de línea (mismo número de bytes, subbing \ n vs &), y comentó:
Aquí hay un desglose algorítmico para la línea 9:
... y 10:
Las líneas 9 y 10 hacen el trabajo real, el resto configura las variables que necesita para el final. Creo que esto es tan golfístico como va a ser, no puedo encontrar ningún otro lugar para hacerlo mejor.
Versión anterior (todo lo siguiente aquí está desactualizado):
Esto no es lo suficientemente corto como para ganar, porque este es un lenguaje de golf terrible, pero nadie responde en IDL, así que voy a buscarlo.
No estoy seguro de si hay alguna forma en que pueda reducirlo más ... Podría llamar a strmid en ayb al mismo tiempo, pero luego gasto más bytes indexando d y funciona igual. ¡Pero seguiré trabajando en ello! (Y mañana editaré una explicación del algoritmo).
fuente