Numeri palindromici con un tocco binario


29

Attenzione: questa NON è una sfida "hey, disegniamo una torta in arte ASCII"! Continua a leggere;)

Qualche tempo fa era il mio compleanno, ho 33 anni.

Quindi c'è questa imbarazzante tradizione sociale che consiste nell'invitare parenti e amici, mettere candele a forma di numero su una torta, cantare canzoni e regali aperti.

   33   
--------

Invece di numeri, posso usare il sistema binario per mettere candele standard: ne metto 6 sulla torta e ne accendo due.

 100001
--------

Vedo che sia i numeri decimali che quelli binari della mia età sono palindromici!

Sfida

Voglio sapere se qualsiasi altro numero può essere messo su una torta con candele ed essere palindromico, decimale e binario.

Scrivi un programma / funzione per verificare se un numero è palindromico sia in decimale che binario. Ma aspetta, c'è di più: in binario, gli zeri iniziali contano per il test!

Ingresso

Un numero decimale x che voglio testare se è compleanno palindromico con 0 <x <2 32 -1 (sì, le persone nella mia dimensione vivono molto a lungo)

Produzione

Sinceramente se soddisfa esattamente queste due condizioni, Falsey altro:

  • La rappresentazione decimale del numero è un palindromo standard
  • La rappresentazione binaria del numero è un palindromo standard e l'aggiunta di zeri iniziali può essere di aiuto

Casi test

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

Regole

Buona fortuna e infine buon compleanno!



6
Potrebbe voler cambiare il titolo in quanto la parte del compleanno è irrelavent.
NoOneIsHere

@NoOneIsHere bene la sfida riguarda le candele su una torta di compleanno. Inoltre c'è una svolta nella rappresentazione binaria, quindi non sono "numeri palindromici generici". Se il tuo commento viene votato, mi verrà in mente un altro titolo.
Goufalite,

Quindi, secondo le regole, 0b01010000000000000000000000000000non è palindromico in quanto richiederebbe l'aggiunta di più zero e quindi il superamento di 2 ^ 32-1? In questo caso, sarebbe utile aggiungere qualcosa come 1342177280un caso di prova di falsi.
Cristian Lupascu,

1
@ w0lf Non ho scritto un limite per l'aggiunta di zeri ma capisco il tuo problema di overflow dello stack;) Inoltre, 1342177280non è un decimale palindromico, quindi Falsey. Modifica
Goufalite

Risposte:


17

05AB1E , 7 byte

b0Ü‚DíQ

Provalo online! o come una suite di test

Spiegazione

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

Bifurcate non ha aiutato?
Magic Octopus Urn,

@MagicOctopusUrn: Sfortunatamente no, poiché desidero invertire ciascun numero nell'elenco e non l'elenco stesso.
Emigna,


8

JavaScript (ES6), 65 byte

Restituisce 0o 1.

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

Come?

La funzione helper g () accetta un intero b come input e verifica se n è un palindromo nella base b . Se b non viene specificato, converte semplicemente n in una stringa prima di testarlo.

Ci liberiamo degli zeri finali nella rappresentazione binaria di n isolando il 1 meno significativo con n&-ne dividendo n per la quantità risultante.

Curiosità: è vero 0perché è (0/0).toString(2)uguale a "NaN", che è un palindromo. (Ma 0non è comunque un input valido.)

Casi test


5

Mathematica, 52 49 byte

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

Provalo su Wolfram Sandbox

uso

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

f[6]

True

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

{True, False, True, False}

Spiegazione

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 *)

Versione con incorporato PalindromeQ

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


3

Japt , 14 byte

s ꬩ¢w n2 ¤ê¬

Provalo online!

Spiegazione

 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.

È venuto con un paio di soluzioni simili per 13 byte: sêQ *(¢w)sêQesêQ &¢w n sêQ
Shaggy,

@Shaggy Grazie, ma sfortunatamente entrambi falliscono 297515792(il binario inverso convertito in decimale è troppo grande per essere gestito da JS) ...
ETHproductions


2

APL, 27 31 byte

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

Come funziona Usando 6 come argomento ...

      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

Provalo su TryAPL.org


Secondo le specifiche, 6 dovrebbe essere un buon input, ma l'espressione fornita restituisce false.
lstefano,

Ah, topi! Questo è quello che ottengo per non aver letto il problema nella sua interezza. Buona pesca. grazie! Ho modificato con una soluzione leggermente più lunga, ma si spera più corretta.
Brian Becker,

Benvenuti in PPCG. Bel primo post! Sfortunatamente, il tuo invio nella sua forma attuale non è né un programma, né una funzione. Non preoccuparti, puoi trasformarlo in una funzione ma lasciando che le parentesi graffe esterne racchiudano l'intero codice.
Adám,

