Số Palindromic với một twist nhị phân


29

Cảnh báo: đây KHÔNG phải là "hey, chúng ta hãy vẽ một chiếc bánh trong thử thách nghệ thuật ASCII"! Hãy tiếp tục đọc;)

Một thời gian trước đây là sinh nhật của tôi, bây giờ tôi 33 tuổi.

Vì vậy, có truyền thống xã hội vụng về này bao gồm mời gia đình và bạn bè, đặt nến - giống như nến trên bánh, hát những bài hát và mở quà.

   33   
--------

Thay vì số, tôi có thể sử dụng hệ thống nhị phân để đặt nến tiêu chuẩn: Tôi đặt 6 cái trên bánh và thắp hai cái.

 100001
--------

Tôi có thể thấy rằng cả số thập phân và số nhị phân ở độ tuổi của tôi đều là palindromic!

Thử thách

Tôi muốn biết nếu có bất kỳ số nào khác có thể được đặt trên một chiếc bánh với nến và được palindromic, thập phân và nhị phân.

Viết chương trình / hàm để kiểm tra xem một số có phải là palindromic ở cả thập phân và nhị phân hay không. Nhưng chờ đã, còn nhiều thứ nữa: trong số nhị phân, số không đứng đầu cho bài kiểm tra!

Đầu vào

Một số thập phân x mà tôi muốn kiểm tra nếu đó là ngày sinh nhật với 0 <x <2 32 -1 (vâng, những người trong chiều của tôi sống rất lâu)

Đầu ra

Thật ra nếu nó đáp ứng chính xác hai điều kiện này, Falsey khác:

  • Biểu diễn thập phân của số là một bảng màu tiêu chuẩn
  • Biểu diễn nhị phân của số là một bảng màu tiêu chuẩn và việc thêm các số 0 đứng đầu có thể giúp với điều này

Các trường hợp thử nghiệm

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

Quy tắc

Chúc may mắn, và cuối cùng chúc mừng sinh nhật!



6
Có thể muốn thay đổi tiêu đề như phần sinh nhật là không liên quan.
NoOneIsHãy

@NoOneIsĐây là thử thách về nến trên bánh sinh nhật. Ngoài ra, có sự thay đổi về biểu diễn nhị phân để nó không phải là "số palindromic chung". Nếu bình luận của bạn được nâng cấp, tôi sẽ đưa ra một tiêu đề khác.
Goufalite

Vì vậy, theo các quy tắc, 0b01010000000000000000000000000000không phải là palindromic vì nó sẽ yêu cầu thêm số không được thêm vào và do đó vượt quá 2 ^ 32-1? Trong trường hợp này, nó sẽ giúp thêm một cái gì đó giống 1342177280như một trường hợp thử nghiệm falsey.
Cristian Lupascu

1
@ w0lf Tôi không viết giới hạn cho việc thêm số không nhưng tôi hiểu vấn đề tràn ngăn xếp của bạn;) Hơn nữa, 1342177280không phải là thập phân palindromic nên Falsey. Chỉnh sửa
Goufalite

Câu trả lời:



11

Python 3 , 59 byte

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

Hãy thử trực tuyến!

-3 byte nhờ Rod
-3 byte nhờ Connor Johnston



1
sử dụng dải có chuỗi sẽ xóa các ký tự đơn: [bin (a) [2:]. dải ('0') => bin (a) .strip (' 0b ')] ( tio.run/iêu "Python 3 - Thử Nó trực tuyến ")
Conner Johnston

@ConnerJohnston o tuyệt, cảm ơn!
HyperNeutrino

8

JavaScript (ES6), 65 byte

Trả về 0hoặc 1.

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

Làm sao?

Hàm trợ giúp g () lấy một số nguyên b làm đầu vào và kiểm tra xem n có phải là một palindrom trong cơ sở b không . Nếu b không được chỉ định, nó chỉ chuyển đổi n thành một chuỗi trước khi kiểm tra nó.

Chúng ta loại bỏ các số 0 ở cuối trong biểu diễn nhị phân của n bằng cách tách 1 ít có ý nghĩa nhất với n&-nvà chia n cho số lượng kết quả.

Sự thật thú vị: đó là sự thật 0(0/0).toString(2)bằng "NaN", đó là một bảng màu. (Nhưng 0dù sao cũng không phải là một đầu vào hợp lệ.)

Các trường hợp thử nghiệm


5

Toán học, 52 49 byte

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

Dùng thử trên Wolfram Sandbox

Sử dụng

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

f[6]

True

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

{True, False, True, False}

Giải trình

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

Phiên bản dựng sẵn PalindromeQ

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


3

Japt , 14 byte

s ꬩ¢w n2 ¤ê¬

Kiểm tra nó trực tuyến!

Giải trình

 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.

Đến với một vài giải pháp tương tự cho 13 byte: sêQ *(¢w)sêQsêQ &¢w n sêQ
Shaggy

@Shaggy Cảm ơn, nhưng thật không may, cả hai đều thất bại 297515792(nhị phân đảo ngược được chuyển đổi thành số thập phân là quá lớn đối với JS để xử lý) ...
ETHproductions 15/2/18


2

APL, 27 31 byte

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

Nó hoạt động thế nào Sử dụng 6 làm đối số ...

      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

Dùng thử trên TryAPL.org


Theo thông số kỹ thuật, 6 được cho là một đầu vào tốt, nhưng biểu thức được cung cấp trả về sai.
lstefano

À, chuột! Đó là những gì tôi nhận được khi không đọc toàn bộ vấn đề. Nắm bắt tốt. cảm ơn bạn! Tôi đã sửa đổi với một giải pháp lâu hơn một chút, nhưng hy vọng chính xác hơn.
Brian Becker

