Keanekaragaman digital

16

Integer positif dapat direpresentasikan dalam basis integer 1 <= b < inf.

Ketika dikonversi ke dasar bahwa ia memiliki beberapa jumlah digit yang berbeda.

Setiap bilangan bulat positif di pangkalan 1memiliki1 angka yang berbeda.

Kebanyakan bilangan bulat positif dalam basis 2memiliki 2angka yang berbeda, kecuali yang berbentuk angka 2^n - 1, yang hanya dimiliki oleh angka1 .

Jadi bilangan bulat positif pertama yang dapat diwakili dalam basis bilangan bulat dengan 1digit unik adalah 1dan yang pertama yang dapat diwakili dengan 2angka yang berbeda adalah 2.

Kita dapat mengatakan bahwa itu 1adalah bilangan bulat pertama dengan keanekaragaman digital 1dan 2adalah bilangan bulat pertama dengan keragaman digital 2.

Tantangan:

Diberikan integer positif nmengembalikan integer positif pertama (dalam basis sepuluh *) yang memiliki keragaman digital n.

* jika bahasa Anda hanya mendukung basis tertentu (mis. unary atau binary) maka Anda dapat menampilkan basis itu.

Algoritme Anda harus bekerja secara teori untuk input bilangan bulat positif: mungkin gagal karena ketepatan bilangan bulat bahasa Anda terlalu kecil untuk output; tapi mungkin tidak gagal karena konversi basis hanya ditentukan hingga batas tertentu.

Uji kasus

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

Ini adalah , solusi terpendek dalam byte yang menang.

Oei: A049363 - juga terkecil jumlah Pandigital dalam basis n.

Jonathan Allan
sumber

Jawaban:

11

Jelly , 4 byte

ṖaWḅ

Cobalah online! atau verifikasi semua kasus uji

Bagaimana itu bekerja

Ṗ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.
Dennis
sumber
Saya lupa nilai tempat bisa meluap, mengalahkan 7 saya yang payah :)
Jonathan Allan
Saya berharap ada grafik rep vs byte yang digunakan per pengguna pada codegolf. Mungkin plot total byte yang digunakan vs rep saat ini.
Filip Haglund
Butuh saya sedikit untuk mencari tahu mengapa ini berhasil ... dilakukan dengan licin!
Greg Martin
9

Python, 40 bytes

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

Uji di Ideone .

Bagaimana itu bekerja

Angka dengan n digit berbeda harus dengan jelas dinyatakan dalam basis b ≥ n . Karena tujuan kami adalah meminimalkan angka, b juga harus sekecil mungkin, jadi b = n adalah pilihan logis.

Itu membuat kita mengatur angka 0,…, n-1 untuk membuat angka sekecil mungkin, yang berarti digit paling signifikan harus dijaga sekecil mungkin. Karena digit pertama tidak boleh 0 dalam representasi kanonik, angka terkecil adalah
(1) (0) (2) ... (n-2) (n-1) n = n n-1 + 2n n-3 + ... + (n-2) n + (n-1) , yang dihitung f secara rekursif.

Dennis
sumber
6

Python 2, 54 46 byte

Ini sangat sangat sangat ! cepat, solusi berulang.

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

Cobalah online

Tidak ada rekursi, jadi ini berfungsi untuk input besar. Inilah hasil dari n = 17000(membutuhkan 1-2 detik):

http://pastebin.com/UZjgvUSW

mbomb007
sumber
Berapa lama input 17000 berlangsung? Butuh 26 detik pada mesin saya, yang tampaknya lambat dibandingkan dengan 0,9 detik Jelly ...
Dennis
Mirip tetapi sebaliknya untuk tiga byte kurang:lambda n:n**~-n+sum(i*n**(n+~i)for i in range(2,n))
Jonathan Allan
2
46 byte dan jauh lebih cepat:n=r=input();k=2\nwhile k<n:r=r*n+k;k+=1\nprint r
Dennis
Ya, luar biasa seberapa cepat perulangan daripada pemahaman dalam Python.
Jonathan Allan
@ JonathanAllan Bukan itu alasannya. Komputasi kekuatannya sangat lambat, sedangkan loop hanya menggunakan perkalian dan penambahan.
Dennis
5

JavaScript (ES6), 29 byte

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

J, 9 byte

#.],2}.i.

Berdasarkan metode @Dennis .

Pemakaian

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

Penjelasan

#.],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

Ada solusi alternatif berdasarkan penggunaan indeks permutasi. Mengingat masukan n , membuat daftar angka [0, 1, ..., n], dan menemukan permutasi menggunakan indeks n !, Dan mengkonversi bahwa sebagai daftar basis- n digit. Solusi yang sesuai dalam J selama 12 byte

#.]{.!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
mil
sumber
Mungkinkah konstruksinya lebih pendek [1,0,2,3,...,n-1]?
Jonathan Allan
1
@ JonathanAllan Saya tidak bisa menemukan jalan, tapi saya perhatikan bahwa indeks permutasi dari mereka adalah ( n -1)!
mil
4

Ruby, 37 35 34 byte

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

