バイナリツイストの回文数


29

警告:これは「ちょっと、ASCIIアートでケーキを描いてみよう」チャレンジではありません!読み続けてください;)

少し前に私の誕生日でした、私は今33歳です。

そのため、家族や友人を招待し、数字のようなろうそくをケーキの上に置いたり、歌を歌ったり、プレゼントを贈ったりする、この厄介な社会的伝統があります。

   33   
--------

数字の代わりに、バイナリシステムを使用して標準のキャンドルを置くことができます。6本をケーキの上に置き、2本を点灯します。

 100001
--------

私の年齢の10進数と2進数の両方が回文的であることがわかります

チャレンジ

他の数字をキャンドルでケーキに付けて、回文、10進数、2進数にすることができるかどうかを知りたいです。

数値が10進数と2進数の両方で回文的かどうかをテストするプログラム/関数を作成します。しかし、待ってください、もっとあります:バイナリでは、テストのために先行ゼロがカウントされます!

入力

0 <x <2 32 -1の誕生日回文であるかどうかをテストする10進数x (はい、私の次元の人々は非常に長生きしています)

出力

これらの2つの条件を完全に満たす場合は真実です。それ以外の場合はです。

  • 数値の10進表現は標準的な回文です
  • 数値のバイナリ表現は標準的なパリンドロームであり、先行ゼロを追加するとこれに役立つ場合があります

テストケース

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

ルール

幸運を祈り、最終的にはお誕生日おめでとう!



6
誕生日の部分は無関係なので、タイトルを変更したい場合があります。
-NoOneIsHere

@NoOneIsHere課題は、バースデーケーキのろうそくについてです。また、バイナリ表現にねじれがあるため、「汎用回文数」ではありません。あなたのコメントが支持された場合、私は別のタイトルを思いつきます。
グーファライト

したがって、ルールによれば、0b01010000000000000000000000000000追加するゼロがさらに必要であり、したがって2 ^ 32-1を超えるため、回文的ではありませんか?この場合1342177280、偽のテストケースのようなものを追加すると役立ちます。
クリスティアンルパスク

1
@ w0lf私はゼロを追加するための制限を書いていませんが、あなたのスタックオーバーフローの問題を理解しています;)さらに、134217728010進回文ではないのでFalseyです。編集
グーファライト

回答:


17

05AB1E、7バイト

b0Ü‚DíQ

オンラインでお試しください! またはテストスイートとして

説明

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

二股は助けにならなかった?
魔法のタコUr

@MagicOctopusUrn:残念ながらそうではありません。リスト自体ではなく、リスト内の各数値を逆にしたいからです。
エミグナ

11

Python 3、59バイト

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

オンラインでお試しください!

Rodのおかげで
-3バイトConnor Johnstonのおかげで-3バイト



