Definamos la función u
de "tamaño sin envolver" de una lista anidada l
(que contiene solo listas) mediante las siguientes reglas:
- Si
l
está vacío, entoncesu(l)
es 1. - Si
l
no está vacío,u(l)
es igual a la suma de los tamaños sin envolver de cada elementol
, más uno.
Su tarea es escribir un programa (o función) que tome una lista como entrada y produzca (o devuelva) el tamaño sin envolver de la lista.
Casos de prueba:
[] -> 1
[[[]],[]] -> 4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]] -> 4
Este es el código de golf , por lo que gana el programa más corto (en bytes).
code-golf
string
array-manipulation
counting
Fruta Esolanging
fuente
fuente
()
lugar de[]
?[[[]][]]
lugar de esto[[[]],[]]
en su segundo ejemplo?["This is some text [with square brackets in] ...[& maybe more than one pair]"]
?]
sí parece ser la solución más corta en muchos idiomas, también hay muchas respuestas que realmente resuelven este desafío a través de la manipulación de listas, y al menos en esolangs contar las ocurrencias de un carácter fijo también es bastante diferente de contar Las ocurrencias de un carácter de entrada.Respuestas:
Retina , 1 byte
Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Por defecto, Retina cuenta el número de coincidencias de la expresión regular dada en la entrada. El tamaño sin envolver es simplemente igual al número de
[]
pares en la entrada y, por lo tanto, al número de]
.fuente
Mathematica, 9 bytes
Resulta que hay un incorporado para eso ...
Tenga en cuenta que esto no funcionaría si las listas realmente contienen elementos que no son de la lista. Lo que
LeafCount
realmente hace es contar el número de subexpresiones atómicas. Para la entrada{{}, {{}}}
, la expresión en realidad lee:Aquí las subexpresiones atómicas son en realidad las cabezas
List
.fuente
Brainfuck,
716159 bytesToma información de STDIN en el formato dado en la pregunta y genera el carácter cuyo código ASCII es el "tamaño sin envolver" de la lista.
Todavía soy un completo aficionado en Brainfuck, por lo que es muy probable que aún se puedan hacer muchas optimizaciones.
Pruébalo en línea!
Sin golf:
fuente
JavaScript (ES6),
2927 bytesMe encanta cuando una recursión resulta tan limpia. Esto es básicamente una búsqueda profunda de la entrada, agregando 1 cada vez que se alcanza el final de una matriz.
Si una matriz vacía fuera falsa en JS, esto podría ser de 24 bytes:
Pero, por desgracia, no lo es. Otros intentos
fuente
f=a=>a[0]?f(a.pop())+f(a):1
? (Sin embargo, el mismo número de bytes.)f=a=>a.reduce((n,a)=>n+f(a),1)
. Ahora,f=(n,a)=>n+a.reduce(f,1)
solo tiene 24 bytes, pero lamentablemente los parámetros están en el orden incorrecto)f=a=>a.map(a=>n+=f(a),n=1)&&n
Perl,
987 + 1 = 8 bytesRequiere la
-p
banderaGracias a @Dada por dos bytes guardados (me encanta este punto y coma explotar por cierto)
fuente
-p
guardar 1 byte;)y;[;
para guardar un byte másCJam ,
75 bytes¡Gracias a Peter Taylor por eliminar 2 bytes! (en
e=
lugar def=:+
)Pruébalo en línea!
fuente
05AB1E , 4 bytes
Pruébalo en línea!
Creo que se puede jugar más al golf, pero ese 'I' es obligatorio, de lo contrario, la entrada se considera una matriz real en lugar de una cadena
fuente
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
en la entrada elimina eseI
requisito, aunque no sé si eso está permitido.Laberinto , 8 bytes
Pruébalo en línea!
Explicación
Esto cuenta los corchetes de apertura a través de un poco de magia bit a bit. Si tenemos en cuenta los resultados de los códigos de caracteres de la AND bit a bit de
[
,,
y]
con2
, obtenemos:Entonces, si solo resumimos el resultado de esta operación para cada personaje, obtenemos el doble del valor que queremos.
En cuanto al código en sí, el bloque 2x2 al principio es un pequeño bucle. En la primera iteración
&-
, en realidad, no haga nada, excepto que ponen un cero explícito encima de los implícitos en la parte inferior de la pila. Este será el total acumulado (y en realidad será negativo guardar un byte más adelante). Entonces el ciclo va de la siguiente manera:Una vez que dejamos el ciclo, se ejecuta el siguiente bit lineal:
La IP luego golpea a un muerto y se da vuelta. Cuando intenta ejecutarse
/
nuevamente, el programa termina debido al intento de división por cero.fuente
Python
32,3623 bytesNoté que
u(l)
es igual al número de[
en la representación de cadena del
, por lo que este programa intenta hacer eso. Sin embargo, probablemente podría jugar más golf al encontrar otra forma de hacer esto ...fuente
lambda x:`x`.count("[")
Python, 26 bytes
Fórmula recursiva simple.
fuente
C #,
4641 bytesl es la cadena de la lista anidada. Pruébalo aquí .
fuente
return
utilizando una función de expresión corporal. Tambiénchar
arroja implícitamenteint
esta manera puede utilizar91
en lugar de'['
:int u(string l)=>l.Count(c=>c==91);
Además, se podría caer la firma de la función y el uso de un método lambda:l=>l.Count(c=>c==91);
.Jalea , 4 bytes
No usa manipulación de cadenas. Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Rubí, 13 (+1) bytes
Llamado con
-n
argumento:EDITAR: cambiado para imprimir realmente la respuesta
fuente
->s{s.count ?[}
, sería una presentación válida.Regex, 1 byte
Pruébalo en línea!
fuente
Brain-Flak ,
63, 61 bytesPruébalo en línea! 58 bytes de código y +3 para el
-a
indicador que permite la entrada ASCII.Versión legible / explicación:
fuente
Befunge ,
221816 bytesTryItOnline!
Editar: ¡Gracias a Martin Ender por reducir 4 bytes!
Edit2: crédito a David Holderness por optimizar dos más
fuente
///, 13 bytes
Salida en unario.
Pruébalo en línea!
Explicación:
fuente
///
?PHP, 35 bytes
preg_match_all
encuentra todas las instancias coincidentes de la expresión regular y devuelve un número, razón por la cual se necesitan las etiquetas de eco cortas.Como la mayoría de las respuestas, cuenta el número de
[
entradas y salidas de ese número.fuente
]
lugar de[
, no tendrá que escapar.count_chars()[91];
hace casi lo mismo pero es más corto.Raqueta 82 bytes
Sin golf:
Pruebas:
Salida:
fuente
V , 10 bytes
Pruébalo en línea!
Contiene algunos caracteres no imprimibles, aquí está la versión legible:
<C-a>
representa "ctrl-a" (ASCII0x01
) y<esc>
representa la tecla de escape (ASCII0x1b
).Versión más divertida y menos golfista:
Pruébalo en línea!
fuente
Scala, 15 bytes
Sin golf:
count
cuenta cuántos elementos satisfacen un predicado, en este caso92<
, cuál es el método<
de92
.fuente
O , 15 bytes
Pruébalo aquí!
En la entrada, las comas deben eliminarse o reemplazarse por espacios.
Explicación
Si se nos permite trabajar en una cadena: 10 bytes
fuente
> <> ,
212018 bytesEditar: puntuación 1 para ir a las declaraciones!
Edición 2: aparentemente> <> difiere de Befunge en que permite un desplazamiento de IP distinto de cero después del ajuste (en otras palabras, al usar una instrucción de trampolín, puedo ajustar a (1, 0) en lugar de (0, 0)). Interesante.
TryItOnline!
fuente
Brainfuck, 28 bytes
Pruébalo en línea.
Esto cuenta el número de caracteres de entrada divisibles por 3, es decir, el número de
]
caracteres.Solución alternativa de 34 bytes que cuenta
[
caracteres directamente y depende de celdas de 8 bits:fuente
C,
4846 bytesGuardado dos bytes gracias a kirbyfan64sos
Código de prueba
Casos de prueba
fuente
*v++^91?0:i++
ai+=*v==91
para guardar 3 bytes.i+=*v++==91
para guardar dos bytes.tinylisp repl, 39 bytes
Define una función
u
que se puede llamar como(u (q ((())()) ))
(para el segundo caso de prueba). Hacerlo en la respuesta ahorra 4 bytes debido a paréntesis de cierre automático.Explicación
La
x-(0-y)
construcción es necesaria porque tinylisp no tiene una función de suma incorporada, solo resta.fuente
Befunge-98 ,
1211109 bytesTryItOnline!
Editar: Gracias a Martin Ender por eliminar un byte
fuente
Haskell,
20 1917 bytesPruébalo en línea!
Toma la lista como una cadena y pone una
1
en una lista para cada uno]
, luego resume todos los1
s.Versión sin puntos: (19 bytes)
Los supuestos
, [ ]
son los únicos caracteres en la cadena. Filtra la lista para obtener todos los caracteres mayores que[
, que son todos,]
y devuelve la longitud.Uso:
fuente
Bash + coreutils, 29 bytes
fuente
tr -d -c [|wc -c
, lo que por defecto leerá la lista de la entrada estándar.DASH , 14 bytes
Simplemente cuenta
]
. Uso:Solución extra, 15 bytes
Este cuenta recursivamente de una lista real. Uso:
fuente