Tabanlı Palindromlar

Dec 28 2020

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ı bnerede 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

12 dingledooper Dec 29 2020 at 03:01

Python 3 , 78 bayt

Sayıları azalan sırada verir 1000 -> 0ve 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 0ve 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!

10 EasyasPi Dec 28 2020 at 13:02

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ı baseelle 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!

10 Lyxal Dec 28 2020 at 04:54

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"\
6 cairdcoinheringaahing Dec 28 2020 at 04:42

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)
6 Shaggy Dec 28 2020 at 07:48

Japt , 11 bayt

A³ô fÈìU êê

Dene

6 J42161217 Dec 28 2020 at 04:53

Wolfram Dili (Mathematica) , 44 bayt

Pick[r=0~Range~1000,r-r~IntegerReverse~#,0]&

Çevrimiçi deneyin!

@Att'tan -13 bayt

6 Arnauld Dec 28 2020 at 07:35

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
6 user Dec 28 2020 at 05:16

Scala , 62 87 bayt

  • Siu Ching Pong -Asuka Kenji- BigInt'nin toStringyalnı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 toStringyöntemi olup kullanılmıştır, ama şimdi Seq.unfoldbir oluşturmak için kullanılan Seqbasamak.

6 DominicvanEssen Dec 28 2020 at 08:04

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
5 Neil Dec 28 2020 at 05:33

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
5 xnor Dec 29 2020 at 10:59

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 : nbunun bir temel- bpalindrom olup olmadığını kontrol etmek için , temel bbasamakların listesini oluşturmayın , ancak nsondan bbir 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( 0ilk ikinci bağımsız değişken olarak verilir ). Bunu bir letkorumanın içinde tanımlamak , argümana bana işleve erişmemizi sağlarken, bağımsız bir işlevin her özyinelemeli çağrı ile onu iletmeye devam etmesi gerekir.

5 ovs Dec 28 2020 at 19:02

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
5 TobySpeight Dec 29 2020 at 00:06

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, ien fazla INT_MAX/bve ben fazla INT_MAXveya 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.

4 TobySpeight Dec 28 2020 at 23:28

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, aarka arkaya tabana bölerek, kalanı kullanarak ters sayıyı (inç z) oluşturmak için onu (as ) azaltırız . aEşit olursa z, bir palindromumuz olur. Normalde, orada dururduk ( a >= zdöngü durumunda), ama golf oynamak için sonuna kadar devam ederiz a==0.

zHem tek hem de çift uzunluktaki palindromları kabul etmek için , kalanı transfer etmeden önce ve sonra eşitliği test etmemiz gerekir .

Son olarak, 0her 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*ageri döndürmememiz halinde i%b&&a, tamsayılar için çalışır ve diğer tamsayı türleri için de çalışır.

4 coltim Dec 28 2020 at 23:57

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
4 Danis Dec 28 2020 at 12:59

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 !

4 DanielWagner Dec 29 2020 at 01:45

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]

filginin 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 nkendi bağımsız değişken göz ardı eder ve yineleme böylece tembellik ile durur; zaman n>0, kesinlikle daha olmayacak nsadece 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 nsürüm daha eğlenceli çünkü daha kafa karıştırıcı. ^ _ ^

4 Jonah Dec 28 2020 at 13:16

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!

3 vrintle Dec 28 2020 at 11:13

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_sYöntemdeki sınırlama nedeniyle 64'ün üzerindeki tabanlar için çalışmaz .

3 NinaLisitsinskaya Dec 29 2020 at 02:07

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!

3 ZaelinGoodman Dec 29 2020 at 03:26

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!

2 DominicvanEssen Dec 28 2020 at 19:44

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
1 2x-1 Jan 03 2021 at 10:09

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
```
1 hakr14 Jan 03 2021 at 10:47

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
1 KevinCruijssen Jan 07 2021 at 15:21

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