Цифровое разнообразие


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 :)
— Джонатан Аллан

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

Мне понадобилось немного времени, чтобы понять, почему это работает ... отлично сделано!
— Грег Мартин

9

Python, 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

Mutliply nи добавить 3:1023

И так далее.

РЕДАКТИРОВАТЬ: короче использовать карту, кажется.

РЕДАКТИРОВАТЬ 2: Спасибо за совет, м-хзан!


(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

С ++ - 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
  • [&(…)] витки … в инфиксный оператор на месте
  • […]Показано выше превращает инфиксную оп в складки (влево или вправо в зависимости от оператора ассоциативности)

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

Использование:

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

Затем вы можете заменить это (<{}{}>)((()))на еще четыре байта
— Post Rock Garf Hunter,



1

PHP, 78 байт

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

Онлайн версия

60 байт работает только до n = 16 с точностью в тестовых случаях

Для n = 144 INF

n = 145 NAN

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.