Наименьший диверсифицирующий показатель

20

Pandigital номер представляет собой целое число , которое содержит все цифры от 0 до 9 , по крайней мере один раз. 1234567890, 1902837465000000 и 9023289761326634265 являются пандигитальными. Для целей этой задачи числа, такие как 123456789, не являются pandigital, поскольку они не содержат 0, хотя 123456789 = 0123456789.

Разнообразная пара целых чисел представляет собой пару целых чисел таким образом, что является Pandigital. называется показателем диверсификации .(a,b)abb

Задача: дать целое число , найти наименьший соответствующий показатель диверсификации . Это , поэтому выигрывает самая короткая программа в байтах.ab

(Вы можете предположить, что существует такой показатель степени, то есть вашей программе не будет дан неверный ввод, такой как степень 10).

Ваше решение должно быть в состоянии обрабатывать как минимум данные тестовые примеры, но теоретически оно должно обрабатывать все действительные входные данные.

Это A090493 на OEIS.

Контрольные примеры

2 -> 68
3 -> 39
4 -> 34
5 -> 19
6 -> 20
7 -> 18
8 -> 28
9 -> 24
11 -> 23
12 -> 22
13 -> 22
14 -> 21
15 -> 12
16 -> 17
17 -> 14
18 -> 21
19 -> 17
20 -> 51
21 -> 17
22 -> 18
23 -> 14
24 -> 19
25 -> 11
26 -> 18
27 -> 13
28 -> 11
29 -> 12
30 -> 39
31 -> 11
32 -> 14
33 -> 16
34 -> 14
35 -> 19
36 -> 10
1234567890 -> 1
Конор О'Брайен
источник
3
Я хочу указать на особый случай 1234567890 -> 1.
Bubbler
@Bubbler Добавлено.
Конор О'Брайен
отрицательные показатели запрещены?
sudo rm -rf slash
1
Что-то подобное 123456789считается пандигитальным? Это равно 0123456789, что, безусловно, пандигитальный.
Wastl
1
@ wastl нет, это не так.
Конор О'Брайен

Ответы:

9

Brachylog (v2), 9 байт

;.≜^dl10∧

Попробуйте онлайн!

Это функция представления. Ссылка TIO содержит оболочку, превращающую функцию в полноценную программу.

объяснение

;.≜^dl10∧
 .≜        Brute-force all integers, outputting the closest to 0
;  ^         for which {the input} to the power of the number
    d        has a list of unique digits
     l10     of length 10
        ∧  (turn off an unwanted implicit constraint)
оборота ais523
источник
7

Python 2 , 44 байта

f=lambda n,k=1:11>len(set(`k`))and-~f(n,n*k)

Ввод должен быть длинным, так как он ​`k`​ведет себя по-разному для длинных и целых чисел.

Попробуйте онлайн!

Деннис
источник
5

Perl 6 , 32 байта

{first ($_** *).comb.Set>9,1..*}

Попробуйте онлайн!

Довольно понятно.

объяснение

{                              }  # Anonymous code block
first                     ,1..*   # First positive number that
      ($_** *)    # When the input is raised to that power
              .comb.Set    # The set of digits
                       >9  # Is longer than 9
Джо Кинг
источник
4

JavaScript (Node.js) ,  51 46  43 байта

Принимает входные данные как литерал BigInt. Возвращает истину вместо 1 .

f=(n,k=n)=>new Set(n+'').size>9||1+f(n*k,k)

Попробуйте онлайн!

Arnauld
источник
2
Я продолжаю забывать, что у JS теперь есть bigint: D
Конор О'Брайен,
Я немного сомнителен о возвращении верно вместо 1. Это , кажется, не соответствует ничего описано в codegolf.meta.stackexchange.com/questions/9263/...
Sparr
3
@Sparr Вот текущий консенсус.
Арнаулд
Благодарю. Я добавил новый Ответ в свою ссылку, ссылаясь на это.
Спарр
3

J , 25 байт

>:@]^:(10>#@~.@":@^)^:_&1

Попробуйте онлайн!

Одиночный монадический глагол. Входные данные должны быть целыми числами с расширенной точностью (например 2x).

Как это устроено

>:@]^:(10>#@~.@":@^)^:_&1    Monadic verb. Input: base a
    ^:              ^:_      Good old do-while loop.
                       &1    Given 1 as the starting point for b,
>:@]                         increment it each step
      (            )         and continue while the condition is true:
               ":@^          Digits of a^b
            ~.@              Unique digits
          #@                 Count of unique digits
       10>                   is less than 10
