Descripción del desafío
Comencemos con algunas definiciones:
- una relación es un conjunto de pares de elementos ordenados (en este desafío, usaremos enteros)
Por ejemplo, [(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]
es una relación.
una relación se llama transitiva si para cualquiera de los dos pares de elementos
(a, b)
y(b, c)
en esta relación, un par(a, c)
también está presente,[(1, 2), (2, 4), (6, 5), (1, 4)]
es transitivo, porque contiene(1, 2)
y(2, 4)
, pero(1, 4)
también,[(7, 8), (9, 10), (15, -5)]
es transitivo, porque no hay dos pares(a, b)
,(c, d)
presente tal queb
=c
.[(5, 9), (9, 54), (0, 0)]
no es transitivo, porque contiene(5, 9)
y(9, 54)
, pero no(5, 54)
Dada una lista de pares de enteros, determine si una relación es transitiva o no.
De entrada y salida
Se le dará una lista de pares de enteros en cualquier formato razonable. Considera una relación
[(1, 6), (9, 1), (6, 5), (0, 0)]
Los siguientes formatos son equivalentes:
[(1, 6), (9, 1), (6, 5), (0, 0)] # list of pairs (2-tuples)
[1, 9, 6, 0], [6, 1, 5, 0] # two lists [x1, x2, ..., xn] [y1, y2, ..., yn]
[[1, 6], [9, 1], [6, 5], [0, 0] # two-dimentional int array
[4, 1, 6, 9, 1, 6, 5, 0, 0] # (n, x1, y1, ..., xn, yn)
[1+6i, 9+i, 6+5i, 0+0i] # list of complex numbers
... many others, whatever best suits golfing purposes
Salida: un valor verdadero para una relación transitiva, falsa de lo contrario. Puede suponer que la entrada consistirá en al menos un par, y que los pares son únicos.
fuente
(1,3) (2,1) (3,4) (1,4) (2,4)
. Si los pares no estuvieran ordenados, esto no sería transitivo porque(2,3)
falta.[(7, 8), (9, 10), (15, -5)]
) no ser transitivo?Respuestas:
Haskell, 42 bytes
Ejemplo de uso:
f [(1,2), (2,4), (6,5), (1,4)]
->True
.Bucle (externo) sobre todos los pares
(a,b)
y bucle (interno) sobre los mismos pares, ahora llamados(c,d)
y cada vez que seb==c
verifica si(a,d)
también existe un par existente. Combina los resultados con lógicoand
.fuente
Prólogo, 66 bytes
La relación no es transitiva si podemos encontrar (A, B) y (B, C) de modo que (A, C) no se mantenga.
fuente
MATL ,
2725 bytesEl formato de entrada es una matriz (que se usa
;
como separador de filas) donde cada par de la relación es una columna. Por ejemplo, casos de pruebase introducen respectivamente como
La salida de verdad es una matriz formada por unos. Falsy es una matriz que contiene al menos un cero.
Pruébalo en línea!
Explicación
El código primero reduce los enteros de entrada a valores enteros únicos basados en 1. A partir de esos valores, genera la matriz de adyacencia; la matriz lo multiplica por sí mismo; y convierte valores distintos de cero en la matriz de resultados a unos. Finalmente, verifica que ninguna entrada en la última matriz exceda la de la matriz de adyacencia.
fuente
JavaScript (ES6),
6967 bytesAhorró 2 bytes gracias a una idea de @Cyoce. Había cuatro formulaciones anteriores de 69 bytes:
fuente
.every
[e]
, por lo que aunque cuesta 8 bytes asignare
, aún guardas un byte. Sin embargo, fui un paso más allá al hacer una abreviatura paraa.every
, que ahorró un segundo byte.Brachylog , 24 bytes
Pruébalo en línea!
Explicación:
En otras palabras, si la entrada contiene pares
[A:B]
y[B:C]
, podemos permutar la entrada para poner[A:B]
y[B:C]
al principio, eliminar todos los demás elementos y generar una lista[A:B:B:C]
. Luego devolvemos la verdad del predicado interno (falsey de todo el programa) si[A:C]
no está allí.fuente
CJam (22 bytes)
Conjunto de pruebas en línea . Este es un bloque anónimo (función) que toma los elementos como una matriz de dos niveles, pero el conjunto de pruebas realiza la manipulación de cadenas para poner primero la entrada en un formato adecuado.
Disección
fuente
Pyth, 14 bytes
Banco de pruebas
Se espera que el formato de entrada sea
[[0, 0], [0, 1], ... ]
fuente
Mathematica, 49 bytes
Función pura que toma una lista de pares. Si la lista de entrada contiene
{a,b}
y{b,c}
no es{a,c}
para algunosa, b, c
, la reemplaza por0
. La verdad es la lista de entrada, la falsedad es0
.fuente
C ++ 14, 140 bytes
Como lambda sin nombre que regresa a través del parámetro de referencia. Requiere su entrada para ser un contenedor de
pair<int,int>
. Tomando el aburrido enfoque O (n ^ 3).Sin golf y uso:
fuente
Python 2 ,
916755 bytesPruébalo en línea!
-24 bytes gracias a Leaky Nun
-12 bytes gracias a Bubbler
fuente
lambda x
alambda s
.for
s.Axioma 103 bytes
sin golf:
los ejercicios
fuente
Pyth -
2221 bytesTest Suite .
fuente
Clojure,
5653 bytesActualización: en lugar de usarlo
:when
, lo comprobaré para todos los pares de[a b]
[c d]
cualquierab != c
o[a d]
se encuentra en el conjunto de entrada.Original:
Wow, Clojure para los bucles son geniales: D Esto comprueba que el
for
bucle no genera un valor falso, lo que ocurre si[a d]
no se encuentra en el conjunto de entrada.Esta entrada tiene que ser un conjunto de vectores de dos elementos:
Si la entrada debe ser similar a una lista,
(%[a d])
debe reemplazarse por((set %)[a d])
6 bytes adicionales.fuente
Ambas soluciones son funciones sin nombre que toman una lista de pares ordenados como entrada y retorno
True
oFalse
.Mathematica, 65 bytes
#~Permutations~{2}]
crea la lista de todos los pares ordenados de pares ordenados a partir de la entrada y losJoin@@@
convierte en cuádruples ordenados. Esos son operados por la funciónIf[#2==#3,{#,#4},Nothing]&@@@
, que tiene una propiedad genial: si los dos elementos del medio son iguales, devuelve el par ordenado que consiste en el primer y el último número; de lo contrario, regresaNothing
, un token especial de Mathematica que desaparece automáticamente de las listas. Entonces, el resultado es el conjunto de pares ordenados que necesita estar en la entrada para que sea transitivo;SubsetQ[#,...]
detecta esa propiedadMathematica, 70 bytes
Table[...,{i,#},{j,#}]
crea una matriz 2D indexada pori
yj
, que se toman directamente de la entrada (por lo tanto, ambos son pares ordenados). La función de esos dos índices esLast@i!=#&@@j||#~MemberQ~{#&@@i,Last@j}
, que se traduce como "el segundo elemento dei
y el primer elemento dej
no coinciden, o la entrada contiene el par ordenado que consiste en el primer elemento dei
y el último elemento dej
". Esto crea una matriz 2D de booleanos, que seAnd@@And@@@
aplana en un solo booleano.fuente
APL (NARS), 39 caracteres, 78 bytes
prueba:
un segundo 'solución' sigue goto maneras:
fuente
Lisp común, 121 bytes
Pruébalo en línea!
fuente