您所有的基础回文都属于我们


20

生成碱基n为回文序列的序列OEIS A126071)。

具体地,该序列被定义如下:给定的数n,表达它在碱aa = 1,2, ..., n,并且计数多少这些表达式是回文。“回文”的含义a是将表达式的基数反转为原子单位(感谢@MartinBüttner)。例如,考虑n= 5

  • a=1:表达式是11111:回文
  • a=2:表达式是101:回文
  • a=3:表达式是12:不是回文
  • a=4:表达式是11:回文
  • a=5:表达式是10:不是回文

因此,对于结果n=53。请注意,OEIS使用的是基2, ..., n+1而不是1, ..., n(感谢@beaker)。这是等效的,因为base 1n+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在基数n-1中也总是回文。
Computronium

Answers:


9

Pyth,13个字节

mlf_ITjLdSdSQ

简洁的原因主要在于I可计算的“ 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是的可接受输出1,则msm_IjdkSdSQ(12个字节)有效。

在这里尝试。


2
请参阅FryAmTheEggman的建议_I#而不要使用f_IT(我不是100%确信它可用,但似乎已经可以使用)。
乔纳森·艾伦

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>


有没有办法将其转换为递归函数?我觉得这样可以节省一些字节。
Mama Fun Roll

@ՊՓԼՃՐՊՃՈԲՍԼ你是对的。谢谢你的提示。
user81655


1

PHP,73 + 1字节

while(++$i<$argn)$c+=strrev($n=base_convert($argn,10,$i+1))==$n;echo$c+1;

工程基地136。与管道一起运行-nR在线尝试


1

PHP,92 + 1字节:

for($b=$c=1;$b++<$n=$argn;$c+=$a==array_reverse($a))for($a=[];~~$n;$n/=$b)$a[]=$n%$b;echo$c;

适用于所有基地。与管道一起运行-nR在线尝试


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

Japt,10字节

õ_õ!ìZ èêS

试试吧


说明

õ              :Range [1,input]
 _             :Map each Z
  õ            :  Range [1,Z] (let's call each X)
   !ìZ         :   Convert Z to a base X digit array
       è       :  Count
        êS     :   Palindromes

1
õ_õ哈哈哈好表情符号
Luis

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.