İkili bükümlü palindromik sayılar


29

Uyarı: Bu "hey, ASCII-sanatta bir pasta çizelim" mücadelesi DEĞİLDİR! Lütfen okumaya devam edin;)

Bir süre önce doğum günümdü, 33 yaşındayım.

Bu yüzden aile ve arkadaşları davet etmek, pastanın üzerine mum gibi saymak, şarkı söylemek ve hediyeler açmaktan oluşan bu garip sosyal gelenek var.

   33   
--------

Rakamlar yerine ikili sistemi standart mumlar koymak için kullanabilirim: 6 tanesini kekin üzerine yerleştiririm ve ikisini de yakarım.

 100001
--------

Bunu görebiliyorum benim yaş ondalık ve ikili hem sayılar palindromic vardır!

Meydan okuma

Başka bir sayının mumlu bir pastanın üzerine konulabileceğini ve palindromik, ondalık ve ikili olabileceğini bilmek istiyorum.

Bir sayının hem ondalık hem de ikili olarak palindromik olup olmadığını sınamak için bir program / işlev yazın . Fakat bekleyin, dahası var: ikilide, önde gelen sıfırlar test için sayılır!

Giriş

0 <x <2 32 -1 ile doğum günü palindromik olup olmadığını test etmek istediğim bir ondalık sayı (evet, boyutumdaki insanlar çok uzun yaşıyorlar)

Çıktı

Gerçeği tam olarak bu iki koşula uyuyorsa, Falsey:

  • Sayının ondalık gösterimi standart bir palindromdur
  • Sayının ikili gösterimi standart bir palindromdur ve satır başına sıfır eklemek bu konuda yardımcı olabilir

Test durumları

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

kurallar

İyi şanslar ve sonunda mutlu yıllar!



6
Doğum günü kısmı düzensiz olduğu için unvanı değiştirmek isteyebilir.
NoOneIsHere

@Hayır AçıkçasıHerhangi bir zorluk doğum günü pastasındaki mumlar hakkında. Ayrıca ikili göstergede büküm var, yani "genel palindromik sayılar" değil. Yorumunuz yükseltilirse, başka bir başlık bulacağım.
Goufalite

Yani kurallara göre 0b01010000000000000000000000000000palindromik değildir , çünkü daha fazla sıfırın eklenmesi ve dolayısıyla 2 ^ 32-1'i aşması gerekirdi. Bu durumda 1342177280, bir falsey test durumu gibi bir şey eklemek için yardımcı olacaktır .
Cristian Lupascu

1
@ w0lf Sıfır eklemek için bir limit yazmadım, ancak yığın taşma probleminizi anlıyorum;) Ayrıca, 1342177280ondalık palindromik değil , Falsey. Düzenleme
Goufalite

Yanıtlar:


17

05AB1E , 7 bayt

b0Ü‚DíQ

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

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

Bifurcate yardım etmedi mi?
Magic Octopus Urn

@MagicOctopusUrn: Ne yazık ki hayır, listedeki her sayıyı tersine çevirmek istiyorum, listenin kendisini değil.
Emigna

11

Python 3 , 59 bayt

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

Çevrimiçi deneyin!

-3 Rod sayesinde bayt
-3 Connor Johnston sayesinde bayt



1
dizeleri olan bir şerit kullanmak tek karakterleri kaldıracak: [bin (a) [2:]. strip ('0') => bin (a) .strip ('0b')]] ( tio.run/… "Python 3 - Dene Çevrimiçi ""
Conner Johnston

@ConnerJohnston o harika, teşekkürler!
HyperNeutrino

8

JavaScript (ES6), 65 bayt

0Veya döndürür 1.

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

Nasıl?

Yardımcı fonksiyon g () , b olarak bir tamsayı alır ve n'nin b tabanındaki bir palindrom olup olmadığını test eder . Eğer b belirtilmemişse, sadece dönüştürür n bunu test etmeden önce bir dizeye.

Bu ikili gösterimi olarak sondaki sıfırlar kurtulmak n en az önemli izole ederek 1 ile n&-nve bölme n elde edilen miktarı ile.

Eğlenceli gerçek: bunun bir gerçeği, 0çünkü bir palindrom olan (0/0).toString(2)eşittir "NaN". (Ama 0yine de geçerli bir giriş değil.)

Test durumları


5

Mathematica, 52 49 bayt

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

Wolfram Sandbox'ta dene

kullanım

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

f[6]

True

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

{True, False, True, False}

açıklama

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

Yerleşik sürüm PalindromeQ

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


3

Japt , 14 bayt

s ꬩ¢w n2 ¤ê¬

Çevrimiçi test edin!

açıklama

 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.

13 bayt içindeki çözeltiler bir çift ile geldi: sêQ *(¢w)sêQvesêQ &¢w n sêQ
Shaggy

@Shaggy Teşekkürler, fakat maalesef ikisi de başarısız oluyor 297515792(ondalık basamağa dönüştürülen ters ikili sadece JS'nin idare edemeyeceği kadar büyük) ...
ETHproductions


2

APL, 27 31 Bayt

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

Nasıl çalışır? Argümanı 6 kullanarak ...

      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

TryAPL.org’da deneyin


Spesifikasyonlara göre, 6'nın iyi bir girdi olması gerekiyor, ancak verilen ifade yanlış.
lstefano

Ah, sıçanlar! Sorunu bütünüyle okumamadığım için bunu elde ediyorum. İyi yakalama. teşekkür ederim! Biraz daha uzun ama umarım daha doğru bir çözümle düzelttim.
Brian Becker,

PPCG'ye Hoşgeldiniz. Güzel ilk mesaj! Ne yazık ki, şu anki haliyle gönderiminiz ne program ne de işlev değil. Endişelenmenize gerek yok, bir işleve girebilir ancak dış parantezlerin tüm kodu içine almasına izin verebilirsiniz.
Adám



1

Brachylog , 7 bayt

↔?ḃc↔.↔

Çevrimiçi deneyin!

Bu çok

açıklama

Örtük giriş ve çıkışla, kod şudur: ?↔?ḃ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 Klasik) , 26 bayt

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

açıklama

                  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)

