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


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)



4

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

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

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

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


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

Ракетка , 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

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подходит для нашего ввода, и оставим это на конвейере. Вывод неявный.


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в строку по умолчанию показывает научную запись, что нарушает этот метод поиска числа-пандигита.


Разве 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;


Вы можете использовать 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

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