Descrição do Desafio
Vamos começar com algumas definições:
- uma relação é um conjunto de pares de elementos ordenados (neste desafio, usaremos números inteiros)
Por exemplo, [(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]
é uma relação.
uma relação é chamada transitiva se, para quaisquer dois pares de elementos,
(a, b)
e(b, c)
nessa relação, um par(a, c)
também estiver presente,[(1, 2), (2, 4), (6, 5), (1, 4)]
é transitivo, porque contém(1, 2)
e(2, 4)
, mas(1, 4)
também,[(7, 8), (9, 10), (15, -5)]
é transitivo, porque não existem dois pares(a, b)
,(c, d)
presentes de modo queb
=c
.[(5, 9), (9, 54), (0, 0)]
não é transitivo, porque contém(5, 9)
e(9, 54)
, mas não(5, 54)
Dada uma lista de pares de números inteiros, determine se uma relação é transitiva ou não.
Entrada / saída
Você receberá uma lista de pares de números inteiros em qualquer formato razoável. Considere uma relação
[(1, 6), (9, 1), (6, 5), (0, 0)]
Os seguintes formatos são 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
Saída: um valor verdadeiro para uma relação transitiva, caso contrário, falsamente. Você pode assumir que a entrada consistirá em pelo menos um par e que os pares são únicos.
fonte
(1,3) (2,1) (3,4) (1,4) (2,4)
. Se os pares não fossem ordenados, isso não seria transitivo porque(2,3)
está faltando.[(7, 8), (9, 10), (15, -5)]
) não deve ser transitivo?Respostas:
Haskell, 42 bytes
Exemplo de uso:
f [(1,2), (2,4), (6,5), (1,4)]
->True
.Loop (externo) sobre todos os pares
(a,b)
e loop (interno) sobre os mesmos pares, agora chamados(c,d)
e sempre queb==c
verificar se(a,d)
também existe um par. Combine os resultados com lógicoand
.fonte
Prolog, 66 bytes
A relação não é transitiva se pudermos encontrar (A, B) e (B, C) de modo que (A, C) não seja válido.
fonte
MATL ,
2725 bytesO formato de entrada é uma matriz (usando
;
como separador de linhas) em que cada par da relação é uma coluna. Por exemplo, casos de testesão respectivamente inseridos como
A saída de verdade é uma matriz formada por uns. Falsy é uma matriz que contém pelo menos um zero.
Experimente online!
Explicação
O código primeiro reduz os números inteiros de entrada para valores inteiros únicos baseados em 1. A partir desses valores, gera a matriz de adjacência; a matriz multiplica por si mesma; e converte valores diferentes de zero na matriz de resultados em unidades. Por fim, verifica se nenhuma entrada na última matriz excede a entrada na matriz de adjacência.
fonte
JavaScript (ES6),
6967 bytesEconomizou 2 bytes graças a uma idéia de @Cyoce. Havia quatro formulações anteriores de 69 bytes:
fonte
.every
[e]
, portanto, mesmo que custe 8 bytes para atribuir,e
você ainda salva um byte. No entanto, fui um passo além ao abreviar paraa.every
, que salvou um segundo byte.Braquilog , 24 bytes
Experimente online!
Explicação:
Em outras palavras, se a entrada contiver pares
[A:B]
e[B:C]
, podemos permitir que a entrada coloque[A:B]
e[B:C]
no início, exclua todos os outros elementos e produza uma lista[A:B:B:C]
. Em seguida, retornamos a verdade do predicado interno (falsey de todo o programa), se[A:C]
não estiver lá.fonte
CJam (22 bytes)
Conjunto de testes online . Este é um bloco anônimo (função) que leva os elementos como uma matriz de dois níveis, mas o conjunto de testes faz manipulação de cadeias para colocar a entrada em um formato adequado primeiro.
Dissecação
fonte
Pitão, 14 bytes
Suíte de teste
É esperado que o formato de entrada seja
[[0, 0], [0, 1], ... ]
fonte
Mathematica, 49 bytes
Função pura que leva uma lista de pares. Se a lista de entrada contiver
{a,b}
e{b,c}
não{a,c}
for para algunsa, b, c
, substitua-a por0
. Verdade é a lista de entrada, é falso0
.fonte
C ++ 14, 140 bytes
Como lambda sem nome, retornando via parâmetro de referência. Requer que sua entrada seja um contêiner de
pair<int,int>
. Adotando a abordagem O (n ^ 3) chata.Ungolfed e uso:
fonte
Python 2 ,
916755 bytesExperimente online!
-24 bytes graças a Leaky Nun
-12 bytes graças a Bubbler
fonte
lambda x
alambda s
.for
s.Axioma 103 bytes
ungolfed:
Os exercícios
fonte
Pitão -
2221 bytesConjunto de Teste .
fonte
Clojure,
5653 bytesAtualização: em vez de usar
:when
, apenas verificarei se todos os pares de[a b]
[c d]
umb != c
ou[a d]
é encontrado no conjunto de entrada.Original:
Uau, Clojure para loops é legal: D Isso verifica se o
for
loop não gera um valor falso, o que ocorre se[a d]
não for encontrado no conjunto de entrada.Essa entrada deve ser um conjunto de vetores de dois elementos:
Se a entrada precisar ser do tipo lista,
(%[a d])
ela deverá ser substituída por((set %)[a d])
6 bytes adicionais.fonte
Ambas as soluções são funções sem nome, recebendo uma lista de pares ordenados como entrada e retorno
True
ouFalse
.Mathematica, 65 bytes
#~Permutations~{2}]
cria a lista de todos os pares ordenados de pares ordenados a partir da entrada e osJoin@@@
converte em quádruplos ordenados. Esses são então operados pela funçãoIf[#2==#3,{#,#4},Nothing]&@@@
, que possui uma propriedade interessante: se os dois elementos do meio forem iguais, ele retornará o par ordenado que consiste no primeiro e no último número; caso contrário, ele retornaráNothing
, um token especial do Mathematica que desaparecerá automaticamente das listas. Portanto, o resultado é o conjunto de pares ordenados que precisam estar na entrada para serem transitivos;SubsetQ[#,...]
detecta essa propriedade.Mathematica, 70 bytes
Table[...,{i,#},{j,#}]
cria uma matriz 2D indexada pori
ej
, que são obtidas diretamente da entrada (portanto, são ambos pares ordenados). A função desses dois índices éLast@i!=#&@@j||#~MemberQ~{#&@@i,Last@j}
, que se traduz em "o segundo elementoi
e o primeiro elemento dej
não coincidem, ou a entrada contém o par ordenado que consiste no primeiro elemento dei
e no último elemento dej
". Isso cria uma matriz 2D de booleanos, queAnd@@And@@@
se transforma em um único booleano.fonte
APL (NARS), 39 caracteres, 78 bytes
teste:
um segundo 'solução' segue os seguintes caminhos:
fonte
Lisp comum, 121 bytes
Experimente online!
fonte