Dijital Çeşitlilik


16

Pozitif bir tam sayı, bir tam sayı bazında temsil edilebilir 1 <= b < inf.

Bu tabana dönüştürüldüğünde, bir dizi ayrı basamak vardır.

Baz herhangi bir pozitif tam sayı 1olan 1tat rakamı.

Tabanında en pozitif tam 2bilgisi 2ayrı basamak, formunkiyle bunun istisnası 2^n - 1, sadece var olan 1.

Bir tamsayı taban temsil edilebilir önce pozitif tamsayıdır Böylece 1tek haneli 1ile temsil edilebilir, birinci 2tat basamağı olan 2.

Biz söyleyebiliriz 1dijital çeşitlilik ile ilk tam sayıdır 1ve 2dijital çeşitlilik ile ilk tam sayıdır 2.

Meydan okuma:

Pozitif bir tamsayı göz önüne alındığında n, dijital çeşitliliği olan ilk pozitif tamsayıyı (taban on *) döndürür n.

* diliniz yalnızca belirli bir tabanı (örn. tekli veya ikili) destekliyorsa, o tabandan çıktı alabilirsiniz.

Algoritmanız herhangi bir pozitif tamsayı girişi için teoride çalışmalıdır : başarısız olabilir, çünkü dilinizin tamsayı hassasiyeti çıktı için çok küçüktür; ancak temel dönüşüm yalnızca belirli bir sınıra kadar tanımlandığı için başarısız olmayabilir .

Test senaryoları

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

Bu , baytlarda en kısa çözüm kazanır.

OEIS: A049363 - ayrıca baz n'deki en küçük pandigital numarası.

Yanıtlar:


11

Jöle , 4 bayt

ṖaWḅ

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın

Nasıl çalışır

Ṗ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.

Yer değerlerinin taşabileceğini unuttum, berbat 7'mi yener :)
Jonathan Allan

Ben kodgolf kullanıcı başına bir temsilcisi vs bayt kullanılan grafik olsaydı. Belki mevcut temsilciye karşı kullanılan toplam bayt grafiği.
Filip Haglund

Bunun neden işe yaradığını anlamaya çalıştım ... dikkatlice yapıldı!
Greg Martin

9

Python, 40 bayt

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

Ideone üzerinde test edin .

Nasıl çalışır

N farklı basamağa sahip bir sayı b ≥ n tabanında açıkça ifade edilmelidir . Hedefimiz sayıyı en aza indirmek olduğundan, b de olabildiğince küçük olmalıdır, bu yüzden b = n mantıklı bir seçimdir.

Bu , mümkün olduğunca küçük bir sayı oluşturmak için 0,…, n-1 rakamlarını düzenlememize izin verir , bu da en önemli rakamların mümkün olduğunca küçük tutulması gerektiği anlamına gelir. Kurallı gösterimde ilk rakam 0 olamaz , en küçük sayı
(1) (0) (2) ... (n-2) (n-1) n = n n-1 + 2n n-3 +… + (N-2) n + (n-1) , ki bu f tekrarlı olarak hesaplar.


6

Python 2, 54 46 bayt

Bu çok çok çok ! hızlı, yinelemeli çözüm.

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

Çevrimiçi deneyin

Özyineleme yok, bu nedenle büyük girdi için çalışıyor. İşte sonucu n = 17000(1-2 saniye sürer):

http://pastebin.com/UZjgvUSW


17000 girişi ne kadar sürdü?
Dennis

Benzer ama üç bayt daha az için başka bir yol:lambda n:n**~-n+sum(i*n**(n+~i)for i in range(2,n))
Jonathan Allan

2
46 bayt ve çok daha hızlı:n=r=input();k=2\nwhile k<n:r=r*n+k;k+=1\nprint r
Dennis

Evet, döngüler Python'daki kavrayıştan ne kadar hızlı olduğu şaşırtıcı.
Jonathan Allan

@JonathanAllan Nedeni bu değil. Döngü yalnızca çarpma ve toplama kullanırken , güçleri hesaplamak çok yavaştır.
Dennis

5

JavaScript (ES6), 29 bayt

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

5

J, 9 bayt

#.],2}.i.

@Dennis ' yöntemine dayanmaktadır .

kullanım

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

açıklama

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

Permütasyon endeksini kullanmaya dayalı alternatif bir çözüm vardır. Giriş Verilen n , basamak listesi oluşturmak [0, 1, ..., n]ve bir dizin kullanılarak permütasyon bulmak n bu baz-listesi gibi! Ve dönüştürmek n basamak. 12 bayt için J'de karşılık gelen çözelti

