Mathematica, 65 bytes
f[a___,x_,b___]/;NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}=x
Isso define uma função f
que deve ser chamada com 5 argumentos, por exemplo
f[5, 9, 17, 33, 829]
Em princípio, a função pode ser chamada com qualquer número (diferente de zero) de argumentos, mas você pode obter resultados inesperados ...
Acho que é a primeira vez que consegui colocar toda a solução em um desafio não trivial no lado esquerdo de um =
.
Explicação
Essa solução realmente coloca os recursos de correspondência de padrões do Mathematica para trabalhar para nós. A característica básica que estamos usando é que o Mathematica não pode apenas definir funções simples como, f[x_] := (* some expression in x *)
mas podemos usar padrões arbitrariamente complexos no lado esquerdo, por exemplo f[{a_, b_}, x_?OddQ] := ...
, adicionar uma definição à f
qual é usada apenas quando é chamada com um elemento de dois elementos lista e um número inteiro ímpar. Convenientemente, já podemos atribuir nomes a elementos arbitrariamente distantes da expressão do lado esquerdo (por exemplo, no último exemplo, poderíamos nos referir imediatamente aos dois elementos da lista como a
e b
).
O padrão que estamos usando neste desafio é f[a___,x_,b___]
. Aqui a___
e b___
são seqüências de zero ou mais argumentos e x
é um único argumento. Como o lado direito da definição é simplesmente x
, o que queremos é uma mágica que garanta que x
seja usada para a entrada que estamos procurando a___
e que b___
sejam simplesmente curingas que cubram os elementos restantes.
Isso é feito anexando uma condição ao padrão com /;
. O lado direito de /;
(tudo até =
) precisa retornar True
para que esse padrão corresponda. A beleza é que o padrão de correspondência do Mathematica vai tentar cada atribuição de a
, x
e b
para as entradas para nós, por isso a busca para o elemento correto é feito por nós. Esta é essencialmente uma solução declarativa para o problema.
Quanto à própria condição:
NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}
Observe que isso não depende de x
nada. Em vez disso, essa condição depende apenas dos quatro elementos restantes. Esse é outro recurso conveniente da solução de correspondência de padrões: devido aos padrões de sequência, a
e b
juntos contêm todas as outras entradas.
Portanto, essa condição precisa verificar se os quatro elementos restantes são elementos contíguos da nossa sequência com no máximo uma lacuna. A idéia básica para verificar isso é que geramos os próximos quatro elementos a partir do mínimo (via ) e verificamos se os quatro elementos são um subconjunto disso. As únicas entradas em que isso pode causar problemas são aquelas que contêm a , porque isso também gera elementos de sequência válidos, portanto, precisamos lidar com isso separadamente.xi+1 = 2xi - 1
2
Última parte: vamos analisar a expressão real, porque há mais açúcar sintático engraçado aqui.
...a~Min~b...
Essa notação infix é abreviada Min[a,b]
. Mas lembre-se disso a
e b
são sequências; portanto, isso se expande para os quatro elementos Min[i1, i2, i3, i4]
e nos fornece o menor elemento restante na entrada.
.../. 2->0
Se isso resultar em um 2, substituímos por um 0 (que gerará valores que não estão na sequência). O espaço é necessário porque, caso contrário, o Mathematica analisa o literal de flutuação .2
.
NestList[...&,...,4]
Aplicamos a função sem nome à esquerda 4 vezes a esse valor e coletamos os resultados em uma lista.
2#-1&
Isso simplesmente multiplica sua entrada por 2 e a diminui.
...~SubsetQ~{a,b}
E, finalmente, verificamos que a lista que contém todos os elementos de a
e b
é um subconjunto disso.