Berbasis Palindromes
Bilangan palindromik, sebagai penyegar, adalah bilangan apa pun yang dibaca maju seperti mundur. Namun, bagaimana dengan palindrom di basis lain?
Memasukkan
Semua bilangan bulat di b
mana b > 1
.
Keluaran
Semua bilangan bulat 10 basis dari 0 sampai 1000 termasuk yang palindrom di basis b. Keluarannya bisa berupa daftar bilangan bulat, atau bilangan bulat yang dipisahkan oleh pemisah seperti koma atau baris baru.
Kasus uji
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}
Jawaban
Python 3 , 78 byte
Menghasilkan angka dalam urutan menurun 1000 -> 0
, dan hubung singkat dengan aZeroDivisionError
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)
Cobalah secara online!
The f(b,n-n//n) -> f(b,n-1)
recurses sampai 0
, dan kesalahan karena pembagian dengan nol tidak terdefinisi.
Python 3 , 76 byte
Kami dapat mempersingkat jawaban sebesar 2 byte jika output floating-point diizinkan.
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)
Cobalah secara online!
C (gcc) maju, 118 117115 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);}}
Cobalah secara online!
C (gcc) , mundur, 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);}}
Cobalah secara online!
Penjelasan
Tanda tangan C:
// Technically implicit int with a void return
void f(int base);
Memutar semua angka dari 0 hingga 1000, mengubahnya menjadi basis base
dengan tangan, lalu memeriksa apakah itu palindrom.
Versi mundur melakukan hal yang sama, tetapi mundur.
Mencetak angka yang cocok, dipisahkan koma, ke stdout.
Versi tidak terpisahkan
#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);
}
}
Terima kasih kepada Arnauld untuk -1 byte!
Terima kasih kepada Toby Speight untuk -2 byte!
05AB1E , 7 byte
₄ÝʒIвÂQ
Cobalah secara online!
Dijelaskan
₄Ý "Push the range [0, 1000]"\
ʒ "and keep the items where:"\
Iв "After being converted to base (input)"\
ÂQ "have its reverse equal to itself"\
Jeli , 7 byte
ȷŻbŒḂ¥Ƈ
Cobalah secara online!
Bagaimana itu bekerja
ȷŻ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 êê
Cobalah
Bahasa Wolfram (Mathematica) , 44 byte
Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&
Cobalah secara online!
-13 byte dari @att
JavaScript (ES6), 87 86 byte
Mengembalikan string yang dipisahkan koma.
n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001)
Cobalah secara online!
Bagaimana?
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
- Tetap setelah Siu Ching Pong -Asuka Kenji- menunjukkan
BigInt
'stoString
hanya bekerja untuk pangkalan hingga 36. - Disimpan 1 byte berkat @cubic lettuce .
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}
Cobalah secara online!
Ini sangat mudah. Itu membuat rentang dari 0 hingga 1000, kemudian memfilter dengan memeriksa apakah mereka sama dengan kebalikannya di basis b
. Untuk mengkonversi ke basis b
(sebagai string), BigInt
's toString
metode yang digunakan, tapi sekarang Seq.unfold
digunakan untuk membuat Seq
angka.
Husk , 12 11 byte
Edit: -1 byte berkat LegionMammal978
foS=↔B⁰ŀdḋ9
Cobalah secara online!
Kode 'palindrome berbasis' yang sebenarnya adalah 7 byte ( foS=↔B⁰
), tetapi menentukan 0 ... 1000 biaya 5 4 (terima kasih kepada LegionMammal978) lebih banyak byte.
Kita bisa menghemat satu byte jika OK untuk mengeluarkan beberapa palindrome berbasis lagi dengan nilai hingga desimal 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
Arang , 14 byte
NθIΦ⊕φ⁼↨ιθ⮌↨ιθ
Cobalah secara online! Tautan adalah untuk verbose versi kode. Penjelasan:
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]
Cobalah secara online!
Berdasarkan ide bagus dari jawaban Python dingledooper : untuk memeriksa bahwa itu n
adalah basis- b
palindrome, jangan buat daftar b
digit basis , tetapi balikkan n
sebagai b
bilangan dasar dengan menjalankan digit pembacaan konversi basis dari akhir, dan periksa apakah hasilnya masih sama n
.
Kode |let 0%m=m;n%m=div n b%(m*b+mod n b)
secara rekursif mendefinisikan fungsi infiks %
yang membalikkan basis n
(diberikan 0
sebagai argumen kedua awal). Mendefinisikannya di dalam let
pelindung memungkinkan kita mengakses argumen b
ke fungsi utama, sedangkan fungsi mandiri perlu terus meneruskannya dengan setiap panggilan rekursif.
APL (Dyalog Extended) , 17 15 byte
Terima kasih kepada Razetime untuk -2 byte!
Bug diperbaiki berkat Siu Ching Pong !
Membutuhkan asal indeks 0
.
⍸⎕(⊤≡∘⌽⊤)¨⍳1001
Cobalah secara online!
⍝ 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;}
Penjelasan
Cukup berbeda dari jawaban saya sebelumnya untuk menjamin posting secara terpisah. Kali ini, kami benar-benar membalikkan angkanya, lalu membandingkan dengan aslinya. Jadi kita tidak perlu menghilangkan nol yang tertinggal, atau kasus khusus 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);
}
}
}
Metode ini bekerja dengan andal i
hingga INT_MAX/b
dan b
hingga INT_MAX
, atau setara yang sesuai jika kita mengubah tipe integer yang digunakan. Untuk tipe unsigned (atau with gcc -fwrapv
), itu harus bekerja untuk berbagai macam 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");}
Cobalah secara online
Kode tidak terputus
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");
}
Penjelasan
Ini menghasilkan angka tertinggi terlebih dahulu, karena tidak ada urutan tertentu yang ditentukan. Untuk setiap nomor kandidat, kami menguranginya (sebagai a
) dengan membaginya secara berurutan dengan basis, menggunakan sisanya untuk membuat angka kebalikan (dalam z
). Jika a
menjadi sama dengan z
, maka kita memiliki palindrome. Biasanya, kami berhenti di situ ( a >= z
dalam kondisi loop), tetapi untuk golf, kami terus melakukannya a==0
.
Kita perlu menguji kesetaraan sebelum dan sesudah mentransfer sisanya ke z
, untuk menerima palindrom dengan panjang ganjil dan genap.
Akhirnya, kami mencetak 0
, yang selalu merupakan palindrome, dan lebih mudah untuk kasus khusus daripada disertakan dalam loop.
Metode ini berfungsi untuk bilangan bulat hingga INT_MAX
jika kita melepaskan kondisi i%b*a
kembali ke i%b&&a
, dan juga akan berfungsi untuk jenis bilangan bulat lainnya.
K (ngn / k) , 18 byte
{&{x~|x}'x\'!1001}
Cobalah secara online!
x\'!1001
konversikan masing-masing dari 0..1000 menjadi representasi basis-x{x~|x}'
periksa apakah setiap representasi adalah palindrome&
dapatkan indeks kebenaran
Python 3.8 (pra-rilis) , 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]]
Cobalah secara online!
Terima kasih kepada dingledooper karena telah menghemat 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]
f
adalah fungsi bunga. Cobalah secara online!
Mungkin satu-satunya bagian yang pintar di sini adalah penggunaan take n
untuk membuat kasus dasar untuk fungsi ekspansi digit. When n=0
, take n
abaikan argumennya dan rekursi berhenti karena kemalasan; bila n>0
, pasti tidak akan lebih dari n
angka jadi aman untuk menyimpan hanya yang pertama n
. Definisi berikut ini setara (dan sama panjangnya):
b&0=[]
b&n=mod n b:b&div n b
... tapi take n
versinya lebih menyenangkan karena lebih membingungkan. ^ _ ^
J , 27 byte
((-:|.)@(#.inv)"0#])i.@1001
bagaimana
(...) i.@1001
- Semuanya adalah kait J, artinya argumen akan menjadi argumen kiri untuk semua yang ada di dalam tanda kurung, dan argumen kanan akan menjadi bilangan bulat dari 0 hingga 1000:i.@1001
...#]
Frasa di dalam tanda kurung menggunakan salinan#
untuk memfilter argumen kanan]
dengan topeng boolean yang dihasilkan dari frasa di sebelah kiri#
:(-:|.)@(#.inv)"0
- Peringkat 0"0
memastikan frase tersebut berlaku untuk setiap nomor individu dari argumen yang benar. Frasa itu sendiri pertama-tama mengonversi masing-masing angka tersebut menjadi daftar digit dalam basis yang diberikan oleh argumen kiri(#.inv)
, dan kemudian memeriksa apakah daftar itu sama dengan kebalikannya(-:|.)@
. Seluruh frase kemudian akan mengembalikan 1 jika ini benar dan 0 sebaliknya, dan topeng boolean ini akan memfilter arg yang benar seperti yang diinginkan.
Cobalah secara online!
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}}
Cobalah secara online!
TIO menggunakan versi Ruby yang lebih lama, sedangkan di Ruby 2.7, kami telah memberi nomor parameter, yang menghemat dua byte.
Ruby , 48 byte
->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}}
Cobalah secara online!
Tidak berfungsi untuk basis di atas 64, karena batasan dalam .to_s
metode.
JavaScript (V8) , 77 89 byte
Diperbaiki untuk pangkalan yang lebih besar dari 36.
b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}
Cobalah secara online!
PowerShell ,
102
100
98
95
87
75 bytes
-14 byte berkat mazzy!
param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]}
Cobalah secara online!
R , 82 81 byte
(atau 79 byte menggunakan pembatas yang agak rumit dari " \n[1]
")
Sunting: -1 byte berkat caird coinheringaahing
function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')
Cobalah secara online!
Menghitung digit secara manual dalam representasi basis baru, dan memeriksa apakah digit tersebut sama dengan digit yang dibalik.
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==.)
Cobalah secara online!
Penjelasan
. 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
Cobalah secara online!
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);}}
Cobalah secara online.
Penjelasan:
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