Chào mừng đến với PPCG. Bài đăng đầu tiên rất hay! Thật không may, trình của bạn ở dạng hiện tại không phải là một chương trình, cũng không phải là một chức năng. Không phải lo lắng, bạn có thể biến nó thành một hàm nhưng để các dấu ngoặc ngoài bao quanh toàn bộ mã.
Adám

Lưu ba byte: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(đây là hình thức tốt để cung cấp liên kết để chạy toàn bộ bộ kiểm tra)
Adám


1

Brachylog , 7 byte

↔?ḃc↔.↔

Hãy thử trực tuyến!

Đó là rất nhiều 's'

Giải trình

Với đầu vào và đầu ra ngầm định, mã là: ?↔?ḃ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⊢⍵}

Giải trình

                  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)

Hãy thử trực tuyến!


Ooh, bạn BB ngoài sân golf!
Adám


1

Pyt , 10 byte

Trả về [1] nếu đúng, [0] nếu sai

ĐɓƖ₫áĐ₫=ʁ∧

Hãy thử trực tuyến!

Giải trình:

              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

Võng mạc , 72 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Hoạt động bằng cách tạo một bản sao đơn nhất của số gốc, nhưng sử dụng _s để nó không bị nhầm lẫn bởi ví dụ: đầu vào của 11. Số unary sau đó được chuyển đổi thành "nhị phân" và các số 0 ở cuối. Palindromes sau đó được cắt ngắn liên tiếp và giai đoạn cuối thử nghiệm xem liệu còn gì không.


0

Toán học, 70 byte

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

0

Husk , 14 byte

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

Hãy thử trực tuyến!

Ungolfed / Giải thích

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

Hãy thử trực tuyến!

Giải trình

Thay vì kiểm tra các số 0 đứng đầu trong hệ nhị phân, tôi kiểm tra mà không có các số 0 ở cuối.

ṙ           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

một vài điều, cảm ơn Ed Marty vì đã chỉ ra rằng tôi cần kiểm tra xem có bao nhiêu số 0 ở phía trước cho một bảng màu. Và tôi cần đảm bảo rằng tôi có thể kiểm tra tới 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);}

Hãy thử trực tuyến!


1
Bạn có thể xóa khoảng trống giữa return(cho 129 byte
Ông Xcoder

Điều này chỉ hoạt động khi thêm tối đa một số 0 đứng đầu, nhưng vấn đề chỉ định nhiều số 0 đứng đầu được cho phép.
Ed Marty

@EdMarty đã được xử lý, cũng như lỗi tràn ngăn xếp.
Dennis.Verweij

bạn đang thiếu một using System;using System.Linq
LiefdeWen

hoặc đó là +23 byte?
LiefdeWen

0

Python 2 , 56 byte

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

Hãy thử trực tuyến!

Sử dụng stripphương thức của Python để loại bỏ các số bin(..)0 ở đầu số đầu ra 0b số nhị phân (vì chúng sẽ luôn có một bit trùng khớp).


0

Bình thường , 25 22 19 18 17 byte

- 3 6 7 8 byte bằng cách học thêm ngôn ngữ

Ks_.Bsz&_IzqKs_`K

Giải trình:

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

Tôi chắc chắn rằng điều này có thể được đánh golf xuống, tôi sẽ làm việc trên đó.

Phòng thử nghiệm


0

PHP, 69 + 1 byte

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

Chạy như đường ống với -nR
Echoes đầu vào ban đầu cho sự thật / không có gì cho falsey

Hãy thử trực tuyến!


0

Octave , 68 66 byte

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

Hãy thử trực tuyến!

Cung cấp ban đầu từ Octave.

Về cơ bản, chúng tôi tạo ra một mảng chứa số dưới dạng một chuỗi thập phân và số đó là một chuỗi nhị phân có dấu 0 bị xóa. Sau đó, chúng ta tạo một mảng có cùng chuỗi với các số nhị phân và số thập phân được lật. Cuối cùng, cả hai mảng được so sánh và kết quả là đúng nếu chúng khớp (cả hai palindromes) hoặc sai nếu chúng không (một hoặc cả hai không palindromes).


  • Lưu 2 byte bằng cách sử dụng flipthay vì fliplr.

0

APL2 (không phải Dyalog), 36 byte

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

Đầu tiên, hãy để B là đại diện 32 bit của N:

B←(32⍴2)⊤N

Sau đó nhân bản B và tìm vị trí của số 1:

(⌽B)⍳1

Sau đó thả nhiều vị trí khỏi B. Điều này sẽ bảo toàn đúng số 0 đứng đầu.

Sau đó thực hiện TÌM và GIẢM GIÁ để xem B bị cắt có chứa gương của chính nó không.

Bây giờ hãy nhìn vào N, số thập phân. Biểu thức được đặt trong ngoặc trái nhất sẽ chuyển N thành một vectơ ký tự và kiểm tra xem nó có MATCH gương của chính nó không.

Cuối cùng, một AND tham gia hai kiểm tra.


Trong APL2 tôi không thể tạo ra một lambda gọn gàng vì vậy tôi đã viết một lớp lót và bao gồm mũi tên gán. Hy vọng điều này không phải là gian lận.


1
Chào mừng đến với PPCG!
Martin Ender

Chào mừng đến với PPCG! Đối với một phiên bản ít gian lận hơn, bạn có thể nối thêm một quad ( ) để biến nó thành một chương trình đầy đủ không? Ngoài ra, bạn có thể rút ngắn (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Erik the Outgolfer 15/2/18

Erik, cảm ơn vì đã kiểm tra! Tôi chắc chắn rằng điều này có thể được cải thiện, nhưng tôi không có ⍨ squiggle trong 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());}

Giải trình:

Hãy thử nó ở đây.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.