Różnorodność cyfrowa

16

Dodatnia liczba całkowita może być reprezentowana w bazie liczb całkowitych 1 <= b < inf.

Po przekonwertowaniu na tę bazę ma pewną liczbę wyraźnych cyfr.

Każda dodatnia liczba całkowita w bazie 1ma 1wyraźną cyfrę.

Większość liczb całkowitych dodatnich w bazie 2ma 2wyraźne cyfry, z wyjątkiem wyjątków postaci 2^n - 1, które mają tylko cyfry 1.

Tak więc pierwszą dodatnią liczbą całkowitą, która może być reprezentowana w bazie liczb całkowitych z 1unikalną cyfrą, 1a pierwszą, która może być reprezentowana przez 2odrębne cyfry, jest 2.

Można powiedzieć, że 1to pierwsza liczba całkowita z cyfrową różnorodnością 1i 2pierwsza liczba całkowita z cyfrową różnorodnością 2.

Wyzwanie:

Biorąc pod uwagę dodatnią liczbę całkowitą, nzwraca pierwszą dodatnią liczbę całkowitą (w bazie dziesiątej *), która ma różnorodność cyfrową wynoszącą n.

* jeśli twój język obsługuje tylko określoną bazę (np. jednoargumentową lub binarną), możesz generować dane wyjściowe w tej bazie.

Twój algorytm musi działać teoretycznie dla każdego dodatniego wejścia liczb całkowitych: może się nie powieść, ponieważ dokładność liczby całkowitej twojego języka jest zbyt mała dla wyniku; ale może nie powieść, ponieważ konwersja podstawowa jest zdefiniowana tylko do pewnego limitu.

Przypadki testowe

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

To jest , najkrótsze rozwiązanie w bajtach wygrywa.

OEIS: A049363 - również najmniejsza liczba pandigitalna w bazie n.

Jonathan Allan
źródło

Odpowiedzi:

11

Galaretka , 4 bajty

ṖaWḅ

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe

Jak to działa

Ṗ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
źródło
Zapomniałem, że wartości miejsc mogą się przepełnić, biję moją kiepską 7 :)
Jonathan Allan
Żałuję, że nie używałem wykresu Rep vs. vs. bajty na użytkownika na codegolf. Może wykres łącznej liczby użytych bajtów w porównaniu z bieżącym powtórzeniem.
Filip Haglund
Trochę mi zajęło, aby dowiedzieć się, dlaczego to działa ... przebiegle wykonane!
Greg Martin
9

Python, 40 bajtów

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

Przetestuj na Ideone .

Jak to działa

Liczba z n wyraźnymi cyframi musi być wyraźnie wyrażona w podstawie b ≥ n . Ponieważ naszym celem jest zminimalizowanie liczby, b również powinno być tak małe, jak to możliwe, więc b = n jest logicznym wyborem.

To pozostawia nam uporządkowanie cyfr 0,…, n-1, aby utworzyć liczbę tak małą, jak to możliwe, co oznacza, że ​​najbardziej znaczące cyfry muszą być tak małe, jak to możliwe. Ponieważ pierwsza cyfra nie może być 0 w reprezentacji kanonicznej, najmniejszą liczbą jest
(1) (0) (2) ... (n-2) (n-1) n = n n-1 + 2n n-3 +… + (N-2) n + (n-1) , które f oblicza rekurencyjnie.

Dennis
źródło
6

Python 2, 54 46 bajtów

To jest bardzo, bardzo, bardzo ! szybkie, iteracyjne rozwiązanie.

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

Wypróbuj online

Nie ma rekurencji, więc działa przy dużych nakładach. Oto wynik n = 17000(zajmuje 1-2 sekund):

http://pastebin.com/UZjgvUSW

mbomb007
źródło
Jak długo trwało wejście 17000? To zajmuje 26 sekund na mojej maszynie, co wydaje się wolne w porównaniu do 0,9 sekundy Jelly ...
Dennis
Podobnie, ale w drugą stronę za trzy bajty mniej:lambda n:n**~-n+sum(i*n**(n+~i)for i in range(2,n))
Jonathan Allan
2
46 bajtów i dużo szybciej:n=r=input();k=2\nwhile k<n:r=r*n+k;k+=1\nprint r
Dennis
Tak, to niesamowite, o ile szybsze są pętle niż zrozumienie w Pythonie.
Jonathan Allan
@JonathanAllan To nie jest powód. Obliczanie mocy jest bardzo wolne, podczas gdy pętla używa tylko mnożenia i dodawania.
Dennis
5

JavaScript (ES6), 29 bajtów

f=(b,n=b)=>n>2?f(b,--n)*b+n:b
Neil
źródło
5

J, 9 bajtów

#.],2}.i.

Na podstawie metody @Dennis .

Stosowanie

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

Wyjaśnienie

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

Istnieje alternatywne rozwiązanie oparte na wykorzystaniu indeksu permutacji. Biorąc pod uwagę dane wejściowe n , utwórz listę cyfr [0, 1, ..., n]i znajdź permutację za pomocą indeksu n ! I przekonwertuj ją jako listę cyfr n . Odpowiednie rozwiązanie w J dla 12 bajtów

