이진 트위스트와 회문 번호


29

경고 : 이것은 "이봐, 아스키 아트로 케이크를 그려 보자"도전이 아닙니다! 계속 읽으십시오;)

얼마 전 내 생일이었고 지금 33 살입니다.

그래서이 어색한 사회적 전통은 가족과 친구들을 초대하고 케이크에 숫자 같은 양초를 넣고 노래를 부르고 선물을 열어주는 것으로 구성되어 있습니다.

   33   
--------

숫자 대신 이진법을 사용하여 표준 양초를 넣을 수 있습니다. 나는 그 중 6 개를 케이크 위에 놓고 두 개를 밝게 비 춥니 다.

 100001
--------

나는 내 나이의 십진수와 이진수가 회 문식 임을 알 수 있습니다 !

도전

나는 다른 숫자가 촛불로 케이크에 놓여지고 회문, 십진 및 이진인지 알고 싶습니다.

숫자가 십진법과 이진법 모두 에서 회 문형인지 테스트 할 프로그램 / 함수를 작성하십시오 . 그러나 잠깐, 더 많은 것이 있습니다 : 이진수로 앞에 0이 테스트에 포함됩니다!

입력

진수 번호 X가 생일 인 경우에 나는 테스트 할 것을 상동와 0 <X <2 32 -1 (예, 라이브 매우 긴 내 차원에서 명)

산출

Falsey는 다음 두 가지 조건을 모두 충족한다면 진실 입니다.

  • 숫자의 십진수 표현은 표준 회문
  • 숫자의 이진 표현은 표준 회문이며 앞에 0을 추가하면 도움이 될 수 있습니다.

테스트 사례

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 여기

@NoOneIs 여기에 도전은 생일 케이크의 촛불에 관한 것입니다. 또한 이진 표현에는 비틀림이 있으므로 "일반 회문 번호"가 아닙니다. 귀하의 의견이 표명되면 다른 제목이 나옵니다.
Goufalite

따라서 규칙에 따르면, 0b01010000000000000000000000000000더 많은 0을 추가해야하므로 2 ^ 32-1을 초과하므로 회문식이 아닌가? 이 경우 1342177280허위 테스트 사례 와 같은 것을 추가하는 것이 도움이됩니다 .
Cristian Lupascu

1
@ w0lf 나는 0을 추가하기위한 제한을 쓰지 않았지만 스택 오버플로 문제를 이해합니다.) 또한 1342177280십진 회문이 아니므로 Falsey입니다. 편집
Goufalite

답변:



11

파이썬 3 , 59 바이트

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

온라인으로 사용해보십시오!

Rod 덕분에
-3 바이트 Connor Johnston 덕분에 -3 바이트



1
문자열과 함께 strip을 사용하면 단일 문자가 제거됩니다. [bin (a) [2 :]. strip ( '0') => bin (a) .strip ( '0b')] ( tio.run/… "Python 3 – Try 온라인 ")
코너 존스턴

@ConnerJohnston o 멋지다, 고마워!
HyperNeutrino

8

자바 스크립트 (ES6), 65 바이트

반환 0또는 1.

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

방법?

헬퍼 함수 g () 는 정수 b 를 입력으로 취하여 nb 의 회문 인지 여부를 테스트합니다 . 경우 B가 지정되지 않은, 그냥 변환 N 을 테스트하기 전에 문자열로.

우리의 이진 표현에 후행 제로 제거 n은 최하위 분리에 의해 1n&-n하고 나눔 N 결과 양에 의해.

재미있는 사실 : equals 0이기 때문에 진실입니다 . 이것은 회문입니다. (그러나 어쨌든 유효한 입력은 아닙니다.)(0/0).toString(2)"NaN"0

테스트 사례


5

매스 매 티카, 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

