Se le dará una matriz anidada. Su programa tiene que visualizar la matriz.
¿Pero cómo?
Por ejemplo, supongamos que tenemos una matriz anidada, como [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]
.
Esta matriz anidada se puede visualizar como:
->1
->2
-->1
-->2
->3
>4
---->5
>6
Ejemplos
Input 1:
["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]
Output 1:
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron
Input 2:
[["1","2"],["3","4"]]
Output 2:
->1
->2
->3
->4
Reglas
- Puede usar una cadena (u otros tipos que funcionan como una matriz anidada) como entrada.
- El nivel máximo de "capas" es 2 ^ 32-1.
code-golf
printable-ascii
Matthew Roh
fuente
fuente
Respuestas:
APL, 32 bytes
Prueba:
Explicación:
{
...}∘0
: ejecuta la siguiente función0
vinculada a⍵
:1=≡⍺:
: si la entrada tiene profundidad 1 (es decir, una matriz que no contiene otras matrices):⍵/'->'
: crea una cadena que contiene⍵
-
sy⍵
>
s,1↓
: suelte el primer elemento,⍵↑
: y toma los primeros⍵
elementos. Esto da como resultado una cadena que contiene⍵-1
guiones y uno>
.⍺,⍨
: agregarle la entrada,⎕←
: y enviarlo a la pantalla⋄
: de lo contrario,⍺∇¨⍵+1
: agregue 1⍵
y aplique la función a cada matriz anidadafuente
('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))
.Mathematica,
585756 bytesGracias a Greg Martin por guardar 1 byte.
Gracias a ngenisis por guardar 1 byte.
fuente
Java 7,
153141114 bytes-39 bytes gracias a @ Barteks2x
Explicación:
Código de prueba:
Pruébalo aquí.
Salida:
fuente
for(int j=i;j-->0;r+="-");
para hacer también lo que hace la siguiente línea, y usando un argumento genérico en lugar de Object []:String r="";<T>String c(int i,T[] o){for(T x:o)if(x instanceof Object[])c(i+1,(T[])x);else for(int j=i;j-->=0;r+=j<0?">"+x+"\n":"-");return r;}
e incluso 1 carácter menos si pasa 1 en lugar de 0 como el primero El argumento está bien.[]
del parámetro para guardar 1 byte adicional da un error. Vea el error aquí en > Depurar después de ejecutar.String r="";<T>String c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return r;}
esto funciona. También puede hacer un truco genérico similar con una cadena para guardar un byte adicional, pero requiere almacenar el resultado en una variable antes de imprimirlo, o un reparto explícito (llamada al método ambiguo):String r="";<T,S>S c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return(S)r;}
String r="";<T,S>S c(S p,T a){for(T x:(T[])a)if(x instanceof Object[])c("-"+p,x);else r+=p+">"+x+"\n";return(S)r;}
Y el requisito de conversión de cadena en el tipo de retorno al llamar se fue.PHP,
77 7473 bytes4 bytes guardados gracias @manatwork.
función recursiva, requiere PHP 7.1 o posterior para el índice de cadena negativo.
"$e"
esArray
para matrices; entonces"$e"!=$e
es lo mismo queis_array($e)
.>
-
al prefijo para cada nivelfuente
function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
is_array($e)
podría ser reemplazado por$e[-1]!==""
.$e[-]==""
... y con la condición invertida$e[-1]>""
. Buen hallazgo!$e[-1]>""
se puede reemplazar"$e"==$e
. Al menos en el antiguo PHP 5.6 que uso.C99 (GCC),
201187140112109forma expandida:
Esto toma una cadena en el formato correcto y termina cuando encuentra la última coincidencia
]
.No usa recursividad y usa tipos largos para lograr la segunda regla: 2 ^ 32-1 niveles . La mayoría de los lenguajes de script tienen una profundidad de recursión limitada o simplemente se bloquean en el desbordamiento de la pila.
No estoy acostumbrado al golf en C, se agradece cualquier ayuda :)
¡Gracias a bolov por sus consejos! ¡Especialmente gracias a Titus que siempre está listo para una buena ronda de golf (incluso en C)!
Otros dos bytes guardados por el hecho de que podemos terminar una vez que coincidamos con el último
]
y no sea necesario que coincida con un carácter nulo.Se puede probar en Wandbox .
fuente
for(int d=1 ...
?long
tiene 4 caracteres, mientras queint
solo tiene 3, y no hay ninguna razón por la que deba hacer que supere el2^32 - 1
para que su envío sea válido, ahorrándole un solo byte.2^31-1
.The maximum level of "layers" is 2^32-1.
.2^31-1
es mucho menos2^32-1
.2^32-1
no cabe unint
tiempo, se ajusta a ununsigned
olong
(eso está en la mayoría de los sistemas / compiladores, por supuesto). Porint
lo tanto , no haría una respuesta correcta (como la mayoría de las respuestas aquí no lo son).JavaScript (ES6),
5851 bytesEditar: Guarde 7 bytes cuando @Arnauld señaló que podía combinar mis dos enfoques.
fuente
PHP,
129 123 112 109 95 9391 bytesLa solución iterativa toma una cadena de STDIN:
Ejecutar
echo '<input>' | php -nR '<code>'
o probar en línea .Descompostura
Feliz de que los números estén entre comillas; así que solo necesito una acción a la vez.
Violín ASCII
Agregar 3 guiones
$p
y eliminar 2 para[
, 4 para]
agrega uno para[
y elimina uno para]
.fuente
Python 2,
6564 bytesEn este momento mi respuesta comienza constantemente sin guiones, por lo que
["foo", "bar"]
es:fuente
import sys, pprint; pprint.pprint(sys.argv)
es de 43 bytes pero no sé si rompe las reglas del código de golf.f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o
import sys, pprint.pprint as p; p(sys.argv)
sigue siendo 43 pero una buena sugerencia, no obstante; D Intentarlo enimport sys.argv as v
realidad lo alarga un poco ~ 48 bytes. Si uno pudiera eliminar sys.argv, ahorraría mucho, pero el programa se vuelve bastante inútil. Un enfoque recursivo es bastante largodef p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]
, ~ 80 bytes.Perl 5 , 55 bytes
53 bytes de código +
-nl
banderas.Pruébalo en línea!
No es óptimo para la expresión regular debido a algunos casos nerviosos que podrían ocurrir (en particular, si un elemento de la matriz contiene corchetes en su interior).
Sin embargo, una función anónima recursiva sería apenas más larga (61 bytes):
Pruébalo en línea!
Pero la forma en que Perl maneja los parámetros no es óptima para las funciones de golf: sin parámetros opcionales significa que tengo que hacer una segunda función (anónima) llamando a la primera, y tengo que obtener explícitamente el último parámetro con ese tiempo
my$v=pop
.fuente
Ruby,
49 4546 bytesEjemplo:
Explicación:
Función recursiva: si
x==[*x]
entonces x es una matriz, e iteramos sobre ella. Si no, sangrarlo.fuente
Haskell, 104 bytes
Haskell no tiene listas anidadas con diferentes profundidades, por lo que tengo que analizar la cadena de entrada por mi cuenta. Afortunadamente, la función de biblioteca
reads
puede analizar cadenas (es decir,"
secuencia de caracteres incluida), por lo que tengo un poco de ayuda aquí.Ejemplo de uso:
Pruébalo en línea! .
Cómo funciona:
La función
#
pasa por la cadena char por char y mantiene el nivel de anidamiento (el primer parámetrol
) como una cadena de-
con un final>
. Si el encabezado de la lista se puede analizar como una Cadena, tomel
y la Cadena seguida de una llamada recursiva con la Cadena eliminada. Si el primer carácter es un espacio, sáltelo. Si es a,
, tome una nueva línea y continúe, si es así]
, baje el nivel de anidación y continúe y de lo contrario (solo a la[
izquierda) aumente el nivel de anidación y continúe. La recursión termina con la cadena de entrada vacía. La función principal(">"#)
establece el nivel de anidamiento">"
y las llamadas#
.fuente
SWI-Prolog, 115 bytes
Se agregaron saltos de línea solo para facilitar la lectura, no incluidos en el recuento de bytes.
p
el predicado atraviesa recursivamente las matrices, agregando un '-' al prefijoF
cuando se mueve un nivel más profundo.w
se usa para escribir la matriz de prefijos, así como el elemento real en la salida.Ejemplo:
fuente
Lote, 249 bytes
Molesto, Batch tiene problemas para comparar comas. Ejecución de muestra:
fuente
Retina ,
635452 bytesGuardado 2 bytes gracias a Martin Ender
Pruébalo en línea!
Explicación
Primero, la matriz se divide reemplazando cada cadena entrecomillada con todo lo que vino antes, más ella misma, más una nueva línea. Al dividirlo de esta manera, es posible encontrar los corchetes de apertura inigualables antes de cada cadena.
Esta transliteración reemplazará
[
con-
, dejará]
sin cambios y eliminará cualquier otro carácter (-~
es todo ASCII imprimible). Sin embargo, solo reemplaza los caracteres que aparecen antes de la cadena final en cada línea.A continuación,
-]
se eliminan todas las instancias de . Estos corresponden a pares de corchetes coincidentes, y solo queremos corchetes no coincidentes. Después de que se eliminen, cada línea tiene un número de-
s igual a la cantidad de paréntesis de apertura que no coinciden .El último
-
antes de a"
se reemplaza por>
, para formar las flechas.Finalmente, todos los
]
sys restantes"
se eliminan.fuente
Röda , 54 bytes
Pruébalo en línea!
Es una función que lee la matriz de entrada de la secuencia. Para cada elemento, se llama a sí mismo de forma recursiva o imprime el elemento.
fuente
Python 3, 80 bytes
Parece que las lambdas de Python respaldan la recursividad, ¿quién sabía?
Este es un contador / cumplido a la respuesta de orlp .
fuente
=
. También sospecho que puedes dejar todos los espacios después de los tres)
, pero no estoy muy familiarizado con el golf en Python.Groovy, 92 bytes
fuente
Apilado , 27 bytes
Pruébalo en línea!
Toma la entrada desde la parte superior de la pila y deja la salida en STDOUT. Esto es simple como hacer un mapa de profundidad, repetir
-
d
tiempos, concatenar con '>' y el elemento en sí.fuente
Gema, 63 personajes
Al igual que las otras soluciones de análisis, se supone que no habrá comillas dobles escapadas en las cadenas.
Ejecución de muestra:
fuente
jq,
7067 caracteres(
67código de 64 caracteres + opción de línea de comando de 3 caracteres)Ejecución de muestra:
Prueba en línea
fuente