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


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.