당신의 모든 기본 회문은 우리에게 속합니다


20

문인 염기n 의 순서 번호를 생성합니다 ( OEIS A126071 ).

구체적으로, 시퀀스는 다음과 같이 정의됩니다 : 숫자가 주어지고에 대한 n기초 a로 표현하고 a = 1,2, ..., n, 회고 식인 표현의 수를 세십시오. "Palindromic"은 a표현 의 기본 자릿수를 원자 단위로 바꾸는 것으로 이해됩니다 (감사, @Martin Büttner ). 예를 들어, 다음을 고려하십시오 n= 5.

  • a=1: 표현은 11111: palindromic
  • a=2: 표현은 101: palindromic
  • a=3: 표현은 12: 회문 이 아닙니다
  • a=4: 표현은 11: palindromic
  • a=5: 표현은 10: 회문 이 아닙니다

따라서의 결과는 n=5입니다 3. OEIS는 (thanks, @beaker ) 2, ..., n+1대신에 밑 을 사용합니다 . 베이스의 표현 때문에와 동등한 와는 항상 회문이다.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은 항상 기수 n-1에서 회 문학이라는 점에 주목할 가치가 있습니다.
Computronium

이것은 A126071
Titus

답변:


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 % 아니지만, 그것은 이었던 것으로 보인다 ).
Jonathan Allan

7

젤리, 14 바이트

bR‘$µ=UP€S
RÇ€

온라인으로 사용해보십시오!

비경쟁 버전

젤리 인터프리터는 단항으로 변환 할 수없는 버그가있었습니다. 이 문제는 현재 해결되었으므로 다음 코드 ( 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

하스켈, 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

자바 스크립트 (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

파이썬 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

내 첫 파이썬 포스트, 실제로 첫 번째 파이썬 코드는
아마도 골프 잠재력을 가지고있을 것입니다.

온라인으로 사용해보십시오!


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

파이썬 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.