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!



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

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



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


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~#&


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.

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


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

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

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 (f⍨X is XfX, where f is a composed function that reverses its right argument and matches with left)

Wypróbuj online!


Och, wygrałeś BB!
— Adám


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

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.


0

Mathematica, 70 bajtów

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

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

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


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!


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


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


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!


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.

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.