Aquí hay algunos ejemplos de entrada, así que puedo explicar cuál es el problema:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Piense en esta línea de texto como un mapa topográfico de algunas montañas. Cada conjunto de paréntesis ilustra una unidad de altitud.
Si "vemos" esto desde un lado, para que podamos ver las montañas verticalmente, veremos:
4 5 cherries woohoo
1 2 3 moo lik e
i
Dado uno de estos mapas topográficos, genera el mapa, pero en una escala vertical, como el resultado anterior. Separe los diferentes elementos en el mapa con el número de caracteres para el siguiente elemento. Por ejemplo, hay 4 espacios en la salida entre moo
y i
. Del mismo modo, hay 4 caracteres en la entrada entre moo
y i
.
El código que hace esto en la menor cantidad de caracteres gana.
code-golf
string
balanced-string
beary605
fuente
fuente
((1 2))))))))))3
debe ser inválida si las alturas negativas están prohibidas.Respuestas:
J,
87797270675756 caracteresToma entrada del teclado. Ejemplo:
Explicación:
Esta explicación se basa en la primera versión de mi programa:
x=.1!:1[1
tomar entrada del teclado y ponerlax
para más tarde(('('&([:+/=)-')'&([:+/=))\,.i.@#)
crea una lista de todas las indeces en la cadena (i.@#
) y las,.
une ( ) junto con el resultado del(('('&([:+/=)-')'&([:+/=))\
verbo.(('('&([:+/=)-')'&([:+/=))\
este verbo se aplica a todos los prefijos de la cadena (por lo que en la entradahello
se aplicaría ah
,he
,hel
,hell
, yhello
. Se trata de un tenedor , que cuenta el número de tramos abiertos('('&([:+/=)
y luego se resta el número de tramos estrechos')'&([:+/=)
. Esto me da la lista de indeces en la cadena y el nivel en el que el carácter en ese índice debe estar en la salida. En una entrada simple esto me da lo siguiente:((' '$~{.@]),[{~{:@])"1
Este es un verbo que toma la lista que acabo de generar y también la salida de('( ) 'charsub x)
(que solo reemplaza una cadena para reemplazar todos los corchetes con espaciosx
). Toma la cola de cada elemento de la lista{:@]
y lo usa como índice en la cadena para obtener el carácter[{~{:@]
. Luego lo antepone,
con el número de espacios como lo indica el encabezado de cada elemento en la lista(' '$~{.@])
. En el ejemplo anterior esto me da:Luego transpongo la matriz
|:
y la invierto|.
para obtener la salida deseada.fuente
GolfScript
69Demostración en línea aquí .
Explicación:
fuente
APL (59)
He asumido que la 'base' también debe ser utilizable. (
(a(b))c(d)
es decir, es válido) Si esto no es necesario, se pueden guardar dos caracteres.Explicación:
T←⍞
: almacena una línea de entrada en T'()'∘=¨T
: para cada carácter en T, vea si es un paréntesis de apertura o cierre. Esto proporciona una lista de listas de booleanos.1 ¯1∘ר
: multiplique el segundo elemento en cada una de estas listas por -1 (entonces un paréntesis de apertura es 1, uno de cierre es -1 y cualquier otro carácter es 0).+/¨
: toma la suma de cada lista interna. Ahora tenemos el valor ∆y para cada personaje.P←
: tienda en P.R←1++\P
: toma un total acumulado de P, dando la altura de cada personaje. Agregue uno a cada carácter para que los caracteres fuera de los paréntesis estén en la primera línea.(⍴T)∘⍴¨⍳⌈/R
: para cada valor de y posible, haga una lista siempre que T, que consista solo en ese valor. (es decir, 1111 ..., 2222 ...., etc.)R∘=¨
: para cada elemento en esta lista, vea si es igual a R. (Para cada nivel, ahora tenemos una lista de ceros y unos correspondientes a si un personaje debe aparecer o no en ese nivel).⍵×P=0
: para cada una de estas listas, ajústelo a cero si P no es cero en ese punto. Esto elimina los caracteres con un delta-y distinto de cero, por lo que elimina los paréntesis.⊃,/T\¨⍨
: para cada profundidad, seleccione de T los caracteres que deben aparecer.⊖↑
: crea una matriz y ponla al derecho.fuente
Tcl, 50
Tipo de trampa, pero bueno ...
Utilizo secuencias de escape ascii para obtener la diferencia de línea,
^[[A
significa mover el cursor 1 línea hacia arriba,^[[B
mover el cursor 1 línea hacia abajo.fuente
APL, 41 caracteres / bytes *
Probado en Dyalog, con un
⎕IO←1
y⎕ML←3
entorno. Es una función que toma la entrada requerida y devuelve la salida. Dada la redacción de la pregunta, creo que es aceptable. En caso de que no sea así, aquí hay una versión que lee de stdin y escribe en stdout, por 4 caracteres más:Explicacion :
Ejemplos:
*: APL se puede guardar en una variedad de caracteres heredados de un solo byte que asignan símbolos APL a los 128 bytes superiores. Por lo tanto, para jugar al golf, un programa que solo usa caracteres ASCII y símbolos APL puede puntuarse como caracteres = bytes.
fuente
⍨
símbolo. Parece una combinación de los caracteres¨
y~
?~
y¨
, aunque es un personaje diferente de ambos. Es un operador llamado Commute . En su forma diádica que voltea los argumentos de la función diádica que se aplica a:(5-2)=(2-⍨5)
. Como operador monádico se convierte en una función diádica monádico, duplicando el argumento de la derecha:(2*2)=(*⍨2)
. Se usa principalmente para escribir una secuencia ininterrumpida de funciones de derecha a izquierda, sin tener que poner paréntesis en torno a expresiones grandes y saltar los ojos alrededor de ellas. En golf es útil porque3*⍨1-2
es un char menos que(1-2)*3
:-)~
en J entonces.J, 56 caracteres
Otra solución J de 56 personajes ... Me cuenta la profundidad traduciendo
(
en ⁻1,)
en 1 y todos los demás caracteres en 0, y luego tomando la suma acumulada de esto:[: +/\ 1 _1 0 {~ '()'&i.
. El resto es en gran medida similar a la solución de @ Gareth.fuente
Python, 161 caracteres
fuente
Python, 130
fuente
Rubí 1.9 (129)
Lecturas de stdin.
fuente
//
a''
la que mantiene el carácter recuento de la misma y evita el fallo en el marcador.C, 132 caracteres
La descripción no especificó la cantidad de información que el envío tenía que aceptar para ser aceptado, por lo que decidí establecer límites que fueran más consistentes con mis necesidades de golf (mientras seguía trabajando con la entrada de ejemplo dada). Permítanme aprovechar esta oportunidad para recordarles a las personas que a menudo es una buena idea especificar máximos mínimos en las descripciones de sus desafíos.
Hay dos bucles principales en el código. El primer ciclo agrupa todos los caracteres que no son paréntesis en la línea de salida apropiada, y el segundo ciclo imprime cada línea.
fuente
C, 149 caracteres
ejecutar con el argumento citado, egaout "((1 2) (3 (4 5) moo)) (i (lik (cerezas) e (woohoo)))"
fuente
Octava, 128
Muy similar a mi última respuesta ...
Prueba
Entrada:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Salida:
fuente
C #, 229 bytes
Si no hay restricciones en el espacio vertical inicial, puede usar esto (sangrado para mayor claridad). Inicializará el cursor una línea por cada
(
encontrado antes de imprimir, luego moverá el cursor hacia arriba y hacia abajo a medida que se leen los corchetes.fuente
PowerShell ,
120119 bytesPruébalo en línea!
Efectos secundarios: caracteres
&
y'
cambios de altura como(
y)
, pero se muestran. Comparar resultados para:Menos golfizado:
fuente
VB.net (para S&G)
No es el código más bonito.
fuente