Tarea:
Dada una entrada entera, averigua si es o no un Número de Cyclops.
¿Qué es un número de Cyclops, puede preguntar? ¡Bueno, es un número cuya representación binaria solo tiene uno 0
en el centro!
Casos de prueba:
Input | Output | Binary | Explanation
--------------------------------------
0 | truthy | 0 | only one zero at "center"
1 | falsy | 1 | contains no zeroes
5 | truthy | 101 | only one zero at center
9 | falsy | 1001 | contains two zeroes (even though both are at the center)
10 | falsy | 1010 | contains two zeroes
27 | truthy | 11011 | only one zero at center
85 | falsy | 1010101 | contains three zeroes
101 | falsy | 1100101 | contains three zeroes
111 | falsy | 1101111 | only one zero, not at center
119 | truthy | 1110111 | only one zero at center
Entrada:
Un entero o tipos equivalentes. (
int
,long
,decimal
, Etc.)Suponga que si la evaluación de la entrada da como resultado un desbordamiento de enteros u otros problemas no deseados, entonces esa entrada no tiene que evaluarse.
Salida:
Verdad o falsedad.
La salida de verdad / falsedad debe cumplir con las especificaciones del lenguaje utilizado para verdad / falsedad. (p. ej., C es
0
tan falso, distinto de cero como verdadero)
Reglas de desafío:
Se supone que una entrada menor que 0 es falsa y, por lo tanto, no es necesario evaluarla.
Si la longitud de la representación binaria del número es par, entonces el número no puede ser un número de Cyclops.
Reglas generales:
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Las lagunas predeterminadas están prohibidas.
Se aplican reglas estándar para su respuesta con las reglas de E / S predeterminadas .
Este es mi primer desafío de programación de puzzles y golf de código , por lo que cualquier comentario sobre cómo debería mejorar sería muy apreciado.
Respuestas:
Japt, 8 bytes
Ejecútalo en línea
Explicación:
La idea es dividir la cadena binaria en
0
, lo que produciría dos elementos si solo hay uno0
. Luego vemos si el primer elemento coincide con el segundo para garantizar que sea palindrómico. Si la cadena binaria contiene múltiples0
s, entonces la reducción devolvería una matriz de elementos múltiples y eso fallaría la==1
condición. Si la cadena binaria contiene uno0
, pero no es palindrómico,äè
regresará0
porqueb
contiene0
coincidencias dea
.fuente
r¶
También debería funcionar.¤
= convertir a binario;q0
= dividido en 0s;äè
No estoy del todo seguro ...; y la bandera-N
convierte listas aNaN
, pero se va0
y1
lo mismo. Por laäè
parte, puedo ver que119
es[111,111]
después de la división, queäè
cambia a1
; y85
está[1,1,1,1]
después de la división, queäè
cambia a[1,1,1]
. ¿Podrías explicar cómo.ä("è")
funciona?NaN
Falsey está en Japt? (es decir, si se realiza un if-else con que a medida que la condición hace el si se ejecutan? "Truthy / salida Falsy debe cumplir con las especificaciones del lenguaje utilizado para Truthy / Falsy") también2
rendimientos2
que dudo es Falsey- (pero podría ser si Japt es como 05AB1E).0
sea considerado verdadero ... sin embargo, si2
regresa2
como verdadero, entonces esta presentación puede necesitar ser reelaborada.Python 2 , 30 bytes
Pruébalo en línea!
Tenga en cuenta que
2*n^2*n+3
es el bit xor de2*n
y2*n+3
, porque esa es la precedencia del operador de Python.fuente
lambda n:(2*n^2*n+3)**2-8*n-9
, con un valor de retorno de0
para los números de cíclope?TRUE
paran = -1
>1
.Código de máquina x86, 17 bytes
Los bytes anteriores definen una función que acepta un valor de entrada de entero de 32 bits (en el
EDI
registro para este ejemplo, siguiendo una convención de llamada común del Sistema V, pero en realidad podría elegir prácticamente cualquier registro de entrada que desee sin afectar el tamaño del resultado resultante código) y devuelve un resultado (en elEAX
registro) que indica si el valor de entrada es un número de Cyclops.Se supone que la entrada es un entero sin signo, ya que las reglas de desafío establecen que podemos ignorar los valores negativos.
La lógica de decisión se toma prestada de la respuesta de Neil : dado que un número de Cyclops tiene la forma , podemos usar una serie de operaciones de giro de bits para verificar el entrada.n = ( 2k+ 1 ) ( 2k - 1- 1 )
Nota: El valor de retorno es verdadero / falso, pero la semántica se invierte, de modo que la función devolverá falso para un número de Cyclops. Afirmo que esto es legal porque el código de máquina no tiene "especificaciones para veracidad / falsedad", que es el requisito en la pregunta. (Vea a continuación una versión alternativa si cree que esto es trampa).
En mnemotecnia en lenguaje ensamblador, esto es:
Pruébalo en línea!
Según lo prometido, si cree que es una trampa invertir la semántica de verdad / falsedad incluso en el código de máquina donde no hay estándares o convenciones reales, agregue tres bytes más, para un total de 21 bytes :
La primera mitad de este código es la misma que la original (a través de las
imul
instrucciones). Ellea
es casi lo mismo, pero en lugar de agregar una constante 2, solo agrega una constante 1. Esto se debe a que la siguienteinc
instrucción incrementa el valor en elEAX
registro en 1 para establecer las banderas. Si se establece el indicador "cero", lasetz
instrucción se estableceráAL
en 1; de lo contrario,AL
se establecerá en 0. Esta es la forma estándar en que un compilador de C generará código de máquina para devolver abool
.Cambiar la constante agregada en la
lea
instrucción obviamente no cambia el tamaño del código, y lainc
instrucción es muy pequeña (solo 1 byte), pero lasetz
instrucción es de 3 bytes. Desafortunadamente, no puedo pensar en una forma más corta de escribirlo.fuente
Regex (ECMAScript),
6058576058 bytesLa entrada está en unario, como la longitud de una cadena de s.norte
x
ADVERTENCIA DE SPOILER : Para la raíz cuadrada, esta expresión regular utiliza una variante del algoritmo de multiplicación generalizado, que no es obvio y podría ser un rompecabezas gratificante para resolver por su cuenta. Para obtener más información, consulte una explicación de esta forma del algoritmo en Buscar un número Rocco .
-2 bytes al permitir el retroceso en la búsqueda dez z de menor a mayor en lugar de viceversa
-1 byte gracias a Grimy , al buscar
+3 bytes para manejar cero
-2 bytes moviendo la captura de raíz cuadrada fuera de la búsqueda anticipada
^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$
Pruébalo en línea!
fuente
^(1*)0\1$
suficientemente simple ?JavaScript (Node.js) , 20 bytes
Pruébalo en línea!
Tal vez esto sea correcto, tal vez.
Gracias Grimy, 1 byte guardado.
JavaScript (Node.js) , 32 bytes
Pruébalo en línea!
JavaScript (Node.js) , 34 bytes
Pruébalo en línea!
fuente
.test
no.match
Perl 6 , 23 bytes
Pruébalo en línea!
Solución basada en expresiones regulares
fuente
Japt ,
2519109 bytesGracias a @Shaggy por -1 byte
Pruébalo en línea!
fuente
Mathematica (lenguaje Wolfram),
3231 bytes¡1 byte guardado gracias a J42161217!
Pruébalo en línea!
Función pura que toma un entero como entrada y regresa
True
oFalse
. Basándose en el hecho (divertido para probar!) Que un númeron
es Cyclops si y sólo sin
más la raíz cuadrada den/2
más2
rondas a una potencia impar de 2. (Se puede sustituirFloor
por cualquieraCeiling
oRound
todo el tiempo que también se reemplaza+2
por+1
.) RetornosTrue
a la entrada0
.fuente
Log2[#+Floor@Sqrt...
√()
lugar deSqrt[]
Rubí , 24 bytes
Pruébalo en línea!
fuente
Japt, 8 bytes
¡Gracias a Luis felipe de Jesus Munoz por arreglar mi presentación!
Pruébalo en línea!
Antigua solución basada en expresiones regulares, 15 bytes
Devuelve 1 para verdadero, 0 para falso.
Pruébalo en línea!
fuente
==
operador!Jalea ,
87 bytes-1 gracias a Erik the Outgolfer (use isPalindrome incorporado, en
ŒḂ
lugar de⁼Ṛ$
)Un enlace monádico que acepta un número entero que produce
1
(verdad) o0
(falsey).Pruébalo en línea!
¿Cómo?
fuente
Bċ0⁼1ȧŒḂ
también es de 8 bytes),⁼Ṛ$
es la misma queŒḂ
para -1. Además, no necesita manejar números negativos.ṚƑ
en su lugar hoy en día, por lo que es posible que desee recordarlo así (los más importantesƑ
).Haskell , 32 bytes
Pruébalo en línea!
fuente
Regex (ECMAScript),
5347 bytes-6 bytes gracias a Deadcode y Grimy
Pruébalo en línea!
fuente
^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
Brachylog , 8 bytes
Este es un predicado que tiene éxito si su entrada es un número de Cyclops y falla si su entrada no es un número de Cyclops. El éxito / fracaso es el concepto de verdad / falsey más fundamental en Brachylog.
Pruébalo en línea! O bien, encuentre todas las salidas verdaderas hasta 10000 .
Explicación
Esto tiene éxito solo cuando se le da un número de Cyclops, porque:
D↔D
fallará; En lo que sigue, podemos suponer que es un palíndromo.×ᵐ≠
fallarán.×ᵐ≠
fallarán.×ᵐ≠
tiene éxito, y todo el predicado tiene éxito.fuente
Ruby ,
2724 bytesConvierte a binario y verifica con una expresión regular. Devuelve
0
si es verdadero,nil
si es falso.-3 bytes gracias a GB .
Pruébalo en línea!
Para dos bytes más, hay un puerto directo de la solución Python:
fuente
05AB1E , 8 (o 9) bytes
Pruébelo en línea o verifique todos los casos de prueba .
Devuelve
1
si es verdad;0
o cualquier número entero positivo que no sea1
falsey. En 05AB1E solo1
es verdad y todo lo demás es falso, pero no estoy seguro de si esta es una salida permitida, o si la salida debería ser dos valores consistentes y únicos. Si es el segundo,Θ
se puede agregar un final para que todas las salidas que no1
sean0
:Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Un enfoque aritmético sería de 10 bytes:
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
1
como verdadero y todos los demás números como falso es aceptable para este desafío, ya que otros lenguajes (por ejemplo, C y TI-BASIC) tienen definiciones similares de verdad / falso (0 / no cero para ambos). Mientras lo que se considera verdadero o falso coincida con las especificaciones del lenguaje, entonces es un juego justo.Excel,
9763 bytesCalcula 2 números:
Luego reste el segundo número del primero:
Y compara este resultado con el número original
Método antiguo
Comience con el Log-base-2 de A1 y redondee hacia abajo el número par más cercano, luego agregue 1.
Luego, cree una cadena de esa cantidad de
"1"
s, y reemplace el carácter del medio con a"0"
para crear un número de Cyclops con una longitud binaria que siempre es impar, y lo mismo o 1 menos que la longitud binaria de A1Luego, compárelo con la representación binaria de A1
fuente
R ,
3733 bytesPruébalo en línea!
R no tiene una función incorporada para convertir a binario, así que simplemente usé una de las fórmulas de OEIS para calcular una lista de términos de la secuencia.
n<-0:x
genera una generosa lista de valores iniciales.2*4^(n<-0:x^2)-2^n-1)
es la fórmula de OEIS, y luego comprueba si la entrada aparece en esa secuencia usando%in%
.-2 bytes al no tener que manejar entradas negativas. -2 bytes recordando que puedo cambiar
<-
a=
.fuente
C (gcc), 26 bytes
Pruébalo en línea!
La respuesta del puerto de Neil . Se basa en la ordenación de operaciones definida por la implementación.
C ++ (clang), 38 bytes
Pruébalo en línea!
No se pueden omitir los tipos en C ++, no se puede omitir el retorno en clang, de lo contrario es idéntico.
fuente
return
lugar del exploit de valor de retorno del acumulador implícito frágil y dependiente de la plataforma.C (gcc) ,
29 2827 bytesGuardado 1 byte gracias a @ceilingcat
Un puerto de la respuesta JS de 21 bytes por @tsh .
Pruébalo en línea!
fuente
J ,
2219171514 bytes-3 bytes gracias a BolceBussiere!
-4 bytes gracias a ngn!
-1 byte gracias a Traws!
J , 14 bytes
Pruébalo en línea!
fuente
#=1++/
(#=1++/)@(*|.)@#:
1=1#.1-(*|.)@#:
1=1#.(*:|.)@#:
Jalea , 9 bytes
Pruébalo en línea!
fuente
Adjunto , 22 bytes
Pruébalo en línea!
Alternativas
27 bytes:
{BitXor[2*_,2*_+3]^2=8*_+9}
27 bytes:
{BitXor@@(2*_+0'3)^2=8*_+9}
27 bytes:
{Palindromic@_∧1=0~_}@Bin
28 bytes:
{BitXor[...2*_+0'3]^2=8*_+9}
28 bytes:
{BitXor[…2*_+0'3]^2=8*_+9}
28 bytes:
{Same@@Bisect@_∧1=0~_}@Bin
29 bytes:
{_[#_/2|Floor]=0∧1=0~_}@Bin
30 bytes:
Same@Bin@{_+2^Floor[Log2@_/2]}
30 bytes:
{_[#_/2|Floor]=0and 1=0~_}@Bin
fuente
Retina 0.8.2 ,
3837 bytesPruébalo en línea! El enlace incluye casos de prueba. Editar: después de la aclaración, la solución anterior no manejaba el cero correctamente. Explicación:
Convierte de decimal a unario.
Convierta de unario a binario, utilizando el método de la wiki de Retina.
Verifique el mismo número de
1
s antes y después de0
, o una cadena vacía (que es como la conversión anterior maneja cero).fuente
Lote,
3937 bytesfuente
Excel,
101107bytes-6 bytes gracias a @Chronocidal.
Realiza 3 verificaciones:
0
0
fuente
ISODD(LEN(DEC2BIN(A1)))
aISEVEN(LOG(A1,2))
Regex (ECMAScript),
65595758 bytes+1 byte para manejar 0 correctamente
Pruébalo en línea!
fuente
VBA,
4136 bytesEjecutar en la ventana Inmediato, con la Declaración explícita desactivada. La entrada es la celda
A1
de la hoja activa. Salidas Verdadero / Falso a la ventana inmediata.Utiliza la misma lógica que mi respuesta de Excel para encontrar el número de Cyclops del mismo número de bits (¡o 1 bit más corto si hay un número par!) Y luego lo compara con la entrada.
Guarda algunos bytes al calcular los números de Cyclops reduciéndolos a la forma
y = 2x^2 - x - 1
(dondex = n-1
para el enésimo número de Cyclops, ox = 2^Int(Log([A1])/Log(4))
para encontrar el número de Cyclops más grande con un número menor o igual de bits) y almacenando x en una variable(-5 Bytes gracias a Taylor Scott !)
fuente
[...]
notación como[(Log(A1,4)]
PHP , 74 bytes
Pruébalo en línea!
Enfoque no matemático totalmente ingenuo, solo cadenas.
O 60 bytes basados en el algoritmo de @ Chronocidal anterior .
Pruébalo en línea!
fuente
Haskell, 82 bytes
Y un puerto de la solución Python de xnor:
Haskell, 47 bytes
fuente