En APL, puede escribir funciones tácitas, llamadas trenes . Cómo funcionan es irrelevante para este desafío. Estas son las diferentes formas en que se pueden agrupar, utilizando ⍴
como función:
⍴ -> ⍴
⍴⍴ -> ⍴⍴
⍴⍴⍴ -> ⍴⍴⍴
⍴⍴⍴⍴ -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴ -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...
El orden sigue siendo el mismo. El procedimiento es que, siempre que haya estrictamente más de 3 funciones, las últimas 3 funciones se agrupan en una función. Si nos encontramos con un tren anidado, lo paréntesis primero, antes de continuar. Aquí está el procedimiento aplicado a ⍴⍴⍴⍴⍴⍴
:
Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.
Aquí está el mismo procedimiento aplicado a ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
:
Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
Step 0: ⍴⍴⍴
There are 3 or less functions, we're done.
Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
Step 0: ⍴⍴
There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.
Entrada
Para este desafío, la entrada se simplificará. Esto significa que puede elegir 2 caracteres diferentes para abrir y cerrar paréntesis y 1 carácter para funciones, diferentes de los elegidos para paréntesis. Los caracteres que elija deben ser consistentes. La entrada no estará vacía y no contendrá paréntesis sin contenido (es decir ()
).
Salida
De nuevo, puede elegir 3 caracteres diferentes, 2 para paréntesis y 1 para funciones. Tenga en cuenta que no necesitan ser los mismos que los elegidos para la entrada, pero deben ser consistentes.
Reglas
- Si hay paréntesis que solo encierran una función dentro de ellos en la entrada, debe eliminarlos en la salida. Es posible que su salida no contenga paréntesis innecesarios (es decir, que encierra solo una función o que encierra toda la salida).
- No necesita implementar el algoritmo utilizado aquí, siempre que su solución sea válida para este desafío.
- Entrada y salida son cadenas en el formato explicado en las secciones de Entrada y Salida. La entrada tendrá al menos un carácter.
- El uso de las lagunas estándar está estrictamente prohibido.
- Este es el código de golf , por lo que gana la respuesta más corta. Sin embargo, no habrá una respuesta aceptada, ya que esta es una competencia por idioma, y para alentar la respuesta en idiomas en los que esta tarea resultaría en un código más largo en comparación con el código escrito en otros idiomas.
Casos de prueba
Los caracteres utilizados aquí son ()⍴
, debe reemplazarlos con los caracteres elegidos.
⍴ -> ⍴
⍴ -> ⍴
⍴⍴ -> ⍴⍴
⍴⍴⍴ -> ⍴⍴⍴
⍴⍴⍴⍴ -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴ -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴) -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴ -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴ -> ⍴⍴(⍴⍴⍴)
((⍴⍴)) -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴ -> ⍴⍴((⍴⍴)⍴⍴)
Este desafío ha sido publicado en el Sandbox. Si tiene el privilegio requerido, puede ver la publicación de sandbox aquí .
fuente
Respuestas:
APL (Dyalog Classic) ,
71686563 bytesPruébalo en línea!
Los personajes que he elegido para E / S son
'('
,')'
y'⍬'
.Esta solución es en sí misma un tren APL.
⍎
analiza la entrada como si fuera una matriz anidada: un árbol con vectores numéricos vacíos (⍬
) como hojas.El dfn (es decir, lambda -
{ }
) atraviesa el árbol de forma recursiva y lo convierte en una cadena entre paréntesis adecuada. El argumento de la izquierda⍺
controla si los paréntesis deben agregarse al nivel actual si es necesario.El dfn maneja los siguientes casos basados en el argumento correcto:
si ya es una cadena (
⍵≡⍕⍵
), devuélvalasi es así
⍬
, devuelve el char'⍬'
si es un singleton, solo profundiza (
∇
es el símbolo de una llamada recursiva)si su longitud es ≤3, repita para cada uno de los elementos y rodee
()
si es necesariode lo contrario, recurse para la cola 3, anteponga todo menos la cola 3 y vuelva a recurrir
fuente
Python 2 ,
224208204 bytes-16 bytes gracias a Mr. Xcoder -4 bytes gracias a ovs
Pruébalo en línea! o Pruebe todos los casos de prueba
El código se puede dividir en 3 pasos principales:
convertir la entrada en una lista anidada y reemplazarla
(p)->p
. La única funciónp
será reemplazada por una lista vacía.Una función recursiva para aplicar la regla "3 o menos" en la lista actual y llamarse a sí misma en todas las sublistas.
Muchos reemplazos para formatear al formato de salida deseado
fuente
((pp))
(op((pp))p
).CJam , 56 bytes
Beats APL!
Pruébalo en línea!
Esto funciona (creo) y no tengo idea de por qué ...
Los caracteres de entrada son
][T
para()⍴
, y los caracteres de salida son][0
para()⍴
(sí, esto significa que están invertidos de lo que cabría esperar; por ejemplo, podría pasarTTT]TT[T]TTTT]TTT[[TT
).Resumen de alto nivel
El programa funciona con la entrada al revés, porque es más conveniente. Para analizar la entrada, aprovechamos el analizador de CJam: invertir y ejecutar la entrada proporciona la forma analizada (hacia atrás) de la entrada.
Luego definimos un procedimiento
K
.K
realiza la mayor parte del trabajo para nuestra presentación, y funciona de la siguiente manera:K
. El resultado debería ser otra matriz, y si esta matriz consiste en un solo elemento, descomprímalo (esto elimina los paréntesis redundantes).Al aplicar
K
a la entrada, obtenemos la forma correctamente entre paréntesis de la entrada (lo único que se debe tener en cuenta es que en realidad envolvemos la entrada en una lista singleton y la desenvolvemos después; la razón de esto es que queremos el fragmento que desempaque los singletons para aplicar al programa de nivel superior, y no solo a sus sub-matrices). Luego, solo aplicamos un formato mínimo para obtener nuestro resultado.Alguna explicación para los bits de golf
El golf del que estoy más orgulloso está usando
,
para realizar la verificación entre enteros y matrices.,
genera el rango [0..n) . Como el único número entero que encontraremos es0
, esto siempre nos da la lista vacía[]
, que es falsey.,
toma su longitud. Como todas las matrices que encontramos no estarán vacías, esto siempre nos da un número entero positivo, que es verdad.Otro golf que podría ser interesante es el método que uso para agrupar los primeros tres elementos de la matriz; es algo similar a mi presentación "Turing complete language interprete code golf" . CJam no tiene una forma corta de dividir una matriz en dos partes (puede intentar cortar la primera parte y luego la otra parte mientras mantiene la matriz original y el índice en la pila, pero eso no funciona muy bien) , así que lo que hago es usar
3/
, que agrupa una matriz en bloques de 3. Luego puedo extraer el primer elemento(
, envolver la matriz dos vecesaa
y luego volver al principio de la lista\+
. La razón por la que envolvemos la matriz dos veces es porque tenemos que quitar una capa:~
, ya que también agrupamos el resto de la matriz en secciones.fuente
JavaScript (ES6),
149146 bytesUsos
()p
, aunque para usar una letra diferente, solo puede cambiar la letrap
hacia el final.fuente