Tabanlı Palindromlar
Bir palindromik sayı, tazeleme olarak, aynı şeyi geriye doğru okuyan herhangi bir sayıdır. Bununla birlikte, diğer bazlardaki palindromlar ne olacak?
Giriş
Herhangi bir tam sayı b
nerede b > 1
.
Çıktı
B tabanındaki palindromlar dahil olmak üzere, 0 ile 1000 arasındaki tüm tamsayı tabanlı 10 sayılar. Çıktı, bir tamsayı listesi veya virgül veya satırsonu gibi bir sınırlayıcıyla ayrılmış tamsayılar olabilir.
Test durumları
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}
Yanıtlar
Python 3 , 78 bayt
Sayıları azalan sırada verir 1000 -> 0
ve kısa devre yapar.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)
Çevrimiçi deneyin!
f(b,n-n//n) -> f(b,n-1)
Kadar recurses 0
ve hatalar sıfıra bölme tanımlanmamış için.
Python 3 , 76 bayt
Kayan nokta çıktısına izin verilirse cevabı 2 bayt kısaltabiliriz.
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)
Çevrimiçi deneyin!
C (GCC) öne doğru, 118 117 115 bayt
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);}}
Çevrimiçi deneyin!
C (GCC) , geriye doğru, 115 113 bayt
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);}}
Çevrimiçi deneyin!
Açıklama
C imzası:
// Technically implicit int with a void return
void f(int base);
0'dan 1000'e kadar tüm sayılar arasında döngü yapar, bunları base
elle tabana dönüştürür ve ardından bunun bir palindrom olup olmadığını kontrol eder.
Geriye dönük sürüm aynı şeyi yapar, ancak geriye doğru.
Eşleşen sayıları virgülle ayrılmış olarak standart çıktıya yazdırır.
Golfsüz versiyon
#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 bayt için Arnauld'a teşekkürler!
-2 bayt için Toby Speight'a teşekkürler!
05AB1E , 7 bayt
₄ÝʒIвÂQ
Çevrimiçi deneyin!
Açıkladı
₄Ý "Push the range [0, 1000]"\
ʒ "and keep the items where:"\
Iв "After being converted to base (input)"\
ÂQ "have its reverse equal to itself"\
Jöle , 7 bayt
ȷŻbŒḂ¥Ƈ
Çevrimiçi deneyin!
Nasıl çalışır
ȷŻ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 bayt
A³ô fÈìU êê
Dene
Wolfram Dili (Mathematica) , 44 bayt
Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&
Çevrimiçi deneyin!
@Att'tan -13 bayt
JavaScript (ES6), 87 86 bayt
Virgülle ayrılmış bir dize döndürür.
n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001)
Çevrimiçi deneyin!
Nasıl?
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 bayt
- Siu Ching Pong -Asuka Kenji-
BigInt
'nintoString
yalnızca 36'ya kadar olan üsler için çalıştığını göstermesinden sonra düzeltildi . - @Cubic marul sayesinde 1 bayt kaydedildi .
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}
Çevrimiçi deneyin!
Bu oldukça basit. 0 ile 1000 arasında bir aralık yapar, ardından tersine tabanda eşit olup olmadıklarını kontrol ederek filtreler b
. Tabanına dönüştürmek için b
(bir karakter dizisi), BigInt
'in toString
yöntemi olup kullanılmıştır, ama şimdi Seq.unfold
bir oluşturmak için kullanılan Seq
basamak.
Kabuk , 12 11 bayt
Düzenleme: LegionMammal978 sayesinde -1 bayt
foS=↔B⁰ŀdḋ9
Çevrimiçi deneyin!
Gerçek 'temelli palindrom' kodu 7 bayttır ( foS=↔B⁰
), ancak 0 ... 1000 belirtilmesi 5 4 (LegionMammal978 sayesinde) bayta daha fazla mal olur.
Ondalık 1024 ( foS=↔B⁰ŀ□32
) değerine kadar değerlere sahip birkaç tane daha temelli palindrom çıktı vermek tamamsa, bir bayt kaydedebiliriz .
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
Kömür , 14 bayt
NθIΦ⊕φ⁼↨ιθ⮌↨ιθ
Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Açıklama:
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 bayt
f b|let 0%m=m;n%m=div n b%(m*b+mod n b)=[n|n<-[0..1000],n==n%0]
Çevrimiçi deneyin!
Dingledooper'ın Python cevabından alınan güzel bir fikre dayanarak : n
bunun bir temel- b
palindrom olup olmadığını kontrol etmek için , temel b
basamakların listesini oluşturmayın , ancak n
sondan b
bir temel dönüştürme okuma basamakları çalıştırarak bir temel sayı olarak ters çevirin ve sonucun hala eşit olup olmadığını kontrol edin n
.
Kod |let 0%m=m;n%m=div n b%(m*b+mod n b)
özyinelemeli olarak %
tabanı tersine çeviren bir infix işlevini tanımlar n
( 0
ilk ikinci bağımsız değişken olarak verilir ). Bunu bir let
korumanın içinde tanımlamak , argümana b
ana işleve erişmemizi sağlarken, bağımsız bir işlevin her özyinelemeli çağrı ile onu iletmeye devam etmesi gerekir.
APL (Dyalog Genişletilmiş) , 17 15 bayt
Razetime'a -2 bayt için teşekkürler ! Siu Ching Pong
sayesinde bir hata düzeltildi !
Dizin kaynağı gerektirir 0
.
⍸⎕(⊤≡∘⌽⊤)¨⍳1001
Çevrimiçi deneyin!
⍝ 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 bayt
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;}
Açıklama
Ayrı bir gönderi için daha önceki cevabımdan yeterince farklı . Bu sefer sayıyı tamamen tersine çevirip orijinaliyle karşılaştırıyoruz. Yani sondaki sıfırları veya özel durumu ortadan kaldırmamıza gerek yok 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);
}
}
}
Bu yöntem , kullanılan tamsayı türünü değiştirirsek, i
en fazla INT_MAX/b
ve b
en fazla INT_MAX
veya uygun eşdeğerleri için güvenilir bir şekilde çalışır . İmzasız türler için (veya ile gcc -fwrapv
), tüm aralığı için çalışmalıdır i
.
C, 100 bayt
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");}
Çevrimiçi deneyin
Golfsüz kod
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çıklama
Bu, belirli bir sıra belirtilmediğinden ilk önce en yüksek sayıları verir. Her bir aday sayısı için, a
arka arkaya tabana bölerek, kalanı kullanarak ters sayıyı (inç z
) oluşturmak için onu (as ) azaltırız . a
Eşit olursa z
, bir palindromumuz olur. Normalde, orada dururduk ( a >= z
döngü durumunda), ama golf oynamak için sonuna kadar devam ederiz a==0
.
z
Hem tek hem de çift uzunluktaki palindromları kabul etmek için , kalanı transfer etmeden önce ve sonra eşitliği test etmemiz gerekir .
Son olarak, 0
her zaman bir palindrom olan ve özel durumu döngüye dahil etmekten daha kolay olan yazdırıyoruz .
Yöntem INT_MAX
, koşulu i%b*a
geri döndürmememiz halinde i%b&&a
, tamsayılar için çalışır ve diğer tamsayı türleri için de çalışır.
K (ngn / k) , 18 bayt
{&{x~|x}'x\'!1001}
Çevrimiçi deneyin!
x\'!1001
0..1000 değerinin her birini taban x gösterimine dönüştür{x~|x}'
her bir temsilin bir palindrom olup olmadığını kontrol edin&
gerçek indislerini al
Python 3.8 (ön sürüm) , 92 85 bayt
lambda b:[i for i in range(1001)if(f:=lambda n:n*[0]and[n%b]+f(n//b))(i)==f(i)[::-1]]
Çevrimiçi deneyin!
7 bayt tasarruf için dingledooper'a teşekkürler !
Haskell, 67 bayt
b&n=take n$mod n b:b&div n b
f b=[n|n<-[0..1000],reverse(b&n)==b&n]
f
ilginin işlevidir. Çevrimiçi deneyin!
Belki de buradaki tek akıllıca bit take n
, rakam genişletme işlevi için bir temel durum oluşturmak için kullanılmasıdır. Zaman n=0
, take n
kendi bağımsız değişken göz ardı eder ve yineleme böylece tembellik ile durur; zaman n>0
, kesinlikle daha olmayacak n
sadece ilk tutmak güvenli böylece basamak n
. Aşağıdaki tanım eşdeğerdir (ve eşit derecede uzun):
b&0=[]
b&n=mod n b:b&div n b
... ama take n
sürüm daha eğlenceli çünkü daha kafa karıştırıcı. ^ _ ^
J , 27 bayt
((-:|.)@(#.inv)"0#])i.@1001
Nasıl
(...) i.@1001
- Her şey bir J kancadır, yani argüman parenslerdeki her şeyin sol argümanı olacak ve sağ argüman 0'dan 1000'e tamsayı olacaktır:i.@1001
...#]
Parens içindeki ifade#
, sağdaki argümanı , şunun solundaki]
ifadeden kaynaklanan boole maskesiyle filtrelemek için copy kullanır#
:(-:|.)@(#.inv)"0
- Derece 0"0
, tümceciklerin her bir sağ bağımsız değişken sayısına uygulanmasını sağlar. İfadenin kendisi önce bu sayıların her birini sol bağımsız değişken tarafından verilen tabandaki bir rakam listesine dönüştürür(#.inv)
ve ardından bu listenin tersine eşit olup olmadığını kontrol eder(-:|.)@
. Böylece tüm ifade, bu doğru olduğunda 1 ve aksi takdirde 0 döndürecektir ve bu boole maskesi, istenen şekilde doğru argümanı filtreleyecektir.
Çevrimiçi deneyin!
Ruby 2.7 , 74 bayt
->b{(0..1e3).select{(a=(g=->k,r=[]{k>0?g[k/b,r<<k%b]:r})[_1])==a.reverse}}
Çevrimiçi deneyin!
TIO, Ruby'nin eski bir sürümünü kullanır, oysa Ruby 2.7'de, iki bayt tasarrufu sağlayan parametreleri numaralandırdık.
Ruby , 48 bayt
->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}}
Çevrimiçi deneyin!
.to_s
Yöntemdeki sınırlama nedeniyle 64'ün üzerindeki tabanlar için çalışmaz .
JavaScript (V8) , 77 89 bayt
36'dan büyük üsler için düzeltildi.
b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}
Çevrimiçi deneyin!
PowerShell ,
102
, 100
98
95
87
75 bayt
-Mazzy sayesinde 14 bayt!
param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]}
Çevrimiçi deneyin!
R , 82 81 bayt
(veya oldukça karmaşık " " sınırlayıcısını kullanan 79 bayt\n[1]
)
Düzenleme: caird coinheringaahing sayesinde -1 bayt
function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')
Çevrimiçi deneyin!
Yeni temel gösterimdeki basamakları manuel olarak hesaplar ve ters çevrilmiş halleriyle aynı olup olmadıklarını kontrol eder.
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 bayt
. as$a|range(1001)|select([while(.>0;./$a|floor)|.%$a]|reverse==.)
Çevrimiçi deneyin!
Açıklama
. 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 bayt
f_IjTQUh^T3
Çevrimiçi deneyin!
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 bayt
b->{for(int i=-1;i++<1e3;){var s=b.toString(i,b);if(s.contains(new StringBuffer(s).reverse()))System.out.println(i);}}
Çevrimiçi deneyin.
Açıklama:
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