Jawaban untuk yang diberikan nmengambil bentuk 10234...(n-1)di dasar n. Menggunakann=10 sebagai contoh:

Mulai dengan n:10

Kalikan dengan ndan tambahkan 2:102

Mutliply oleh ndan tambahkan 3:1023

Dan seterusnya.

EDIT: Tampaknya lebih pendek untuk menggunakan peta.

EDIT 2: Terima kasih atas tipnya, m-chrzan!

Lee W
sumber
(2...n)akan lebih pendek satu byte.
m-chrzan
3

CJam , 9 byte

ri__,2>+b

Cobalah online!

Penjelasan

ri   e# Read input N.
__   e# Make two copies.
,    e# Turn last copy into range [0 1 2 ... N-1].
2>   e# Discard up to two leading values.
+    e# Prepend a copy of N.
b    e# Treat as base-N digits.
Martin Ender
sumber
3

CJam (9 byte)

qi_,X2$tb

Demo online

Pembedahan

Jelas angka terkecil dengan keragaman digital nditemukan oleh konversi [1 0 2 3 ... n-1]basis di basis n. Namun, perhatikan bahwa built-in konversi basis tidak memerlukan digit berada dalam kisaran 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

Perhatikan bahwa dalam kasus khusus n = 1kita mendapatkan 1 [0] 1 1 tbmemberikan 1 [0 1] byang 1.

Peter Taylor
sumber
3

Haskell, 31 byte

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

Mengubah daftar [n,2,3,...,n-1]menjadi pangkalan nmenggunakan metode Horner melalui pelipatan. Versi yang kurang golf ini diberikan pada halaman OEIS .

Terima kasih kepada nimi selama 3 byte!

Tidak
sumber
Saya tidak tahu Haskell terlalu baik, apakah flip memerlukan fungsi untuk dinamai ( f?) Untuk menjadi solusi golf yang valid? (hanya saja ftidak direferensikan nanti dalam kode)
Jonathan Allan
@ JonathanAllan Bentuk fungsi lambda di Haskell adalah \n->fold1..., yang hanya selama penamaan itu. Anda dapat menulis fungsi bebas titik di mana variabel input tidak dinamai dengan menggabungkan subfungsi, tetapi itu akan mengerikan di sini dengan tiga referensi n.
xnor
Keren, terima kasih atas penjelasannya. Sintaks Haskell agak membingungkan saya.
Jonathan Allan
Anda dapat menggunakan foldldan mulai dengan n:f n=foldl((+).(*n))n[2..n-1]
nimi
3

05AB1E , 9 byte

DL¦¨v¹*y+

Cobalah online!

Penjelasan

n = 4 digunakan misalnya.

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
Emigna
sumber
2

C ++ - 181 55

Akan memposting solusi keren itu menggunakan <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;});}

dan kemudian saya menyadari bahwa ini jauh lebih mudah:

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

Perl 6 ,  34 31  30 byte

Diterjemahkan dari contoh Haskell di halaman OEIS .

{(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
  • [&(…)]berubah menjadi operator infiks di tempat
  • Itu […] atas mengubah op infix menjadi lipatan (kiri atau kanan tergantung pada asosiasi operator)

Diperluas:

{
  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
    )
}

Pemakaian:

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
Brad Gilbert b2gills
sumber
2

Brain-Flak , 84 76 byte

Terima kasih kepada Wheat Wizard untuk bermain golf 8 byte

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

Cobalah online!

Penjelasan

Program mendorong nilai dari 0ke n-1ke tumpukan menggantikan bagian atas 0dan 1dengan 1dan 0. Kemudian itu mengalikan bagian atas tumpukan dengann dan menambahkan nilai di bawahnya sampai hanya ada satu nilai yang tersisa di tumpukan.

Pada dasarnya ia menemukan angka untuk angka terkecil di pangkalan nyang berisi nangka berbeda (untuk n> 1 selalu dalam bentuk1023...(n-1) ). Ini kemudian menghitung angka yang diberikan angka dan alas.

Kode Beranotasi

(({})<>)       # 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
0 '
sumber
Anda dapat mengganti {}{}(()(<()>))([][()])dengan (<{}{}>)([(())][])untuk menyimpan empat byte
Post Rock Garf Hunter
Anda kemudian dapat menggantinya dengan (<{}{}>)((()))untuk menyimpan empat byte lagi
Post Rock Garf Hunter
1

Julia, 26 byte

\(n,k=n)=k<3?n:n\~-k*n+~-k

Cobalah online!

Dennis
sumber
1

PHP, 78 Bytes

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

Versi Online

60 Bytes hanya berfungsi hingga n = 16 dengan ketepatan dalam testcases

Untuk n = 144 INF

n = 145 NAN

for(;$j<$a=$argn;)$t+=($j<2?1-$j:$j)*$a**($a-1-$j++);echo$t;
Jörg Hülsermann
sumber
0

JavaScript (ES6), 39 byte

Tidak digunakan =>

function f(b,n){throw f(b,n>2?--n:1)*b}
pengguna71511
sumber
Selamat datang di PPCG!
Stephen