Salva tre byte: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(è consigliabile fornire un collegamento per eseguire l'intera suite di test)
Adám,


1

Brachylog , 7 byte

↔?ḃc↔.↔

Provalo online!

Questo è un sacco di ...

Spiegazione

Con input e output impliciti, il codice è: ?↔?ḃ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 byte

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

Spiegazione

                  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)

Provalo online!


Ooh, BB fuori campo!
Adám,


1

Pyt , 10 byte

Restituisce [1] se vero, [0] se falso

ĐɓƖ₫áĐ₫=ʁ∧

Provalo online!

Spiegazione:

              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 byte

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

Provalo online! Il link include casi di test. Funziona creando un duplicato unario del numero originale, ma usando _s in modo che non sia confuso da un input di 11. Il numero unario viene quindi convertito in "binario" e zeri finali eliminati. I palindromi vengono successivamente troncati e l'ultimo stadio verifica se è rimasto qualcosa.


0

Mathematica, 70 byte

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

0

Buccia , 14 byte

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

Provalo online!

Ungolfed / Spiegazione

             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 byte

ṙṭ@ḍ2⁻Πbṭ∧

Provalo online!

Spiegazione

Invece di controllare con zero iniziali in binario, controllo senza gli zeri finali.

ṙ           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 byte

alcune cose, grazie a Ed Marty per aver sottolineato che devo controllare quanti 0 sono imbottiti davanti per un palindromo. E devo assicurarmi di poter controllare fino a 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);}

Provalo online!


1
È possibile rimuovere lo spazio tra returne (per 129 byte
Mr. Xcoder

Funziona solo quando si aggiunge al massimo uno 0 iniziale, ma il problema specifica che sono consentiti più zeri iniziali.
Ed Marty,

@EdMarty che è stato gestito, così come il bug di overflow dello stack.
Dennis.Verweij,

ti manca un using System;eusing System.Linq
LiefdeWen

o sono i +23 byte?
Liefde:

0

Python 2 , 56 byte

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

Provalo online!

Usa Python stripmetodo sia remove il bin(..)'s uscita della porta 0b e gli zeri finali del numero binario (come avranno sempre un po' di corrispondenza).


0

Pyth , 25 22 19 18 17 byte

- 3 6 7 8 byte imparando ulteriormente la lingua

Ks_.Bsz&_IzqKs_`K

Spiegazione:

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))

Sono sicuro che questo può essere risolto, ci lavorerò su.

Test Suite


0

PHP, 69 + 1 byte

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

Esegui come pipe con -nR
Echo per l'input originale di verità / niente per falsità

Provalo online!


0

Ottava , 68 66 byte

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

Provalo online!

Offerta iniziale di Octave.

Fondamentalmente creiamo un array contenente il numero come una stringa decimale e il numero come una stringa binaria con 0 finali finali rimossi. Quindi creiamo un array con lo stesso alle stringhe ma con i numeri binari e decimali invertiti. Infine, vengono confrontati entrambi gli array e il risultato è vero se corrispondono (entrambi i palindromi) o falso se non lo sono (uno o entrambi non i palindromi).


  • Salva 2 byte usando flipinvece di fliplr.

0

APL2 (non Dyalog), 36 byte

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

Prima di tutto B è la rappresentazione a 32 bit di N:

B←(32⍴2)⊤N

Quindi rispecchia B e trova la posizione del 1 ° 1:

(⌽B)⍳1

Quindi rilasciare molte posizioni da B. Ciò conserverà il numero corretto di 0 iniziali.

Quindi esegui FIND e OR-REDUCTION per vedere se la B ritagliata contiene il suo mirror.

Ora diamo un'occhiata a N, il decimale. L'espressione tra parentesi più a sinistra converte N in un vettore di caratteri e controlla se corrisponde al proprio mirror.

Infine, un AND unisce i due controlli.


In APL2 non riesco a creare una lambda ordinata, quindi ho scritto una riga e ho incluso la freccia del compito. Spero che questo non stia tradendo.


1
Benvenuti in PPCG!
Martin Ender,

Benvenuti in PPCG! Per una versione meno ingannevole, sei in grado di aggiungere un quad ( ) per renderlo invece un programma completo? Inoltre, sei in grado di accorciare (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Erik the Outgolfer,

Erik, grazie per il controllo! Sono sicuro che questo potrebbe essere migliorato, ma non ho il ⍨ squiggle in APL2.
mappo,

0

Java 8, 105 104 byte

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

Spiegazione:

Provalo qui.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.