El reto:
Considere la función F(N) = 2^N + 1
donde N
es un entero positivo menor que 31
. La secuencia definida por esta función es:
3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097, 8193, 16385, 32769, 65537, 131073, 262145, 524289, 1048577, 2097153, 4194305, 8388609, 16777217, 33554433, 67108865, 134217729, 268435457, 536870913, 1073741825
Se generará una entrada de la siguiente manera:
- Toma 5 enteros contiguos de la secuencia anterior.
- Reemplace uno de ellos con un número entero positivo diferente (que puede o no ser parte de la secuencia anterior).
- Opcionalmente reordenar los 5 números resultantes.
Dada tal lista de 5 enteros, encuentre el que se intercambió y, por lo tanto, no forma parte de los 5 enteros contiguos originales.
Ejemplo:
- Sublista original:
5, 9, 17, 33, 65
. - Reemplazar uno:
5, 7, 17, 33, 65
. - Reordenar:
33, 17, 5, 7, 65
.
El resultado esperado sería 7
.
Los 5 valores en la entrada siempre serán distintos y siempre habrá una solución única. (Por ejemplo, no tendrá que lidiar con entradas como 3, 9, 17, 33, 129
dónde 3
o 129
si se hubieran intercambiado).
Casos de prueba:
5,9,17,33,829
o/p: 829
9,5,17,829,33
o/p: 829
33, 17, 5, 7, 65
o/p: 7
5,9,177,33,65
o/p: 177
65,129,259,513,1025
o/p: 259
129,259,513,1025,65
o/p: 259
63,129,257,513,1025
o/p: 63
65,129,257,513,4097
o/p: 4097
5, 9, 2, 17, 33
o/p: 2
536870913, 67108865, 1073741825, 1, 268435457
o/p: 1
536870913,67108865,134217729,1,268435457
N = 30
como uno de los valores de entrada.Respuestas:
Jalea, 15 bytes
TryItOnline
Todos los casos de prueba también en TryItOnline
Devuelve una lista que contiene una lista que contiene la impar.
¿Cómo?
fuente
JavaScript (ES6), 62 bytes
Algoritmo completamente nuevo, ya que, como señaló @ edc65, el anterior estaba roto. Explicación: Primero tratamos el caso fácil buscando un 2 o un número que no sea uno mayor que una potencia de 2. Si no se encontró ninguno, hay dos casos posibles, dependiendo de si el valor adicional estaba por debajo o por encima del ejecución original de cinco, por lo que verificamos si el valor más pequeño y el segundo más grande pertenecen a la misma ejecución de cinco y, de ser así, culpar al valor más grande de lo contrario al valor más pequeño.
fuente
n-1&n-2
con el valor2
[3, 17, 33, 65, 257]
.--n&--n|!n
ve bien para el2
caso?Python, 84 bytes
Todos los casos de prueba están en ideone
Para una entrada válida, devuelve un conjunto que contiene solo la salida impar.
Para una entrada no válida, se alcanzará el límite de recursión y se generará un error.
fuente
Mathematica, 65 bytes
Esto define una función
f
que debería llamarse con 5 argumentos, p. Ej.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 ejemplof[{a_, b_}, x_?OddQ] := ...
, agregaría una definición a laf
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 comoa
yb
).El patrón que estamos usando en este desafío es
f[a___,x_,b___]
. Aquía___
yb___
son secuencias de cero o más argumentos yx
es un argumento único. Dado que el lado derecho de la definición es simplementex
, lo que queremos es algo de magia que garantice quex
se use para la entrada que estamos buscandoa___
y queb___
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 regresarTrue
para que este patrón coincida. La belleza es que comparador de patrón de Mathematica tratará cada asignación dea
,x
yb
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í:
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
yb
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í.
Esta notación infija es la abreviatura de
Min[a,b]
. Pero recuerde quea
yb
son secuencias, por lo que esto realmente se expande a los cuatro elementosMin[i1, i2, i3, i4]
y nos da el elemento restante más pequeño en la entrada.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
.Aplicamos la función sin nombre de la izquierda 4 veces a este valor y recopilamos los resultados en una lista.
Esto simplemente multiplica su entrada por 2 y la disminuye.
Y finalmente, verificamos que la lista que contiene todos los elementos de
a
yb
es un subconjunto de esto.fuente
Raqueta 198 bytes
Versión sin golf:
Pruebas:
Salida:
fuente
05AB1E ,
3230262420 bytesExplicación
Pruébalo en línea!
fuente
R, 97 bytes
Esto resultó ser más difícil de lo que pensaba. Sin embargo, estoy seguro de que esto se puede jugar mucho.
Desengañado y explicado
La
match()
función volveráNA
si algún elemento del vector de entrada no está en la secuencia y, en consecuencia, podemos encontrar el índice dondeNA
existe en la entrada y devolver esto:x[is.na(m)]
Se vuelve un poco más complicado si la entrada es parte de la secuencia pero está fuera de lugar. Debido a que la entrada ha sido ordenada, la distancia entre cada par de índices debería ser
1
. Por lo tanto, podemos encontrar el elemento fuera de lugar investigando la1st
diferencia de los índices coincidentesl=diff(m)
y seleccionando el índice para el cuall>1
. Esto sería suficiente si no fuera por el hecho de quel
contiene4
elementos en lugar de5
. Esto es solo un problema si el último elemento en la entrada ordenada es un miembro de la secuencia PERO no es parte de la subsecuencia (como en el caso de prueba final). En consecuencia, si el4th
elemento>1
busca la5th
entrada en la entrada ordenada, busque el índice en el4
vector -length:x[ifelse(l[4]>1,5,l>1)]
fuente
anyNA
que es equivalente aany(is.na(x))
Haskell,
6664 bytesEjemplo de uso:
g [65,129,257,513,4097]
->4097
.Recorre todas las sublistas contiguas de longitud 5 de
F(N)
, mantiene los elementos que no están en la lista de entradax
y el patrón coincide con los de longitud 1 (->[s]
).Editar: @xnor guardó dos bytes al eliminar el límite superior del bucle externo. Como se garantiza que existe una solución, la pereza de Haskell se detiene en el primer número encontrado.
fuente
Perl,
6459 bytesIncluye +2 para
-an
Dar lista de entrada en STDIN:
oddout.pl
:Si no le importa la cantidad variable de espacio alrededor del resultado, este 58 byte verson funciona:
Ambas versiones se repiten para siempre si la entrada no tiene solución.
Este es un código muy enfermo, pero no puedo pensar en nada elegante ...
La forma en que uso (ab)
%a
es un nuevo truco de Perlgolf, que yo sepa.fuente
Python 2, 73 bytes
Itera a través de conjuntos
d
de cinco elementos de secuencia consecutivos hasta que encuentra uno que contiene todos los elementos de entrada menos uno, y luego imprime la diferencia, que es la salida en un conjunto de singleton.Los conjuntos
d
de cinco elementos consecutivos se crean a partir de la nada al agregar repetidamente un nuevo elementoi+1
y eliminar cualquier elemento anteriori/32+1
que aparezca antes de la ventana actual de 5. Así es como se ve su progreso.Hay un 1 perdido al comienzo de la inicialización, pero es inofensivo porque se elimina de inmediato. Los conjuntos más pequeños, ya que acumula hasta 5 elementos, también son inofensivos.
fuente
PHP,
877675 bytescorre con
php -r '<code>' <value1> <value2> <value3> <value4> <value5>
fuente
array_diff
. Pero puedo guardar un byte allí.end
en lugar demax
y su nota no es más importanteC #, 69 bytes
int M(int[]a)=>a.Except(new int[30].Select((_,i)=>(1<<i+1)+1)).Sum();
fuente
Java 7,85 bytes
Sin golf
fuente
l
31? En la pregunta, solo veo un int-array como entrada, pero no un int adicional. : SPHP, 76 bytes
implementado la idea de Titus con el mod 5
126 bytes antes
fuente
array_map(function($z){return 2**$z+1;},range($i,$i+4))
.$x[key($x)]
->end($x)
1-count($x=...)
a la condición lo librará del descanso:for(;1-count($x=...););echo end($x);
(-13)Pyth, 18 bytes
Forme la secuencia, tome sublistas de longitud 5, elimine cada sublista de Q, tome el resultado más corto, genere su único elemento.
fuente
[5, 9, 2, 17, 33]
Kotlin, 55 bytes
fun f(a:IntArray)=a.find{it-1 !in(1..30).map{1 shl it}}
fuente