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

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)

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!


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

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!


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

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

(]+10>#@=@":@^)^:_*
FrownyFrog,


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!


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!


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


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.


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


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.


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.


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;


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.

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



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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.