Цифрова різноманітність


16

Позитивне ціле число може бути представлене в цілій базі 1 <= b < inf.

При перетворенні на цю базу він має деяку кількість різних цифр.

Будь-яке додатне ціле число в базі 1має 1чітку цифру.

Більшість позитивних цілих чисел у базі 2мають 2різні цифри, виняток становлять лише ті форми 2^n - 1, які є 1.

Отже, перше додатне ціле число, яке може бути представлене цілою цілою базою з 1унікальною цифрою, 1і перше, що може бути представлене 2різними цифрами 2.

Можна сказати, що 1це перше ціле число з цифровим різноманіттям 1і 2це перше ціле число з цифровим різноманіттям 2.

Виклик:

З огляду на додатне ціле число nповернемо перше додатне ціле число (у базовій частині десять), яке має цифрове різноманіття 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 :)
— Джонатан Аллан

Мені б хотілося, щоб на кодовому гольфі був використаний графік повторень проти байтів, який використовувався. Можливо, графік загальної кількості байтів, використаних проти поточного представника.
— Філіп Хаглунд

Взяв мене трохи, щоб зрозуміти, чому це працює ... хитро зроблено!
— Грег Мартін

9

Пітон, 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

Python 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 секунд, що здається повільним порівняно з 0,9 секунди Джеллі ...
— Денніс

Аналогічно, але навпаки на три байти менше: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 .

Використання

   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 цифр. Відповідне рішення в 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}

Відповідь на дану nформу складається 10234...(n-1)в основі n. Використовуючи n=10як приклад:

Почніть з n:10

Помножте на nі додайте 2:102

Вмикати відповідь nта додати 3:1023

І так далі.

EDIT: Коротше використовувати карту, здається.

EDIT 2: Дякую за підказку, m-chrzan!


(2...n)буде байт коротше.
— m-chrzan


3

CJam (9 байт)

qi_,X2$tb

Демонстрація в Інтернеті

Розсічення

Очевидно, що найменше число з цифровим різноманіттям nвиявляється шляхом перетворення [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]

Перетворює список [n,2,3,...,n-1]у базу nза допомогою методу Хорнера шляхом складання. Менш гольф-версія цього наведена на сторінці OEIS .

Дякуємо німі за 3 байти!


Я не знаю занадто добре Haskell, чи потрібна складка, щоб функція була названа ( f?), Щоб бути дійсним рішенням для гольфу? (це просто fне посилається пізніше в коді)
— Джонатан Аллан

@JonathanAllan Форма функції лямбда в Haskell є \n->fold1..., що так само, як іменування її. Ви можете написати безточну функцію, коли вхідна змінна не називається комбінуванням підфункцій, але це було б жахливо з трьома посиланнями на n.
— xnor

Класно, дякую за пояснення. Синтаксис Haskell мене дещо бентежить.
— Джонатан Аллан

Ви можете використовувати 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

Perl 6 ,  34 31  30 байт

Перекладено з прикладу Haskell на сторінці 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
  • [&(…)]перетворюється …на місцевого оператора інфікування
  • […]Показано вище перетворює інфіксне оп в складки (вліво або вправо в залежності від оператора асоціативності)

Розширено:

{
  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

Мозг-Флак , 84 76 байт

Завдяки Wheat Wizard за теніс на 8 байт

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

Спробуйте в Інтернеті!

Пояснення

Програма висуває значення від 0до n-1до стека, замінюючи верхню частину 0і 1на 1і 0. Потім він помножує верхню частину стека на 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

Ви можете замінити {}{}(()(<()>))([][()])з , (<{}{}>)([(())][])щоб зберегти чотири байти
— пост -

Потім ви можете замінити це, (<{}{}>)((()))щоб зберегти ще чотири байти
— Post Rock Garf Hunter





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.