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 0en 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
0tan 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últiples0s, entonces la reducción devolvería una matriz de elementos múltiples y eso fallaría la==1condición. Si la cadena binaria contiene uno0, pero no es palindrómico,äèregresará0porquebcontiene0coincidencias dea.fuente
r¶También debería funcionar.¤= convertir a binario;q0= dividido en 0s;äèNo estoy del todo seguro ...; y la bandera-Nconvierte listas aNaN, pero se va0y1lo mismo. Por laäèparte, puedo ver que119es[111,111]después de la división, queäècambia a1; y85está[1,1,1,1]después de la división, queäècambia a[1,1,1]. ¿Podrías explicar cómo.ä("è")funciona?NaNFalsey 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én2rendimientos2que dudo es Falsey- (pero podría ser si Japt es como 05AB1E).0sea considerado verdadero ... sin embargo, si2regresa2como 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+3es el bit xor de2*ny2*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 de0para los números de cíclope?TRUEparan = -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
EDIregistro 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 elEAXregistro) 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
imulinstrucciones). Elleaes casi lo mismo, pero en lugar de agregar una constante 2, solo agrega una constante 1. Esto se debe a que la siguienteincinstrucción incrementa el valor en elEAXregistro en 1 para establecer las banderas. Si se establece el indicador "cero", lasetzinstrucción se estableceráALen 1; de lo contrario,ALse 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
leainstrucción obviamente no cambia el tamaño del código, y laincinstrucción es muy pequeña (solo 1 byte), pero lasetzinstrucció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
xADVERTENCIA 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
.testno.matchPerl 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
TrueoFalse. Basándose en el hecho (divertido para probar!) Que un númerones Cyclops si y sólo sinmás la raíz cuadrada den/2más2rondas a una potencia impar de 2. (Se puede sustituirFloorpor cualquieraCeilingoRoundtodo el tiempo que también se reemplaza+2por+1.) RetornosTruea 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↔Dfallará; 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
0si es verdadero,nilsi 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
1si es verdad;0o cualquier número entero positivo que no sea1falsey. En 05AB1E solo1es 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 no1sean0: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
1como 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:xgenera 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
returnlugar 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~_}@Bin28 bytes:
{BitXor[...2*_+0'3]^2=8*_+9}28 bytes:
{BitXor[…2*_+0'3]^2=8*_+9}28 bytes:
{Same@@Bisect@_∧1=0~_}@Bin29 bytes:
{_[#_/2|Floor]=0∧1=0~_}@Bin30 bytes:
Same@Bin@{_+2^Floor[Log2@_/2]}30 bytes:
{_[#_/2|Floor]=0and 1=0~_}@Binfuente
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
1s 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:
00fuente
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
A1de 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-1para 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