Números palindrómicos con un giro binario.


29

Advertencia: ¡este NO es un desafío de "oye, dibujemos un pastel en el arte ASCII"! Por favor sigue leyendo;)

Hace algún tiempo era mi cumpleaños, ahora tengo 33 años.

Por lo tanto, existe esta incómoda tradición social que consiste en invitar a familiares y amigos, poner velas con números en un pastel, cantar canciones y abrir regalos.

   33   
--------

En lugar de números, puedo usar el sistema binario para poner velas estándar: coloco 6 de ellas en el pastel y enciendo dos.

 100001
--------

¡Puedo ver que los números decimales y binarios de mi edad son palindrómicos!

Reto

Quiero saber si cualquier otro número se puede poner en un pastel con velas y ser palindrómico, decimal y binario.

Escriba un programa / función para probar si un número es palindrómico tanto en decimal como en binario. Pero espera, hay más: ¡ en binario, los ceros iniciales cuentan para la prueba!

Entrada

Un número decimal x que quiero probar si es un cumpleaños palindrómico con 0 <x <2 32 -1 (sí, las personas en mi dimensión viven mucho tiempo)

Salida

Verdad si cumple exactamente estas dos condiciones, Falsey más:

  • La representación decimal del número es un palíndromo estándar.
  • La representación binaria del número es un palíndromo estándar, y agregar ceros a la izquierda puede ayudar con esto

Casos de prueba

1 > 1 => Truthy
6 > 110 (0110) => Truthy
9 > 1001 => Truthy
10 > 1010 (01010) => Falsey, 10 is not palindromic
12 => 1100 (001100) => Falsey, 12 is not palindromic
13 => 1101 (...01101) => Falsey, neither 13 nor 1101 are palindromic
14 => 1110 (01110) => Falsey, 14 is not palindromic
33 > 100001 => Truthy
44 > 101100 (..0101100) => Falsey, 101100 is not palindromic
1342177280 > 1010000000000000000000000000000 (00000000000000000000000000001010000000000000000000000000000) => Falsey, 1342177280 is not palindromic (but the binary representation is)
297515792 > 10001101110111011101100010000 (000010001101110111011101100010000) => Truthy

Reglas

¡Buena suerte y, finalmente, feliz cumpleaños!



66
Es posible que desee cambiar el título, ya que la parte del cumpleaños es irrelevante.
NoOneIsHere

@NoOneIsAquí, el desafío es sobre velas en un pastel de cumpleaños. También está el giro en la representación binaria, por lo que no se trata de "números genéricos palindrómicos". Si tu comentario es votado, crearé otro título.
Goufalite

Entonces, de acuerdo con las reglas, 0b01010000000000000000000000000000¿no es palindrómico ya que requeriría agregar más ceros y, por lo tanto, exceder 2 ^ 32-1? En este caso, sería útil agregar algo 1342177280como un caso de prueba de falsey.
Cristian Lupascu

1
@ w0lf No escribí un límite para agregar ceros, pero entiendo su problema de desbordamiento de pila;) Además, 1342177280no es decimal palindrómico, así que Falsey. Edición
Goufalite

Respuestas:


17

05AB1E , 7 bytes

b0Ü‚DíQ

Pruébalo en línea! o como un conjunto de pruebas

Explicación

b         # convert input to binary
 0Ü       # remove trailing zeroes
   ‚      # pair with input
    D     # duplicate
     í    # reverse each (in the copy)
      Q   # check for equality

Bifurcado no ayudó?
Magic Octopus Urn

@MagicOctopusUrn: Desafortunadamente no, ya que quiero revertir cada número en la lista y no la lista en sí.
Emigna

11

Python 3 , 59 bytes

lambda a:all(c==c[::-1]for c in[str(a),bin(a).strip('0b')])

Pruébalo en línea!

-3 bytes gracias a Rod
-3 bytes gracias a Connor Johnston



1
el uso de strip con cadenas eliminará caracteres individuales: [bin (a) [2:]. strip ('0') => bin (a) .strip ('0b')] ( tio.run/… "Python 3 - Intenta It Online ")
Conner Johnston

