주어진 기수 (기본)에서 정수가 회문인지 확인


11

stdin에서 두 개의 정수를 읽은 프로그램을 작성하십시오. 각 줄 바꿈은 다음에 "번호"및 "기수"라고하며 종료됩니다.

  1. 당신이이 번호는 기수의 회문 경우 원하는 고정 된 메시지를 인쇄합니다 (예를 들어 true, t, 1)
  2. 숫자가 기수의 회문 (예를 들면 아닌 경우 원하는 다른 고정 된 메시지를 인쇄 false, f, 0, 등)
  3. 이 메시지는 매 실행마다 동일해야하지만 골프에 가장 적합한 규칙은 없습니다.
  4. 입력이 유효하고 두 개의 양의 정수라고 가정 할 수 있습니다. "숫자"는 초과하지 않으며 2147483647"기수"는 초과하지 않습니다 32767.
  5. 외부 리소스를 사용할 수는 없지만 기본적으로 언어에 포함 된 수학 함수를 사용할 수 있습니다.

참고 : 기수는 숫자의 밑 수일뿐입니다.

샘플 실행 :

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

참고 : 기수는 숫자의 밑 수일뿐입니다.

지금은 좋아 보인다. 외부 리소스를 금지하고 싶을 수도 있습니다.

예를 들어 @ user2509848 흠?
durron597

웹에서 숫자를 변환하는 계산기를 웹에서 찾을 수 있다면 거의 확실하게 사용됩니다. 우리는 최근에 트로리 대답의 발진을 겪고 있습니다.

고정 메시지 중 하나가 빈 문자열 일 수 있습니까 (다른 하나는 비어 있지 않은 문자열이라고 가정)?
Toby Speight

답변:


5

J (23 자) 및 K (19) 이중 기능

두 언어는 일반적으로이 골프와 매우 유사합니다. 다음은 J입니다.

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1-숫자 1을 자체에 추가하여 배열을 1 1만듭니다.
  • 1!:1-키보드에서 두 개의 문자열 1!:1을 읽습니다 ( 읽는 것, 1키보드 입력을위한 파일 핸들 / 번호).
  • ". -각 문자열을 숫자로 변환하십시오.
  • #.^:_1~/- F~/ x,y찾기를 의미합니다 y F x. 우리는 F이다 #.^:_1기본 확장을 수행하는.
  • (-:|.)-인수 -:가 역순 ( |.) 과 일치합니까 ( )? 1예, 0아니요

그리고 여기 K가 있습니다 :

