Palindromes dựa trên
Số palindromic, như một số làm mới, là bất kỳ số nào đọc về phía trước giống như số ngược lại. Tuy nhiên, những gì về palindromes ở các căn cứ khác?
Đầu vào
Bất kỳ số nguyên bở đâu b > 1.
Đầu ra
Tất cả các số nguyên cơ số 10 từ 0 đến 1000 được bao gồm là palindromes trong cơ số b. Đầu ra có thể là danh sách các số nguyên hoặc các số nguyên được phân tách bằng dấu phân cách như dấu phẩy hoặc dòng mới.
Các trường hợp thử nghiệm
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}
Trả lời
Python 3 , 78 byte
Xuất ra các số theo thứ tự giảm dần 1000 -> 0và đoản mạch vớiZeroDivisionError
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)
Hãy thử nó trực tuyến!
Các f(b,n-n//n) -> f(b,n-1)recurses đến 0, và sai lầm vì chia cho số không được xác định.
Python 3 , 76 byte
Chúng ta có thể rút ngắn câu trả lời đi 2 byte nếu đầu ra dấu phẩy động được phép.
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)
Hãy thử nó trực tuyến!
C (gcc) chuyển tiếp, 118 117 115 byte
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);}}
Hãy thử nó trực tuyến!
C (gcc) , ngược, 115 113 byte
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);}}
Hãy thử nó trực tuyến!
Giải trình
Chữ ký C:
// Technically implicit int with a void return
void f(int base);
Lặp qua tất cả các số từ 0 đến 1000, chuyển đổi chúng thành cơ số basebằng tay, sau đó kiểm tra xem đó có phải là palindrome hay không.
Phiên bản ngược cũng làm điều tương tự, nhưng ngược lại.
In các số phù hợp, được phân tách bằng dấu phẩy, thành stdout.
Phiên bản không sử dụng
#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);
}
}
Cảm ơn Arnauld vì -1 byte!
Cảm ơn Toby Speight cho -2 byte!
05AB1E , 7 byte
₄ÝʒIвÂQ
Hãy thử nó trực tuyến!
Giải thích
₄Ý "Push the range [0, 1000]"\
ʒ "and keep the items where:"\
Iв "After being converted to base (input)"\
ÂQ "have its reverse equal to itself"\
Thạch , 7 byte
ȷŻbŒḂ¥Ƈ
Hãy thử nó trực tuyến!
Làm thế nào nó hoạt động
ȷŻ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 byte
A³ô fÈìU êê
Thử nó
Ngôn ngữ Wolfram (Mathematica) , 44 byte
Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&
Hãy thử nó trực tuyến!
-13 byte từ @att
JavaScript (ES6), 87 86 byte
Trả về một chuỗi được phân tách bằng dấu phẩy.
n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001)
Hãy thử nó trực tuyến!
Làm sao?
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 byte
- Đã sửa sau khi Siu Ching Pong -Asuka Kenji- chỉ ra
BigIntrằngtoStringchỉ hoạt động cho các căn cứ lên đến 36. - Đã lưu 1 byte nhờ @cubic xà lách .
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}
Hãy thử nó trực tuyến!
Việc này thật thẳng thắn. Nó tạo ra một phạm vi từ 0 đến 1000, sau đó lọc bằng cách kiểm tra xem chúng có bằng với đảo ngược của chúng trong cơ sở hay không b. Để chuyển đổi sang cơ sở b(như là một chuỗi), BigInt's toStringphương pháp được đã được sử dụng, nhưng bây giờ Seq.unfoldđược sử dụng để tạo ra một Seqchữ số.
Husk , 12 11 byte
Chỉnh sửa: -1 byte nhờ LegionMammal978
foS=↔B⁰ŀdḋ9
Hãy thử nó trực tuyến!
Mã 'dựa trên palindrome' thực tế là 7 byte ( foS=↔B⁰), nhưng việc chỉ định 0 ... 1000 tốn thêm 5 4 byte (nhờ LegionMammal978) nhiều byte hơn.
Chúng tôi có thể tiết kiệm một byte nếu Ok để xuất thêm một vài palindromes dựa trên giá trị lên đến thập phân 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
Than củi , 14 byte
NθIΦ⊕φ⁼↨ιθ⮌↨ιθ
Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã. Giải trình:
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 byte
f b|let 0%m=m;n%m=div n b%(m*b+mod n b)=[n|n<-[0..1000],n==n%0]
Hãy thử nó trực tuyến!
Dựa trên một ý tưởng hay từ câu trả lời Python của dingledooper : để kiểm tra xem đó có phải nlà số cơ sở hay bkhông, không tạo danh sách các bchữ số cơ sở , mà đảo ngược ndưới dạng bsố cơ sở bằng cách chạy các chữ số đọc chuyển đổi cơ sở từ cuối và kiểm tra xem kết quả vẫn bằng n.
Mã |let 0%m=m;n%m=div n b%(m*b+mod n b)định nghĩa một cách đệ quy một hàm infix %đảo ngược cơ sở n(được đưa ra 0dưới dạng đối số thứ hai ban đầu). Việc xác định nó bên trong một trình letbảo vệ cho phép chúng ta truy cập đối số bvào hàm chính, trong khi một hàm độc lập sẽ cần phải tiếp tục truyền nó với mỗi lần gọi đệ quy.
APL (Dyalog Extended) , 17 15 byte
Cảm ơn Razetime cho -2 byte!
Một lỗi đã được sửa nhờ Siu Ching Pong !
Yêu cầu nguồn gốc của chỉ mục 0.
⍸⎕(⊤≡∘⌽⊤)¨⍳1001
Hãy thử nó trực tuyến!
⍝ 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 byte
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;}
Giải trình
Vừa đủ khác với câu trả lời trước đó của tôi để đảm bảo đăng riêng. Lần này, chúng tôi hoàn toàn đảo ngược số, sau đó so sánh với ban đầu. Vì vậy, chúng ta không cần phải loại bỏ các số không ở cuối hoặc trường hợp đặc biệt 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);
}
}
}
Phương pháp này hoạt động đáng tin cậy cho itối đa INT_MAX/bvà btối đa INT_MAXhoặc tương đương thích hợp nếu chúng ta thay đổi kiểu số nguyên được sử dụng. Đối với các loại không dấu (hoặc có gcc -fwrapv), nó sẽ hoạt động cho đầy đủ các loại i.
C, 100 byte
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");}
Thử trực tuyến
Mã không có
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");
}
Giải trình
Điều này cho kết quả cao nhất trước tiên, vì không có thứ tự cụ thể nào được chỉ định. Đối với mỗi số ứng cử viên, chúng tôi giảm nó (dưới dạng a) bằng cách chia liên tiếp cho cơ số, sử dụng phần dư để tạo thành số đảo ngược (trong z). Nếu atrở nên bằng z, thì chúng ta có một palindrome. Thông thường, chúng tôi sẽ dừng lại ở đó ( a >= ztrong điều kiện vòng lặp), nhưng đối với chơi gôn, chúng tôi tiếp tục đến cùng a==0.
Chúng ta cần kiểm tra sự bằng nhau cả trước và sau khi chuyển phần còn lại sang z, để chấp nhận cả palindromes độ dài chẵn và lẻ.
Cuối cùng, chúng tôi in 0, luôn luôn là một palindrome, và dễ viết hoa chữ thường hơn là đưa vào vòng lặp.
Phương thức này hoạt động với các số nguyên cho đến INT_MAXkhi chúng ta hủy bỏ điều kiện i%b*atrở lại i%b&&avà cũng sẽ hoạt động với các kiểu số nguyên khác.
K (ngn / k) , 18 byte
{&{x~|x}'x\'!1001}
Hãy thử nó trực tuyến!
x\'!1001chuyển đổi từng 0..1000 thành biểu diễn base-x{x~|x}'kiểm tra xem mỗi biểu diễn có phải là palindrome không&lấy các chỉ số của trues
Python 3.8 (bản phát hành trước) , 92 85 byte
lambda b:[i for i in range(1001)if(f:=lambda n:n*[0]and[n%b]+f(n//b))(i)==f(i)[::-1]]
Hãy thử nó trực tuyến!
Cảm ơn dingledooper vì đã tiết kiệm được 7 byte!
Haskell, 67 byte
b&n=take n$mod n b:b&div n b
f b=[n|n<-[0..1000],reverse(b&n)==b&n]
flà hàm quan tâm. Hãy thử nó trực tuyến!
Có lẽ một chút thông minh duy nhất ở đây là việc sử dụng take nđể làm một trường hợp cơ sở cho hàm mở rộng chữ số. Khi n=0, take nbỏ qua đối số của nó và do đó, đệ quy dừng lại do lười biếng; khi n>0, chắc chắn sẽ không có nhiều hơn các nchữ số nên chỉ giữ lại chữ số đầu tiên là an toàn n. Định nghĩa sau là tương đương (và dài như nhau):
b&0=[]
b&n=mod n b:b&div n b
... nhưng take nphiên bản vui hơn vì nó khó hiểu hơn. ^ _ ^
J , 27 byte
((-:|.)@(#.inv)"0#])i.@1001
làm sao
(...) i.@1001- Toàn bộ điều là một dấu móc J, có nghĩa là đối số sẽ là đối số bên trái cho mọi thứ trong parens và đối số bên phải sẽ là các số nguyên từ 0 đến 1000:i.@1001...#]Cụm từ bên trong parens sử dụng bản sao#để lọc đối số bên phải]bằng mặt nạ boolean do cụm từ bên trái của#:(-:|.)@(#.inv)"0- Xếp hạng 0"0đảm bảo cụm từ áp dụng cho từng số riêng lẻ của đối số đúng. Bản thân cụm từ đầu tiên chuyển đổi từng số đó thành danh sách các chữ số trong cơ số được đưa ra bởi đối số bên trái(#.inv), và sau đó kiểm tra xem danh sách đó có bằng với đảo ngược của nó hay không(-:|.)@. Do đó, toàn bộ cụm từ sẽ trả về 1 khi điều này đúng và 0 nếu ngược lại, và mặt nạ boolean này sẽ lọc đối số phù hợp như mong muốn.
Hãy thử nó trực tuyến!
Ruby 2.7 , 74 byte
->b{(0..1e3).select{(a=(g=->k,r=[]{k>0?g[k/b,r<<k%b]:r})[_1])==a.reverse}}
Hãy thử nó trực tuyến!
TIO sử dụng phiên bản Ruby cũ hơn, trong khi trong Ruby 2.7, chúng tôi đã đánh số các tham số, giúp tiết kiệm hai byte.
Ruby , 48 byte
->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}}
Hãy thử nó trực tuyến!
Không hoạt động cho các cơ sở trên 64, do giới hạn trong .to_sphương pháp.
JavaScript (V8) , 77 89 byte
Cố định cho các cơ số lớn hơn 36.
b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}
Hãy thử nó trực tuyến!
PowerShell ,
102
100
98
95
87
75 byte
-14 byte nhờ mazzy!
param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]}
Hãy thử nó trực tuyến!
R , 82 81 byte
(hoặc 79 byte sử dụng dấu phân cách khá phức tạp của " \n[1] ")
Chỉnh sửa: -1 byte nhờ tính năng chia sẻ tiền ảo kỳ lạ
function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')
Hãy thử nó trực tuyến!
Tính toán thủ công các chữ số trong biểu diễn cơ sở mới và kiểm tra xem chúng có giống với bản thân đã đảo ngược hay không.
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 byte
. as$a|range(1001)|select([while(.>0;./$a|floor)|.%$a]|reverse==.)
Hãy thử nó trực tuyến!
Giải trình
. 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 byte
f_IjTQUh^T3
Hãy thử nó trực tuyến!
f_IjTQUh^T3 | Explanation
------------+---------------------------------------
f | filter
Uh^T3 | the range [0, 1001)
jTQ | on whether each number in base <input>
_I | equals itself reversed
Java 10, 118 byte
b->{for(int i=-1;i++<1e3;){var s=b.toString(i,b);if(s.contains(new StringBuffer(s).reverse()))System.out.println(i);}}
Hãy thử nó trực tuyến.
Giải trình:
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