@ConnerJohnston o genial, gracias!
HyperNeutrino

8

JavaScript (ES6), 65 bytes

Devoluciones 0o 1.

n=>(g=b=>[...s=n.toString(b)].reverse().join``==s)()&g(2,n/=n&-n)

¿Cómo?

La función auxiliar g () toma un entero b como entrada y prueba si n es un palíndromo en la base b . Si no se especifica b , solo convierte n en una cadena antes de probarlo.

Eliminamos los ceros finales en la representación binaria de n aislando el 1 menos significativo con n&-ny dividiendo n entre la cantidad resultante.

Dato curioso: es cierto 0porque (0/0).toString(2)igual "NaN", que es un palíndromo. (Pero de 0todos modos no es una entrada válida).

Casos de prueba


5

Mathematica, 52 49 bytes

i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&

Pruébalo en Wolfram Sandbox

Uso

f = (i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&);

f[6]

True

f /@ {9, 14, 33, 44}

{True, False, True, False}

Explicación

i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&

i=IntegerReverse                                   (* Set i to the integer reversing function. *)
                 i@#==#                            (* Check whether the input reversed is equal to input. *)
                       &&                          (* Logical AND *)
                          i[#,2,Range@#]           (* Generate the binary-reversed versions of input, whose lengths *)
                                                   (* (in binary) are `{1..<input>}` *) 
                                                   (* trim or pad 0s to match length *)
                                        ~FreeQ~#   (* Check whether the result is free of the original input *)
                         !                         (* Logical NOT *)

Versión con incorporado PalindromeQ

PalindromeQ@#&&!IntegerReverse[#,2,Range@#]~FreeQ~#&


3

Japt , 14 bytes

s ꬩ¢w n2 ¤ê¬

¡Pruébelo en línea!

Explicación

 s ê¬ © ¢   w n2 ¤  ê¬
Us êq &&Us2 w n2 s2 êq   Ungolfed
                         Implicit: U = input integer
Us êq                    Convert U to a string and check if it's a palindrome.
        Us2 w            Convert U to binary and reverse. 
              n2 s2      Convert to a number, then back to binary, to remove extra 0s.
                    êq   Check if this is a palindrome.
      &&                 Return whether both of these conditions were met.

Se le ocurrió un par de soluciones similares para 13 bytes: sêQ *(¢w)sêQysêQ &¢w n sêQ
Shaggy

@ Shaggy Gracias, pero desafortunadamente ambos fallan 297515792(el binario invertido convertido a decimal es demasiado grande para que JS lo maneje) ...
ETHproductions


2

APL, 27 31 bytes

∧/(⌽≡⊢)∘⍕¨{⍵,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢⍵}

Como funciona Usando 6 como argumento ...

      2⊥⍣¯1⊢6 ⍝ get the bit representation
1 1 0

      ⌽2⊥⍣¯1⊢6 ⍝ reverse it (if it's a palindrome, it doesn't matter)
0 1 1

      {⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ drop off the trailing (now leading 0's)
1 1

      6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ enclose and concatenate the bits to the original number
┌─┬───┐
│6│1 1│
└─┴───┘

      (⌽≡⊢)∘⍕ ⍝ is a composition of
      ⍕ ⍝ convert to string and 
      (⌽≡⊢) ⍝ palindrome test

      (⌽≡⊢)∘⍕¨6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ apply it to each of the original argument and the bit representation
  1 1

      ∧/(⌽≡⊢)∘⍕¨6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6  ⍝ ∧/ tests for all 1's (truth)
  1

Pruébalo en TryAPL.org


Según las especificaciones, se supone que 6 es una buena entrada, pero la expresión proporcionada devuelve falso.
lstefano

Ah, ratas! Eso es lo que obtengo por no leer el problema en su totalidad. Buena atrapada. ¡gracias! Lo modifiqué con una solución un poco más larga, pero con suerte más correcta.
Brian Becker

Bienvenido a PPCG. Bonito primer post! Desafortunadamente, su presentación en su forma actual no es ni un programa ni una función. Sin embargo, no se preocupe, puede convertirlo en una función pero dejando que los corchetes externos encierren todo el código.
Adám

Guarde tres bytes: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(es una buena forma de proporcionar un enlace para ejecutar todo el conjunto de pruebas)
Adám


1

Brachylog , 7 bytes

↔?ḃc↔.↔

Pruébalo en línea!

Eso es un montón de ...

Explicación

Con la entrada y salida implícita, el código es: ?↔?ḃc↔.↔.

?↔?        The Input is a palindrome
   ḃ       Convert it to the list of its digits in binary
    c      Concatenate it into an integer
     ↔     Reverse it: this causes to remove the trailing 0's
      .↔.  The resulting number is also a palindrome

1

APL (Dyalog Classic) , 26 bytes

{≡∘⌽⍨⍕⍵,⍵,⍨(<\⊂⊢)⌽2⊥⍣¯1⊢⍵}

Explicación

                  2⊥⍣¯1⊢⍵  encode  as binary
                          reverse
           (<\⊂⊢)          partition from first 1
      ⍵,⍵,⍨                prepend and append 
                         turn into text string
≡∘⌽⍨                       match text with its reverse (fX is XfX, where f is a composed function that reverses its right argument and matches with left)

Pruébalo en línea!


¡Oh, superaste a BB!
Adám


1

Pyt , 10 bytes

Devuelve [1] si es verdadero, [0] si es falso

ĐɓƖ₫áĐ₫=ʁ∧

Pruébalo en línea!

Explicación:

              Implicit input
Đ             Duplicate input
ɓ             Get input in binary (as string)
Ɩ             Cast to integer
₫             Reverse the digits (this removes any trailing zeroes)
á             Push the stack into a list
Đ             Duplicate the list
₫             Reverse the digits of each element of the list
=             Are the two lists equal element-wise
ʁ∧            Reduce the list by bitwise AND

0

Retina , 72 bytes

.+
$*_;$&
+`(_+)\1
$+0
0_
_
0+;
;
+`\b(\w)((\w*)\1)?\b
$3
(\B;\B)|.*
$.1

Pruébalo en línea! El enlace incluye casos de prueba. Funciona creando un duplicado unario del número original, pero usando _s para que no se confunda, por ejemplo, con una entrada de 11. El número unario se convierte en "binario" y se eliminan los ceros finales. Los palíndromos se truncan sucesivamente y la última etapa prueba si queda algo.


0

Mathematica, 70 bytes

(P=PalindromeQ)[PadRight[#~IntegerDigits~2,#~IntegerExponent~2]]&&P@#&

0

Casco , 14 bytes

¤&S=↔ȯ↓=0↔ḋ⁰d⁰

Pruébalo en línea!

Ungolfed / Explicación

             d⁰  -- digits of input in decimal
          ḋ⁰)    -- digits of input in binary
         ↔       --   reverse
     (↓=0        --   and drop all leading zeros
¤&               -- test the two lists if
  S=↔            --   they're equal to their own reverse

0

Gaia , 10 bytes

ṙṭ@ḍ2⁻Πbṭ∧

Pruébalo en línea!

Explicación

En lugar de verificar con ceros a la izquierda en binario, verifico sin los ceros finales.

ṙ           String representation of number
 ṭ          Is palindromic?
  @         Push input again
   ḍ        Prime factors
    2⁻      Remove all 2s
      Π     Product
       b    Convert to binary
        ṭ   Is palindromic?
         ∧  Logical and


0

C # (.NET Core) , 130 129 179 173 + 23 bytes

Unas pocas cosas, gracias a Ed Marty por señalar que necesito verificar que haya 0 ceros delante para un palíndromo. Y necesito asegurarme de que puedo verificar hasta x ^ 32 -1.

x=>{var a=Convert.ToString(x,2);var b=x+"";Func<string,bool>p=z=>z.SequenceEqual(z.Reverse());return new int[a.Length].Select((_,z)=>p(new string('0',z)+a)).Any(z=>z)&p(b);}

Pruébalo en línea!


1
Puede eliminar el espacio entre returny (para 129 bytes
Mr. Xcoder

Esto solo funciona cuando se agrega como máximo un 0 inicial, pero el problema especifica que se permiten múltiples ceros iniciales.
Ed Marty

@EdMarty que se ha manejado, así como el error de desbordamiento de pila.
Dennis.Verweij

te falta una using System;yusing System.Linq
LiefdeWen

o es que los +23 bytes?
LiefdeWen

0

Python 2 , 56 bytes

lambda n:all(s==s[::-1]for s in(`n`,bin(n).strip("0b")))

Pruébalo en línea!

Usos de Python stripmétodo para quitar el tanto bin(..)'s de salida del líder 0b y ceros a la derecha del número binario (como siempre lo tendrán un poco de correspondencia).


0

Pyth , 25 22 19 18 17 bytes

- 3 6 7 8 bytes aprendiendo más el idioma

Ks_.Bsz&_IzqKs_`K

Explicación:

Ks        Set K to the integer version of...
 _.BsJ    Reverse string of the binary input
&         And
 _Iz      Is the input equal to the reverse of itself?
 qKs_`K   Is K equal to int(the reverse of basically string(K))

Estoy seguro de que esto se puede reducir, estaré trabajando en eso.

Banco de pruebas


0

PHP, 69 + 1 bytes

$q=trim(decbin($p=$argn),0);if(strrev($p)==$p&&strrev($q)==$q)echo$p;

Ejecutar como tubería con -nR
Echoes la entrada original para la verdad / nada para falsey

Pruébalo en línea!


0

Octava , 68 66 bytes

@(x)all([d=num2str(x) b=deblank(['' dec2bin(x)-48])]==flip([b d]))

Pruébalo en línea!

Oferta inicial de Octave.

Básicamente creamos una matriz que contiene el número como una cadena decimal y el número como una cadena binaria con los ceros finales eliminados. Luego creamos una matriz con las mismas cadenas pero con los números binarios y decimales invertidos. Finalmente, se comparan ambas matrices y el resultado es verdadero si coinciden (ambos palíndromos) o falso si no lo hacen (uno o ambos no son palíndromos).


  • Ahorre 2 bytes usando en fliplugar de fliplr.

0

APL2 (no Dyalog), 36 bytes

(N≡⌽N←⍕N)^∨/(((⌽B)⍳1)↓B)⍷B←(32⍴2)⊤N←

Primero dejemos que B sea la representación de 32 bits de N:

B←(32⍴2)⊤N

Luego espeje B y encuentre la posición del 1er 1:

(⌽B)⍳1

Luego, elimine esa cantidad de posiciones de B. Esto preservará el número correcto de ceros iniciales.

Luego realice ENCONTRAR y una REDUCCIÓN OR para ver si el B recortado contiene su propio espejo.

Ahora veamos N, el decimal. La expresión entre corchetes más a la izquierda convierte N en un vector de caracteres y comprueba si coincide con su propio espejo.

Finalmente, un AND se une a los dos cheques.


En APL2 no puedo hacer una lambda ordenada, así que escribí una línea e incluí la flecha de asignación. Espero que esto no sea trampa.


1
Bienvenido a PPCG!
Martin Ender

Bienvenido a PPCG! Para una versión menos trampa, ¿puede agregar un quad ( ) para que sea un programa completo? Además, ¿puedes acortar (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Erik the Outgolfer

Erik, gracias por revisar! Estoy seguro de que esto podría mejorarse, pero no tengo el ig squiggle en APL2.
mappo

0

Java 8, 105 104 bytes

n->{String t=n+n.toString(n,2).replaceAll("0*$","")+n;return t.contains(new StringBuffer(t).reverse());}

Explicación:

Pruébalo aquí.

n->{                         // Method with Integer parameter and boolean return-type
  String t=n                 //  Create a String `t` starting with the input Integer
    +n.toString(n,2)         //  Append the binary representation of the input Integer,
      .replaceAll("0*$","")  //   with all trailing zeroes removed
    +n;                      //  Append the input Integer again
  return t.contains(new StringBuffer(t).reverse());
                             //  Return true if `t` is a palindrome
}                            // End of method
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.