a~|a:_vs/|.:'0::'``
  • 0::'``- 콘솔에서 0::각 ( ') 줄 의 문자열을 ( ) 입력하십시오 ( `이 파일 핸들입니다).
  • .:'- .:각 ( ') 문자열을 숫자로 변환합니다.
  • _vs/|-기수가 숫자 앞에 오도록 숫자 쌍을 뒤집은 다음 그 사이에 /기본 확장 함수 _vs( "스칼라에서 벡터" ) 를 삽입합니다 ( ) .
  • a~|a:-이 확장 결과를에 할당 a한 다음 그 반대 ( ) a와 일치 하는지 확인하십시오 ~( |). 다시 한 번 1그렇습니다 0.

@ ak82이 방법이 더 재미 있다고 생각합니다
John Dvorak

8

GolfScript, 10 자

~base.-1%=

간단한 방법으로 GolfScript를 사용하는 것이 쉬운 방법입니다. 출력은 0/ 1for false / true입니다.

~       # Take input and evaluate it (stack: num rdx)
base    # Fortunately the stack is in the correct order for
        # a base transformation (stack: b[])
.       # Duplicate top of stack (stack: b[] b[])
-1%     # Reverse array (stack: b[] brev[])
=       # Compare the elements

3

APL (20)

⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕

출력 0또는 1예 :

      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      5
⎕:
      5
0
      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      16781313
⎕:
      64
1

설명:

  • ⎕{... }⎕: 두 개의 숫자를 읽고 함수에 전달합니다. 첫 번째 숫자이고 두 번째 숫자입니다.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), 기본 을 나타내는 데 필요한 자릿수 .
  • ⍺/⍨: 각 자릿수의 기준이므로 방금 계산 한 숫자로 복제됩니다.
  • ⍵⊤⍨: 주어진 기준으로 표현 하십시오 (숫자를 사용하여의 모든 값에 적용됩니다 ).
  • ≡∘⌽⍨: 결과가 반대인지 확인합니다.

3

펄, 82 77 73 69 바이트

$==<>;$.=<>;push(@a,$=%$.),$=/=$.while$=;@b=reverse@a;print@a~~@b?1:0

입력 번호는 STDIN의 입력 라인으로 예상되며 결과는 1또는 로 작성됩니다 0. 전자는 첫 번째 숫자가 주어진 기준을 나타내는 회문임을 의미합니다.

편집 1 :를 사용 $=하면 내부적으로 int로 변환되기 때문에 일부 바이트가 절약됩니다.

편집 2 : smartmatch 연산자 ~~는 배열 요소를 직접 비교하므로 문자열로 변환 할 필요가 없습니다.

편집 3 : 불필요한 변수를 제거하여 최적화

65 바이트 : 빈 문자열이에 대한 출력으로 허용 false되면 마지막 4 바이트를 제거 할 수 있습니다.

언 골프 버전

$= = <>;
$. = <>;
while ($=) {
    push(@a, $= % $.);
    $= /= $.; # implicit int conversion by $=
}
@b = reverse @a;
print (@a ~~ @b) ? 1 : 0

알고리즘은 변환 된 숫자의 자릿수를 배열에 저장합니다 @a. 그런 다음이 배열의 문자열 표현이 배열과 역순으로 비교됩니다. 공백은 숫자를 구분합니다.


죄송합니다, 내 대답은 정말 똑같습니다,하지만 사용 $=하면 int단계를 anything you want쓸 수 있습니다 ... 그리고 의문의 여지가 있으니 원하는 것은 아무것도 될 수 없습니다 ;-)
F. Hauri

@ F.Hauri : 감사합니다. 업데이트하겠습니다. $=또한 "Perl의 골프 팁" 질문에 대한 이 답변의 팁으로 제공됩니다 . 반환하는 데 6 바이트가 더 들지만 고정 메시지가 비어 있지 않다는 느낌이 들었습니다. 0
Heiko Oberdiek

앙 ,, 반환 0 비용 4 추가 바이트가 아니라 6하지만 유지는 : 이다 아무것도! silence
F. Hauri

@ F.Hauri : 예, 4는 정확합니다. 여분의 2 바이트는 ungolfed 버전의 괄호였습니다.
Heiko Oberdiek

2

자바 스크립트 87

function f(n,b){for(a=[];n;n=(n-r)/b)a.push(r=n%b);return a.join()==a.reverse().join()}

nargument는 숫자이고 bargument는 기수입니다.


2

세이지, 45

대화식 프롬프트에서 실행

A=Integer(input()).digits(input())
A==A[::-1]

True회문 일 때 인쇄 , False그렇지 않으면 인쇄


2

54 56 62

$==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse

테스트하려면 :

for a in $'16\n3' $'16\n10' $'12346\n12345' $'12346\n12346' $'21\n11' $'170\n16';do
    perl -E <<<"$a" ' 
        $==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse
    '
  done

줄게:

1

1


1

이 출력 그래서 1대한 true회문이 발견 될 때와 전혀 다른 경우.

풀기 :

$==<>;                            # Stdin to `$=`  (value)
$-=<>;                            # Stdin to `$-`  (radix)
while ( $= ) {
    $_.= $/. chr ( $= % $- +50 ); # Add *separator*+ chr from next modulo to radix to `$_`
    $=/= $-                       # Divide value by radix
}
say $_ == reverse                 # Return test result

참고 :

  • $_ 현재 행 버퍼이며 시작시 비어 있습니다.
  • $=A는 예약 originaly 라인 인쇄에 사용되는 변수,이 라인 카운터이다. 따라서이 변수는 integer 이며, 계산에 int()사용 된 것처럼 잘린 정수 가됩니다.
  • $- 전통적인 문자를 사용하지 않기 위해 재미로 사용되었습니다 ... (더 난독 화) ...

명확히하기 위해, 이것은 회문이 아닌 경우 아무 것도 말하지 않으며, 그렇지 않은 경우 1을 말합니다.
durron597

1
좋은 트릭. 그러나 잘못된 긍정 : 21에 밑이 11입니다. 숫자는 문자열 비교에서 구분 기호가 필요합니다.
Heiko Oberdiek

아 아아아 +3! @HeikoOberdiek 당신이 맞아요 ...
F. Hauri

@ F.Hauri : 숫자도 반전됩니다. 따라서 기본 16의 170은 회문 (palindrome) 인 0xAA이지만 결과는 거짓입니다.
Heiko Oberdiek

Aaarg +6! 문자로 변환 ...
F. Hauri

1

매스 매 티카 77 43

IntegerDigits[n,b]b를 기준으로 자릿수 목록으로 n을 나타냅니다. 각 b 자리는 10 진수로 표시됩니다.

예를 들어 16781313은 기본 17의 회문이 아닙니다.

IntegerDigits[16781313, 17]

{11, 13, 15, 11, 14, 1}

그러나, 그것은 이다 베이스 (16)의 회문은 :

IntegerDigits[16781313, 16]

{1, 0, 0, 1, 0, 0, 1}


위의 예에서 순서 쌍을 입력 한 경우

(x=Input[]~IntegerDigits~Input[])==Reverse@x

돌아올 것이다

거짓 (* ({11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

참 (* ({1, 0, 0, 1, 0, 0, 1}이 {1, 0, 0, 1, 0, 0, 1}과 같기 때문에) *)


이상하게도 대답에 필요하지는 않지만 궁금합니다. 어떻게 렌더링합니까?
durron597

바보 같은
형편

"typecast"를 친절하게 설명하십시오.
DavidC

입력을 유형으로 변환해야하므로 내 현자 솔루션이 2 자 이상 길었습니다.Integer
user12205

이제 나는 당신이 무슨 뜻인지 이해합니다. 감사.
DavidC

1

하스켈 (80 문자)

tb 0 _=[]
tb x b=(tb(div x b)b)++[mod x b]
pali n r=(\x->(x==reverse x))(tb n r)

로 전화하십시오 pali $number $radix. 숫자가 회문 (palindrome) 일 때는 참이고, 그렇지 않으면 거짓입니다.


1

루비-76 자

f=->(n,b){n==0?[]:[n%b,*f.(n/b,b)]};d=f.(gets.to_i,gets.to_i);p d==d.reverse

1

Perl 6 , 27 바이트 (stdin / out이없는 22)

say (+get).base(get)~~.flip

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

  get()                     # pulls a line of stdin
 +                          # numerificate
(      ).base(get())        # pull the radix and call base to 
                            #  convert to string with that base
                    ~~      # alias LHS to $_ and smartmatch to
                      .flip # reverse of the string in $_

읽기 쉬운 골프의 왕 Perl6 (골프?)

Perl 6 함수 (stdin / stdout 아님), 22 바이트

{$^a.base($^b)~~.flip}

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


base내가 대답에 사용하지 않은 이유 base는 최대 36 자까지만 지원하고 질문은 기수를 지원하도록 요청하기 때문입니다.32767
Jo King

오, 몰랐어 흠.
Phil H

0

dg-97 바이트

dg 시도하기 :

n,r=map int$input!.split!
a=list!
while n=>
 a.append$chr(n%r)
 n//=r
print$a==(list$reversed a)

설명 :

n, r=map int $ input!.split!      # convert to int the string from input
a = list!                         # ! calls a function without args
while n =>
 a.append $ chr (n % r)           # append the modulus
 n //= r                          # integer division
print $ a == (list $ reversed a)  # check for palindrome list

0

C, 140 132

int x,r,d[32],i=0,j=0,m=1;main(){scanf("%d %d",&x,&r);for(;x;i++)d[i]=x%r,x/=r;i--;for(j=i;j;j--)if(d[j]-d[i-j])m=0;printf("%d",m);}
  • 기수 1은 지원되지 않습니다.)

1
그냥 puts(m)제대로 작동합니까?
durron597 년

printf("%d",m);8 자 더 짧습니다.
VX

0

하스켈-59

Max Ried의 답변이 거의 변경되지 않았습니다.

0%_=[]
x%b=x`mod`b:((x`div`b)%b)
p=((reverse>>=(==)).).(%)


0

dc, 39 바이트

길이는 물론 회문입니다 ( 33₁₂).

[[t]pq]sgod[O~laO*+sad0<r]dsrx+la=g[f]p

숫자와 기수는 스택의 맨 위에 있어야합니다 (현재 숫자베이스에서). 숫자는 0 이상이어야하고 기수는 2 이상이어야합니다. 출력이 t회 문인 f경우 와 그렇지 않은 경우 의 출력입니다 . 챌린지에 지정되어 있지 않으므로 숫자에 선행 0이 없다고 가정합니다 (따라서 끝나는 숫자 0는 회문이 될 수 없음).

설명

전체 프로그램으로 :

#!/usr/bin/dc

# read input
??

# success message
[[t]pq]sg

# set output radix
o

# keep a copy unmodified
d

# reverse the digits into register a
[O~ laO*+sa d0<r]dsrx

# eat the zero left on stack, and compare stored copy to a
+ la=g

# failure message
[f]p

0

LaTeX, 165 바이트

desmos.com의 예

k기수는 조정 가능한 입력입니다.

b=\floor \left(\log _k\left(\floor \left(x\right)\right)\right)
f\left(x\right)=k^bx-x-\left(k^2-1\right)\sum _{n=1}^bk^{\left(b-n\right)}\floor \left(xk^{-n}\right)

경우 f(x)=0, x베이스 회문이다 k.


0

펄 6 , 34 바이트

PhilH 덕분에 -4 바이트

{@(polymod $^a: $^b xx*)~~[R,] $_}

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


@r 대신 $ _를 사용하여 2를 절약 할 수 있습니다
Phil H

@PhilH 아니요 . (목록이 아닌 Seq를 할당 함)
Jo King

아, 죄송합니다 오류를 보지 못했습니다
Phil H

@PhilH 두 번째 팁은 여전히 ​​바이트 절약에 도움이되었습니다!
Jo King

1
$ _ 또는 @_에서 메타 축소를 호출하는 더 짧은 방법이 없다는 것을 항상 귀찮게합니다.
Phil H

0

05AB1E ,  4  3 바이트

вÂQ

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

в      # The first (implicit) input converted to base second (implicit) input
       #  i.e. 12345 and 12346 → [1,1]
       #  i.e. 10 and 16 → [1,6]
 Â     # Bifurcate the value (short for duplicate & reverse)
       #  i.e. [1,1] → [1,1] and [1,1]
       #  i.e. [1,6] → [1,6] and [6,1]
  Q    # Check if they are still the same, and thus a palindrome
       #  i.e. [1,1] and [1,1] → 1
       #  i.e. [1,6] and [6,1] → 0

0

C (gcc) , 79 바이트

n,r,m;main(o){for(scanf("%d %d",&n,&r),o=n;n;n/=r)m=m*r+n%r;printf("%d",m==o);}

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

개요

n,r,m;main(o){
for(scanf("%d %d",&n,&r),       Read the number and the radix.
o=n;                            ...and save the number in o
n;                              Loop while n is non-zero
n/=r)                           Divide by radix to remove right-most digit.
m=m*r+n%r;                      Multiply m by radix to make room for a digit
                                and add the digit.
printf("%d",m==o);}             Print whether we have a palindrome or not.

회 문의 경우 숫자의 역수는 숫자 자체와 같아야합니다.

베이스에 세 자리 숫자 ABC가 있다고 가정하십시오. 이 값을 밑수로 곱하면 항상 ABC0이되고 AB에서 염기를 C로 나머지로 나눕니다. 따라서 숫자를 뒤집기 위해 원래 숫자에서 가장 오른쪽 숫자를 뽑아서 반대 숫자의 오른쪽에 삽입합니다. 그 자리를위한 공간을 확보하기 위해, 우리는 사전에 밑을 기본으로 곱합니다.

원래:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA

이것은 멋지다.이 뒤에 수학을 설명 할 수 있습니까?
durron597

트윗 담아 가기 게시물에 설명을 추가했습니다.
gastropner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.