Liczby palindromiczne z dwójkowym zwrotem

29

Ostrzeżenie: NIE jest to wyzwanie „hej, narysujmy ciasto w sztuce ASCII”! Proszę czytaj dalej;)

Jakiś czas temu były moje urodziny, mam teraz 33 lata.

Istnieje więc ta niezręczna tradycja społeczna polegająca na zapraszaniu rodziny i przyjaciół, stawianiu świec numerycznych na torcie, śpiewaniu piosenek i prezentach.

   33   
--------

Zamiast liczb mogę użyć systemu binarnego do umieszczenia standardowych świec: kładę 6 z nich na torcie i zapalam dwie z nich.

 100001
--------

Widzę, że zarówno liczby dziesiętne, jak i binarne w moim wieku są palindromiczne!

Wyzwanie

Chcę wiedzieć, czy jakaś inna liczba może być umieszczona na torcie ze świecami i być palindromiczna, dziesiętna i binarna.

Napisz program / funkcję, aby sprawdzić, czy liczba jest palindromiczna zarówno w postaci dziesiętnej, jak i binarnej. Ale czekaj, jest więcej: w systemie binarnym wiodące zera liczą się do testu!

Wkład

Liczba dziesiętna x, którą chcę przetestować, jeśli jest urodzinowa palindromiczna z 0 <x <2 32 -1 (tak, ludzie w moim wymiarze żyją bardzo długo)

Wydajność

Prawda, jeśli spełnia dokładnie te dwa warunki, Falsey jeszcze:

  • Dziesiętna reprezentacja liczby jest standardowym palindromem
  • Binarna reprezentacja liczby jest standardowym palindromem, a dodanie zer wiodących może w tym pomóc

Przypadki testowe

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

Zasady

Powodzenia i ostatecznie wszystkiego najlepszego!

Gufalit
źródło
Piaskownica
Goufalite
6
Może chcesz zmienić tytuł, ponieważ część urodzinowa jest nieistotna.
NoOneIsHere
@NoOneIsOto wyzwanie polega na świecach na torcie urodzinowym. Jest także zwrot w reprezentacji binarnej, więc nie są to „ogólne liczby palindromowe”. Jeśli twój komentarz jest pozytywnie oceniany, wymyślę inny tytuł.
Goufalite,
Tak więc, zgodnie z regułami, 0b01010000000000000000000000000000nie jest palindromiczne, ponieważ wymagałoby dodania większej liczby zer, a zatem przekraczałoby 2 ^ 32-1? W takim przypadku pomogłoby dodać coś 1342177280w rodzaju przypadku testowego falsey.
Cristian Lupascu,
1
@ w0lf Nie napisałem limitu na dodawanie zer, ale rozumiem twój problem z przepełnieniem stosu;) Co więcej, 1342177280nie jest palindromiczny dziesiętny, więc Falsey. Edycja
Goufalite

Odpowiedzi:

17

05AB1E , 7 bajtów

b0Ü‚DíQ

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

b         # convert input to binary
 0Ü       # remove trailing zeroes
   ‚      # pair with input
    D     # duplicate
     í    # reverse each (in the copy)
      Q   # check for equality
Emigna
źródło
Bifurcate nie pomogło?
Magic Octopus Urn
@MagicOctopusUrn: Niestety nie, ponieważ chcę odwrócić każdy numer na liście, a nie samą listę.
Emigna
11

Python 3 , 59 bajtów

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

Wypróbuj online!

-3 bajty dzięki Rodowi
-3 bajty dzięki Connorowi Johnstonowi

