ベースの回文

Dec 28 2020

回文数は、復習として、前方と後方を同じように読み取る任意の番号です。しかし、他の基地の回文はどうですか?

入力

bここで、任意の整数b > 1

出力

基数bのパリンドロームである0から1000までのすべての整数の基数10の数値。出力は、整数のリスト、またはコンマや改行などの区切り文字で区切られた整数のいずれかです。

テストケース

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}

回答

12 dingledooper Dec 29 2020 at 03:01

Python 3、78バイト

数値を降順で出力し1000 -> 0、と短絡します。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)

オンラインでお試しください!

f(b,n-n//n) -> f(b,n-1)まで再帰0、そしてエラーはゼロ除算が定義されていないからです。

Python 3、76バイト

浮動小数点出力が許可されている場合は、回答を2バイト短縮できます。

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)

オンラインでお試しください!

10 EasyasPi Dec 28 2020 at 13:02

C(gcc)転送、118 117115バイト

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);}}

オンラインでお試しください!

C(gcc)、後方、115113バイト

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);}}

オンラインでお試しください!

説明

C署名:

// Technically implicit int with a void return
void f(int base);

0から1000までのすべての数値をループし、それらをbase手動でベースに変換してから、それが回文であるかどうかを確認します。

後方バージョンは同じことをしますが、後方です。

一致する数値をコンマ区切りでstdoutに出力します。

ゴルフなしのバージョン

#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バイトのArnauldに感謝します!

-2バイトのTobySpeightに感謝します!

10 Lyxal Dec 28 2020 at 04:54

05AB1E、7バイト

₄ÝʒIвÂQ

オンラインでお試しください!

説明

₄Ý	"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

ゼリー、7バイト

ȷŻbŒḂ¥Ƈ

オンラインでお試しください!

使い方

ȷŻ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バイト

A³ô fÈìU êê

それを試してみてください

6 J42161217 Dec 28 2020 at 04:53

Wolfram言語(Mathematica)、44バイト

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

オンラインでお試しください!

-@ attから13バイト

6 Arnauld Dec 28 2020 at 07:35

JavaScriptの(ES6)、 87の 86バイト

カンマ区切りの文字列を返します。

n=>(g=k=>--k&&g(k)+((h=k=>a=k?[k%n,...h(k/n|0)]:[])(k)+''==a.reverse()?[,k]:''))(1001)

オンラインでお試しください!

どうやって?

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

スカラ座、62の87バイト

  • シウチンポン-Asuka Kenji-後に修正された指摘BigInttoString唯一の36までの拠点で働いています。
  • @cubicレタスのおかげで1バイト節約できました。
b=>0 to 1000 filter{x=>val y=Seq.unfold(x){q=>Option.when(q>0)(q%b,q/b)};y==y.reverse}

オンラインでお試しください!

これは非常に簡単です。範囲は0〜1000になり、ベースの逆数に等しいかどうかをチェックしてフィルタリングしbます。塩基に変換するb(文字列)、BigInttoString方法がされて使用されたが、今Seq.unfold作成するために使用されるSeq数字の桁を。

6 DominicvanEssen Dec 28 2020 at 08:04

殻、12の11バイト

編集:LegionMammal978のおかげで-1バイト

foS=↔B⁰ŀdḋ9

オンラインでお試しください!

実際の「ベースの回文」コードは7バイト(foS=↔B⁰)ですが、0 ... 1000を指定すると、5 4バイト(LegionMammal978のおかげで)多くなります。
10進数の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

木炭、14バイト

NθIΦ⊕φ⁼↨ιθ⮌↨ιθ

オンラインでお試しください!リンクは、コードの詳細バージョンへのリンクです。説明:

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バイト

f b|let 0%m=m;n%m=div n b%(m*b+mod n b)=[n|n<-[0..1000],n==n%0]

オンラインでお試しください!

dingledooperのPythonの答えからの素晴らしいアイデアに基づいて:それnがベースbパリンドロームであることを確認するには、ベースb桁のリストを生成せずに、最後から桁を読み取るベース変換を実行してベース番号nとして逆にします。b結果がまだ等しいことを確認してくださいn

このコード|let 0%m=m;n%m=div n b%(m*b+mod n b)は、%ベースを逆にする中置関数を再帰的に定義しますn0最初の2番目の引数として指定)。letガード内で定義するbと、main関数への引数にアクセスできますが、スタンドアロン関数では、再帰呼び出しごとに引数を渡し続ける必要があります。

5 ovs Dec 28 2020 at 19:02

APL(Dyalogが拡張)、17の15バイト

-2バイトのRazetimeに感謝します!Siu Ching Pongの
おかげでバグが修正されました!

インデックスの原点が必要0です。

⍸⎕(⊤≡∘⌽⊤)¨⍳1001

オンラインでお試しください!

                 ⍝ 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バイト

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;}

説明

個別に投稿することを保証するための私の以前の回答とは十分に異なります。今回は、数字を完全に逆にして、元の数字と比較します。したがって、末尾のゼロや特殊なケースを削除する必要はありません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);
        }
    }
}

このメソッドは、i最大INT_MAX/bb最大INT_MAX、または使用する整数型を変更した場合の適切な同等物に対して確実に機能します。符号なしタイプ(またはwith gcc -fwrapv)の場合、の全範囲で機能するはずですi

4 TobySpeight Dec 28 2020 at 23:28