#.]{.!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

İnşa etmek daha kısa olabilir [1,0,2,3,...,n-1]mi?
Jonathan Allan

1
@JonathanAllan Bir yol bulamıyorum, ama bunların permütasyon indekslerinin ( n -1) olacağını fark ettim !
mil

4

Yakut, 37 35 34 bayt

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

Belirli için cevap nhalini alır 10234...(n-1)tabanında n. n=10Örnek olarak kullanma :

Şununla başla n:10

İle çarpın nve ekleyin 2:102

Mutliply tarafından n ve 3 ekle:1023

Ve bunun gibi.

EDIT: Harita kullanmak daha kısa, öyle görünüyor.

EDIT 2: Bahşiş için teşekkürler, m-chrzan!


(2...n)bayt daha kısa olacaktır.
m-chrzan

3

CJam , 9 bayt

ri__,2>+b

Çevrimiçi deneyin!

açıklama

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.

3

CJam (9 bayt)

qi_,X2$tb

Çevrimiçi demo

teşrih

Tabii ki, dijital çeşitliliği ile en az sayıda nbaz dönüştürücü ile bulunur [1 0 2 3 ... n-1]tabanında n. Ancak, yerleşik temel dönüşümün basamakların aralıkta olmasını gerektirmediğini unutmayı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

Not özel durumda olduğunu n = 1biz olsun 1 [0] 1 1 tbvererek 1 [0 1] bhangi 1.


3

Haskell, 31 bayt

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

Listeyi Horner yöntemini kullanarak katlama yoluyla [n,2,3,...,n-1]tabana dönüştürür n. Bunun daha az golf edilmiş bir versiyonu OEIS sayfasında verilmektedir .

3 bayt için nimi için teşekkürler!


Haskell'i çok iyi bilmiyorum, katlama işlevi fgeçerli bir golf çözümü olarak adlandırılmalı ( ?) İşlevini gerektiriyor mu? ( fkodda daha sonra referans verilmemiştir)
Jonathan Allan

@JonathanAllan Haskell'deki lambda işlev formu, \n->fold1...adlandırma kadar uzun. Alt değişkenleri birleştirerek giriş değişkeninin adlandırılmadığı noktadan bağımsız bir işlev yazabilirsiniz, ancak burada üç referansla korkunç olurdu n.
xnor

Harika, açıklama için teşekkürler. Haskell sözdizimi beni biraz karıştırıyor.
Jonathan Allan

Kullanabilir foldlve nf n=foldl((+).(*n))n[2..n-1]
şununla

3

05AB1E , 9 bayt

DL¦¨v¹*y+

Çevrimiçi deneyin!

açıklama

n = 4 örneğin kullanılır.

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

Şu gerçek serin çözümü kullanarak yayınlamak üzereydi <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;});}

ve sonra ben öyle fark yolu kolaylaştırır:

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

2

Perl 6 ,  34 31  30 bayt

OEIS sayfasındaki Haskell örneğinden çevrilmiştir .

{(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
  • [&(…)]yerinde bir infix operatörüne dönüşür
  • Yukarıda […]gösterilen bir infix op'u bir kıvrım haline getirir (operatör ilişkisine bağlı olarak sola veya sağa)

Expanded:

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

Kullanımı:

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 bayt

8 bayt golf için Buğday Sihirbazı sayesinde

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

Çevrimiçi deneyin!

açıklama

Program değerleri iter 0için n-1yığın üst yerini alır 0ve 1birlikte 1ve 0. Sonra yığının üstünü çarpar ve yığının nüzerinde yalnızca bir değer kalana kadar altına değer ekler.

Temelde n, nfarklı basamaklar içeren tabandaki en küçük sayının rakamlarını bulur ( n> 1 için her zaman formdadır 1023...(n-1)). Daha sonra basamak ve taban verilen sayıyı hesaplar.

Açıklamalı Kod

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

Sen yerini alabilir {}{}(()(<()>))([][()])ile (<{}{}>)([(())][])kaydet dört bayt
Post Rock GARF Hunter

Daha sonra (<{}{}>)((()))dört bayt daha kaydetmek için bunu değiştirebilirsiniz
Post Rock Garf Hunter



1

PHP, 78 Bayt

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

Çevrimiçi sürüm

60 Bayt yalnızca test örneklerindeki hassasiyetle n = 16'ya kadar çalışır

N = 144 INF için

n = 145 NAN

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


0

JavaScript (ES6), 39 bayt

Kullanmaz =>

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

PPCG'ye Hoşgeldiniz!
Stephen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.