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!

Goufalite
fuente
Sandbox
Goufalite
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
Emigna
fuente
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
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

Arnauld
fuente
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~#&
JungHwan Min
fuente
4

Pyth - 13 bytes

&_I.s.BQ`Z_I`

Test Suite .

Maltysen
fuente
Puede usar _MIy jQ2guardar 2 bytes:_MI,.sjQ2Z`
Erik the Outgolfer
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.
ETHproducciones
fuente
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

Brian Becker
fuente
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

Jalea , 8 bytes

Bt0ŒḂaŒḂ

Pruébalo en línea!

Hiperneutrino
fuente
Probablemente quieras ȧo en alugar de µporque de lo contrario esto siempre será verdad.
Erik the Outgolfer
@EriktheOutgolfer whoops gracias
HyperNeutrino
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
Fatalizar
fuente
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!

Gil
fuente
¡Oh, superaste a BB!
Adám
1

Perl, 53 +3 (-pal) bytes

$_=sprintf"%b",$_;s/0+$//;$_="$_/@F"eq reverse"@F/$_"

pruébalo en línea

Nahuel Fouilleul
fuente
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
mudkip201
fuente
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.

Neil
fuente
0

Mathematica, 70 bytes

(P=PalindromeQ)[PadRight[#~IntegerDigits~2,#~IntegerExponent~2]]&&P@#&
J42161217
fuente
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
ბიმო
fuente
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
Gato de negocios
fuente
0

C (gcc) , 105 bytes

r(n,b){int s=0,c=n;for(;n;n/=b)s=s*b+n%b;return s==c;}
c;f(n){for(c=n;c%2<1;c/=2);return r(n,10)&r(c,2);}

Pruébalo en línea!

Monja permeable
fuente
Puede reemplazar ambas ocurrencias de return con n=. ( 95 bytes. )
Jonathan Frech
Y puede eliminar la nueva línea para un byte adicional guardado.
Jonathan Frech
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!

Dennis.Verweij
fuente
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).

Jonathan Frech
fuente
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

Stan Strum
fuente
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!

Jo
fuente
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.
Tom Carpenter
fuente
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.

mappo
fuente
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
Kevin Cruijssen
fuente