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


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.