apt , 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 감사합니다, 그러나 불행히도 그 둘 다 실패합니다 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에 오신 것을 환영합니다. 좋은 첫 포스트! 불행히도, 현재 형식으로 제출 한 것은 프로그램이나 기능이 아닙니다. 그러나 걱정할 필요는 없지만 함수로 만들 수 있지만 바깥 괄호로 코드 전체를 묶을 수 있습니다.
Adám

3 바이트를 절약하십시오 : {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(전체 테스트 스위트를 실행하기위한 링크를 제공하는 것이 좋습니다)
Adám


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!
Adám


1

Pyt , 10 바이트

참이면 [1], 거짓이면 [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이 제거됩니다. 회문은 계속해서 잘리고 마지막 단계는 남은 것이 있는지 테스트합니다.


0

Mathematica, 70 바이트

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

0

껍질 , 14 바이트

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

온라인으로 사용해보십시오!

언 골프 / 설명

             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 바이트

ṙṭ@ḍ2⁻Πbṭ∧

온라인으로 사용해보십시오!

설명

이진수로 선행 0을 확인하는 대신 후행 0없이 확인합니다.

ṙ           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 바이트

몇 가지, 에드 마티 (Ed Marty)에게 회문 앞에 채워진 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

이것은 최대 하나의 선행 0을 추가 할 때만 작동하지만 문제는 여러 선행 0이 허용되도록 지정합니다.
Ed Marty

처리 된 @EdMarty와 스택 오버플로 버그.
Dennis.Verweij

당신은 using System;using System.Linq
LiefdeWen

아니면 +23 바이트입니까?
LiefdeWen


0

Pyth , 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

PHP, 69 + 1 바이트

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

-nR
진실에 대한 원래의 입력을 에코 로 처리하고 거짓에 대한 것은 없습니다.

온라인으로 사용해보십시오!


0

옥타브 , 68 66 바이트

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

온라인으로 사용해보십시오!

Octave의 초기 오퍼링.

우리는 기본적으로 숫자를 10 진수 문자열로 포함하고 숫자를 이진수 문자열로 포함하여 후행 0을 제거하는 배열을 만듭니다. 그런 다음 문자열과 동일하지만 이진수와 십진수를 뒤집은 배열을 만듭니다. 마지막으로 두 배열이 비교되고 결과가 일치하면 (팔린 드 둘 다), 일치하지 않으면 (팔린 드가 아닌) 거짓입니다.


  • flip대신 2 바이트를 사용하십시오 fliplr.

0

APL2 (Dyalog 아님), 36 바이트

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

먼저 B를 32 비트 N으로 표현하자.

B←(32⍴2)⊤N

그런 다음 B를 미러링하고 첫 번째 1의 위치를 ​​찾으십시오.

(⌽B)⍳1

그런 다음 B에서 그 많은 위치를 삭제하십시오. 그러면 올바른 선행 0 수가 유지됩니다.

그런 다음 FIND 및 OR-REDUCTION을 수행하여 자른 B에 자체 미러가 있는지 확인하십시오.

이제 십진수 인 N을 봅시다. 가장 왼쪽 대괄호 표현식은 N을 문자형 벡터로 변환하고 고유 한 미러와 일치하는지 확인합니다.

마지막으로 AND는 두 가지 검사에 합류합니다.


APL2에서는 깔끔한 람다를 만들 수 없으므로 하나의 라이너를 작성하고 할당 화살표를 포함 시켰습니다. 바람 피우지 않기를 바랍니다.


1
PPCG에 오신 것을 환영합니다!
Martin Ender 2019

PPCG에 오신 것을 환영합니다! 부정 행위가 적은 버전의 경우 쿼드 ( )를 추가 하여 전체 프로그램으로 만들 수 있습니까? 또한 단축 할 수 (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕있습니까?
Outgolfer Erik

에릭, 확인해 주셔서 감사합니다! 나는 이것이 향상 될 수 있다고 확신하지만 APL2에는 s sggggle이 없습니다.
mappo

0

자바 8, 105104 바이트

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.