디지털 다양성


16

양의 정수는 정수의 밑으로 표시 될 수 있습니다 1 <= b < inf.

해당 기준으로 변환 할 때 고유 숫자가 있습니다.

기수의 양의 정수 11고유 한 숫자를 갖습니다 .

기본적으로 대부분의 양의 정수 22고유 한 숫자를 갖지만 예외는 형식 2^n - 1은 다음과 같습니다 1.

정수와베이스로 표현 될 수 있도록 제 양수 1고유 디지트가 1및로 표현 될 수있는 제 2뚜렷한 숫자이다 2.

우리는 말할 수있는 1디지털 다양성 첫 번째 정수 12디지털 다양성 최초의 정수입니다 2.

도전:

양의 정수가 주어지면의 n디지털 다양성을 갖는 첫 번째 양의 정수 (기본 10 *)를 반환합니다 n.

* 언어가 특정 기본 (예 : 단항 또는 이진) 만 지원하는 경우 해당 기본으로 출력 할 수 있습니다.

알고리즘은 양의 정수 입력에 대해 이론적으로 작동 해야 합니다. 언어 정수의 정밀도가 출력에 비해 너무 작기 때문에 실패 할 수 있습니다 . 하지만 그렇지 않을 수도 있습니다 기본 변환은 어느 정도까지만 정의되므로 실패 않을 .

테스트 사례

input  output
   1     1
   2     2
   3     11
   4     75
   5     694
   6     8345
   7     123717
  17     49030176097150555672
  20     5271200265927977839335179
  35     31553934355853606735562426636407089783813301667210139
  63     3625251781415299613726919161860178255907794200133329465833974783321623703779312895623049180230543882191649073441
 257     87678437238928144977867204156371666030574491195943247606217411725999221158137320290311206746021269051905957869964398955543865645836750532964676103309118517901711628268617642190891105089936701834562621017362909185346834491214407969530898724148629372941508591337423558645926764610261822387781382563338079572769909101879401794746607730261119588219922573912353523976018472514396317057486257150092160745928604277707892487794747938484196105308022626085969393774316283689089561353458798878282422725100360693093282006215082783023264045094700028196975508236300153490495688610733745982183150355962887110565055971546946484175232

이것은 가장 짧은 바이트 단위 솔루션 인 입니다.

OEIS : A049363- 또한베이스 n에서 가장 작은 pandigital 숫자입니다.

답변:


11

젤리 , 4 바이트

ṖaWḅ

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인

작동 원리

ṖaWḅ  Main link. Argument: n

Ṗ     Pop; yield [1, 2, 3, ..., n-1].
  W   Wrap; yield [n].
 a    Logical AND; yield [n, 2, 3, ..., n-1].
   ḅ  Convert the result from base n to integer.

나는 오버 플로우 수있는 곳 값이, 내 형편 7 : 뛰는 것을 잊었다
조나단 앨런

codegolf에서 사용자 당 rep vs bytes 사용 된 차트가 있었으면 좋겠습니다. 사용 된 총 바이트 수와 현재 rep 수
Filip Haglund

왜 이것이 작동하는지 알아 내기 위해 조금 나왔습니다 ... 매끄럽게 완료되었습니다!
Greg Martin

9

파이썬, 40 바이트

f=lambda n,k=1:n*(n<k+2)or-~f(n,k+1)*n-k

Ideone에서 테스트하십시오 .

작동 원리

A의 번호 N 고유 숫자 명확히 기재 표현해야 B ≥ N . 우리의 목표 수를 최소화하기 때문에, B는 또한 가능한 한 작게도록되어야 B = N 논리적 인 선택이다.

따라서 가능한 작은 숫자를 만들기 위해 숫자 0,…, n-1 을 배열 해야합니다. 즉, 가장 중요한 숫자는 가능한 작게 유지해야합니다. 정규 표현에서 첫 번째 숫자는 0 이 될 수 없으므로 가장 작은 숫자는
(1) (0) (2) ... (n-2) (n-1) n = n n-1 + 2n n-3입니다. + ... + (N-2) + N (N-1) , 이는 F의 재귀 계산한다.


6

파이썬 2, 54 46 바이트

이것은 매우 매우입니다 ! 빠르고 반복적 인 솔루션.

n=r=input();k=2
while k<n:r=r*n+k;k+=1
print r

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

재귀가 없으므로 큰 입력에 작동합니다. 결과는 다음과 같습니다 n = 17000(1-2 초 소요).

http://pastebin.com/UZjgvUSW


입력 17000은 얼마나 걸립니까? 내 컴퓨터에서 26 초가 걸리는데, Jelly의 0.9 초에 비해 느리게 보입니다.
Dennis

비슷하지만 다른 방법으로 3 바이트 이하 :lambda n:n**~-n+sum(i*n**(n+~i)for i in range(2,n))
Jonathan Allan