#.]{.!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
mile
źródło
Czy budowa może być krótsza [1,0,2,3,...,n-1]?
Jonathan Allan
1
@JonathanAllan Nie mogę znaleźć sposobu, ale zauważyłem, że wskaźniki permutacji będą wynosić ( n -1)!
mil
4

Rubinowy, 37 35 34 bajtów

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

Odpowiedź na dane pytanie nma formę 10234...(n-1)podstawową n. Używając n=10jako przykład:

Zacznij od n:10

Pomnóż ni dodaj 2:102

Mutliply przez ni dodaj 3:1023

I tak dalej.

EDYCJA: Wydaje się, że użycie mapy jest krótsze.

EDYCJA 2: Dzięki za wskazówkę, m-chrzan!

Lee W.
źródło
(2...n)będzie o bajt krótszy.
m-chrzan
3

CJam , 9 bajtów

ri__,2>+b

Wypróbuj online!

Wyjaśnienie

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
źródło
3

CJam (9 bajtów)

qi_,X2$tb

Demo online

Sekcja

Oczywiście najmniejszą liczbę z cyfrową różnorodnością nmożna znaleźć poprzez konwersję [1 0 2 3 ... n-1]bazy w bazie n. Należy jednak pamiętać, że wbudowana konwersja podstawowa nie wymaga, aby cyfry znajdowały się w zakresie 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

Zauważ, że w szczególnym przypadku n = 1otrzymujemy 1 [0] 1 1 tbdawanie, 1 [0 1] bktóre jest 1.

Peter Taylor
źródło
3

Haskell, 31 bajtów

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

Konwertuje listę [n,2,3,...,n-1]na bazę nprzy użyciu metody Hornera poprzez zwijanie. Mniej golfowa wersja tego znajduje się na stronie OEIS .

Dzięki nim za 3 bajty!

xnor
źródło
Nie znam zbyt dobrze Haskella, czy fold wymaga nazwy ( f?), Aby była poprawnym rozwiązaniem dla golfa? (po prostu fnie ma go w dalszej części kodu)
Jonathan Allan
@JonathanAllan Forma funkcji lambda w Haskell jest \n->fold1...taka sama, jak jej nazwa. Możesz napisać funkcję bez punktów, w której zmienna wejściowa nie ma nazwy, łącząc podfunkcje, ale byłoby to okropne tutaj z trzema odniesieniami do n.
xnor
Fajnie, dziękuję za wyjaśnienie. Składnia Haskella nieco mnie dezorientuje.
Jonathan Allan
Możesz używać foldli zaczynać od n:f n=foldl((+).(*n))n[2..n-1]
nimi
3

05AB1E , 9 bajtów

DL¦¨v¹*y+

Wypróbuj online!

Wyjaśnienie

n = 4 używane na przykład.

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
źródło
2

C ++ - 181 55

Już miał opublikować to naprawdę fajne rozwiązanie, używając <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;});}

i wtedy zdałem sobie sprawę, że jest o wiele łatwiej:

int g(int n){int r=n,j=2;for(;j<n;)r=r*n+j++;return r;}
Anedar
źródło
2

Perl 6 ,  34 31  30 bajtów

Przetłumaczone z przykładu Haskell na stronie 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
  • [&(…)]zamienia się w lokalnego operatora infix
  • […]Pokazano powyżej zwojów op Infix do zagięcia (w lewo lub w prawo w zależności od asocjatywnego operatora)

Rozszerzony:

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

Stosowanie:

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
źródło
2

Brain-Flak , 84 76 bajtów

Dzięki Wheat Wizard za grę w golfa 8 bajtów

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

Wypróbuj online!

Wyjaśnienie

Program wypycha wartości z 0do n-1stosu zastępuje górną 0i za 1pomocą 1oraz 0. Następnie mnoży górę stosu przezn i dodaje wartość poniżej, aż na stosie pozostanie tylko jedna wartość.

Zasadniczo znajduje cyfry dla najmniejszej liczby w bazie, nktóra zawiera nróżne cyfry (dla n> 1 zawsze ma postać 1023...(n-1)). Następnie oblicza liczbę na podstawie cyfr i podstawy.

Kod z adnotacjami

(({})<>)       # 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 '
źródło
Można wymienić {}{}(()(<()>))([][()])ze (<{}{}>)([(())][])aby zapisać czterech bajtów
post rocka GARF Hunter
Następnie możesz zamienić to na, (<{}{}>)((()))aby zaoszczędzić cztery kolejne bajty
Post Rock Garf Hunter
1

Julia, 26 bajtów

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

Wypróbuj online!

Dennis
źródło
1

PHP, 78 bajtów

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

Wersja online

60 bajtów działa tylko do n = 16 z precyzją w przypadkach testowych

Dla 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
źródło
0

k, 12 bajtów

Na podstawie odpowiedzi Dennisa .

{x/x,2+!x-2}
zgrep
źródło
0

JavaScript (ES6), 39 bajtów

Nie używa =>

function f(b,n){throw f(b,n>2?--n:1)*b}
użytkownik71511
źródło
Witamy w PPCG!
Stephen