C、100バイト

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");}

オンラインでお試しください

ゴルフされていないコード

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、底で連続的に除算し、余りを使用して逆数(in z)を作成することにより、(as )を減らします。にa等しくなるとz、回文が発生します。通常は(a >= zループ状態で)そこで停止しますが、ゴルフの場合は、まで続けますa==0

z奇数と偶数の両方の長さのパリンドロームを受け入れるには、剰余をに転送する前と後の両方で同等性をテストする必要があります。

最後に、0常にパリンドロームであり、ループに含めるよりも特別な場合の方が簡単なを印刷します。

このメソッドINT_MAXは、条件をアンゴルフしてi%b*a元に戻すまでi%b&&aの整数に対して機能し、他の整数型に対しても機能します。

4 coltim Dec 28 2020 at 23:57

K(ngn / k)、18バイト

{&{x~|x}'x\'!1001}

オンラインでお試しください!

  • x\'!1001 0..1000のそれぞれをbase-x表現に変換します
  • {x~|x}' 各表現が回文であるかどうかを確認します
  • & 真のインデックスを取得する
4 Danis Dec 28 2020 at 12:59

Python 3.8(プレリリース)、9285バイト

lambda b:[i for i in range(1001)if(f:=lambda n:n*[0]and[n%b]+f(n//b))(i)==f(i)[::-1]]

オンラインでお試しください!

7バイトを節約してくれたdingledooperに感謝します!

4 DanielWagner Dec 29 2020 at 01:45

Haskell、67バイト

b&n=take n$mod n b:b&div n b
f b=[n|n<-[0..1000],reverse(b&n)==b&n]

f関心のある関数です。オンラインでお試しください!

おそらく、ここでの唯一の巧妙なビットはtake n、桁拡張関数のベースケースを作成するためにを使用することです。の場合n=0take nその引数を無視するため、再帰は怠惰によって停止します。の場合n>0、確かにn数字を超えることはないので、最初の数字だけを保持するのが安全nです。次の定義は同等です(そして同じくらい長いです):

b&0=[]
b&n=mod n b:b&div n b

...しかし、take nバージョンはより混乱しているため、より楽しいです。^ _ ^

4 Jonah Dec 28 2020 at 13:16

J、27バイト

((-:|.)@(#.inv)"0#])i.@1001

どうやって

  • (...) i.@1001 -全体がJフックです。つまり、引数は親のすべての左引数になり、右引数は0から1000までの整数になります。 i.@1001
  • ...#]parens内のフレーズは、copy#を使用]して、#:の左側のフレーズから生じるブールマスクによって右側の引数をフィルタリングします。
  • (-:|.)@(#.inv)"0-ランク0"0は、フレーズが正しい引数の個々の番号に適用されることを保証します。句自体は、最初にこれらの各数値を左の引数(#.inv)で指定された基数の数字のリストに変換し、次にそのリストがその逆に等しいかどうかをチェックします(-:|.)@。したがって、フレーズ全体は、これがtrueの場合は1を返し、それ以外の場合は0を返します。このブールマスクは、必要に応じて右引数をフィルタリングします。

オンラインでお試しください!

3 vrintle Dec 28 2020 at 11:13

Ruby 2.7、74バイト

->b{(0..1e3).select{(a=(g=->k,r=[]{k>0?g[k/b,r<<k%b]:r})[_1])==a.reverse}}

オンラインでお試しください!

TIOは古いバージョンのRubyを使用しますが、Ruby 2.7では、2バイトを節約するパラメーターに番号を付けました。


Ruby、48バイト

->b{(0..1e3).select{|k|(k=k.to_s b)==k.reverse}}

オンラインでお試しください!

.to_sメソッドの制限により、64を超えるベースでは機能しません。

3 NinaLisitsinskaya Dec 29 2020 at 02:07

JavaScriptの(V8) 、77の89バイト

36を超えるベースで修正されました。

b=>{for(i=-1;i<1e3;){j=[],k=++i;while(k|=0)j.push(k%b),k/=b;''+j==j.reverse()&&print(i)}}

オンラインでお試しください!

3 ZaelinGoodman Dec 29 2020 at 03:26

PowerShellの、 102の 100 98 95 87 75バイト

-mazzyのおかげで14バイト!

param($u)0..1e3|?{for($b=@();$_=($_-($b+=$_%$u)[-1])/$u){}"$b"-eq$b[11..0]}

オンラインでお試しください!

2 DominicvanEssen Dec 28 2020 at 19:44

R、8281バイト

(または" "のかなり複雑な区切り文字を使用して79バイト\n[1]

編集:cairdcoinheringaahingのおかげで-1バイト

function(b)for(i in 0:1e3)if(!i||all((a=i%/%b^(0:log(i,b))%%b)==rev(a)))cat(i,'')

オンラインでお試しください!

新しい基本表現の数字を手動で計算し、それらが逆になっているのと同じかどうかを確認します。

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バイト

. as$a|range(1001)|select([while(.>0;./$a|floor)|.%$a]|reverse==.)

オンラインでお試しください!

説明

. 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バイト

f_IjTQUh^T3

オンラインでお試しください!


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バイト

b->{for(int i=-1;i++<1e3;){var s=b.toString(i,b);if(s.contains(new StringBuffer(s).reverse()))System.out.println(i);}}

オンラインでお試しください。

説明:

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