Introdução
Suponha que você tenha uma régua com números de 0 a r-1 . Você coloca uma formiga entre dois números e ela começa a engatinhar erraticamente na régua. A régua é tão estreita que a formiga não pode andar de uma posição para outra sem andar em todos os números intermediários. Quando a formiga anda em um número pela primeira vez, você o grava, e isso permite uma permutação dos números r . Dizemos que uma permutação é antipática se puder ser gerada por uma formiga dessa maneira. Alternativamente, uma permutação p é antipática se todas as entradas p [i], exceto a primeira, estiverem a uma distância de uma entrada anterior.
Exemplos
A permutação comprimento-6
4, 3, 5, 2, 1, 0
é impaciente, porque 3 está à distância 1 de 4 , 5 está à distância 1 de 4 , 2 está à distância 1 de 3 , 1 está à distância 1 de 2 e 0 está à distância 1 de 1 . A permutação
3, 2, 5, 4, 1, 0
não é impaciente, porque 5 não está à distância 1 de 3 ou 2 ; a formiga teria que passar por 4 para chegar a 5 .
A tarefa
Dada uma permutação dos números de 0 a r-1 por cerca de 1 ≤ r ≤ 100 em qualquer formato razoável, produza um valor verdadeiro se a permutação for antsy e um valor false se não.
Casos de teste
[0] -> True
[0, 1] -> True
[1, 0] -> True
[0, 1, 2] -> True
[0, 2, 1] -> False
[2, 1, 3, 0] -> True
[3, 1, 0, 2] -> False
[1, 2, 0, 3] -> True
[2, 3, 1, 4, 0] -> True
[2, 3, 0, 4, 1] -> False
[0, 5, 1, 3, 2, 4] -> False
[6, 5, 4, 7, 3, 8, 9, 2, 1, 0] -> True
[4, 3, 5, 6, 7, 2, 9, 1, 0, 8] -> False
[5, 2, 7, 9, 6, 8, 0, 4, 1, 3] -> False
[20, 13, 7, 0, 14, 16, 10, 24, 21, 1, 8, 23, 17, 18, 11, 2, 6, 22, 4, 5, 9, 12, 3, 15, 19] -> False
[34, 36, 99, 94, 77, 93, 31, 90, 21, 88, 30, 66, 92, 83, 42, 5, 86, 11, 15, 78, 40, 48, 22, 29, 95, 64, 97, 43, 14, 33, 69, 49, 50, 35, 74, 46, 26, 51, 75, 87, 23, 85, 41, 98, 82, 79, 59, 56, 37, 96, 45, 17, 32, 91, 62, 20, 4, 9, 2, 18, 27, 60, 63, 25, 61, 76, 1, 55, 16, 8, 6, 38, 54, 47, 73, 67, 53, 57, 7, 72, 84, 39, 52, 58, 0, 89, 12, 68, 70, 24, 80, 3, 44, 13, 28, 10, 71, 65, 81, 19] -> False
[47, 48, 46, 45, 44, 49, 43, 42, 41, 50, 40, 39, 38, 51, 37, 36, 52, 35, 34, 33, 32, 53, 54, 31, 30, 55, 56, 29, 28, 57, 58, 59, 60, 27, 26, 61, 25, 62, 63, 64, 65, 66, 67, 24, 23, 22, 21, 68, 69, 20, 19, 18, 17, 70, 71, 16, 15, 72, 73, 74, 75, 76, 14, 13, 12, 77, 11, 10, 9, 8, 78, 7, 79, 80, 6, 81, 5, 4, 3, 82, 2, 83, 84, 1, 85, 86, 87, 0, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] -> True
Curiosidade: para r ≥ 1 , existem exatamente 2 r-1 permutações de comprimento r .
Respostas:
Pitão, 7 bytes
Experimente online. (Apenas casos de teste pequenos são incluídos devido ao tempo de execução exponencial.) Saídas 2 para Truthy, 0 para Falsey.
Em outras palavras,
onde
subseq
gera se os elementos da primeira lista aparecem em ordem na segunda lista, não necessariamente adjacentes. Asubseq
é feito em Pyth tomando todos os subgrupos da segunda lista, que mantêm a ordem dos elementos, e contando o número de ocorrências da primeira lista. Isso leva tempo exponencial.Por que isso funciona? Para que uma permutação seja impaciente, passar de 0 a n-1 deve consistir em ir apenas para a esquerda e depois apenas para a direita. Isso ocorre porque os elementos maiores que o primeiro devem aumentar da esquerda para a direita e os menores que devem diminuir da esquerda para a direita.
Se espelharmos a lista colocando uma cópia invertida à sua esquerda, essa caminhada agora só dá certo.
Por outro lado, qualquer parte direita da lista de espelhos corresponde a uma caminhada esquerda-direita da lista original. Este à direita é apenas uma subsequência classificada de 0 a n-1. Em uma lista impulsiva, essa subsequência classificada é única, exceto por uma escolha arbitrária entre as duas cópias adjacentes do primeiro elemento original.
fonte
Haskell, 46 bytes
Verifica se a diferença do vetor dos máximos em execução e dos mínimos em execução é [0,1,2,3 ...].
O Zgarb salvou 2 bytes com
(%)=scanl1
.fonte
(#)=scanl1
?JavaScript (ES6), 45
Eu pensei que era muito simples precisar de explicação, mas há um truque e, por precaução, aqui está minha primeira versão, pré-golfe
Nota: no código golfed
a
é usado em vez dek
, pois não preciso de referência à matriz original dentro daevery
chamada. Portanto, evito poluir o espaço para nome global reutilizando o parâmetroTeste
fonte
f=([q,...a],x=[])=>x&&(x[q]=!(x+x)|x[q+1]|x[q-1])&&(a+a?f(a,x):1)
Python 2, 49 bytes
Verifica se cada prefixo da lista contém todos os números entre o mínimo e o máximo, inclusive. Isso é feito verificando se a diferença entre max e min é menor que seu comprimento.
54 bytes:
Verifica se o último elemento é um a menos que o mínimo dos outros elementos ou um a mais que o máximo. Em seguida, remove o último elemento e se repete. Em uma lista de elemento único, gera True.
Isso também pode ser verificado através de uma compreensão de lista divertida, mas mais longa.
Eu gostaria de usar a desigualdade
min(l)-2<l.pop()<max(l)+2
, mas aspop
necessidades precisam acontecer primeiro. Usar um programa para produzir via código de erro provavelmente seria mais curto.fonte
Mathematica, 42 bytes
Usa a correspondência de padrões para tentar encontrar um prefixo
a
cuja diferença máxima do próximo elementob
seja maior que1
(e negue o resultado deMatchQ
).fonte
Perl,
393835 bytesInclui +1 para
-p
Dê sequência em STDIN:
antsy.pl
:fonte
MATL , 11 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
Isso calcula uma matriz de todas as diferenças absolutas aos pares e mantém a parte triangular superior. O resultado é verdadeiro se houver pelo menos um valor 1 em todas as colunas, exceto a primeira.
fonte
R,
726460 bytesUma permutação é irritante se, e somente se, todas as suas subpermutações esquerdas forem contínuas (ou seja, tiverem uma diferença quando classificadas).
Se é garantido que a entrada tem comprimento superior a um, podemos substituí-lo1:sum(1|v)
porseq(v)
, o que salva quatro bytes.A
seq(v)
condição if se comporta de maneira diferente quando a entrada tem um comprimento --- gera a sequência em1:v
vez deseq_along(v)
. No entanto, felizmente, a saída acaba sendoTRUE
nesse caso, que é o comportamento desejado. O mesmo acontece com a entrada de comprimento zero.Em R,
T
é uma variável predefinida igual aTRUE
(mas R permite redefini-la).TRUE
também é considerado igual a1
.Agradecemos a @Billywob por algumas melhorias úteis na solução original.
fonte
scan
pouparia dois bytes. Nesse caso, é exatamente o mesmo número de bytes dafor
abordagem de loop:v=scan();c=c();for(i in 1:sum(1|v))c=c(c,diff(sort(v[1:i])));all(c==1)
que seria 2 bytes mais curto que a sua abordagem vetorizada.T
. Irá editar.05AB1E , 7 bytes
Experimente online! ou como um conjunto de testes modificado .
Explicação
Usa o processo descrito por xnor em sua brilhante resposta Pyth .
Retorna 2 para instâncias verdadeiras e 0 para falsidade.
fonte
Perl, 63 bytes
Observe que @ Gabriel Banamy apresentou uma resposta mais curta (55 bytes) . Mas acho que essa solução ainda é interessante, por isso estou publicando.
A contagem de bytes inclui 62 bytes de código e
-n
sinalizador.Para executá-lo:
Explicações breves : converte cada número
k
na representação unária dek+1
(isso+1
é necessário para que os0
s não sejam ignorados). Então, para cada númerok+1
(expresso em unário como1(1*)
), verificamos sek
($1
esperak
) ouk+2
(que é então11$1
) está presente na string anterior (referenciada por$-backtick
). Se não, então definimos$.
como zero. No final, imprimimos o$.
que será1
se nunca o definirmos como zero, ou zero caso contrário.fonte
Brain-Flak
302 264256 bytesAgradecimentos ao Assistente de Trigo por salvar 46 bytes
O topo da pilha será 1 para verdade e 0 para falsidade.
Truthy: Experimente online!
Falsy: Experimente on-line!
A idéia é manter o número mínimo e máximo que a formiga visitou na pilha off. Em seguida, compare cada número com os dois e atualize o número apropriado. Se o próximo número não for 1 a menos que o mínimo ou 1 a mais que o máximo, saia do loop e retorne false.
Breve explicação:
fonte
([]){({}[()]<({}<>)<>>)}{}
com([]){{}({}<>)<>([])}{}
para salvar um casal mais bytesGeléia ,
987 bytesExperimente Online!
Uma tradução em geléia da resposta do xnor.
Soluções antigas:
Experimente online!
Funciona de maneira muito semelhante à minha resposta Pyth abaixo:
fonte
»\_«\⁼Ṣ
, mas muito mais eficientesŒBŒPċṢ
e;\Ṣ€IỊȦ
deve salvar um byte em cada abordagem.UŒBŒPċṢ
que não salva bytes. OỊ
é bom, no entanto; Eu tinha interpretado mal esse átomo para gerar o NÃO lógico do que ele realmente fez.U
(ou do@
agora que penso nisso). Se uma matriz é impaciente, então é a matriz invertida, não?[2, 1, 3, 0]
é impaciente, mas[0, 3, 1, 2]
não é.CJam (
2120 bytes)Conjunto de testes online
Dissecação
Isso usa a observação de xnor em sua resposta de Haskell de que a diferença entre o máximo e o mínimo dos primeiros
n
elementos deve sern-1
.Abordagem alternativa (também 20 bytes)
Conjunto de testes online
Isso verifica diretamente se cada elemento após o primeiro está à distância 1 de um elemento anterior. Como a entrada é uma permutação e, portanto, não repete valores, este é um teste suficiente. Agradecemos a Martin por economizar 1 byte.
Dissecação
fonte
{_{a+_)f-:z1&,*}*^!}
Java,
100987975 bytesAnteriormente:
Economizou 3 bytes substituindo
true
efalse
com1>0
e0>1
.Economizou 23 bytes graças às excelentes sugestões de Peter Taylor!
Ungolfed:
Acompanhe os valores mais altos e mais baixos vistos até
m
en
; aceite apenas um novo valor se este for,m + 1
oun - 1
seja, o próximo valor mais alto ou mais baixo; inicialize o valor alto,,m
para um a menos que o primeiro elemento, para que ele "corresponda" na primeira vez no loop. Nota: este é um algoritmo online de tempo linear. Requer apenas três palavras de memória, para os valores atuais, mais alto até agora e mais baixo até agora, ao contrário de muitas outras soluções.Se o próximo valor errar as extremidades alta e baixa da faixa, o valor mais baixo até agora é definido como
-1
e a extremidade baixa nunca pode prosseguir e chegar a zero. Em seguida, detectamos uma sequência antipática, verificando se o valor baixon
atingiu zero.(Infelizmente, isso é menos eficiente, porque sempre precisamos olhar para toda a sequência, em vez de resgatar o primeiro número errado , mas é difícil argumentar com uma economia de 23 bytes (!) Quando outras soluções estão usando O (n ^ 2 ) e abordagens de tempo exponencial.)
Uso:
Nota: isso também pode ser escrito sem tirar proveito do Java 8 lambdas:
Java 7, 89 bytes
fonte
int m,n;m=n=a[0];--m;
poderia serint n=a[0],m=n-1;
, e o caroreturn
eelse
poderia ser reduzido comi==m+1?m++:n=(i==n-1)?i:-1;return n==0;
(ou algo semelhante - eu não testei isso).m++
oum+=1
ali, então eu ainda preciso de umif
e umelse
, e ele perde o aspecto de um curto-circuito no primeiro valor ruim, mas isso é uma grande melhoria. Obrigado!j
e atribuir o resultado a ela, mas suspeite que haveria uma maneira melhor de fazê-lo.g
, e não consegui fazê-lo funcionar. (Estou usando o Java 9-ea + 138, talvez seja uma diferença entre o Java 8 e o Java 9?). Posso tentar novamente amanhã.n-=i==m+1?m-m++:i==n-1?1:n+1;
Pitão ( bifurcação ), 13 bytes
Não há link Try It Online para este fork do Pyth. A bifurcação inclui a função deltas
.+
, que não faz parte da biblioteca Pyth padrão.Explicação:
fonte
Perl,
6654 +1 = 55 bytes+1 byte para
-n
.Explicação:
Imprime 0 se falso, 1 se verdadeiro.
-11 bytes graças a @Dada
fonte
perl -nE 's/\d+/$.&=!@a||1~~[map{abs$_-$&}@a];push@a,$&/eg;say$.'
:: em-n
vez de<>=~
permitir que você se livre do/r
modificador. use\d+
e depois em$&
vez de(\d+)
e$1
.!@a
em vez de0>$#a
.$.&=
em vez de$.&&=
.push@a,$&
em vez de@a=(@a,$&)
Brainfuck, 60 bytes
A permutação é fornecida como bytes sem separadores e sem nova linha final. Como
\x00
ocorre na entrada, isso foi projetado para implementações comEOF = -1
. A saída é\x00
para false e\x01
true.Se uma permutação de
\x01
atéchr(r)
é permitido, então podemos substituir todas as instâncias,+
com,
uma pontuação de 57 com umaEOF = 0
implementação.Experimente on-line (versão de 57 bytes): A entrada pode ser fornecida como uma permutação de qualquer faixa contígua de bytes
\x00
, exceto , e a saída será\x00
falsa e o mínimo da faixa verdadeira.Acompanhamos o mínimo e o máximo vistos até agora e, para cada personagem após o primeiro, verificamos se é min-1 ou max + 1 ou nenhum. No caso de nenhum deles, mova o ponteiro para fora do espaço de trabalho normal para que as células locais se tornem zero.
O layout da memória do espaço de trabalho normal no início do loop principal é
c a b 0 0
onde
c
é o caractere atual,a
é min eb
é max. (Para a versão de 60 bytes, tudo é tratado com um deslocamento de 1 por causa de,+
.)fonte
Braquilog , 22 bytes
Experimente online!
Explicação
Não encontrei uma maneira concisa de verificar se uma lista contém números inteiros consecutivos ou não. O mais curto que encontrei é gerar um intervalo entre o primeiro e o último elemento dessa lista e verificar se esse intervalo é a lista original.
fonte
1
. Não sei como isso é fácil em Brachylog.Lote, 133 bytes
Recebe entrada como argumentos da linha de comando. Sai com o nível de erro 0 para êxito, 1 para falha.
fonte
J, 14 bytes
Isso é baseado no método do @ xnor .
Explicação
fonte
Java, 170 bytes
Matriz
x
tem valores de 0 a número máximo em ordem (Python seria muito melhor aqui ...). O loop retrocede tentando corresponder ao número mais baixo (x[b]
) ou mais alto (x[e]
) ainda não encontrado; se isso acontecer, esse número pode ser alcançado nessa etapa.Teste o código aqui .
fonte
Mathematica, 47 bytes
Um pouco mais do que a solução de Martin Ender (surpresa surpresa!). Mas é um dos meus esforços mais ilegíveis, então é bom: D
Explicação:
fonte
Java 7,
170169 bytesUngolfed & código de teste:
Experimente aqui.
Saída:
fonte