1
文字列でストリップを使用すると、単一の文字が削除されます。[bin(a)[2:]。strip( '0')=> bin(a).strip( '0b')](tio.run/… "Python 3 – Tryオンライン」)
コナージョンストン

@ConnerJohnstonかっこいい、ありがとう!
ハイパーニュートリノ

8

JavaScript(ES6)、65バイト

0またはを返します1

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

どうやって?

ヘルパー関数g()は、整数bを入力として受け取り、nが基数bの回文であるかどうかをテストします。bが指定されていない場合、テストする前にnを文字列に変換するだけです。

nのバイナリ表現の末尾のゼロを取り除くには、最下位の1nn&-nで割り、結果の量で除算します。

おもしろい事実:イコールがパリンドロームである0ため、それは真実です。(とにかく有効な入力ではありません。)(0/0).toString(2)"NaN"0

テストケース


5

Mathematica、52 49バイト

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

Wolfram Sandboxで試してみてください

使用法

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

f[6]

True

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

{True, False, True, False}

説明

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

組み込みのバージョン PalindromeQ

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


3

Japt、14バイト

s ꬩ¢w n2 ¤ê¬

オンラインでテストしてください!

説明

 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バイトの似たようなソリューションをいくつかsêQ *(¢w)sêQsêQ &¢w n sêQ
Shaggy

@Shaggyのおかげで、残念ながらそれらの両方に失敗297515792...(逆バイナリは、小数点に変換ハンドルにJSのためにあまりにも大きい)
ETHproductions


2

APL、27 31バイト

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

どのように機能しますか?引数として6を使用しています...

      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で試してください


仕様によると、6は適切な入力であると想定されていますが、指定された式はfalseを返します。
lstefano

ああ、ラット!それは私が問題全体を読んでいないために得たものです。良いキャッチ。ありがとうございました!少し長くなりましたが、うまくいけばより正確なソリューションに修正しました。
ブライアンベッカー

PPCGへようこそ。素敵な最初の投稿!残念ながら、現在の形式での提出はプログラムでも機能でもありません。心配する必要はありません。関数にすることはできますが、外側の中括弧でコード全体を囲むことができます。
アダム

保存3バイト:{(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(全体のテストスイートを実行するためのリンクを提供するために、良い形である)
アダム・


1

Brachylog、7バイト

↔?ḃc↔.↔

オンラインでお試しください!

それはたくさんの…

説明

暗黙的な入力と出力の場合、コードは次のとおりです。 ?↔?ḃ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バイト

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

説明

                  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)

オンラインでお試しください!


ああ、あなたはBBをゴルフアウトしました!
アダム


1

Pyt、10 バイト

trueの場合は[1]、falseの場合は[0]を返します

ĐɓƖ₫áĐ₫=ʁ∧

オンラインでお試しください!

説明:

              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

網膜、72バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。元の数の単項複製を作成することで機能しますが、_s を使用して、たとえばの入力によって混乱しないようにします11。次に、単項数は「バイナリ」に変換され、末尾のゼロは削除されます。その後、回文は連続的に切り捨てられ、最後の段階で何か残っているかどうかがテストされます。


0

Mathematica、70バイト

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


0

ガイア、10バイト

ṙṭ@ḍ2⁻Πbṭ∧

オンラインでお試しください!

説明

バイナリの先頭のゼロでチェックする代わりに、末尾のゼロなしでチェックします。

ṙ           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コア)130 129 179 173 + 23のバイト

いくつかのこと、エドマーティに感謝します。パリンドロームの前に多くの0が埋め込まれていることを確認する必要があることを指摘してくれました。そして、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);}

オンラインでお試しください!


1
あなたは、間にスペースを削除することができますreturnし、(ために129バイト
氏Xcoder

これは、多くても1つの先行ゼロを追加する場合にのみ機能しますが、問題では複数の先行ゼロが許可されることが指定されています。
エドマーティ

処理された@EdMarty、およびスタックオーバーフローのバグ。
-Dennis.Verweij

あなたが不足しているusing System;using System.Linq
LiefdeWen

またはそれは+23バイトですか?
LiefdeWen


0

ピス25 22 19 18 17バイト

- 言語をさらに学習して3 6 7 8バイト

Ks_.Bsz&_IzqKs_`K

説明:

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

これは確実に解決できると確信しています。今後取り組んでいきます。

テストスイート



0

オクターブ68 66バイト

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

オンラインでお試しください!

Octaveからの最初の提供。

基本的に、10進数の文字列としての数値と、末尾の0が削除されたバイナリ文字列としての数値を含む配列を作成します。次に、文字列と同じですが、2進数と10進数を反転させた配列を作成します。最後に、両方の配列が比較され、結果が一致する場合は両方(パリンドローム)、または一致しない場合は偽(どちらかまたは両方がパリンドロームではない)になります。


  • flip代わりに2バイトを保存しますfliplr

0

APL2(Dyalogではない)、36バイト

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

まず、BをNの32ビット表現とします。

B←(32⍴2)⊤N

次に、Bをミラーリングし、1番目の位置を見つけます1:

(⌽B)⍳1

次に、Bからその数だけドロップします。これにより、先頭の0の正しい数が保持されます。

次に、FINDおよびOR-REDUCTIONを実行して、トリミングされたBに独自のミラーが含まれているかどうかを確認します。

次に、10進数のNを見てみましょう。左端の括弧で囲まれた式は、Nを文字ベクトルに変換し、それが独自のミラーと一致するかどうかを確認します。

最後に、ANDが2つのチェックを結合します。


APL2では、きちんとしたラムダを作成できないので、ワンライナーを作成し、割り当て矢印を含めました。これが不正行為ではないことを願っています。


1
PPCGへようこそ!
マーティンエンダー

PPCGへようこそ!不正行為が少ないバージョンでは、代わりにクワッド()を追加して完全なプログラムにすることができますか?また、短縮することはでき(N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕ますか?
エリックアウトゴルファー

エリック、チェックありがとう!これは改善できると確信していますが、APL2には⍨波線がありません。
mappo

0

ジャワ8、105の 104バイト

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

説明:

ここで試してみてください。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.