Çevrimiçi deneyin!


Ooh, BB'yi kovmuştun!
Adám


1

Pyt , 10 bayt

True ise [1], false ise [0] döndürür

ĐɓƖ₫áĐ₫=ʁ∧

Çevrimiçi deneyin!

Açıklama:

              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 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Orijinal sayının tek bir kopyasını oluşturarak çalışır, ancak _s'yi örneğin bir girdiyle karıştırılmaması için kullanarak 11. Tek sayı daha sonra "ikili" ye dönüştürülür ve izleyen sıfırlar çıkarılır. Palindromlar daha sonra arka arkaya kesiliyor ve son aşamada kalan herhangi bir şey olup olmadığını test ediyor.


0

Mathematica, 70 bayt

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

0

Kabuğu , 14 bayt

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

Çevrimiçi deneyin!

Ungolfed / Açıklama

             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 bayt

ṙṭ@ḍ2⁻Πbṭ∧

Çevrimiçi deneyin!

açıklama

İkili olarak baştaki sıfırlarla kontrol etmek yerine, izleyen sıfırlar olmadan kontrol ederim.

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

birkaç şey, Ed Marty'ye, bir palindrom için öndeki yastığın 0'ını kontrol etmem gerektiğine işaret ettiğim için teşekkür ederim. Ve x ^ 32 -1'e kadar kontrol edebildiğimden emin olmam gerekiyor .

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

Çevrimiçi deneyin!


1
Sen arasındaki boşluğu kaldırmak returnve (için 129 bayt
Sn Xcoder

Bu sadece en fazla bir satır 0 eklerken çalışır, ancak sorun birden fazla satırın sıfırlanabileceğini belirtir.
Ed Marty

İşlenen @EdMarty ve yığın taşması hatası.
Dennis.Verweij

Bir using System;ve sen eksikusing System.Linq
LiefdeWen

ya da +23 bayt mı?
LiefdeWen

0

Python 2 , 56 bayt

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

Çevrimiçi deneyin!

Python'un striphem bin(..)çıktının öncüsünü 0b hem de ikili sayının sonundaki sıfırlarını kaldırmak için kullanır (her zaman eşleşen bir bite sahip olacaklar).


0

Pyth , 25 22 19 18 17 bayt

- 3 6 7 8 bayt dili daha da öğrenerek

Ks_.Bsz&_IzqKs_`K

Açıklama:

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

Bunun golf oynayabileceğinden eminim, bunun üzerinde çalışacağım.

Test odası


0

PHP, 69 + 1 bayt

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

-nR
Truthy için orijinal girişi Echoes ile pipo olarak çalıştır / falsey için hiçbirşey

Çevrimiçi deneyin!


0

Octave , 68 66 bayt

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

Çevrimiçi deneyin!

Octave'dan ilk teklif.

Temelde, sayıyı ondalık dizge olarak içeren bir dizi ve izleyen 0 silinen ikili bir dizge olarak sayıyı yaratırız. Sonra dizeleriyle aynı olan ancak ikili ve ondalık sayılar çevrilmiş olan bir dizi yaratırız. Son olarak, her iki dizi karşılaştırılır ve sonuç, eşleşmeleri durumunda (her ikisi de palindromlar) doğrudur veya eğer eşleşmezse (palindromlardan biri veya her ikisi değil) doğru olur.


  • Kaydet 2'yi kullanarak bayt flipyerine fliplr.

0

APL2 (Dyalog değil), 36 bayt

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

İlk önce B, N'nin 32-bit gösterimi olsun:

B←(32⍴2)⊤N

Daha sonra B aynasını aynalayın ve 1. 1'in konumunu bulun:

(⌽B)⍳1

Ardından B'den birçok pozisyonu bırakın. Bu, doğru öncü 0'ları koruyacaktır.

Sonra, kırpılmış B'nin kendi aynasını içerip içermediğini görmek için FIND ve OR-REDUCTION gerçekleştirin.

Şimdi N'ye bakalım, ondalık. En soldaki parantez içi ifade, N'yi bir karakter vektörüne dönüştürür ve kendi aynasına uyup uymadığını kontrol eder.

Son olarak, bir AND iki çeke katılır.


APL2'de düzgün bir lambda yapamam, bu yüzden bir liner yazdım ve ödev oku dahil ettim. Umarım bu hile değildir.


1
PPCG'ye Hoşgeldiniz!
Martin Ender

PPCG'ye Hoşgeldiniz! Daha az hile yapan bir sürüm için bunun yerine tam bir program yapmak için bir quad ( ) ekleyebilir misiniz ? Ayrıca, kısaltabiliyor (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕musunuz?
Outgolfer Erik,

Erik, kontrol ettiğin için teşekkürler! Bunun geliştirilebileceğine eminim, ancak APL2'de ⍨ dalgalığım yok.
mappo

0

Java 8, 105 104 bayt

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

Açıklama:

Burada dene.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.