すべてのベースパリンドロームは私たちのものです


20

回文が含まれる塩基nのシーケンス番号を生成します(OEIS A126071)。

具体的には、シーケンスは次のように定義されます。数値を指定し、nそれをベースafor a = 1,2, ..., nで表現し、それらの式が回文的である数をカウントします。「パリンドローム」はa、原子単位として式の基数を反転することで理解されます(ありがとう、@ MartinBüttner)。例として、以下を検討してn= 5ください。

  • a=1:式は11111:パリンドローム
  • a=2:式は101:パリンドローム
  • a=3:式は12:回文ではない
  • a=4:式は11:パリンドローム
  • a=5:式は10:回文ではない

したがって、の結果はn=5です3。OEISは(thanks、@beaker)の2, ..., n+1代わりにベースを使用することに注意してください。base とexpressionの式は常に回文的であるため、これは同等です。1, ..., n1n+1

シーケンスの最初の値は

 1, 1, 2, 2, 3, 2, 3, 3, 3, 4, 2, 3, 3, 3, 4, 4, 4, 4, 2, 4, 5, ...

入力は正の整数nです。出力は、nシーケンスの最初の項です。

プログラムはn、内部計算のデフォルトのデータ型によって引き起こされる制限まで、理論的に機能するはずです(十分な時間とメモリが与えられます)。

すべての機能が許可されています。最も少ないバイト数が優先されます。



1
誰にも役立つ場合は、ベースn-1の数字nも常に回文的であることに注意してください。
-Computronium

これはA126071-
タイタス

回答:


9

Pyth、13バイト

mlf_ITjLdSdSQ

これの簡潔さは、主にInvaluable " Invariant"コマンドによるものです。

msf_ITjLdSdSQ       implicit: Q=input
m         d         map lambda d over
           SQ       Inclusive range 1 to Q
      jLdSd         Convert d to all the bases between 1 and d
  f                  filter lambda T:
   _IT                 is invariant under reverse
 l                  number that are invariant under reverse

True許容出力がの場合1msm_IjdkSdSQ(12バイト)動作します。

ここで試してみてください


2
使用するよりもFryAmTheEggmanの提案を参照してください(使用可能かどうかは100%確かではありませんが、使用可能だったようです)。_I#f_IT
ジョナサンアラン

7

ゼリー、14バイト

bR‘$µ=UP€S
RÇ€

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

非競合バージョン

Jellyインタープリターには、単項への変換を不可能にするバグがありました。これは現在修正されているため、次のコード(12バイト)も手元のタスクを実行します。

bRµ=UP€S
RÇ€

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

使い方

bR‘$µ=UP€S  Helper link. Argument: z

 R‘$        Apply range and increment, i.e., map z to [2, ..., z + 1].
            In the non-competing version R simply maps z to [1, ... z].
b           Convert z to each of the bases to the right.
    µ       Begin a new, monadic chain. Argument: base conversions
     =U     Compare the digits of each base with the reversed digits.
            = has depth 0, so [1,2,3]=[1,3,3] yields [1,0,1].
       P€   Take the product of the innermost arrays.
         S  Sum all resulting Booleans.


RÇ€         Main link. Argument: n

R           Yield [1, ..., n].
 ǀ         Apply the helper link to each.

4

MATL、19 20バイト

:"0@XK:Q"K@:YAtP=A+

現在のリリース(10.1.0)を使用します。これは、この課題よりも前のものです。

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

説明

:            % vector [1,2,...,N], where "N" is implicit input
"            % for each number in that vector
  0          % push 0
  @          % push number 1,2,...N corresponding to current iteration, say "n" 
  XK         % copy n to clipboard
  :Q         % vector [2,3,...,n+1]
  "          % for each number "m" in that vector
    K        % push n
    @:       % vector [1,2,...,m]
    YA       % express n in base m with symbols 1,2,...,m
    tP       % duplicate and permute
    =A       % 1 if all entries are equal (palindrome), 0 otherwise
    +        % add that number
             % implicitly close the two loops and display stack contents