2
46 바이트와 훨씬 더 빠른 속도 :n=r=input();k=2\nwhile k<n:r=r*n+k;k+=1\nprint r
Dennis

예, 파이썬에서 루프가 이해력보다 훨씬 빠릅니다.
Jonathan Allan

@JonathanAllan 이유가 아닙니다. 루프는 곱셈과 덧셈 만 사용하는 반면, 힘 계산은 매우 느립니다.
Dennis

5

자바 스크립트 (ES6), 29 바이트

f=(b,n=b)=>n>2?f(b,--n)*b+n:b

5

J, 9 바이트

#.],2}.i.

@Dennis ' 방법을 기반으로 합니다.

용법

   f =: #.],2}.i.
   (,.f"0) >: i. 7
1      1
2      2
3     11
4     75
5    694
6   8345
7 123717
   f 17x
49030176097150555672

설명

#.],2}.i.  Input: n
       i.  Get range, [0, 1, ..., n-1]
    2}.    Drop the first 2 values, [2, 3, ...., n-1]
  ]        Get n
   ,       Prepend it, [n, 2, 3, ..., n-1]
#.         Convert that to decimal from a list of base-n digits and return

순열 인덱스 사용을 기반으로하는 대체 솔루션이 있습니다. 입력 감안할 때 N , 숫자의 목록을 작성 [0, 1, ..., n]하고, 인덱스를 사용하여 순열 찾을 N 그 기지 - 목록으로! 및 변환을 n 개의 숫자. 12 바이트에 대한 J의 해당 솔루션

