Angka palindrom dengan twist biner


29

Peringatan: ini BUKAN tantangan "hei, mari kita menggambar kue di ASCII-art"! Silakan terus membaca;)

Beberapa waktu yang lalu itu adalah hari ulang tahunku, sekarang aku berumur 33 tahun.

Jadi ada tradisi sosial canggung yang terdiri dari mengundang keluarga dan teman-teman, meletakkan lilin seperti angka pada kue, menyanyikan lagu dan hadiah terbuka.

   33   
--------

Alih-alih angka, saya bisa menggunakan sistem biner untuk meletakkan lilin standar: Saya menempatkan 6 di atas kue dan menyalakan dua di antaranya.

 100001
--------

Saya dapat melihat bahwa angka desimal dan biner pada usia saya adalah palindromik!

Tantangan

Saya ingin tahu apakah ada nomor lain yang bisa diletakkan di atas kue dengan lilin dan menjadi palindromik, desimal dan biner.

Menulis sebuah program / fungsi untuk menguji apakah nomor palindromic di kedua desimal dan biner. Tapi tunggu, masih ada lagi: dalam biner, nilainya nol untuk ujian!

Memasukkan

Angka desimal x yang ingin saya uji apakah itu palindromik ulang tahun dengan 0 <x <2 32 -1 (ya, orang-orang di dimensi saya hidup sangat lama)

Keluaran

Sejujurnya jika memenuhi dua syarat ini, Falsey yang lain:

  • Representasi desimal angka adalah palindrom standar
  • Representasi biner dari angka adalah palindrome standar, dan menambahkan nol di awal dapat membantu dengan ini

Uji kasus

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

Aturan

Semoga sukses, dan akhirnya selamat ulang tahun!



6
Mungkin ingin mengubah judul karena bagian ulang tahun tidak relevan.
NoOneIsHere

@NoOneIsHanya tantangannya adalah tentang lilin pada kue ulang tahun. Juga ada twist pada representasi biner sehingga bukan "angka palindromik generik". Jika komentar Anda dibatalkan, saya akan menghasilkan judul lain.
Goufalite

Jadi, menurut aturan, 0b01010000000000000000000000000000bukankah palindromik karena akan membutuhkan lebih banyak nol untuk ditambahkan dan dengan demikian melebihi 2 ^ 32-1? Dalam hal ini akan membantu untuk menambahkan sesuatu seperti 1342177280kasus uji falsey.
Cristian Lupascu

1
@ w0lf Saya tidak menulis batas untuk menambahkan nol tapi saya mengerti masalah stack overflow Anda;) Selanjutnya, 1342177280palindromic desimal tidak begitu Falsey. Editing
Goufalite

Jawaban:


17

05AB1E , 7 byte

b0Ü‚DíQ

Cobalah online! atau sebagai Test Suite

Penjelasan

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

Bifurkasi tidak membantu?
Magic Octopus Mm

@ MagicOctopusUrn: Sayangnya tidak, karena saya ingin membalikkan setiap nomor dalam daftar dan bukan daftar itu sendiri.
Emigna

11

Python 3 , 59 byte

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

Cobalah online!

-3 byte terima kasih kepada Rod
-3 byte terima kasih kepada Connor Johnston



1
menggunakan strip dengan string akan menghapus karakter tunggal: [bin (a) [2:]. strip ('0') => bin (a) .strip ('0b')] ( tio.run/… "Python 3 - Coba It Online ")
Conner Johnston

@ConnerJohnston o keren, terima kasih!
HyperNeutrino

8

JavaScript (ES6), 65 byte

Pengembalian 0atau 1.

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

Bagaimana?

Fungsi helper g () mengambil bilangan bulat b sebagai input dan menguji apakah n adalah palindrom pada basis b . Jika b tidak ditentukan, itu hanya mengkonversi n ke string sebelum mengujinya.

Kami menyingkirkan nol membuntuti dalam representasi biner dari n dengan mengisolasi paling signifikan 1 dengan n&-ndan membagi n dengan kuantitas yang dihasilkan.

Fakta yang menyenangkan: itu adalah kebenaran 0karena (0/0).toString(2)sama "NaN", yang merupakan palindrom. (Tapi 0toh bukan input yang valid.)

Uji kasus


5

Mathematica, 52 49 byte

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

Cobalah di Wolfram Sandbox

Pemakaian

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

f[6]

True

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

{True, False, True, False}

Penjelasan

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 dengan builtin PalindromeQ

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


3

Japt , 14 byte

s ꬩ¢w n2 ¤ê¬

Uji secara online!

Penjelasan

 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.

Datang dengan beberapa solusi serupa selama 13 byte: sêQ *(¢w)sêQdansêQ &¢w n sêQ
Shaggy

@Shaggy Terima kasih, tapi sayangnya keduanya gagal 297515792(biner yang dibalik dikonversi menjadi desimal terlalu besar untuk ditangani JS) ...
ETHproduksi


2

APL, 27 31 Bytes

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

Bagaimana cara kerjanya? Menggunakan 6 sebagai argumen ...

      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

Cobalah di TryAPL.org


Menurut spesifikasi, 6 seharusnya menjadi input yang baik, tetapi ekspresi yang diberikan return false.
lstefano

