Imagine que tiene una matriz de enteros, cuyos valores no negativos son punteros a otras posiciones en la misma matriz, solo que esos valores representan túneles, por lo que si el valor en la posición A es positivo y apunta a la posición B, entonces el valor en la posición B también debe ser positivo y apuntar a la posición A para representar ambos extremos del túnel. Entonces:
Desafío
- Dado un conjunto de enteros, verifique si el conjunto cumple con la restricción de ser un conjunto de túneles y devuelve dos valores distintos y coherentes para verdadero y falso.
- Los valores en la matriz estarán por debajo de cero para las posiciones que no sean de túnel, y cero o más para las posiciones de túnel. Si su matriz está indexada en 1, entonces el valor cero representa una posición no túnel. Los valores que no son de túnel no necesitan ser verificados.
- Si un valor positivo en una celda apunta a sí mismo, eso es falso. Si A apunta a B, B a C y C a A, eso es falso. Si un valor positivo apunta más allá de los límites de la matriz, eso es falso.
Ejemplos
Los siguientes ejemplos están indexados a 0:
[-1, -1, -1, 6, -1, -1, 3, -1, -1] Truthy (position 3 points to position 6 and vice versa)
[1, 0] Truthy (position 0 points to position 1 and vice versa)
[0, 1] Falsey (positions 0 and 1 point to themselves)
[4, 2, 1, -1, 0, -1] Truthy
[2, 3, 0, 1] Truthy
[1, 2, 0] Falsey (no circular tunnels allowed)
[-1, 2, -1] Falsey (tunnel without end)
[] Truthy (no tunnels, that's OK)
[-1, -2, -3] Truthy (no tunnels, that's OK)
[1, 0, 3] Falsey (tunnel goes beyond limits)
[1] Falsey (tunnel goes beyond limits)
[1, 0, 3, 7] Falsey (tunnel goes beyond limits)
Este es el código de golf , ¡así que puede ganar el código más corto para cada idioma!
[0]
?[0,1]
y[0,-1,2]
darían?[0,1]
está en los ejemplos. "Si un valor positivo en una celda apunta a sí mismo, eso es un error"[2,3,0,1]
Respuestas:
R , 47 bytes
Pruébalo en línea!
Código desenrollado y explicación:
fuente
Python 2 ,
666160 bytesPruébalo en línea!
fuente
APL (Dyalog Unicode) ,
1924 bytesPruébalo en línea!
Prefijo lambda anónimo, devolviendo 1 para verdadero y 0 para falso. El enlace TIO contiene una versión "prettificada" de la salida para los casos de prueba.
Saludos a @ngn y @ Adám por guardar aproximadamente un bazillion de bytes.
Un agradecimiento adicional a @ngn por la ayuda con la solución de la respuesta para algunos casos de prueba y para convertirlo en un tren.
Los usos de respuestas actualizadas
⎕IO←0
, preparando el I ndice O rigin a 0.Cómo:
fuente
0<
→×
CreoJavaScript (ES6), 35 bytes
Guardado 1 byte gracias a @Shaggy
Pruébalo en línea!
Comentado
fuente
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 bytes
Pruébalo en línea!
fuente
Jalea , 16 bytes
Pruébalo en línea!
1 indexado.
fuente
Perl 6 , 36 bytes
Pruébalo en línea!
La idea básica es comprobar si el conjunto
{ i, a[i], a[a[i]] }
contiene exactamente dos elementos distintos para cada índicei
cona[i] >= 0
. Si un elemento se señala a sí mismo, el conjunto contiene solo un único elemento distinto. Si el otro extremo no apunta hacia atrási
, el conjunto contiene tres elementos distintos. Sia[i] < 0
, elxx
factor es cero o negativo, entonces el conjunto es{ i, a[i] }
, también con dos elementos distintos.fuente
MATL ,
1918 Bytes-1 Byte gracias a Luis
Pruébalo en línea! , solo para el primero, ¡porque no sé cómo hacerlos todos!
Da
0
si es verdadero, un número entero distinto de cero si es falso, por ejemplo. para el caso de prueba 6 da4
.¡Recuerde que, al igual que MATLAB, MATL está indexado en 1, por lo que debe agregarse 1 a los casos de prueba!
Nunca jugué golf en un Esolang antes, ¡así que los consejos fueron muy bien recibidos!
Explicado:
fuente
05AB1E ,
161514 bytes-1 byte gracias a @Dorian .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
ε
cony
. Así que no hay necesidad de©
, y cada uno®
reemplazado pory
Japt
-e
, 11 bytesIntentalo
Original (sin indicador),
1413 bytesPruébalo o ejecuta todos los casos de prueba
fuente
Python,
112979686 bytesPruébalo en línea!
Devoluciones
True
oFalse
.-10 bytes gracias a @Rod y @TFeld.
fuente
K (ngn / k) , 33 bytes
Pruébalo en línea!
fuente
Haskell , 48 bytes
¡Verifique todos los casos de prueba!
Explicación
Primero eliminemos un poco el código. Como
f =<< g
es lo mismo\x -> f (g x) x
, el código es equivalente aque es un poco más claro
Esta solución se basa en una observación simple: deje que
a
sea la matriz de entrada yu
la lista de pares(i, a[i])
dondei
hay un índice. Entoncesa
es una matriz válida si y sólo si para cada(x, y)
enu
cony >= 0
, el par(y, x)
pertenece au
también.fuente
Java (JDK) , 89 bytes
Pruébalo en línea!
Créditos
fuente
r
y salir del bucle análogo a aquíCarbón , 22 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Salidas
-
para la verdad y nada para la falsedad. Nota: Ingresar una matriz vacía parece bloquear el carbón, pero por ahora puede ingresar un espacio, que está lo suficientemente cerca. Explicación:fuente
Pascal (FPC) ,
165155153 bytesPruébalo en línea!
Funcionó esta vez porque la entrada es matriz. Vuelve
1
por veracidad y0
por falsey.fuente
Limpio , 60 bytes
Pruébalo en línea!
Limpio , 142 bytes
Versión monstruosa extremadamente complicada:
Pruébalo en línea!
Explicado:
fuente
Ruby , 44 bytes
Pruébalo en línea!
fuente
Pyth ,
1716 bytesPruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
Editar: me di cuenta de que el k al final también era innecesario
fuente
Groovy , 52 bytes
Pruébalo en línea!
fuente
Perl 5 , 54 bytes
Pruébalo en línea!
fuente
C (gcc) , 95 bytes
Pruébalo en línea!
fuente
Mathematica, 42 bytes
Pura función. Toma una lista de números indexados en 1 como entrada y devuelve
True
oFalse
como salida. Simplemente sigue los túneles, asegurando que los0
mapas a0
, no existen 1 ciclos, y todos los ciclos son 2 ciclos. (No estoy completamente seguro de si esto falla en algún caso extremo, pero da los resultados correctos para los ejemplos).fuente
Esta respuesta no funciona. Aquí solo con fines ilustrativos.
Esta respuesta pasa todos los casos de prueba (actualmente) publicados. Sin embargo, falla (genera un error) en otra entrada válida, como
[1, 2]
o[1, 0, 3, 7]
.¿Cómo podría pasar
[1, 0, 3]
y fallar[1, 0, 3, 7]
? Bueno, avanza por la lista, como era de esperar. Cuando lee un elementox
de la listaa
, primero comprueba six
es menorlen(a)
e inmediatamente devuelveFalse
, si es así. De modo que devuelve correctamenteFalse
en[1, 0, 3]
, porque3
no es menoslen(a)
.Pero suponiendo que
x
pase esa verificación, el código pasará a hacer otras verificaciones y, en cierto momento, se evaluaráa[a[x]]
. Ya hemos garantizado que la evaluacióna[x]
estará bien ... pero noa[a[x]]
, lo que resuelvea[7]
cuándox
está3
en el[1, 0, 3, 7]
ejemplo. En este punto, Python plantea unIndexError
, en lugar de regresarFalse
.Para completar, aquí está la respuesta.
Python 2 , 59 bytes
Pruébalo en línea!
Quería hacerlo
x<len(a)and-1<a[x]...
, pero por supuestolen(a)
es siempre>-1
, por lo que lo anterior es equivalente. Esta comprobación es un total de 5 relaciones encadenados (<
,>
,<
,!=
, y==
), además de un cheque por separado-1<x
en elif
estado.Python (convenientemente) cortocircuita relaciones encadenadas como esta, por ejemplo, si
x>=len(a)
la verificación regresaFalse
antes de llegara[x]
(lo que de otro modo generaría unIndexError
).fuente