фонтанчик для питья
источник
(]+10>#@=@":@^)^:_*
FrownyFrog
2

Tcl , 82 байта

proc X d {while {[llength [lsort -u [split [expr $d**[incr i]] ""]]]-10} {}
set i}

Попробуйте онлайн!

sergiol
источник
Вы можете сохранить еще несколько байтов с llength 82 байтами
Дэвид
Сохранено несколько байтов, затем в @david
sergiol
2

Ракетка , 110 96 байт

-14 байт благодаря UltimateHawk!

(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))

Попробуйте онлайн!

Гален Иванов
источник
1
Это можно сократить до 96 байт, вернув вместо этого функцию(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))
Ultimate Hawk
@ UltimateHawk Спасибо! Я забыл о параметрах по умолчанию ... (хотя вспомогательная функция также использовала параметр по умолчанию b ...)
Гален Иванов
2

Python 3 , 52 47 байт

благодаря @BMO

f=lambda n,i=1:len({*str(n**i)})>9or 1+f(n,i+1)

Попробуйте онлайн!

Дэвид
источник
Просто на голову, но вы можете просто удалить старый код и поместить "<s> 52 </ s> 47" в строку заголовка. Журнал редактирования сохранит старые версии, если кому-то интересно
Веска
2

05AB1E (наследие) , 10 9 байтов

Сохранено 1 байт благодаря Mr. Xcoder

XµINmÙgTQ

Попробуйте онлайн!

объяснение

Xµ           # find the first positive integer N that
  INm        # when the input is raised to N
     Ù       # and duplicate digits are removed
      g      # has a length
       TQ    # equal to 10
Emigna
источник
1
Legacy сохраняет 1 байт: 1µINmÙgTQ- Попробуйте онлайн!
г-н Xcoder
@ Mr.Xcoder: О да, у нас был неявный вывод Nтогда. Благодарность!
Emigna
1

Древесный уголь , 19 байт

WΦχ¬№IXIθLυIκ⊞υωILυ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

WΦχ¬№IXIθLυIκ⊞υω

Повторно вставляйте пустую строку в пустой список до тех пор, пока не появятся цифры, которых не содержит мощность ввода в длину списка.

ILυ

Напечатайте длину списка.

Нил
источник
Почему отрицательный голос?
Луис Мендо
1

К (нгн / к) , 76 байт