HyperNeutrino
źródło
1
użycie paska z łańcuchami spowoduje usunięcie pojedynczych znaków: [bin (a) [2:]. strip ('0') => bin (a) .strip ('0b')] ( tio.run/… "Python 3 - Spróbuj To online ”)
Conner Johnston,
@ConnerJohnston o cool, dzięki!
HyperNeutrino,
8

JavaScript (ES6), 65 bajtów

Zwraca 0lub 1.

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

W jaki sposób?

Funkcja pomocnicza g () przyjmuje na wejściu liczbę całkowitą b i sprawdza, czy n jest palindromem w podstawie b . Jeśli b nie jest określone, po prostu konwertuje n na ciąg przed przetestowaniem.

My pozbyć się zer z binarnej reprezentacji n izolując przynajmniej znaczną 1 z n&-ni podzielenie n przez otrzymanej ilości.

Ciekawostka: to prawda, 0ponieważ (0/0).toString(2)równa się "NaN", czyli palindrom. (Ale i 0tak nie jest to poprawny wpis.)

Przypadki testowe

Arnauld
źródło
5

Mathematica, 52 49 bajtów

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

Wypróbuj na Wolfram Sandbox

Stosowanie

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

f[6]

True

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

{True, False, True, False}

Wyjaśnienie

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

Wersja z wbudowanym PalindromeQ

PalindromeQ@#&&!IntegerReverse[#,2,Range@#]~FreeQ~#&
JungHwan Min
źródło
4

Pyth - 13 bajtów

&_I.s.BQ`Z_I`

Pakiet testowy .

Maltysen
źródło
Możesz użyć _MIi jQ2zapisać 2 bajty:_MI,.sjQ2Z`
Erik Outgolfer
3

Japt , 14 bajtów

s ꬩ¢w n2 ¤ê¬

Przetestuj online!

Wyjaśnienie

 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.
ETHprodukcje
źródło
Wymyśliłem kilka podobnych rozwiązań dla 13 bajtów: sêQ *(¢w)sêQisêQ &¢w n sêQ
Kudłaty
@ Shaggy Dzięki, ale niestety oba nie działają 297515792(odwrócony plik binarny przekonwertowany na dziesiętny jest po prostu zbyt duży, aby JS mógł go obsłużyć) ...
ETHproductions
2

APL, 27 31 bajtów

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

Jak to działa Używając 6 jako argumentu ...

      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

Wypróbuj na TryAPL.org

Brian Becker
źródło
Zgodnie ze specyfikacją, wartość 6 powinna być dobrym wprowadzeniem, ale pod warunkiem wyrażenia return false.
Istefano
Ach, szczury! To właśnie otrzymuję za to, że nie przeczytałem problemu w całości. Dobry chwyt Dziękuję Ci! Poprawiłem nieco dłuższym, ale mam nadzieję, że bardziej poprawnym rozwiązaniem.
Brian Becker,
Witamy w PPCG. Miły pierwszy post! Niestety Twoje zgłoszenie w obecnej formie nie jest ani programem, ani funkcją. Nie martw się jednak, możesz przekształcić go w funkcję, ale pozwalając zewnętrznym nawiasom zamykać cały kod.
Adám
Zaoszczędź trzy bajty: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(jest to dobra forma, aby podać link do uruchomienia całego pakietu testowego)
Adám
1

Galaretki , 8 bajtów

Bt0ŒḂaŒḂ

Wypróbuj online!

HyperNeutrino
źródło
Prawdopodobnie chcesz ȧlub azamiast, µponieważ w przeciwnym razie zawsze będzie to prawdą.
Erik the Outgolfer
@EriktheOutgolfer whoops dzięki
HyperNeutrino
1

Brachylog , 7 bajtów

↔?ḃc↔.↔

Wypróbuj online!

To dużo

Wyjaśnienie

W przypadku niejawnego wejścia i wyjścia kod jest następujący: ?↔?ḃ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
Fatalizować
źródło
1

APL (Dyalog Classic) , 26 bajtów

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

Wyjaśnienie

                  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)

Wypróbuj online!

Gil
źródło
Och, wygrałeś BB!
Adám
1

Perl, 53 +3 (-pal) bajtów

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

spróbuj online

Nahuel Fouilleul
źródło
1

Pyt , 10 bajtów

Zwraca [1] jeśli prawda, [0] jeśli fałsz

ĐɓƖ₫áĐ₫=ʁ∧

Wypróbuj online!

Wyjaśnienie:

              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
źródło
0

Siatkówka , 72 bajty

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

Wypróbuj online! Link zawiera przypadki testowe. Działa poprzez utworzenie jednoznacznego duplikatu oryginalnego numeru, ale za pomocą _s, aby nie pomylić go np. Przez wprowadzenie 11. Unary liczba jest następnie konwertowana na „binarne” i usuwane zera końcowe zera. Palindromy są następnie kolejno obcinane, a ostatni etap sprawdza, czy coś zostało.

Neil
źródło
0

Mathematica, 70 bajtów

(P=PalindromeQ)[PadRight[#~IntegerDigits~2,#~IntegerExponent~2]]&&P@#&
J42161217
źródło
0

Łuska , 14 bajtów

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

Wypróbuj online!

Niegolfowane / Wyjaśnienie

             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
ბიმო
źródło
0

Gaia , 10 bajtów

ṙṭ@ḍ2⁻Πbṭ∧

Wypróbuj online!

Wyjaśnienie

Zamiast sprawdzania z wiodącymi zerami w systemie binarnym, sprawdzam bez zer końcowych.

ṙ           String representation of number
 ṭ          Is palindromic?
  @         Push input again
   ḍ        Prime factors
    2⁻      Remove all 2s
      Π     Product
       b    Convert to binary
        ṭ   Is palindromic?
         ∧  Logical and
Business Cat
źródło
0

C (gcc) , 105 bajtów

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

Wypróbuj online!

Leaky Nun
źródło
Można zastąpić oba wystąpienia return z n=. ( 95 bajtów )
Jonathan Frech,
I możesz usunąć nową linię dla dodatkowego zapisanego bajtu.
Jonathan Frech,
0

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

kilka rzeczy, dziękuję Edowi Marty'emu za wskazanie, że muszę sprawdzić, ile tylnych zer padało z przodu na palindrom. I muszę się upewnić, że mogę sprawdzić do 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);}

Wypróbuj online!

Dennis.Verweij
źródło
1
Możesz usunąć spację między returni (dla 129 bajtów
Mr. Xcoder
Działa to tylko podczas dodawania co najwyżej jednego wiodącego 0, ale problem określa wiele zer wiodących, które są dozwolone.
Ed Marty,
@EdMarty, który został obsłużony, a także błąd przepełnienia stosu.
Dennis.Verweij,
brakuje ci using System;iusing System.Linq
LiefdeWen
czy jest to, że +23 bajty?
LiefdeWen,
0

Python 2 , 56 bajtów

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

Wypróbuj online!

Używa stripmetody Pythona zarówno do usuwania bin(..)wiodących zer wyjściowych, jak 0b i końcowych zer binarnych (ponieważ zawsze będą miały pasujący bit).

Jonathan Frech
źródło
0

Pyth , 25 22 19 18 17 bajtów

- 3 6 7 8 bajtów poprzez dalszą naukę języka

Ks_.Bsz&_IzqKs_`K

Wyjaśnienie:

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

Jestem pewien, że można to zagrać w golfa, będę nad tym pracował.

Pakiet testowy

Stan Strum
źródło
0

PHP, 69 + 1 bajtów

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

Uruchom jako fajkę z -nR
Echa oryginalnym wejściem dla prawdy / nic dla falsey

Wypróbuj online!

Jo.
źródło
0

Oktawa , 68 66 bajtów

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

Wypróbuj online!

Pierwsza oferta od Octave.

Zasadniczo tworzymy tablicę zawierającą liczbę jako ciąg dziesiętny i liczbę jako ciąg binarny z usuniętymi końcowymi zerami. Następnie tworzymy tablicę z tym samym ciągiem znaków, ale z odwróconą liczbą binarną i dziesiętną. Na koniec porównywane są obie tablice, a wynik jest albo prawdziwy, jeśli pasują (oba palindromy), albo fałsz, jeśli nie (jedna lub obie nie są palindromami).


  • Zaoszczędź 2 bajty, używając flipzamiast fliplr.
Tom Carpenter
źródło
0

APL2 (nie Dyalog), 36 bajtów

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

Najpierw niech B będzie 32-bitową reprezentacją N:

B←(32⍴2)⊤N

Następnie wykonaj kopię lustrzaną B i znajdź pozycję 1. 1:

(⌽B)⍳1

Następnie upuść tyle pozycji z B. To pozwoli zachować prawidłową liczbę wiodących zer.

Następnie wykonaj ZNAJDŹ i ZMNIEJSZANIE OR, aby sprawdzić, czy przycięty B zawiera własne lustro.

Teraz spójrzmy na N, dziesiętny. Wyrażenie znajdujące się najbardziej po lewej stronie w nawiasach przekształca N w wektor znaków i sprawdza, czy DOPASUJE swoje własne lustro.

Wreszcie AND dołącza do dwóch czeków.


W APL2 nie mogę zrobić zgrabnej lambdy, więc napisałem linijkę i dołączyłem strzałkę przypisania. Mam nadzieję, że to nie oszustwo.

mappo
źródło
1
Witamy w PPCG!
Martin Ender
Witamy w PPCG! W przypadku wersji mniej oszukującej, czy możesz dołączyć quad ( ), aby zamiast tego był to pełny program? Czy jesteś w stanie skrócić (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Erik the Outgolfer
Erik, dzięki za sprawdzenie! Jestem pewien, że można to poprawić, ale nie mam skrętu gle w APL2.
mappo
0

Java 8, 105 104 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło