Mathematica, 65 bytes
f[a___,x_,b___]/;NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}=x
Esto define una función f
que debería llamarse con 5 argumentos, p. Ej.
f[5, 9, 17, 33, 829]
En principio, la función se puede invocar con cualquier número (distinto de cero) de argumentos, pero puede obtener resultados inesperados ...
Creo que esta es la primera vez, que logré poner toda la solución a un desafío no trivial en el lado izquierdo de a =
.
Explicación
Esta solución realmente pone las capacidades de coincidencia de patrones de Mathematica a trabajar para nosotros. La característica básica que estamos usando es que Mathematica no solo puede definir funciones simples como, f[x_] := (* some expression in x *)
sino que podemos usar patrones arbitrariamente complejos en el lado izquierdo, por ejemplo f[{a_, b_}, x_?OddQ] := ...
, agregaría una definición a la f
que solo se usa cuando se llama con un elemento de dos elementos. lista y un entero impar. Convenientemente, ya podemos dar nombres a elementos arbitrariamente en la parte inferior de la expresión del lado izquierdo (por ejemplo, en el último ejemplo, podríamos referirnos inmediatamente a los dos elementos de la lista como a
y b
).
El patrón que estamos usando en este desafío es f[a___,x_,b___]
. Aquí a___
y b___
son secuencias de cero o más argumentos y x
es un argumento único. Dado que el lado derecho de la definición es simplemente x
, lo que queremos es algo de magia que garantice que x
se use para la entrada que estamos buscando a___
y que b___
sean simplemente comodines que cubran los elementos restantes.
Esto se realiza adjuntando una condición al patrón con /;
. El lado derecho de /;
(todo hasta el =
) debe regresar True
para que este patrón coincida. La belleza es que comparador de patrón de Mathematica tratará cada asignación de a
, x
y b
a las entradas para nosotros, por lo que la búsqueda del elemento correcto está hecho por nosotros. Esto es esencialmente una solución declarativa al problema.
En cuanto a la condición en sí:
NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}
Tenga en cuenta que esto no depende x
en absoluto. En cambio, esta condición depende solo de los cuatro elementos restantes. Esta es otra característica conveniente de la solución de coincidencia de patrones: debido a los patrones de secuencia, a
y b
juntos contienen todas las demás entradas.
Por lo tanto, esta condición debe verificar si los cuatro elementos restantes son elementos contiguos de nuestra secuencia con un espacio como máximo. La idea básica para verificar esto es que generamos los siguientes cuatro elementos desde el mínimo (vía ) y verificamos si los cuatro elementos son un subconjunto de esto. Las únicas entradas donde eso puede causar problemas son aquellas que contienen un , porque esto también genera elementos de secuencia válidos, por lo que debemos manejarlo por separado.xi+1 = 2xi - 1
2
Última parte: veamos la expresión real, porque hay algo más de azúcar sintáctica divertida aquí.
...a~Min~b...
Esta notación infija es la abreviatura de Min[a,b]
. Pero recuerde que a
y b
son secuencias, por lo que esto realmente se expande a los cuatro elementos Min[i1, i2, i3, i4]
y nos da el elemento restante más pequeño en la entrada.
.../. 2->0
Si esto resulta en un 2, lo reemplazamos con un 0 (que generará valores que no están en la secuencia). El espacio es necesario porque, de lo contrario, Mathematica analiza el literal flotante .2
.
NestList[...&,...,4]
Aplicamos la función sin nombre de la izquierda 4 veces a este valor y recopilamos los resultados en una lista.
2#-1&
Esto simplemente multiplica su entrada por 2 y la disminuye.
...~SubsetQ~{a,b}
Y finalmente, verificamos que la lista que contiene todos los elementos de a
y b
es un subconjunto de esto.