Najmniejszy wykładnik dywersyfikacji

20

Liczba pandigitalna jest liczbą całkowitą, która co najmniej raz zawiera każdą cyfrę od 0 do 9. 1234567890, 1902837465000000 i 9023289761326634265 są pandigitalne. Do celów tego wyzwania liczby takie jak 123456789 nie są pandigitalne, ponieważ nie zawierają 0, mimo że 123456789 = 0123456789.

Zróżnicowane pary liczb całkowitych ma parę liczb (a,b) , tak że b jest Pandigital. b nazywa się wykładnikiem dywersyfikującym .abb

Wyzwanie: Biorąc pod uwagę liczbę całkowitą a , znajdź najmniejszy odpowiadający wykładnik dywersyfikacji b . To jest , więc wygrywa najkrótszy program w bajtach.

(Możesz założyć, że istnieje taki wykładnik, to znaczy, że twój program nie otrzyma nieprawidłowych danych wejściowych, takich jak potęga 10.)

Twoje rozwiązanie musi być w stanie obsłużyć co najmniej podane przypadki testowe, ale teoretycznie powinno obsługiwać wszystkie prawidłowe dane wejściowe.

To jest A090493 w OEIS.

Przypadki testowe

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
Conor O'Brien
źródło
3
Chcę zwrócić uwagę na szczególny przypadek 1234567890 -> 1.
Bubbler,
@Bubbler Dodano.
Conor O'Brien,
są ujemne wykładniki poza limitem?
sudo rm -rf slash
1
Czy coś takiego 123456789liczy się jako pandigital? Jest równy 0123456789, co jest zdecydowanie pandigitalem.
wastl
1
@wastl nie, nie ma.
Conor O'Brien,

Odpowiedzi:

9

Brachylog (v2), 9 bajtów

;.≜^dl10∧

Wypróbuj online!

To jest przesłanie funkcji. Łącze TIO zawiera opakowanie, które przekształca funkcję w pełny program.

Wyjaśnienie

;.≜^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
źródło
7

Python 2 , 44 bajty

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

Dane wejściowe muszą być długie, ponieważ ​`k`​zachowują się inaczej dla długich i wewnętrznych.

Wypróbuj online!

Dennis
źródło
5

Perl 6 , 32 bajty

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

Wypróbuj online!

Dość oczywiste.

Wyjaśnienie

{                              }  # 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
Jo King
źródło
4

JavaScript (Node.js) ,  51 46  43 bajtów

Pobiera dane wejściowe jako literał BigInt. Zwraca true zamiast 1 .

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

Wypróbuj online!

Arnauld
źródło
2
Ciągle zapominam, że JS ma teraz bigintów: D
Conor O'Brien
Jestem nieco wątpliwy, czy zwracam wartość true zamiast 1. To nie pasuje do niczego opisanego na codegolf.meta.stackexchange.com/questions/9263/...
Sparr
3
@Sparr Oto aktualny konsensus.
Arnauld,
Dzięki. Umieszczam nową odpowiedź na moim linku, odnosząc się do tego.
Sparr,
4

Haskell, 50 bajtów

f a=until(\b->all(`elem`show(a^b))['0'..'9'])(+1)1

Wypróbuj online!

Ta sama liczba bajtów:

f a=[b|b<-[1..],all(`elem`show(a^b))['0'..'9']]!!0
nimi
źródło
3

J , 25 bajtów

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

Wypróbuj online!

Pojedynczy czasownik monadyczny. Dane wejściowe powinny być liczbami całkowitymi o rozszerzonej precyzji (np 2x.).

Jak to działa

>:@]^:(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
Bubbler
źródło
(]+10>#@=@":@^)^:_*
FrownyFrog,
2

Tcl , 82 bajty

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

Wypróbuj online!

sergiol
źródło
Możesz zapisać więcej bajtów za pomocą llength 82 bajtów
David
Zapisałem trochę bajtów, następnie przejdzie do @david
sergiol
2

Rakieta , 110 96 bajtów

-14 bajtów dzięki UltimateHawk!

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

Wypróbuj online!

Galen Iwanow
źródło
1
Można to skrócić do 96 bajtów poprzez ponowne użycie funkcji(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))
Ultimate Hawk
@UltimateHawk Dziękujemy! Zapomniałem o domyślnych parametrach ... (chociaż funkcja pomocnika również używała domyślnego parametru b ...)
Galen Iwanow
2

Python 3 , 52 47 bajtów

dzięki @BMO

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

Wypróbuj online!

David
źródło
Tylko heads up, ale możesz po prostu usunąć stary kod i wstawić „<s> 52 </s> 47” w wierszu nagłówka. Dziennik edycji zachowa stare wersje, jeśli ktoś będzie ciekawy
Veskah
2

05AB1E (starsza wersja) , 10 9 bajtów

Zaoszczędzony 1 bajt dzięki Mr. Xcoder

XµINmÙgTQ

Wypróbuj online!

Wyjaśnienie

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
źródło
1
Dziedzictwo oszczędza 1 bajt: 1µINmÙgTQ- Wypróbuj online!
Pan Xcoder,
@ Mr.Xcoder: O tak, mieliśmy wtedy dorozumianą moc wyjściową N. Dzięki!
Emigna,
1

Węgiel drzewny , 19 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Kilkakrotnie pchnij pusty ciąg do pustej listy, aż nie będzie żadnych cyfr, których moc wejściowa do długości listy nie zawiera.

ILυ

Wydrukuj długość listy.

