Considere una cadena no vacía de paréntesis correctamente equilibrados:
(()(()())()((())))(())
Podemos imaginar que cada par de paréntesis representa un anillo en una construcción telescópica colapsada . Entonces extendamos el telescopio:
( )( )
()( )()( ) ()
()() ( )
()
Otra forma de verlo es que los paréntesis en la profundidad n se mueven a la línea n , manteniendo su posición horizontal.
Su tarea es tomar una cadena de paréntesis equilibrados y producir la versión extendida.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o equivalente más cercano), argumento de línea de comando o parámetro de función, y produciendo salida a través de STDOUT (o equivalente más cercano), valor de retorno o parámetro de función (out).
Puede suponer que la cadena de entrada es válida, es decir, consta solo de paréntesis, que están correctamente equilibrados.
Puede imprimir espacios finales en cada línea, pero no más espacios iniciales de los necesarios. En total, las líneas no deben ser más largas que el doble de la longitud de la cadena de entrada. Opcionalmente, puede imprimir una nueva línea final.
Ejemplos
Además del ejemplo anterior, aquí hay algunos casos de prueba más (la entrada y la salida están separadas por una línea vacía).
()
()
(((())))
( )
( )
( )
()
()(())((()))(())()
()( )( )( )()
() ( ) ()
()
((()())()(()(())()))
( )
( )()( )
()() ()( )()
()
Desafíos relacionados:
- Cadenas topográficas , que le pide que produzca lo que es esencialmente el complemento de la salida en este desafío.
- Code Explanation Formatter , una amplia generalización de las ideas en este desafío, publicado recientemente por PhiNotPi. (De hecho, la descripción original de PhiNotPi de su idea fue lo que inspiró este desafío).
Tablas de clasificación
Huh, esto tuvo mucha participación, así que aquí hay un Fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Respuestas:
CJam,
171615 bytesLo anterior es un volcado xxd reversible, ya que el código fuente contiene los caracteres no imprimibles VT (0x0b) y CSI (0x9b).
Al igual que esta respuesta , usa secuencias de escape ANSI , pero también usa pestañas verticales e imprime los caracteres de control directamente para evitar usar printf .
Esto requiere un terminal de texto de video compatible, que incluye la mayoría de los emuladores de terminales que no son de Windows.
Prueba de funcionamiento
Tenemos que configurar la variable de shell LANG y la codificación del emulador de terminal en ISO 8859-1. Lo primero se logra ejecutando
Además, antes de ejecutar el código real, deshabilitaremos el mensaje y borraremos la pantalla.
Esto asegura que la salida se muestre correctamente.
Para restaurar LANG y la solicitud, ejecute esto:
Cómo funciona
Insertamos una pestaña vertical después de cada uno ( para mover el cursor hacia abajo y la secuencia de bytes 9b 41 (
"\x9bA"
) antes de cada uno ) para mover el cursor hacia arriba.fuente
código de máquina x86,
3934333029 bytesEnsamblaje x86 para DOS, con algunos trucos:
Limitaciones :
cls
antes de correr es casi obligatorio;bh=0
y el indicador de dirección se borra al inicio, ambos indocumentados; OTOH,bx
se establece explícitamente en cero en todas las variantes de DOS que vi (DosBox, MS-DOS 2, FreeDOS), y en todos los lugares donde probé los indicadores ya estaban bien.fuente
cld
?add
/sub
.lop
aloop
?nasm
desambigua entreloop
una etiqueta yloop
la instrucción de ensamblaje, así que escribolop
como todos los demás.J,
3228 bytesEsto fue divertido.
Explicación
Así es como funciona esta solución, incluida una explicación de cómo se ha jugado al golf.
fuente
:')
C, 150 bytes
Esta era una locura divertida de golf. Todavía no estoy convencido de que haya terminado con eso.
Definimos una sola función,
f
que toma la cadena como entrada y salida a stdout.Veamos el código, línea por línea:
¡Contestaré cualquier pregunta que pueda tener!
¡Pruebe un programa de prueba en línea !
fuente
f
,m
no se restablecería a 0. Esto cuenta como "romper su entorno", prohibido aquí .Retina + Bash, 27 bytes (14 + 10 + 3 = 27)
Esto hace uso de ANSI Escapes:
Equivalente a
sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g"
. El\e[B
código de escape significa mover el cursor hacia abajo una fila, y los\e[A
medios mover el cursor hacia arriba una fila, por lo que esta solución simplemente inserta esos códigos después y antes del inicio y el final de cada par de paréntesis anidados. La entrada se pasa a través de STDIN.Tendrá que llamarlo
printf $(Retina ...)
para ver la salida correctamente.Salida
fuente
printf
, sería genial. De lo contrario, creo que sería justo agregar| printf
al conteo de bytes.printf $()
oprintf $(Retina )
.\e
másprintf
? Simplemente puede poner los caracteres de control en el patrón de reemplazo.TI-BASIC,
69 60 5655 bytesEsto es para la familia de calculadoras TI-83 + / 84 +, aunque fue escrito en una edición 84+ C Silver.
El programa aparece como mayor en calc debido a que se incluye información de IVA + tamaño. Además, hay más de 56 caracteres aquí; la razón por la que son 56 bytes es porque todos los comandos que tienen más de un carácter se comprimen en tokens que tienen uno o dos bytes de tamaño.
¡Afeitado otro byte gracias a thomas-kwa ! (también de él fue el salto de 60 a 56.)
fuente
cos(piAns
truco para guardar otro byte.Python 2, 115 bytes
Llama como
f("((()())()(()(())()))")
, y la salida es STDOUT.Explicación
Comenzamos con
n = 0
. Para cada carácter en la línea de entrada:(
, anteponemosn
espacios y luego incrementamosn
)
, decrementamosn
y anteponemosn
espaciosEl resultado se comprime e imprime. Tenga en cuenta que las
zip
cremalleras de Python coinciden con la longitud del elemento más corto , p. Ej.Por lo general, uno usaría
itertools.zip_longest
(izip_longest
) si quisieranzip
rellenar a la longitud del elemento más largo .Pero en Python 2, este comportamiento se puede simular mediante la asignación
None
:Python 3, 115 bytes
Sin cremallera, solo rellenando adecuadamente con
ljust
. Este parece tener cierto potencial de golf.fuente
R,
151127caracteresCon sangrías y nuevas líneas:
Uso:
Lee la cadena como stdin, la divide como un vector de caracteres individuales, calcula la suma acumulativa de
(
y)
, resta la primera con la segunda (con un retraso) calculando así el "nivel" de cada paréntesis. Luego imprime en stdout, para cada nivel, los paréntesis correspondientes o un espacio.¡Gracias a @MickyT por ayudarme a acortarlo considerablemente!
fuente
for(i in n)cat(ifelse(D[i]-j," ",S[i]));cat("\n")
conX=S;X[which(D!=j)]=' ';cat(X,sep='',fill=T)
. Entoncesn
no es realmente necesario, pero necesitaría cambiar un poco la parte de cumsum.D=c(C(S=="("),0)-c(0,C(S==")"));
reduciéndolo a 135.which
Sin embargo, no es realmente necesario aquí (D!=j
ya que es un vector de booleanos que permite la indexación). No sabía argumentofill
paracat
, eso es un truco ingenioso! ¡Gracias por hacerme acortarlo por la asombrosa cantidad de 24 caracteres!C,
58 53 52 5149 bytesUtiliza secuencias de escape ANSI para mover la posición del cursor.
Si no usa gcc u otro compilador que lo admita
\e
, puede reemplazarlo\x1B
por un total de 2 bytes adicionales.\e[A
mueve el cursor hacia arriba una fila y\e[B
mueve el cursor hacia abajo una fila. No es necesario usar\e[B
para moverse hacia abajo una fila, ya que son dos bytes más cortos para usar el carácter de tabulación vertical ASCII0xB
o\v
.Se supone que la cadena de entrada, a partir de la pregunta, consiste solo en paréntesis (equilibrados), por lo que verificar la paridad del carácter, con
&1
, es suficiente para distinguir entre(
y)
.fuente
Pip, 53 bytes
Pip es un lenguaje de código de golf de mi invención. La primera versión se publicó el sábado, ¡así que puedo probarla oficialmente! La solución a continuación no es tan competitiva como los idiomas de golf, pero eso se debe en parte a que todavía no he implementado cosas como zip y max.
Espera la cadena de paréntesis como argumento de línea de comando.
Versión "sin golf":
Explicación:
A diferencia de la mayoría de los lenguajes de golf, Pip es imprescindible con los operadores de infijo, por lo que la sintaxis está algo más cerca de C y sus derivados. También toma prestadas ideas de la programación funcional y basada en arreglos. Consulte el repositorio para obtener más documentación.
El programa primero genera una lista de profundidades (almacenándola
z
) al asignar una función a la cadena de entradaa
. La variable globalv
rastrea el nivel actual. (Las variablesa-g
en Pip son variables locales de función, peroh-z
son globales.v
Es útil porque está preinicializado a -1).Luego, usamos un
W
bucle hile para generar e imprimir cada línea, hasta que la línea generada consista en todos los espacios.v
ahora se usa para columnas yi
para filas. La{z@++v=i?as}
función, asignada repetidamente a la cadena de entrada original, prueba si la línea actuali
coincide con la línea en la que se supone que está el paréntesis actual (como se almacena en laz
lista). Si es así, use el paréntesis (a
); si no, uses
(preinicializado al espacio). El resultado final es que en cada iteración,o
se le asigna una lista de caracteres equivalente a la siguiente línea de la salida.Para probar si debemos continuar haciendo un bucle, verificamos si
o
con todos los espaciosRM
'd está vacío. De lo contrario, imprímalo (que de forma predeterminada concatena todo junto como en CJam), restablezca el número de columna a -1 e incremente el número de fila.(Dato curioso: al principio tenía una solución de 51 bytes ... que no funcionó porque apareció un error en el intérprete).
fuente
Pyth, 31 bytes
Pruébalo en línea.
-/<zk\(/<zhk\)
: Encuentra el nivel apropiado para la posición actual del personaje.?YqN-/<zk\(/<zhk\)d
: Un espacio si el nivel apropiado no es el nivel actual, de lo contrario, el personaje actual.Js.e?YqN-/<zk\(/<zhk\)dz
: Genere la cadena, guárdelaJ
.I-JdJ
: SiJ
no hay todos los espacios, imprímalo.Vz
:z
Tiempos de bucle .fuente
GNU Bash + coreutils + sangría, 135
Entrada / salida a través de STDIN / STDOUT:
indent
realiza la mayor parte del trabajo pesado, pero necesita trabajar con aparatos ortopédicos en lugar de parens. El resto es modificación de esta respuesta para transponer la salida deindent
.fuente
Pitón 2, 92
Imprime línea por línea. Para un número de línea dado
i
(en realidad, su negación), pasa por la cadena de entradas
y crea una nueva cadenaz
que solo contiene los caracteres des
profundidadi
. Esto se hace incrementando o decrementandoi
para rastrear la profundidad actual, y agregando los caracteres actuales cuandoi
se0
ajusta para el tipo de par, y de lo contrario agregando un espacio.Luego, imprime y vuelve a la siguiente, a
i
menos que la línea actual fuera todos los espacios. Tenga en cuenta que, dado que los parens están equilibrados, eli
ciclo posterior es el mismo que al principio.Python 3 sería el mismo excepto por un personaje para
print(z)
.fuente
trampa :(
Retina + TeX, N bytestrampa :(Esto solo funciona si representa (?) La salida usando MathJax o algún otro TeX, que actualmente está deshabilitado para este SE :(
Cada línea debe estar en un archivo diferente, pero puede probarla usando
Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{("
(o el comando sed equivalentesed -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"
). La entrada se pasa a través de STDIN.Esto funciona al encerrar entre paréntesis el contenido de cada par de paréntesis y luego suscribir todos los elementos dentro de ellos.
Salida
fuente
In total the lines must not be longer than twice the length of the input string
. Cambiar la línea 2(\,{
y la línea 4}\,)
significa que la salida se ajusta a esto (aunque la profundidad vertical sigue siendo incorrecta: ()Java,
232226224222 bytesVersión de golf:
Versión larga:
La cadena de entrada se analiza primero, buscando "(" y ")" para sumar / restar un contador y almacenar su valor determinando qué tan abajo deben ir los paréntesis en una matriz y al mismo tiempo realizar un seguimiento de cuán profundo es el más profundo. Luego se analiza la matriz; los paréntesis con valores menores se imprimen primero y continuarán imprimiendo línea por línea hasta alcanzar el máximo.
Probablemente encontraré formas de jugar al golf más adelante.
fuente
Javascript / ES6, 97 caracteres
Uso
Explicación
fuente
n<m?console.log(o):0
, puede usarn<m&&console.log(o)
que ahorra 1 byte.CJam,
43 4136 bytesNo demasiado golf (creo), pero aquí va mi primer intento:
Cómo funciona
Estoy usando el hecho muy útil de que
)
y(
en CJam significan incremento y decremento respectivamente. Por lo tanto, simplemente evalúo los corchetes para obtener la profundidad.Pruébalo en línea aquí
fuente
Octava, 85 caracteres
Es una optimización del enfoque ingenuo, que en realidad es bastante natural para Matlab y Octave:
Es
t
posible que la tabla aún no exista, y podemos asignar a cualquier elemento de inmediato, y da nueva forma a la dimensión más pequeña que se requiere para que exista este elemento, lo cual es bastante conveniente.fuente
Perl,
918988848079 bytesfuente
Haskell, 154 bytes
misma idea que la otra solución de Haskell, pero algo más corta. - Uso:
fuente
J, 46
No es tan bueno como los otros 'idiomas de golf', pero en mi defensa: J es terrible con las cuerdas.
Toma la cadena como entrada para una función. Probablemente también haya una mejor manera de hacerlo en J.
Uso:
fuente
Ruby,
119115114Explicación:
fuente
Java,
233214 bytesSangrado:
Supongo que el ciclo final podría acortarse, pero lo dejaré como un ejercicio para el lector. ;-)
Antigua respuesta de 233 bytes:
Sangrado:
fuente
for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);
afor(x=0;x<l*l;)System.out.print((x%l==0?"\n":"")+m[x++]);
por -1 byte. Además, puede guardar 2 bytes más al eliminarlosp=x=0
y simplemente utilizarlosint p=0,x=0,
en la inicialización de los campos. En total se convierte en 211 bytes .C #, 195 bytes
Primero intente en el golf - grite si hice algo mal.
Versión alternativa de C # usando SetCursorPosition y trabajando de izquierda a derecha tomando la entrada como una línea de comando arg.
Pensé que sería divertido ajustar la posición de escritura en función del par abierto / cerrado y no de las líneas completas. Cerrar paren mueve la posición hacia arriba antes de escribir; abrir paren lo mueve hacia abajo después de escribir. La acción SetCursorPosition ahorra cinco bytes. Mover el cursor a la siguiente línea después de la salida tomaría bastante más.
fuente
Lote,
356335 bytesSé que ya existe una solución Batch para este desafío, pero esta se juega mucho más y parece tener un enfoque diferente. Lo más importante, la otra solución por lotes contiene al menos un comando de PowerShell; Esta solución no.
Hay un carácter de retroceso (
U+0008
) en la penúltima línea que sigue al punto (línea 12, columna 57). Esto no es visible en el código publicado aquí, pero está incluido en el recuento de bytes.fuente
Lote, 424 bytes.
Sin golf:
Ejemplo:
fuente
C,
118bytesOtra respuesta en C, pero la mía es más corta.
Versión sin golf:
¡Y funciona!
fuente
putchar(c-d?32:*p)
es un personaje más corto queputchar(c==d?*p:32)
.Haskell, 227 bytes
fuente
n#[]
lugar dem n []
.Perl, 76 bytes
No
use strict
aquí :)fuente
Lex, 94 bytes
Depende de los códigos de la consola de Linux. Con gcc, puede cortar cuatro bytes reemplazando ambas instancias
\33
por un carácter de escape real.Para compilar y ejecutar:
fuente