Escriba un programa que verifique si el entero es una potencia de 2.
Entrada de muestra:
8
Salida de muestra:
Yes
Entrada de muestra:
10
Salida de muestra:
No
Reglas:
No utilices
+
,-
operaciones.Use algún tipo de flujo de entrada para obtener el número. No se supone que la entrada se almacene inicialmente en una variable.
El código más corto (en bytes) gana.
Puede usar cualquier respuesta de verdad / falsedad (por ejemplo, true
/ false
). Puede suponer que el número de entrada es mayor que 0
.
code-golf
restricted-source
decision-problem
integer
gthacoder
fuente
fuente
pred
función, cuando se aplica a un número entero n, devuelve n - 1. ¿Están también prohibidas funciones como esta, que son disfraces delgados alrededor del operador prohibido?)
, o la mayoría de los lenguajes basados en c '--
.Respuestas:
GolfScript, 6 caracteres, sin decrementos
Aquí hay una solución que no usa el
x & (x-1)
método de ninguna forma. Utiliza en sux & (x/3)
lugar. ;-) Salidas0
si es falso,1
si es verdadero.Explicación:
~
evalúa la cadena de entrada para convertirla en un número,.
lo duplica (para el subsiguiente&
),3/
lo divide por tres (truncando)&
calcula el AND a nivel de bit del valor dividido con el original, que será cero si y solo si la entrada es cero o una potencia de dos (es decir, tiene como máximo un conjunto de bits), y!
lógicamente niega esto, asignando cero a uno y todos los demás valores a cero.Notas:
De acuerdo con las reglas aclaradas, el cero no es una entrada válida , por lo que este código está bien, aunque salga
1
si la entrada es cero.Si
(
se permite el operador de decremento GolfScript , entonces la solución de 5 caracteres~.(&!
publicada por aditsu es suficiente. Sin embargo, parece ir en contra del espíritu de las reglas , si no de la carta.Se me ocurrió el
x & (x/3)
truco hace años en la lista de correo Fun With Perl. (Estoy seguro de que no soy el primero en descubrirlo, pero lo (re) inventé independientemente). Aquí hay un enlace a la publicación original , que incluye una prueba de que realmente funciona.fuente
7/3 = 2 (0010)
, así7 & 2 = 0111 & 0010 = 0010
que claramente el último bit no es 1APL (7)
Sí, eso es 7 bytes . Suponga por el momento que estoy usando la página de códigos 907 de IBM en lugar de Unicode y luego cada carácter es un byte :)
es decir
0 = mod(log(input(),2),1)
fuente
Indeterminate
cuando lo intento.GolfScript, 11 (para 1 (verdadero) y 0 (falso))
Pon el número en la pila y luego corre.
GolfScript, 22 (para Sí / No)
Me encanta cómo convertir
1
/0
aYes
/No
toma tanto código como el desafío en sí: DAdvertencia: EXTREMADAMENTE ineficiente;) Funciona bien para números de hasta 10000, pero una vez que llega tan alto, comienza a notar un ligero retraso.
Explicación:
.,
: se convierten
enn 0..n
(.
duplicado,,
0..n rango){2\?}
: al poder de 2%
: asigna "potencia de 2" sobre "0..n" para que se conviertan [1 2 4 8 16 ...]
?0>
: comprueba si la matriz contiene el número (0 es mayor que el índice)fuente
.,{2\?}%?0<'YesNo'3/=
:; También creo que estás haciendo trampa al preguntar "Pon el número en la pila", debes comenzar con a~
.Mathematica 28
Para potencias enteras de 2, el numerador del registro de base 2 será 1 (lo que significa que el registro es una fracción unitaria).
Aquí modificamos la función ligeramente para mostrar la entrada presunta. Usamos
#
en lugar deInput[]
y agregamos&
para definir una función pura. Devuelve la misma respuesta que se devolvería si el usuario ingresara el número en la función anterior.Prueba de varios números a la vez.
fuente
Perl 6 (17 caracteres)
Este programa obtiene una línea de la
get
función STDIN , calcula el logaritmo con la base 2 (log(2)
), y comprueba si el resultado se divide por 1 (%%1
, donde%%
se divide por operador). No es tan corto como la solución GolfScript, pero me parece aceptable (GolfScript gana todo de todos modos), pero mucho más rápido (incluso teniendo en cuenta que Perl 6 es lento en este momento).fuente
+
y-
están prohibidos para este desafío, es porque six & (x - 1)
es igual0
, entoncesx
es una potencia de 2.x&~(~0*x)
aún funciona. Eso es solo 2 caracteres más.Octava (
1523)EDITAR: actualizado debido al requisito de entrada del usuario;
Permite al usuario ingresar un valor y generar 1 para verdadero, 0 para falso.
Probado en Octave, debería funcionar también en Matlab.
fuente
R,
1311Basado en la solución Perl. Devoluciones
FALSE
oTRUE
.El parámetro
i
representa la variable de entrada.Una versión alternativa con entrada del usuario:
fuente
GolfScript, 5
Salidas 1 para verdadero, 0 para falso. Según la idea del usuario3142747:
Nota:
(
es decremento, es de esperar que no cuente como-
:)Si lo hace (y los comentarios del OP sugieren que podría serlo ), consulte la solución de Ilmari Karonen .
Para salida Y / N, agregue
'NY'1/=
al final (7 bytes más).fuente
Python, 31
fuente
bin(input()).rfind('1')<3
2==
porque pensé que también debería funcionar para números no positivos. Que explícitamente no está requerido por las reglas, así que ...print bin(input()).count('1')<2
en un total de 31 caracteres, pero es muy similar al tuyo.C, 48
fuente
*
tiene mayor prioridad que el binario&
, no necesita los parens. Y si se acepta el valor de retorno (solo preguntado)exit(x&x*-1)
sería mucho más corto.-
:x*-1
.-
está prohibido.Decidí usar otro enfoque, basado en el recuento de población o la suma lateral del número (el número de 1 bits). La idea es que todas las potencias de dos tienen exactamente un
1
bit, y ningún otro número lo tiene. Agregué una versión de JavaScript porque me pareció divertido, aunque ciertamente no ganará ninguna competencia de golf.J,
1415 caracteres (salidas 0 o 1)JavaScript, 76 caracteres (salidas verdaderas o falsas)
fuente
Clip ,
987Lee un número de stdin.
Explicación:
Para empezar,
Z
=0
,W
=2
yO
= 1. Esto permite la colocación deW
yO
junto a la otra, mientras que el uso2
y1
sería interpretado como el número 21 sin un espacio de separación (un carácter adicional no deseado). En Clip, la función de módulo (%
) funciona en no enteros, por lo tanto, para determinar si algún valorv
es un entero, verifica siv
mod 1 = 0. Usando la sintaxis de Clip, esto se escribe como=0%v1
. Sin embargo, como los booleanos se almacenan como1
(o cualquier otra cosa) y0
, comprobar si algo es igual a0
'simplemente' no es así. Para esto, Clip tiene el!
operador. En mi código,v
eslnx2
.x
es una entrada de stdin,n
convierte una cadena en un número ylab
es la baseb
de registro dea
. Por lo tanto, el programa se traduce (más legible) a0 = ((log base 2 of parseInt(readLine)) mod 1)
.Ejemplos:
salidas
y
salidas
Edición 1: reemplazado
0
,1
y2
conZ
,O
yW
.Edición 2: reemplazado
=Z
con!
.También:
Pyth , 5
Comprime aún más la versión de Clip, ya que Pyth tiene Q para la entrada ya evaluada y una función log2 (a) en lugar de solo el registro general (a, b).
fuente
Javascript (37)
Script simple que solo divide por 2 repetidamente y verifica el resto.
fuente
for
bucle (también 37 caracteres)for(i=prompt();i>1;i/=2){}alert(i==1)
Mathematica (21)
Sin entrada es un poco más corto
fuente
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
4140 caracteresCómo funciona: tomas el logaritmo en la base 2 usando
l(prompt()) / l(2)
, y si ese resultado el módulo 1 es igual a cero, entonces es una potencia de 2.Por ejemplo: después de tomar el logaritmo de 8 en la base
2
, obtienes3
.3 modulo 1
es igual a 0, por lo que esto devuelve verdadero.Después de tomar el logaritmo de 7 en la base 2, obtienes
2.807354922057604
.2.807354922057604 modulo 1
es igual a0.807354922057604
, entonces esto devuelve falso.fuente
Math.log
ya lo hará : "Cada una de las siguientes funciones de objetos matemáticos aplica el operador abstracto ToNumber a cada uno de sus argumentos ..."JavaScript, 35
Funciona para bytes.
Versión de 46 caracteres , funciona para números de 16 bits.
El truco funciona en la mayoría de los lenguajes dinámicos.
Explicación: Convierta el número a base 2, interprete esa cadena como base 10, haga el módulo 9 para obtener la suma de dígitos, que debe ser 1.
fuente
0x2ff
, que en la base 2 es1111111111
?+1
!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13 + 1 = 14 caracteres
Utiliza el mismo método de un hilo antiguo de FWP como mi entrada de GolfScript . Imprime
1
si la entrada es una potencia de dos, y una línea vacía de lo contrario.Necesita ser manejado con
perl -nE
; Eln
costo es de un personaje adicional , para un total de 14 caracteres. Alternativamente, aquí hay una versión de 18 caracteres que no necesitan
:fuente
pitón 3, 38
pitón, 32
Sin embargo, el código no funciona en todas las versiones.
Tenga en cuenta que la solución también funciona para 0 (print False).
fuente
==
con&
?Ruby - 17 caracteres (cuarto intento)
Mi mejor momento actual es una fusión de la respuesta de @ steenslag con la mía. A continuación están mis intentos anteriores.
Ruby - 19 caracteres (tercer intento)
Ruby - 22 caracteres (segundo intento)
Ruby - 24 caracteres (primer intento)
fuente
K / Kona (
2417)Devuelve 1 si es verdadero y 0 si es falso. Cualquier potencia de 2 tiene un solo bit igual a 1:
(esto imprime todos los poderes de 2 (de 0 a 9) en binario)
Así que resumo todos los componentes de la expresión binaria de
x
y veo si es igual a 1; en caso afirmativox=2^n
, de lo contrario no.... sabía que podía hacerlo más pequeño
fuente
C # (54 caracteres)
fuente
Int32
, noToInt32
...int
lugar deInt32
2 caracteres menos.Rebmu (9 caracteres)
Prueba
Rebmu es un dialecto restringido de Rebol. El código es esencialmente:
Alternativa
14 caracteres: Rebmu no tiene un bit 'mushed' Y ~
En Rebol:
fuente
GTB , 46 bytes
fuente
Python, 35
No utiliza no solo operaciones +/-, sino también operaciones matemáticas además de la conversión a forma binaria.
Otras cosas (interesantes, pero no para la competencia):
También tengo una versión regexp (61) :
(Me encanta la idea, pero la función de importar y combinar hace que sea demasiado larga)
Y agradable, pero aburrida versión de operaciones bit a bit (31) :
(sí, es más corto, pero usa ~ -x para la disminución que contiene la operación)
fuente
Python 2.7 (
30293937)EDITAR: actualizado debido al requisito de entrada del usuario;
Fuerza bruta, intente dividir hasta = 1 (éxito) o <1 (fracaso)
fuente
not a%2
se puede escribir comoa%2==0
. De acuerdo, esto sería más largo en muchos idiomas, pero no en Python.a%2<1
.2.
Eliminar que ahorraría un byte.Pitón (33)
fuente
int(bin(input()*2)[3:])<1
También funciona desde el shell de Python con solo 25 caracteres.Rubí,
33,28, 25fuente
APL (12 para 0/1, 27 para sí / no)
o, si debemos generar texto:
Lea en A. Forme un vector 0..A, luego un vector 2 0 ..2 A (sí, eso es mucho más de lo necesario), luego un vector que compara A con cada uno de ellos (lo que resulta en un vector de 0 y como máximo uno 1), luego xor que (no hay operador xor en APL, pero ≠ aplicado a booleanos actuará como uno.) Ahora tenemos 0 o 1.
Para obtener SÍ o NO: multiplique el 0 o 1 por 3, elimine este número de caracteres de 'SÍ NO', luego tome los primeros 3 caracteres de este.
fuente
C, 65 bytes
fuente
main(k){...
, confiando en laint
escritura implícita . Puede ser UB, pero este es el código de golf. NUNCA use algo así en la producción, por supuesto.Haskell (
5250)fuente