Ah, tikus! Itulah yang saya dapatkan karena tidak membaca masalahnya secara keseluruhan. Tangkapan yang bagus. Terima kasih! Saya telah mengubah dengan sedikit lebih lama, tetapi semoga lebih tepat, solusi.
Brian Becker

Selamat datang di PPCG. Posting pertama yang bagus! Sayangnya, kiriman Anda dalam bentuk saat ini bukan sebuah program, atau fungsi. Jangan khawatir, Anda bisa membuatnya menjadi fungsi tetapi membiarkan kawat gigi luar menyertakan seluruh kode.
Adám

Simpan tiga byte: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(ini adalah bentuk yang baik untuk menyediakan tautan untuk menjalankan seluruh rangkaian uji)
Adám


1

Brachylog , 7 byte

↔?ḃc↔.↔

Cobalah online!

Itu banyak ...

Penjelasan

Dengan input dan output implisit, kodenya adalah: ?↔?ḃ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⊢⍵}

Penjelasan

                  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)

Cobalah online!


Ooh, kau keluar-golf BB!
Adám


1

Pyt , 10 byte

Mengembalikan [1] jika benar, [0] jika salah

ĐɓƖ₫áĐ₫=ʁ∧

Cobalah online!

Penjelasan:

              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

Cobalah online! Tautan termasuk kasus uji. Bekerja dengan membuat duplikat unary dari nomor asli, tetapi menggunakan _sehingga tidak bingung dengan misalnya input 11. Nomor unary kemudian dikonversi ke "biner" dan nol trailing dilucuti. Palindrom kemudian dipotong secara berturut-turut dan tahap terakhir menguji apakah masih ada yang tersisa.


0

Mathematica, 70 byte

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

0

Sekam , 14 byte

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

Cobalah online!

Tidak Terikat / Penjelasan

             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ṭ∧

Cobalah online!

Penjelasan

Alih-alih memeriksa dengan nol nol di biner, saya memeriksa tanpa nol nol.

ṙ           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

beberapa hal, terima kasih kepada Ed Marty untuk menunjukkan bahwa saya perlu memeriksa sebanyak 0's empuk di depan untuk palindrome. Dan saya perlu memastikan bahwa saya dapat memeriksa hingga 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);}

Cobalah online!


1
Anda dapat menghapus ruang antara returndan (untuk 129 byte
Tn. Xcoder

Ini hanya berfungsi ketika menambahkan paling banyak satu 0 memimpin, tetapi masalah menentukan beberapa nol terkemuka diizinkan.
Ed Marty

@ Eddarty yang telah ditangani, serta bug stack overflow.
Dennis.Verweij

Anda kehilangan using System;danusing System.Linq
LiefdeWen

atau apakah itu +23 byte?
LiefdeWen

0

Python 2 , 56 byte

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

Cobalah online!

Menggunakan stripmetode Python untuk menghapus bin(..)terkemuka output 0b dan nol angka biner (karena mereka akan selalu memiliki bit yang cocok).


0

Pyth , 25 22 19 18 17 byte

- 3 6 7 8 byte dengan mempelajari bahasa lebih lanjut

Ks_.Bsz&_IzqKs_`K

Penjelasan:

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

Saya yakin ini bisa diturunkan, saya akan mengusahakannya.

Test Suite


0

PHP, 69 +1 byte

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

Jalankan sebagai pipa dengan -nR
Echoes input asli untuk truey / nothing for falsey

Cobalah online!


0

Oktaf , 68 66 byte

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

Cobalah online!

Penawaran awal dari Octave.

Kami pada dasarnya membuat array yang berisi angka sebagai string desimal dan angka sebagai string biner dengan trailing 0 dihapus. Kemudian kita membuat array dengan string yang sama tetapi dengan angka biner dan desimal dibalik. Akhirnya kedua array dibandingkan dan hasilnya benar jika cocok (keduanya palindrom) atau salah jika tidak (satu atau keduanya tidak palindrom).


  • Simpan 2 byte menggunakan flipbukan fliplr.

0

APL2 (bukan Dyalog), 36 byte

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

Pertama, biarkan B menjadi representasi 32-bit N:

B←(32⍴2)⊤N

Kemudian mirror B dan temukan posisi 1 1:

(⌽B)⍳1

Kemudian jatuhkan banyak posisi dari B. Ini akan mempertahankan jumlah 0s yang benar.

Kemudian lakukan FIND dan OR-REDUCTION untuk melihat apakah B yang dipangkas mengandung cerminnya sendiri.

Sekarang mari kita lihat N, desimal. Ekspresi kurung kurawal kiri mengkonversi N ke vektor karakter dan memeriksa apakah MATCH sendiri mirror.

Akhirnya, seorang DAN bergabung dengan dua cek.


Di APL2 saya tidak bisa membuat lambda yang rapi jadi saya menulis satu baris dan menyertakan panah penugasan. Semoga ini tidak curang.


1
Selamat datang di PPCG!
Martin Ender

Selamat datang di PPCG! Untuk versi yang kurang curang, apakah Anda dapat menambahkan quad ( ) untuk menjadikannya program yang lengkap? Juga, apakah Anda bisa mempersingkat (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Erik the Outgolfer

Erik, terima kasih sudah memeriksa! Saya yakin ini bisa diperbaiki, tapi saya tidak punya ig coretan di 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());}

Penjelasan:

Coba di sini.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.