{#{10>#?(+/|\0<|x)#x}{{+/2 99#,/|0 10\x,0}/+/99 99#,/a*\:x,0}\a::|(99#10)\x}

Попробуйте онлайн!

{ } функция с аргументом x

|(99#10)\x мы представляем числа в виде перевернутых списков из 99 десятичных цифр - сделайте это с аргументом

a::присваивать глобальной переменной a(k не имеет замыканий. нам нужно aбыть глобальными, чтобы мы могли использовать их в подфункциях)

{ }{ }\ в то время как первая функция возвращает Falsey, продолжайте применять вторую функцию (она же цикл), сохраняя промежуточные результаты

a*\:xкаждая из aцифр, умноженная на каждую из xцифр («внешний продукт»)

99 99#a*\:x,0 добавьте дополнительный столбец 0 с и измените форму снова до 99x99, это сместит i-ую строку на элементы i вправо, вставив 0s слева (это работает для тестов, для больших входов 99x99 может привести к переполнению)

+/ сумма

{+/2 99#,/|0 10\x,0}/ размножать нести:

  • { }/ продолжайте применять до схождения

  • 0 10\x делим на 10 (пара списков)

  • |0 10\x Моддив на 10

  • 2 99#,/|0 10\x,0 moddiv на 10, часть div смещена на 1 цифру вправо

  • +/ сумма

{10>#?(+/|\0<|x)#x} - проверить наличие (не) пандигитальности:

  • |x задний ход x

  • 0< какие цифры ненулевые

  • |\ частичные максимумы

  • +/ сумма - это число ведущих 0 в x

  • 10> они меньше 10?

# длина последовательности степеней - это результат

СПП
источник
1

PowerShell , 107 байт

param([bigint]$a)for([bigint]$b=1;-join("$([bigint]::pow($a,$b))"|% t*y|sort -u)-ne-join(0..9);$b=$b+1){}$b

Попробуйте онлайн!

Довольно просто, просто позор, который мы должны использовать [bigint]везде. Мы берем ввод $a, затем настраиваем forцикл с инициализатором $b=1.

Каждая итерация мы увеличиваем $bпосле проверки , является ли $a ^ $b( с помощью pow) , посланный toCharArra y, sortEd с -uNique флагом, а затем -joinобъединено в строку является -nOT eкаче в диапазоне 0..9также -joinизд в строку.

Это полный рот. Например, это было бы сравнить 7 ^ 5 = 16807 --> "01678"с "0123456789", определить , что они не равны, и продолжить цикл.

Как только мы выйдем из цикла, мы определили, что $bподходит для нашего ввода, и оставим это на конвейере. Вывод неявный.

AdmBorkBork
источник
1

Java, 108 байт

a->{int b=0;while(new java.math.BigDecimal(a).pow(++b).toString().chars().distinct().count()<10);return b;};

Попробуйте онлайн!

объяснение

Грубая сила, зацикливая ^ b, пока не найдет строку с 10 (или более, но это невозможно, поскольку будет только от 0 до 9) уникальных символов.

BigDecimalТребуется как потому, что Math.powон недостаточно точен (неудачно в случае 11), так и потому, что преобразование a Doubleв строку по умолчанию показывает научную запись, что нарушает этот метод поиска числа-пандигита.

Hypino
источник
Разве Java vars не начинается с 0 по умолчанию? Может сэкономить 2 байта, исключив инициализацию.
Даррел Хоффман
@DarrelHoffman Переменные экземпляра делают, да. Переменные в локальной области не имеют.
Hypino
Ах, хорошо. Прошло некоторое время с тех пор, как я работал на Java, забыл, что техничность.
Даррел Хоффман
Вы можете сохранить 6 байтов, изменив new java.math.BigDecimal(a).pow(++b).toString()на (new java.math.BigDecimal(a).pow(++b)+"")(и конечная точка с запятой не должна учитываться для лямбда-функций). Попробуйте онлайн
Кевин Круйссен
1

Pyth, 10 8 байт

fq;l{`^Q

Попробуйте это онлайн здесь .

fq;l{`^QT   Implicit: Q=eval(input())
            Trailing T inferred
f           Return (and print) the first positive integer where the following is true:
      ^QT     Raise input to the current number-th power
     `        Convert to string
    {         Deduplicate
   l          Take the length
 q            Is the above equal to...
  ;           10

Сохранено 2 байта благодаря FryAmTheEggman, предыдущий код fq;l{j^QT;

Sok
источник
Вы можете использовать backtick для преобразования числа в строку вместо базового преобразования, которое позволит вам пропустить Tоперацию power.
FryAmTheEggman
0

Желе , 12 11 байт

1*@ṾØDfƑʋ1#

Попробуйте онлайн!

Как это устроено

1*@ṾØDfƑʋ1#  Main link. Argument: n

1            Set the return value to 1.
         1#  Call the link to the left for k = 1, 2, ... and with right argument n,
             until it returns a truthy value.
        ʋ      Combine the four links to the left into a dyadic chain.
 *@              Compute n**k.
   Ṿ             Convert it to its string representation.
    ØD           Yield "0123456789".
      fƑ         Filter and return 1 is the result is equal to the left argument.
Деннис
источник
0

Атташе , 27 байт

${Generate{#Unique[x^_]>9}}

Попробуйте онлайн!

объяснение

${Generate{#Unique[x^_]>9}}
${                        }    lambda, input: x
  Generate{              }     first natural number _ satisfying...
                   x^_             the input to that number
            Unique[   ]          unique digits of ^
           #                   length of ^
                       >9      is greater than 9
                               i.e.: has 10 distinct digits

альтернативы

28 байт: ${Generate{Unique@S[x^_]@9}}

29 байт: ${Generate{Unique[S[x^_]]@9}}

30 байтов: ${Generate{#Unique[S[x^_]]>9}}

31 байт: Generate@${{#Unique[S[x^_]]>9}}

32 байта: ${Generate[{#Unique[S[x^_]]>9}]}

33 байта: ${If[#Unique[x^y]>9,y,x&$!-~y]}&0

34 байта: ${If[#Unique[x^y]>9,y,$[x,y+1]]}&0

Конор О'Брайен
источник