Imagine que você tenha uma matriz de números inteiros, cujos valores não negativos são ponteiros para outras posições na mesma matriz, apenas que esses valores representem túneis; portanto, se o valor na posição A for positivo e apontar para a posição B, então o valor na posição B também deve ser positivo e apontar para a posição A para representar as duas extremidades do túnel. Então:
Desafio
- Dada uma matriz de números inteiros, verifique se a matriz está de acordo com a restrição de ser uma matriz de encapsulamento e retorne dois valores distintos e coerentes para truthy e falsey.
- Os valores na matriz estarão abaixo de zero para posições fora do túnel e zero ou acima para posições no túnel. Se sua matriz é indexada em 1, o valor zero representa uma posição que não é do túnel. Valores não relacionados ao túnel não precisam ser verificados.
- Se um valor positivo em uma célula aponta para si mesmo, isso é falso. Se A aponta para B, B para C e C para A, isso é falso. Se um valor positivo aponta além dos limites da matriz, isso é um erro.
Exemplos
Os exemplos a seguir são indexados em 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 é o código-golfe , portanto, pode ganhar o código mais curto para cada idioma!
[0]
?[0,1]
e[0,-1,2]
dariam?[0,1]
está nos exemplos. "Se um valor positivo em uma célula aponta para si mesmo, isso é uma falsa"[2,3,0,1]
Respostas:
R , 47 bytes
Experimente online!
Código desenrolado e explicação:
fonte
Python 2 ,
666160 bytesExperimente online!
fonte
APL (Dyalog Unicode) ,
1924 bytesExperimente online!
Prefixo lambda anônimo, retornando 1 para truthy e 0 para falsy. O link TIO contém uma versão "prettified" da saída para os casos de teste.
Gritos para @ngn e @ Adám por economizar aproximadamente um bazilhão de bytes.
Uma mensagem extra para @ngn pela ajuda na correção da resposta para alguns casos de teste e na criação de um trem.
A resposta atualizada utiliza
⎕IO←0
, configurando o I ndex O como 0.Quão:
fonte
0<
→×
Eu achoJavaScript (ES6), 35 bytes
Guardado 1 byte graças a @Shaggy
Experimente online!
Comentado
fonte
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 bytes
Experimente online!
fonte
Gelatina , 16 bytes
Experimente online!
1 indexado.
fonte
Perl 6 , 36 bytes
Experimente online!
A idéia básica é verificar se o conjunto
{ i, a[i], a[a[i]] }
contém exatamente dois elementos distintos para cada índicei
coma[i] >= 0
. Se um elemento apontar para si mesmo, o conjunto conterá apenas um único elemento distinto. Se a outra extremidade não apontar de voltai
, o conjunto conterá três elementos distintos. Sea[i] < 0
, oxx
fator é zero ou negativo, então o conjunto é{ i, a[i] }
, também com dois elementos distintos.fonte
MATL ,
1918 bytes-1 Byte graças a Luis
Experimente online!, apenas para o primeiro, porque eu não sei como fazer todos eles!
Dá
0
se realmente, um número inteiro diferente de zero se falsey, por exemplo. para o caso de teste 6 fornece4
.Lembre-se de que, como o MATLAB, o MATL é indexado 1, portanto, 1 deve ser adicionado aos casos de teste!
Nunca jogou golfe em um Esolang antes, então os conselhos foram muito bem recebidos!
Explicado:
fonte
05AB1E ,
161514 bytes-1 byte graças a @Dorian .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
ε
comy
. Portanto, não há necessidade de©
, e cada um®
substituído pory
Japonês
-e
, 11 bytesTente
Original (sem sinalizador),
1413 bytesExperimente ou execute todos os casos de teste
fonte
Python,
112979686 bytesExperimente Online!
Retorna
True
ouFalse
.-10 bytes graças a @Rod e @TFeld.
fonte
K (ngn / k) , 33 bytes
Experimente online!
fonte
Haskell , 48 bytes
Verifique todos os casos de teste!
Explicação
Vamos primeiro desfazer um pouco o código. Como
f =<< g
é o mesmo que\x -> f (g x) x
, o código é equivalente ao que é um pouco mais claro.
Esta solução é baseada em uma observação simples:
a
seja a matriz de entrada eu
a lista de pares em(i, a[i])
quei
é um índice. Entãoa
é uma matriz válida se e somente se para cada(x, y)
nou
comy >= 0
, o par(y, x)
pertenceu
também.fonte
Java (JDK) , 89 bytes
Experimente online!
Créditos
fonte
r
e interromper o loop análogo a este aquiCarvão , 22 bytes
Experimente online! Link é a versão detalhada do código. Saídas
-
para verdade e nada para falsidade. Nota: A inserção de uma matriz vazia parece travar o carvão, mas por enquanto você pode inserir um espaço, o que é próximo o suficiente. Explicação:fonte
Pascal (FPC) ,
165155153 bytesExperimente online!
Função Made desta vez porque a entrada é array. Retorna
1
para verdade e0
para falsey.fonte
Limpo , 60 bytes
Experimente online!
Limpo , 142 bytes
Versão monstro extremamente complicada:
Experimente online!
Explicado:
fonte
Ruby , 44 bytes
Experimente online!
fonte
Pitão ,
1716 bytesExperimente online aqui ou verifique todos os casos de teste de uma vez aqui .
Edit: percebeu que o k à direita também era desnecessário
fonte
Groovy , 52 bytes
Experimente online!
fonte
Perl 5 , 54 bytes
Experimente online!
fonte
C (gcc) , 95 bytes
Experimente online!
fonte
Mathematica, 42 bytes
Função pura. Toma uma lista de números indexada em 1 como entrada e retorno
True
ouFalse
como saída. Apenas segue os túneis, assegurando que os0
mapas para0
, não existam 1 ciclo e todos os ciclos sejam 2 ciclos. (Não tenho certeza absoluta se isso falhar em casos extremos, mas fornece os resultados corretos para os exemplos.)fonte
Esta resposta não funciona. Aqui apenas para fins ilustrativos.
Esta resposta passa em todos os casos de teste publicados (atualmente). No entanto, ele falha (gera um erro) em outra entrada válida, como
[1, 2]
ou[1, 0, 3, 7]
.Como isso poderia passar
[1, 0, 3]
e falhar[1, 0, 3, 7]
? Bem, ele prossegue na lista, exatamente como você esperaria. Quando lê um elementox
da listaa
, primeiro verifica sex
é menorlen(a)
e retorna imediatamenteFalse
, se houver. Por isso corretamente retornaFalse
em[1, 0, 3]
, porque3
não é inferior alen(a)
.Mas, supondo que seja
x
aprovado nessa verificação, o código continuará executando outras verificações e, em um determinado momento, ele será avaliadoa[a[x]]
. Já garantimos que a avaliaçãoa[x]
será boa ... mas nãoa[a[x]]
, o que resolvea[7]
quandox
está3
no[1, 0, 3, 7]
exemplo. Neste ponto, o Python gera umIndexError
, em vez de retornarFalse
.Para completar, aqui está a resposta.
Python 2 , 59 bytes
Experimente online!
Eu queria fazer
x<len(a)and-1<a[x]...
, maslen(a)
é claro que é sempre>-1
, então o acima é equivalente. Essa verificação é um total de 5 relações encadeadas (<
,>
,<
,!=
, e==
), além de um controlo separado-1<x
noif
condição.Curto-circuitos em Python (convenientemente) encadearam relações como esta; portanto, por exemplo, se
x>=len(a)
a verificação retornarFalse
antes que chegue aoa[x]
(o que de outra forma aumentaria umIndexError
).fonte