#.]{.!A.i.,]  Input: n
        i.    Make range [0, 1, ..., n-1]
           ]  Get n
          ,   Join, makes [0, 1, ..., n-1, n]
     !        Factorial of n
      A.      Permutation index using n! into [0, 1, ..., n]
  ]           Get n
   {.         Take the first n values of that permutation
              (This is to handle the case when n = 1)
#.            Convert that to decimal from a list of base-n digits and return

구성하는 것이 더 짧을 수 [1,0,2,3,...,n-1]있습니까?
Jonathan Allan

1
@JonathanAllan 나는 방법을 찾을 수 없지만 그것들의 순열 지수는 ( n -1) 이라는 것을 알았습니다 !
마일

4

루비, 37 35 34 바이트

->n{s=n;(2...n).map{|d|s=s*n+d};s}

주어진 답변 은 기본 n형식 10234...(n-1)을 취합니다 n. n=10예제로 사용 :

로 시작 n:10

n2를 곱하고 더합니다 :102

여러 가지 방법으로 n추가하고 3 :1023

등등.

편집 :지도를 사용하는 것이 더 짧습니다.

편집 2 : 팁 주셔서 감사합니다, m-chrzan!


(2...n)바이트가 짧아집니다.
m-chrzan


3

CJam (9 바이트)

qi_,X2$tb

온라인 데모

해부

분명히 디지털 다양성을 가진 가장 작은 숫자 는 base에서 base n-converting함으로써 발견됩니다 . 그러나 기본 변환 기본 제공에서는 숫자가 범위 안에있을 필요는 없습니다 .[1 0 2 3 ... n-1]n0 .. n-1

qi    e# Read integer from stdin
_,    e# Duplicate and built array [0 1 ... n-1]
X2$t  e# Set value at index 1 to n
b     e# Base conversion

특별한 경우에 n = 1우리는 어느 것을 1 [0] 1 1 tb제공 합니다.1 [0 1] b1


3

하스켈, 31 바이트

f n=foldl((+).(*n))n[2..n-1]

접기를 통해 Horner의 방법을 사용하여 목록 [n,2,3,...,n-1]을 기본으로 변환합니다 n. 이것의 덜 골프 버전은 OEIS 페이지에 있습니다.

3 바이트의 nimi에 감사합니다!


나는 Haskell을 너무 잘 모른다. 접기에는 f유효한 골프 솔루션 이되기 위해 함수의 이름을 지정해야 합니까 ( ?)? ( f코드에서 나중에 참조되지 않습니다)
Jonathan Allan

@JonathanAllan Haskell의 람다 함수 형식은 \n->fold1...이름을 짓는 한입니다. 하위 함수를 결합하여 입력 변수의 이름을 지정하지 않는 무점 함수를 작성할 수 있지만 여기에는에 대한 세 개의 참조가 n있습니다.
xnor

설명 감사합니다. Haskell 구문은 다소 혼란 스럽습니다.
Jonathan Allan

사용 foldl하고 시작할 수 있습니다 n:f n=foldl((+).(*n))n[2..n-1]
nimi

3

05AB1E , 9 바이트

DL¦¨v¹*y+

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

설명

n = 4 예를 들어 사용됩니다.

D           # duplicate input
            # STACK: 4, 4
 L          # range(1, a)
            # STACK: 4, [1,2,3,4]
  ¦¨        # remove first and last element of list
            # STACK: 4, [2,3]
    v       # for each y in list
     ¹*     # multiply current stack with input
       y+   # and add y
            # STACK, first pass: 4*4+2 = 18
            # STACK, second pass: 18*4+3 = 75

2

C ++- 181 55

다음을 사용하여 실제 멋진 솔루션을 게시하려고했습니다 <numeric>.

#import <vector>
#import <numeric>
using namespace std;int f(int n){vector<int> v(n+1);iota(v.begin(),v.end(),0);swap(v[0],v[1]);return accumulate(v.begin(),v.end()-1,0,[n](int r,int a){return r*n+a;});}

그리고 나는 그것이 실현 방법으로 쉽게 :

int g(int n){int r=n,j=2;for(;j<n;)r=r*n+j++;return r;}

2

펄 6 ,  34 31  30 바이트

OEIS 페이지 의 Haskell 예제에서 번역되었습니다 .

{(1,0,|(2..^$^n)).reduce: $n×*+*}        # 34
{(1,0,|(2..^$^n)).reduce: $n* *+*}       # 34

{reduce $^n×*+*,1,0,|(2..^$n)}           # 31
{[[&($^n×*+*)]] 1,0,|(2..^$n)}           # 31

{reduce $_×*+*,1,0,|(2..^$_)}            # 30
  • [&(…)] 회전 내부 중위 연산자로
  • […]위 의 그림은 접두사 op를 접음으로 바꿉니다 (연산자 연관성에 따라 왼쪽 또는 오른쪽)

넓히는:

{
  reduce

    # declare the blocks only parameter 「$n」 ( the 「^」 twigil )
    # declare a WhateverCode lambda that takes two args 「*」
    $^n × * + *

    # a list that always contains at least (1,0)
    1, 0,
    # with a range slipped in
    |(
      2 ..^ $n # range from 2 up-to and excluding 「$n」
               # it is empty if $n <= 2
    )
}

용법:

my &code = {reduce $_×*+*,1,0,|(2..^$_)}

say code 1; # 1
say code 2; # 2
say code 3; # 11
say code 4; # 75
say code 7; # 123717

# let's see how long it takes to calculate a largish value:

my $start-time = now;
$_ = code 17000;
my $calc-time = now;
$_ = ~$_; # 25189207981120412047...86380901260421982999
my $display-time = now;

say "It takes only { $calc-time - $start-time } seconds to calculate 17000";
say "but { $display-time - $calc-time } seconds to stringify"

# It takes only 1.06527824 seconds to calculate 17000
# but 5.3929017 seconds to stringify

2

Brain-Flak , 84 76 바이트

8 바이트 골프를위한 밀 마법사 덕분에

(({})<>){(({}[()]))}{}(<{}{}>)((())){{}({<({}[()])><>({})<>}{}{})([][()])}{}

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

설명

이 프로그램에서 값을 밀어 0n-1스택 상단을 대체에 0110. 그런 다음 스택의 상단에n 하나의 값만 남을 때까지 그 아래에 값을 추가합니다.

기본적으로 다른 숫자 n가 포함 된 기본에서 가장 작은 숫자의 숫자를 찾습니다 n( n> 1의 경우 항상 형식입니다 1023...(n-1)). 그런 다음 숫자와 밑 수가 주어진 숫자를 계산합니다.

주석이 달린 코드

(({})<>)       # Pushes a copy of n to the right stack and switches to right stack
{(({}[()]))}{} # While the top of the stack != 0 copy the top of the stack-1
               #   and push it
(<{}{}>)       # Discard the top two values (0 and 1 for n > 1) and push 0
((()))         # Push 1 twice (second time so that the loop is works properly)
{{}            # Loop while stack height > 1
  (            #   Push...
    {<({}[()])><>({})<>}{} # The top value of the stack * n
    {}         #     Plus the value below the top of the stack
  )            #   End push
([][()])}{}    # End loop

당신은 대체 할 수 {}{}(()(<()>))([][()])(<{}{}>)([(())][])할인율 4 바이트
포스트 록 Garf 헌터에게

그런 다음 (<{}{}>)((()))4 바이트를 더 절약하기 위해 이를 대체 할 수 있습니다
Post Rock Garf Hunter



1

PHP, 78 바이트

for(;$i<$a=$argn;)$s=bcadd($s,bcmul($i<2?1-$i:$i,bcpow($a,$a-1-$i++)));echo$s;

온라인 버전

60 바이트는 테스트 케이스의 정밀도로 n = 16까지만 작동합니다.

n = 144 INF의 경우

n = 145 NAN

for(;$j<$a=$argn;)$t+=($j<2?1-$j:$j)*$a**($a-1-$j++);echo$t;


0

자바 스크립트 (ES6), 39 바이트

사용하지 않습니다 =>

function f(b,n){throw f(b,n>2?--n:1)*b}

PPCG에 오신 것을 환영합니다!
Stephen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.