Berbasis Palindromes

Dec 28 2020

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 bmana 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

12 dingledooper Dec 29 2020 at 03:01

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!

10 EasyasPi Dec 28 2020 at 13:02

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 basedengan 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!

10 Lyxal Dec 28 2020 at 04:54

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

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

Japt , 11 byte

A³ô fÈìU êê

Cobalah

6 J42161217 Dec 28 2020 at 04:53

Bahasa Wolfram (Mathematica) , 44 byte

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

Cobalah secara online!

-13 byte dari @att

6 Arnauld Dec 28 2020 at 07:35

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

Scala , 62 87 byte

  • Tetap setelah Siu Ching Pong -Asuka Kenji- menunjukkan BigInt's toStringhanya 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 toStringmetode yang digunakan, tapi sekarang Seq.unfolddigunakan untuk membuat Seqangka.

6 DominicvanEssen Dec 28 2020 at 08:04

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

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

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 nadalah basis- bpalindrome, jangan buat daftar bdigit basis , tetapi balikkan nsebagai bbilangan 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 0sebagai argumen kedua awal). Mendefinisikannya di dalam letpelindung memungkinkan kita mengakses argumen bke fungsi utama, sedangkan fungsi mandiri perlu terus meneruskannya dengan setiap panggilan rekursif.

5 ovs Dec 28 2020 at 19:02

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

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 ihingga INT_MAX/bdan bhingga 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.

4 TobySpeight Dec 28 2020 at 23:28

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 amenjadi sama dengan z, maka kita memiliki palindrome. Biasanya, kami berhenti di situ ( a >= zdalam 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_MAXjika kita melepaskan kondisi i%b*akembali ke i%b&&a, dan juga akan berfungsi untuk jenis bilangan bulat lainnya.

4 coltim Dec 28 2020 at 23:57

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

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!

4 DanielWagner Dec 29 2020 at 01:45

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]

fadalah fungsi bunga. Cobalah secara online!

Mungkin satu-satunya bagian yang pintar di sini adalah penggunaan take nuntuk membuat kasus dasar untuk fungsi ekspansi digit. When n=0, take nabaikan argumennya dan rekursi berhenti karena kemalasan; bila n>0, pasti tidak akan lebih dari nangka 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 nversinya lebih menyenangkan karena lebih membingungkan. ^ _ ^

4 Jonah Dec 28 2020 at 13:16

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 "0memastikan 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!

3 vrintle Dec 28 2020 at 11:13

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_smetode.

3 NinaLisitsinskaya Dec 29 2020 at 02:07

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!

3 ZaelinGoodman Dec 29 2020 at 03:26

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!

2 DominicvanEssen Dec 28 2020 at 19:44

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

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

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

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