Esta es una versión del desafío reciente ¿Es este número una potencia entera de -2? con un conjunto diferente de criterios diseñados para resaltar la naturaleza interesante del problema y hacer que el desafío sea más difícil. Puse algo de consideración aquí .
El desafío que Toby afirma maravillosamente en la pregunta vinculada es:
Hay formas inteligentes de determinar si un número entero es una potencia exacta de 2. Eso ya no es un problema interesante, así que determinemos si un entero dado es una potencia exacta de -2 . Por ejemplo:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Reglas:
- Un número entero es de 64 bits, con signo, complemento de dos. Este es el único tipo de datos con el que puede trabajar.
- Solo puede usar las siguientes operaciones. Cada uno de estos cuenta como una operación.
n << k
,n >> k
: Desplazamiento a la izquierda / derechan
pork
bits. El bit de signo se extiende en el desplazamiento a la derecha.n >>> k
: Desplazamiento a la derecha pero no extiende el bit de signo. Los 0 se desplazan.a & b
,a | b
,a ^ b
: Bitwise AND, OR, XOR.a + b
,a - b
,a * b
: Sumar, restar, multiplicar.~b
: Inversión bit a bit.-b
: Negación del complemento a dos.a / b
,a % b
: Divide (cociente entero, se redondea hacia 0) y módulo.- El módulo de números negativos utiliza las reglas especificadas en C99 :
(a/b) * b + a%b
será iguala
. Así5 % -3
es2
y-5 % 3
es-2
: 5 / 3
es1
,5 % 3
es2
, como 1 * 3 + 2 = 5.-5 / 3
es-1
,-5 % 3
es-2
, como -1 * 3 + -2 = -5.5 / -3
es-1
,5 % -3
es2
, como -1 * -3 + 2 = 5.-5 / -3
es1
,-5 % -3
es-2
, como 1 * -3 + -2 = -5.- Tenga en cuenta que el
//
operador de división de piso de Python no satisface la propiedad de "redondear hacia 0" de la división aquí, y el%
operador de Python tampoco cumple con los requisitos.
- El módulo de números negativos utiliza las reglas especificadas en C99 :
- Las asignaciones no cuentan como una operación. Como en C, las asignaciones evalúan el valor del lado izquierdo después de la asignación: se
a = (b = a + 5)
estableceb
ena + 5
, luego se establecea
enb
, y cuenta como una operación. - Las asignaciones compuestas pueden usarse como
a += b
mediosa = a + b
y contar como una operación.
- Puede usar constantes enteras, no cuentan como nada.
- Los paréntesis para especificar el orden de las operaciones son aceptables.
- Puedes declarar funciones. Las declaraciones de funciones pueden tener cualquier estilo que sea conveniente para usted, pero tenga en cuenta que los enteros de 64 bits son el único tipo de datos válido. Las declaraciones de funciones no cuentan como operaciones, pero una llamada de función cuenta como una. Además, para ser claros: las funciones pueden contener múltiples
return
declaraciones yreturn
se permiten mensajes de correo electrónico desde cualquier punto. Elreturn
sí mismo no cuenta como una operación. - Puede declarar variables sin costo.
- Puede usar
while
bucles, pero no puede usarif
ofor
. Los operadores utilizados en lawhile
condición cuentan para su puntaje.while
los bucles se ejecutan siempre que su condición se evalúe a un valor distinto de cero (un "verdadero" 0 en lenguajes que tienen este concepto no es un resultado válido). Ya que se permite a principios de retención, se le permite utilizarbreak
, así - Se permite el desbordamiento / subflujo y no se realizará una fijación de valor. Se trata como si la operación realmente sucediera correctamente y luego se truncara a 64 bits.
Criterios de puntuación / victoria:
Su código debe producir un valor que no sea cero si la entrada es una potencia de -2, y cero en caso contrario.
Este es el código atómico de golf . Su puntaje es el número total de operaciones presentes en su código (como se definió anteriormente), no el número total de operaciones que se ejecutan en tiempo de ejecución. El siguiente código:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
Contiene 5 operaciones: dos en la función y tres llamadas a funciones.
No importa cómo presente su resultado, use lo que sea conveniente en su idioma, ya sea en última instancia, almacenando el resultado en una variable, devolviéndolo de una función, o lo que sea.
El ganador es la publicación que es demostrablemente correcta (proporcione una prueba informal o formal si es necesario) y tiene el puntaje más bajo como se describió anteriormente.
Bonus muy difícil modo desafío!
Para tener la oportunidad de ganar absolutamente nada, excepto la capacidad potencial de impresionar a las personas en las fiestas, envíe una respuesta sin usar while
bucles Si se presentan suficientes de estos, incluso podría considerar dividir los grupos ganadores en dos categorías (con y sin bucles).
Nota: Si desea proporcionar una solución en un lenguaje que solo sea compatible con enteros de 32 bits, puede hacerlo, siempre que justifique suficientemente que seguirá siendo correcta para enteros de 64 bits en una explicación.
Además: ciertas características específicas del idioma pueden permitirse sin costo si no eluden las reglas, pero son necesarias para obligar a su idioma a comportarse de acuerdo con las reglas anteriores . Por ejemplo (artificial), permitiré una comparación libre no igual a 0 en while
bucles, cuando se aplica a la condición como un todo, como una solución para un lenguaje que tiene ceros "verdaderos". No se permiten intentos claros de aprovechar este tipo de cosas , por ejemplo, el concepto de valores "verdaderos" 0 o "indefinidos" no existe en el conjunto de reglas anterior, por lo que no se puede confiar en ellos.
m ^= s
que sea todavía impresionante, y creo que estaría totalmente bien hacer la sustitución para mejorarlo aún más.
while
y break
no permitir if
? if (x) { ... }
es equivalente a while (x) { ... break; }
.
break
y los retornos tempranos son la parte lamentable) y es una larga historia y una lección aprendida en reglas para futuros desafíos. ¡Siempre existe la versión "bonus"! :)
if
y for
no están permitidos? int x=condition; while (x) { ... x=0; }
es gratis, solo más código. Lo mismo con c-style for
.