1

Haskell、88バイト

a!b|a<b=[a]|1>0=mod a b:(div a b)!b
f n=[1+sum[1|x<-[2..y],y!x==reverse(y!x)]|y<-[1..n]]

1

ES6、149バイト

n=>[...Array(n)].map((_,i)=>[...Array(i)].reduce((c,_,j)=>c+(''+(a=q(i+1,j+2,[]))==''+a.reverse()),1),q=(n,b,d)=>n<b?[n,...d]:q(n/b|0,b,[n%b,...d]))

36を超えるベースでも機能します。


1

JavaScript(ES6)、105 95バイト

f=(n,b)=>b?b<2?1:f(n,b-1)+([...s=n.toString(b)].reverse().join``==s):n<2?[1]:[...f(n-1),f(n,n)]

説明

1から36までの数字(JavaScriptのベース変換の制限)を取り、シーケンスの配列を返します。

塩基が渡されたときに回文をチェックする再帰関数、そうでなければn渡されただけのシーケンスを返します。

f=(n,b)=>

  // Base palindrome checking
  b?
    b<3?1:                 // return 1 for base-1, since toString(2)
    f(n,b-1)+(             // return the sum of all lower bases and check  this
      [...s=n.toString(b)] // s = n in base b
      .reverse().join``==s // add 1 if it is a palindrome
    )

  // Sequence generation
  :
    n<2?[1]:               // return 1 for the first value of the sequence
    [...f(n-1),f(n,n)]     // return the value for n after the previous values

テスト

var solution = f=(n,b)=>b?b<2?1:f(n,b-1)+([...s=n.toString(b)].reverse().join``==s):n<2?[1]:[...f(n-1),f(n,n)]
<input type="number" oninput="result.textContent=solution(+this.value)" />
<pre id="result"></pre>


それを再帰関数に変える方法はありますか?私はそれがいくつかのバイトを節約できるように感じています。
ママファンロール

@ՊՓԼՃՐՊՃՈԲՍԼそのとおりです。ヒントをありがとう。
user81655




1

Python 2、97バイト

c=1;n=int(input())
for b in range(2,n):
	a=[];z=n
	while z:a+=[z%b];z//=b
	c+=a[::-1]==a
print c

私の最初のPython投稿、実際には私の最初のPythonコードは、
おそらくゴルフの可能性をいくらか持っています。

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


1

> <>、197 + 2バイト

-vフラグの場合は+2

:1+0v    ;n\
1\  \$:@2(?/
:<~$/?)}:{:*}}@:{{
\   \~0${:}
>$:@1(?\::4[:&r&r]:$&@@&%:&@&$@-$,5[1+{]$~{{:@}}$@,$
~~1 \  \
?\~0>$:@2(?\$1-:@3+[}]4[}1-]=
 \  /@@r/!?/
r@+1/)0:<
  /?/$-1$~<
~$/       \-1

tio.runはn> 1の出力を返さないようですが、https://fishlanguage.comで確認できます。入力は「初期スタック」ボックスに入ります。



1

Python 2、85バイト

def f(a):b,c=2,0;exec'd,m=[],a\nwhile m:d+=[m%b];m/=b\nc+=d[::-1]==d;b+=1;'*a;print c

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

引数として整数が必要です。

説明:

# named function
def f(a):
    # initialize variable to track base (b) and to track palindromes (c)
    b,c=2,0
        # construct code
        '
        # initialize variable to store remainders (m) and to track divisor (d)
        m,d=[],a
        # while d is not zero,
        # add the current remainder to the array
        # and divide d by the base and assign the result back to d
        while d:m+=[m%b];d/=b
        # False == 0 and True == 1, so add 1 to total if m == reversed(m)
        c+=m[::-1]==m;
        # increment base
        # terminate with ; so that next statement can be executed separately
        b+=1;
        '
    # execute constructed statement (a) times
    exec'....................................................'*a
    # print result
    print c
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.