デジタルダイバーシティ


16

正の整数は、整数の基数で表すことができます1 <= b < inf

そのベースに変換すると、いくつかの異なる数字があります。

baseの正の整数に1は、1個別の数字があります。

baseのほとんどの正の整数に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の最小パンデジタル数。

回答:


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でユーザーごとに使用されたバイト数のグラフが表示されたらいいのにと思います。たぶん、使用された合計バイト対現在の担当者のプロット。
フィリップハグランド

これがなぜ機能するのかを理解するために少しかかりました...
グレッグマーティン

9

Python、40バイト

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

Ideoneでテストします。

使い方

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秒に比べて遅いようです
デニス

3バイトのために似ていますが、他の方法の周りに少ない:lambda n:n**~-n+sum(i*n**(n+~i)for i in range(2,n))
ジョナサン・アラン

2
46バイトとはるかに高速:n=r=input();k=2\nwhile k<n:r=r*n+k;k+=1\nprint r
デニス

はい、Pythonでの理解よりもループの方がはるかに高速です。
ジョナサンアラン

@JonathanAllanそれが理由ではない。パワーの計算は非常に遅くなりますが、ループは乗算と加算のみを使用します。
デニス


5

J、9バイト

#.],2}.i.

@Dennis ' methodに基づきます。

使用法

   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が与えられると、数字のリストを作成し、n!の[0, 1, ..., n]インデックスを使用して置換を見つけ、それを基数nの数字のリストとして変換します。Jの12バイトの対応するソリューション

#.]{.!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]ますか?
ジョナサンアラン

1
@JonathanAllan方法が見つかりませんが、それらの順列インデックスが(n -1)になることに気付きました!
マイル

4

ルビー、37 35 34バイト

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

与えられた答えはbase nの形式10234...(n-1)を取りますnn=10例として使用:

で始まるn10

n2を乗算して追加します。102

複数nで追加:1023

等々。

編集:マップを使用する方が短いようです。

編集2:先端をありがとう、m-chrzan!


(2...n)1バイト短くなります。
m-chrzan


3

CJam(9バイト)

qi_,X2$tb

オンラインデモ

解剖

明らかに、デジタル多様性を持つ最小数nは、base [1 0 2 3 ... n-1]でベース変換することで見つかり nます。ただし、組み込みの基本変換では、数字が範囲内にある必要はないことに注意してください0 .. 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] bです1


3

Haskell、31バイト

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

折り畳みを介してHornerの方法を使用して、リスト[n,2,3,...,n-1]をベースに変換しますn。これのより少ないゴルフバージョンはOEISページで与えられます

3バイトのnimiに感謝します!


Haskellをあまりよく知らないfのですが、有効なゴルフソリューションになるためには、関数の名前(?)が必要ですか?(fコードの後半で参照されていないだけです)
ジョナサンアラン

@JonathanAllan Haskellのラムダ関数形式はです\n->fold1...。これは名前を付けるのと同じ長さです。サブ関数を組み合わせて入力変数に名前を付けないポイントフリー関数を作成できますが、ここでは3つの参照を使用するとひどくなりますn
-xnor

クール、説明ありがとう。Haskellの構文は私を多少混乱させます。
ジョナサンアラン

使用できます foldlし、で始まるnf 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

Perl 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-Flak84 76バイト

8バイトのゴルフをしてくれたWheat Wizardに感謝

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

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

説明

プログラムから値をプッシュ0するn-1スタックにトップを置き換え01して10。次に、スタックの一番上に乗算しますnし、スタックに値が1つだけ残るまでその下の値を追加します。

基本的に、異なる数字nを含むbaseの最小数の数字を検索しますnn1 を超える場合は常にの形式になります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バイトを保存することができます
ウィートウィザード

それ(<{}{}>)((()))から、さらに4バイトを保存するためにそれを置き換えることができます
ウィートウィザード



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;


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.