기반 회문
회문 번호는 다시 말해서 역방향과 같은 앞쪽으로 읽는 숫자입니다. 그러나 다른 기지의 회문은 어떻습니까?
입력
모든 정수 b
곳 b > 1
.
산출
기본 b의 회 문인 0부터 1000까지의 모든 정수 기본 10 숫자입니다. 출력은 정수 목록이거나 쉼표 또는 줄 바꿈과 같은 구분 기호로 구분 된 정수일 수 있습니다.
테스트 케이스
Input->Output
10->{0,1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99,101,111,121,131,141,151,161,171,181,191,202,212,222,232,242,252,262,272,282,292,303,313,323,333,343,353,363,373,383,393,404,414,424,434,444,454,464,474,484,494,505,515,525,535,545,555,565,575,585,595,606,616,626,636,646,656,666,676,686,696,707,717,727,737,747,757,767,777,787,797,808,818,828,838,848,858,868,878,888,898,909,919,929,939,949,959,969,979,989,999}
2->{0,1,3,5,7,9,15,17,21,27,31,33,45,51,63,65,73,85,93,99,107,119,127,129,153,165,189,195,219,231,255,257,273,297,313,325,341,365,381,387,403,427,443,455,471,495,511,513,561,585,633,645,693,717,765,771,819,843,891,903,951,975}
9->{0,1,2,3,4,5,6,7,8,10,20,30,40,50,60,70,80,82,91,100,109,118,127,136,145,154,164,173,182,191,200,209,218,227,236,246,255,264,273,282,291,300,309,318,328,337,346,355,364,373,382,391,400,410,419,428,437,446,455,464,473,482,492,501,510,519,528,537,546,555,564,574,583,592,601,610,619,628,637,646,656,665,674,683,692,701,710,719,728,730,820,910,1000}
답변
Python 3 , 78 바이트
내림차순으로 숫자를 출력하고 1000 -> 0
a로 단락ZeroDivisionError
def f(b,n=1000):
r=0;m=n
while m:r=r*b+m%b;m//=b
n==r==print(n);f(b,n-n//n)
온라인으로 시도하십시오!
f(b,n-n//n) -> f(b,n-1)
까지 재귀 0
, 오류가 0으로 나누는 것은 정의되지 않기 때문에.
Python 3 , 76 바이트
부동 소수점 출력이 허용되면 답을 2 바이트로 줄일 수 있습니다.
def f(b,n=1e3):
r=0;m=n
while m:r=r*b+m%b;m//=b
n==r==print(n);f(b,n-n/n)
온라인으로 시도하십시오!
C (GCC) 앞으로, 118 (117) 115 바이트
b[11],*p,*x,i,m;f(n){for(i=-1;i++<1e3;){for(p=x=b,m=i;m;*p++=m%n,m/=n);while(p>x)m|=*--p-*x++;m||printf("%d,",i);}}
온라인으로 시도하십시오!
C (GCC) , 거꾸로, 115 113 바이트
b[11],*p,*x,i,m;f(n){for(i=1001;i--;){for(p=x=b,m=i;m;*p++=m%n,m/=n);while(p>x)m|=*--p-*x++;m||printf("%d,",i);}}
온라인으로 시도하십시오!
설명
C 서명 :
// Technically implicit int with a void return
void f(int base);
0에서 1000까지의 모든 숫자를 반복 base
하고 손 으로 기본 으로 변환 한 다음 회문인지 확인합니다.
역방향 버전은 같은 일을하지만 거꾸로합니다.
일치하는 숫자를 쉼표로 구분하여 stdout에 인쇄합니다.
골프를 치지 않은 버전
#include <stdio.h>
// A buffer to hold our converted integer.
// It is large enough for 1000 in binary.
int buffer[11];
// Start and end pointers for buffer
int *start, *end;
// Loop counter
int i;
// Temporary
int tmp;
void f(int base)
{
// Loop for 0 to 1000
#ifdef BACKWARDS
// Loop backwards
for (i = 1001; i-- != 0;) {
#else
// Loop forwards
// for (i = 0; i <= 1000; i++)
for (i = -1; i++ < 1e3; ) {
#endif
// Convert to base in buffer, tracking the length in end.
for(start = end = buffer, tmp = i; tmp != 0;) {
*end++ = tmp % base;
tmp /= base;
}
// Check if it is a palindrome.
// Loop while our starting pointer is less than our ending pointer.
// tmp will zero at the start thanks to the loop condition.
while (end > start)
// Assembly style comparison using subtraction.
// If *end == *start, tmp will still be zero.
// If not, it will be permanently set to non-zero with a binary or.
tmp |= *--end - *start++;
// If tmp is still zero (meaning it is a palindrome), print.
tmp || printf("%d,", i);
}
}
-1 바이트에 대한 Arnauld에게 감사드립니다!
-2 바이트에 대한 Toby Speight에게 감사드립니다!
05AB1E , 7 바이트
₄ÝʒIвÂQ
온라인으로 시도하십시오!
설명
₄Ý "Push the range [0, 1000]"\
ʒ "and keep the items where:"\
Iв "After being converted to base (input)"\
ÂQ "have its reverse equal to itself"\
젤리 , 7 바이트
ȷŻbŒḂ¥Ƈ
온라인으로 시도하십시오!
작동 원리
ȷŻbŒḂ¥Ƈ - Main link. Takes a base b on the left
ȷ - 1000
Ż - [0, 1, 2, ..., 1000]
¥ - Group the previous 2 links into a dyad f(k, b):
b - Convert k to base b
ŒḂ - Is this a palindrome?
Ƈ - Filter [0, 1, 2, ..., 1000], keeping those k that are true under f(k, b)
Japt , 11 바이트
A³ô fÈìU êê
시도 해봐
Wolfram 언어 (Mathematica) , 44 바이트
Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&
온라인으로 시도하십시오!
@att에서 -13 바이트
JavaScript (ES6), 87 86 바이트
쉼표로 구분 된 문자열을 반환합니다.
n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001)
온라인으로 시도하십시오!
어떻게?
n => ( // n = input base
g = k => // g is a recursive function taking a counter k
--k && // decrement k; abort if it's equal to 0
g(k) + ( // otherwise do a recursive call and append the ...
( h = k => // ... result of the recursive function h
a = k ? // which builds an array a[]
[ k % n, // consisting of each digit of k in base n,
...h(k / n | 0) ] // dividing k by n and taking the integer part
: // for the next iteration until k = 0
[] //
)(k) + '' // invoke h with k and coerce the result to a string
== a.reverse() ? // if this is palindromic:
[, k] // append a comma followed by k to the output
: // else:
'' // just append an empty string
) //
)(1001) // initial call to g with k = 1001
Scala , 62 87 바이트
- 시우 칭 퐁 -Asuka Kenji-가 지적한 후 고정
BigInt
의toString
경우에만 최대 36 기지 작동합니다. - @cubic lettuce 덕분에 1 바이트가 절약되었습니다 .
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}
온라인으로 시도하십시오!
이것은 매우 간단합니다. 0에서 1000까지의 범위를 만든 다음 base에서 역순과 같은지 확인하여 필터링합니다 b
. base b
(문자열)로 변환하기 위해 BigInt
의 toString
메서드 가 사용되었지만 이제는 숫자 Seq.unfold
를 만드는 데 사용됩니다 Seq
.
Husk , 12 11 바이트
편집 : LegionMammal978 덕분에 -1 바이트
foS=↔B⁰ŀdḋ9
온라인으로 시도하십시오!
실제 '기반 회문'코드는 7 바이트 ( foS=↔B⁰
)이지만 0 ... 1000을 지정하면 5 4 바이트 (LegionMammal978 덕분에)가 더 많이 듭니다.
10 진수 1024 ( foS=↔B⁰ŀ□32
) 까지의 값으로 몇 가지 기반 회문을 더 출력해도 괜찮다면 바이트를 저장할 수 있습니다.
f # output the truthy values of
ŀdḋ9 # series from zero up to one less than 1001
# (decimal interpretation of binary digits of '9')
o # based on combination of 2 functions:
S=↔ # 1. is it equal to reverse of itself?
B⁰ # 2. digits in base given by argument
목탄 , 14 바이트
NθIΦ⊕φ⁼↨ιθ⮌↨ιθ
온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. 설명:
Nθ Input the base `b`
φ Predefined variable 1000
⊕ Incremented
Φ Filter on implicit range
ι Current value
↨ θ Converted to base `b`
⁼ Equals
ι Current value
↨ θ Converted to base `b`
⮌ Reversed
I Cast to string
Implicitly print
Haskell , 63 바이트
f b|let 0%m=m;n%m=div n b%(m*b+mod n b)=[n|n<-[0..1000],n==n%0]
온라인으로 시도하십시오!
dingledooper의 Python 답변 에서 얻은 좋은 아이디어를 기반으로 : 그것이 n
기본 b
회문 인지 확인하려면 기본 b
숫자 목록을 생성하지 말고 끝에서 숫자를 읽는 기본 변환을 실행하여 기본 번호 n
로 반전 b
하십시오. 결과가 여전히 같은지 확인하십시오 n
.
이 코드 |let 0%m=m;n%m=div n b%(m*b+mod n b)
는 %
밑을 뒤집는 중위 함수 를 재귀 적으로 정의합니다 n
( 0
초기 두 번째 인수로 주어짐 ). let
가드 내부에서 정의 b
하면 주 함수에 대한 인수 에 액세스 할 수있는 반면 독립형 함수는 각 재귀 호출과 함께 계속 전달해야합니다.
APL (Dyalog Extended) , 17 15 바이트
-2 바이트에 대한 Razetime 덕분입니다 ! Siu Ching Pong
덕분에 수정 된 버그 !
인덱스 원본이 필요합니다 0
.
⍸⎕(⊤≡∘⌽⊤)¨⍳1001
온라인으로 시도하십시오!
⍝ tradfn taking the base as input
⍳1001 ⍝ the indices up to 1000
⍵( )¨ ⍝ apply a function to each index as a right argument and the input base as a left argument:
⌽⊤ ⍝ the reverse of the index converted to the input base
≡ ⍝ does it match
⊤ ⍝ the index converted to the input base
⍸ ⍝ all truthy indices
C- 76 바이트
i=1001,a,z;f(b){for(;i--;i-z||printf("%d ",i))for(a=i,z=0;a;a/=b)z=z*b+a%b;}
설명
별도 게시 영장에 대한 이전 답변 과 완전히 다릅니다 . 이번에는 숫자를 완전히 뒤집은 다음 원본과 비교합니다. 따라서 후행 0 또는 특수한 경우를 제거 할 필요가 없습니다 0
.
void fun(int b)
{
for (int i = 1001; i--;) {
int z = 0;
for (int a = i; a != 0; a /= b) {
z = z*b + a%b;
}
if (i==z) {
printf("%d ",i);
}
}
}
이 메서드는 i
최대 INT_MAX/b
및 b
최대 INT_MAX
, 또는 사용 된 정수 유형을 변경하는 경우 적절한 동등 항목에 대해 안정적으로 작동합니다 . 서명되지 않은 유형 (또는 사용 gcc -fwrapv
)의 경우 전체 범위에서 작동합니다 i
.
C, 100 바이트
i=1001,a,z;f(b){for(;--i;)for(a=i,z=0;i%b*a;a/=b)if(a==z||a==(z=z*b+a%b))printf("%d ",i);puts("0");}
온라인으로 시도
골프를 치지 않은 코드
void fun(int b)
{
for (int i = 1001; --i;) {
if (i%b) { /* no leading/trailing zeros */
for (int a = i, z = 0; a != 0; a /= b) {
if (a==z) {
printf("%d ",i);
}
z = z*b + a%b;
if (a==z) {
printf("%d ",i);
}
}
}
}
puts("0");
}
설명
특정 순서가 지정되지 않았으므로 가장 높은 숫자를 먼저 출력합니다. 각 후보 번호에 대해 a
연속적으로 밑수로 나누고 나머지를 사용하여 역수 (in z
) 를 구축하여으로 줄 입니다. 경우 a
같음이되고 z
, 우리는 회문 있습니다. 일반적으로 a >= z
루프 상태에서 멈췄 지만 골프의 경우 a==0
.
z
홀수 및 짝수 길이 회문을 모두 허용 하려면 나머지를로 전송하기 전과 후에 동등성을 테스트해야합니다 .
마지막으로, 우리 0
는 항상 회문이고, 루프에 포함하는 것보다 특별한 경우가 더 쉬운를 인쇄 합니다.
이 방법은 INT_MAX
조건을 i%b*a
다시으로 되 돌리면 i%b&&a
정수에 대해 작동하며 다른 정수 유형에도 작동합니다.
K (ngn / k) , 18 바이트
{&{x~|x}'x\'!1001}
온라인으로 시도하십시오!
x\'!1001
0..1000을 각각 base-x 표현으로 변환{x~|x}'
각 표현이 회문인지 확인&
진실의 지표를 얻다
Python 3.8 (사전 출시) , 92 85 바이트
lambda b:[i for i in range(1001)if(f:=lambda n:n*[0]and[n%b]+f(n//b))(i)==f(i)[::-1]]
온라인으로 시도하십시오!
7 바이트를 절약 한 dingledooper 에게 감사드립니다 !
Haskell, 67 바이트
b&n=take n$mod n b:b&div n b
f b=[n|n<-[0..1000],reverse(b&n)==b&n]
f
관심있는 기능입니다. 온라인으로 시도하십시오!
아마도 여기서 유일하게 영리한 부분 take n
은 숫자 확장 기능의 기본 케이스를 만드는 데 사용하는 것입니다 . 되면 n=0
, take n
그 인자를 무시하고 있으므로 재귀 게으름 통해 중지; 때 n>0
, 확실히 n
자릿수 보다 많지 않을 것이므로 첫 번째 만 유지하는 것이 안전합니다 n
. 다음 정의는 동일하며 길이도 동일합니다.
b&0=[]
b&n=mod n b:b&div n b
...하지만 take n
버전이 더 헷갈 리기 때문에 더 재미 있습니다. ^ _ ^
J , 27 바이트
((-:|.)@(#.inv)"0#])i.@1001
어떻게
(...) i.@1001
-모든 것은 J 후크입니다. 즉, 인수는 괄호 안의 모든 항목에 대한 왼쪽 인수가되고 오른쪽 인수는 0에서 1000 사이의 정수가됩니다.i.@1001
...#]
괄호 안의 구는 copy#
를 사용]
하여 왼쪽에있는 구에서 나온 부울 마스크로 오른쪽 인수를 필터링합니다#
.(-:|.)@(#.inv)"0
-순위 0"0
은 구가 오른쪽 인수의 각 개별 번호에 적용되도록합니다. 구 자체는 먼저 각 숫자를 왼쪽 arg에 의해 주어진 밑수 목록으로 변환(#.inv)
한 다음 해당 목록이 그 반대인지 확인합니다(-:|.)@
. 따라서 전체 구문은 이것이 참이면 1을 반환하고 그렇지 않으면 0을 반환하며이 부울 마스크는 원하는대로 오른쪽 인수를 필터링합니다.
온라인으로 시도하십시오!
Ruby 2.7 , 74 바이트
->b{(0..1e3).select{(a=(g=->k,r=[]{k>0?g[k/b,r<<k%b]:r})[_1])==a.reverse}}
온라인으로 시도하십시오!
TIO는 이전 버전의 Ruby를 사용하는 반면 Ruby 2.7에서는 매개 변수에 번호를 매겨 2 바이트를 절약합니다.
Ruby , 48 바이트
->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}}
온라인으로 시도하십시오!
.to_s
방법 의 제한으로 인해 64가 넘는 염기에서는 작동하지 않습니다 .
JavaScript (V8) , 77 89 바이트
36보다 큰 염기에 대해 수정되었습니다.
b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}
온라인으로 시도하십시오!
PowerShell을 ,
102
(100)
98
95
87
75 바이트
mazzy 덕분에 -14 바이트!
param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]}
온라인으로 시도하십시오!
R , 82 81 바이트
(또는 " " 의 다소 복잡한 구분 기호를 사용하는 79 바이트\n[1]
)
편집 : -1 바이트 덕분에 caird coinheringaahing
function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')
온라인으로 시도하십시오!
새 기본 표현에서 숫자를 수동으로 계산하고 반전 된 숫자와 동일한 지 확인합니다.
function(b)
for(i in 0:1000) # loop i through zero to 1000
if(!i # if i is zero (always a palindrome),
|| # or
all( # if all the digits of
(a=i%/%b^(0:log(i,b))%%b) # a = the representation of i in base b
==rev(a)) # are the same as themselves reversed
)cat(i,'') # output this i
jq , 66 바이트
. as$a|range(1001)|select([while(.>0;./$a|floor)|.%$a]|reverse==.)
온라인으로 시도하십시오!
설명
. as $a | # Assign the input to $a. range(1001) | # For every item in [0..1000]: select ( # Filter out all items where: [ while(. > 0; # The list of quotients from repeatedly . / $a | floor) # short-dividing by $a |. % $a] # And then modulo-ing by $a
| reverse == .) # is equal to its reverse
```
Pyth , 11 바이트
f_IjTQUh^T3
온라인으로 시도하십시오!
f_IjTQUh^T3 | Explanation
------------+---------------------------------------
f | filter
Uh^T3 | the range [0, 1001)
jTQ | on whether each number in base <input>
_I | equals itself reversed
자바 10, 118 바이트
b->{for(int i=-1;i++<1e3;){var s=b.toString(i,b);if(s.contains(new StringBuffer(s).reverse()))System.out.println(i);}}
온라인으로 시도하십시오.
설명:
b->{ // Method with Integer parameter and no return-type
for(int i=-1;i++<1e3;){ // Loop `i` in the range [0,1000]:
var s=b.toString(i,b); // Convert `i` to base-`b` as String
if(s.contains(new StringBuffer(s).reverse()))
// If this String is a palindrome:
System.out.println(i);}} // Print `i` with trailing newline