Neil
źródło
Dlaczego głosowanie negatywne?
Luis Mendo,
1

K (ngn / k) , 76 bajtów

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

Wypróbuj online!

{ } funkcja z argumentem x

|(99#10)\x reprezentujemy liczby jako odwrócone listy 99 cyfr dziesiętnych - zrób to z argumentem

a::przypisać do zmiennej globalnej a(k nie ma zamknięć. musimy abyć globalni, abyśmy mogli używać jej w podfunkcjach)

{ }{ }\ podczas gdy pierwsza funkcja zwraca falsey, kontynuuj stosowanie drugiej funkcji (czyli pętli while), zachowując wyniki pośrednie

a*\:xkażda z acyfr pomnożona przez każdą z xcyfr („produkt zewnętrzny”)

99 99#a*\:x,0 dodaj dodatkową kolumnę zer i ponownie zmień kształt na 99x99, to przesuwa i-ty rząd o i elementy w prawo, wstawiając 0 po lewej stronie (to działa w przypadku testów, dla większych danych wejściowych 99x99 może prowadzić do przepełnienia)

+/ suma

{+/2 99#,/|0 10\x,0}/ propaguj carry:

  • { }/ aplikuj do momentu konwergencji

  • 0 10\x divmod przez 10 (para list)

  • |0 10\x moddiv o 10

  • 2 99#,/|0 10\x,0 moddiv o 10, z częścią „div” przesuniętą o 1 cyfrę w prawo

  • +/ suma

{10>#?(+/|\0<|x)#x} - sprawdź (nie) pandigital:

  • |x rewers x

  • 0< które cyfry są niezerowe

  • |\ częściowe maksima

  • +/ suma - zlicza liczbę wiodących zer x

  • 10> czy mają mniej niż 10?

# długość sekwencji potęg - oto wynik

ngn
źródło
1

PowerShell , 107 bajtów

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

Wypróbuj online!

Całkiem proste, szkoda, że ​​musimy [bigint]wszędzie używać . Bierzemy dane wejściowe $a, a następnie konfigurujemy forpętlę z inicjatorem $b=1.

Każda iteracja zwiększamy $bpo sprawdzeniu, czy $a ^ $b(przez pow) wysłany toCharArra y, sorted z -unique flagą, następnie -joined razem w ciąg jest -not equal do zakresu 0..9również -joined na sznurku.

To kęs. Na przykład porównałoby to 7 ^ 5 = 16807 --> "01678"z "0123456789", ustaliłoby, że nie są równe i kontynuował pętlę.

Kiedy już nie jesteśmy w pętli, ustaliliśmy, który $bpasuje do naszych danych wejściowych, więc zostawmy to w przygotowaniu. Wynik jest niejawny.

AdmBorkBork
źródło
1

Java, 108 bajtów

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

Wypróbuj online!

Wyjaśnienie

Brutalna siła, zapętlając ^ b, aż znajdzie ciąg zawierający 10 (lub więcej, ale to niemożliwe, ponieważ będzie tylko 0 do 9) unikalnych znaków.

BigDecimaljest wymagany zarówno dlatego, że Math.pownie jest wystarczająco dokładny (nie sprawdza się w przypadku 11), a także dlatego, że Doubledomyślnie konwersja łańcucha na ciąg pokazuje notację naukową, co łamie tę metodę znajdowania liczby pandigitalnej.

Hypino
źródło
Czy wersje Java nie zaczynają się domyślnie od 0? Można zapisać 2 bajty, eliminując inicjalizację.
Darrel Hoffman,
@ Zmienne wystąpienia @DarrelHoffman tak, tak. Zmienne o zasięgu lokalnym nie.
Hypino,
Ach, w porządku. Minęło trochę czasu, odkąd pracowałem w Javie, zapomniałem o tej technice.
Darrel Hoffman
Możesz zaoszczędzić 6 bajtów, zmieniając new java.math.BigDecimal(a).pow(++b).toString()na (new java.math.BigDecimal(a).pow(++b)+"")(a funkcje średnika końcowego nie muszą być liczone dla funkcji lambda). Wypróbuj online
Kevin Cruijssen
1

Pyth, 10 8 bajtów

fq;l{`^Q

Wypróbuj online tutaj .

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

Zaoszczędzono 2 bajty dzięki FryAmTheEggman, poprzedni kod fq;l{j^QT;

Sok
źródło
Możesz użyć strzałki wstecz, aby przekonwertować liczbę na ciąg zamiast konwersji bazowej, co pozwoli ci pominąć Toperację zasilania.
FryAmTheEggman,
0

Galaretka , 12 11 bajtów

1*@ṾØDfƑʋ1#

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
0

Czysty , 107 101 bajtów

import StdEnv,Data.Integer
$a=hd[b\\b<-[1..]|length(removeDup[c\\c<-:toString(prod(repeatn b a))])>9]

Wypróbuj online!

Pobiera dane wejściowe jako Integer, zwracaInt

Obrzydliwe
źródło
0

Attache , 27 bajtów

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

Wypróbuj online!

Wyjaśnienie

${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

Alternatywy

28 bajtów: ${Generate{Unique@S[x^_]@9}}

29 bajtów: ${Generate{Unique[S[x^_]]@9}}

30 bajtów: ${Generate{#Unique[S[x^_]]>9}}

31 bajtów: Generate@${{#Unique[S[x^_]]>9}}

32 bajty: ${Generate[{#Unique[S[x^_]]>9}]}

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

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

Conor O'Brien
źródło