Eksponen Diversifikasi Terkecil

20

Angka pandigital adalah bilangan bulat yang berisi setiap digit dari 0 hingga 9 setidaknya satu kali. 1234567890, 1902837465000000, dan 9023289761326634265 semuanya pandigital. Untuk keperluan tantangan ini, angka-angka seperti 123456789 bukan pandigital, karena angka-angka tersebut tidak mengandung angka 0, walaupun 123456789 = 0123456789.

Sebuah beragam sepasang bilangan bulat adalah sepasang bilangan bulat (a,b) sehingga ab adalah Pandigital. b disebut eksponen diversifikasi .

Tantangan: Dengan bilangan bulat a , temukan eksponen diversifikasi yang sesuai terkecil b . Ini adalah , sehingga program terpendek dalam byte menang.

(Anda dapat berasumsi bahwa ada eksponen seperti itu, yaitu, program Anda tidak akan diberi input yang tidak valid, seperti kekuatan 10.)

Solusi Anda harus mampu menangani minimal kasus uji yang diberikan, tetapi harus secara teoritis menangani semua input yang valid.

Ini adalah A090493 pada OEIS.

Uji kasus

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
sumber
3
Saya ingin menunjukkan sebuah kasus khusus 1234567890 -> 1.
Bubbler
@Bubbler Ditambahkan.
Conor O'Brien
Apakah eksponen negatif terlarang?
sudo rm -rf slash
1
Apakah sesuatu seperti 123456789dihitung sebagai pandigital? Itu sama dengan 0123456789, yang pasti pandigital.
wastl
1
@ tidak, tidak.
Conor O'Brien

Jawaban:

9

Brachylog (v2), 9 byte

;.≜^dl10∧

Cobalah online!

Ini adalah pengiriman fungsi. TIO Link berisi pembungkus yang membuat fungsi menjadi program lengkap.

Penjelasan

;.≜^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
sumber
7

Python 2 , 44 byte

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

Input harus panjang, karena ​`k`​berperilaku berbeda untuk jangka panjang dan int.

Cobalah online!

Dennis
sumber
5

Perl 6 , 32 byte

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

Cobalah online!

Cukup jelas.

Penjelasan

{                              }  # 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
sumber
4

JavaScript (Node.js) ,  51 46  43 byte

Mengambil input sebagai literal BigInt. Mengembalikan nilai true sebagai ganti 1 .

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

Cobalah online!

Arnauld
sumber
2
Saya selalu lupa JS memiliki bigint's sekarang: D
Conor O'Brien
Saya sedikit ragu-ragu untuk mengembalikan true, bukan 1. Itu tampaknya tidak cocok dengan apa pun yang dijelaskan di codegolf.meta.stackexchange.com/questions/9263/…
Sparr
3
@Parr Ini adalah konsensus saat ini.
Arnauld
Terima kasih. Saya meletakkan Jawaban baru pada tautan saya yang merujuk pada itu.
Sparr
4

Haskell, 50 byte

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

Cobalah online!

Jumlah byte yang sama:

f a=[b|b<-[1..],all(`elem`show(a^b))['0'..'9']]!!0
nimi
sumber
3

J , 25 byte

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

Cobalah online!

Kata kerja monadik tunggal. Input harus bilangan bulat dengan presisi yang diperluas (mis2x .).

Bagaimana itu bekerja

>:@]^:(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
sumber
(]+10>#@=@":@^)^:_*
FrownyFrog
2

Tcl , 82 byte

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

Cobalah online!

sergiol
sumber
Anda dapat menyimpan lebih banyak byte dengan llength 82 byte
david
Menyimpan beberapa byte, lalu ke @david
sergiol
2

Racket , 110 96 byte

-14 byte, terima kasih kepada UltimateHawk!

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

Cobalah online!

Galen Ivanov
sumber
1
Ini dapat disingkat menjadi 96 byte dengan berulang pada fungsi sebagai gantinya(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))
Ultimate Hawk
@UlalueHawk Terima kasih! Saya lupa tentang parameter default ... (meskipun fungsi helper juga menggunakan parameter default b ...)
Galen Ivanov
2

Python 3 , 52 47 byte

terima kasih kepada @BMO

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

Cobalah online!

David
sumber
Hanya kepala saja tetapi Anda bisa menghapus kode lama dan memasukkan "<s> 52 </s> 47" di baris header. Edit log akan mempertahankan versi lama jika ada yang penasaran
Veskah
2

05AB1E (warisan) , 10 9 byte

Disimpan 1 byte berkat Tn. Xcoder

XµINmÙgTQ

Cobalah online!

Penjelasan

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
sumber
1
Legacy menghemat 1 byte: 1µINmÙgTQ- Cobalah online!
Tn. Xcoder
@ Mr.Xcoder: Oh ya, kami memiliki output implisit Nsaat itu. Terima kasih!
Emigna
1

Arang , 19 byte

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

Cobalah online!Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Dorong berulang kali string kosong ke daftar kosong hingga tidak ada digit yang tidak dapat diisi oleh kekuatan input hingga panjang daftar.

ILυ

Cetak panjang daftar.

Neil
sumber
Mengapa downvote?
Luis Mendo
1

K (ngn / k) , 76 byte

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

Cobalah online!

{ } berfungsi dengan argumen x

|(99#10)\x kami mewakili angka sebagai daftar terbalik dari 99 digit desimal - lakukan itu pada argumen

a::tetapkan ke variabel global a(k tidak memiliki penutup. kita harus aglobal agar kita dapat menggunakannya dalam subfungsi)

{ }{ }\ sementara fungsi pertama mengembalikan falsey, terus menerapkan fungsi kedua (alias while loop), menjaga hasil antara

a*\:xmasing-masing adigit dikalikan dengan masing-masing xdigit ("produk luar")

99 99#a*\:x,0 menambahkan kolom ekstra 0s dan membentuk kembali lagi menjadi 99x99, ini menggeser baris ke-i dengan item ke kanan, menyisipkan 0s di sebelah kiri (ini berfungsi untuk pengujian, untuk input yang lebih besar, 99x99 dapat menyebabkan meluap)

+/ jumlah

{+/2 99#,/|0 10\x,0}/ diperbanyak membawa:

  • { }/ tetap terapkan sampai konvergensi

  • 0 10\x divmod by 10 (sepasang daftar)

  • |0 10\x moddiv oleh 10

  • 2 99#,/|0 10\x,0 moddiv oleh 10, dengan bagian "div" bergeser 1 digit ke kanan

  • +/ jumlah

{10>#?(+/|\0<|x)#x} - periksa pandigital (tidak):

  • |x membalikkan x

  • 0< digit mana yang bukan nol

  • |\ maxima parsial

  • +/ jumlah - ini menghitung jumlah 0 di awal x

  • 10> apakah jumlahnya kurang dari 10?

# panjang urutan kekuatan - ini adalah hasilnya

ngn
sumber
1

PowerShell , 107 byte

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

Cobalah online!

Cukup mudah, hanya rasa malu yang perlu kita gunakan di [bigint]mana-mana. Kami mengambil input $a, lalu mengatur forloop dengan penginisialisasi$b=1 .

Setiap iterasi yang kita tambahkan $bsetelah memeriksa apakah $a ^ $b(via pow) mengirim toCharArra y, sorted dengan -uflag nique, kemudian -joindiedit bersama menjadi string -natau tidak esesuai dengan range 0..9juga-join ed ke dalam string.

Itu seteguk. Misalnya, ini akan dibandingkan 7 ^ 5 = 16807 --> "01678"dengan"0123456789" , menentukan mereka tidak sama, dan melanjutkan loop.

Setelah kami keluar dari loop, kami telah menentukan $binput yang sesuai dengan kami, dan biarkan di jalur pipa. Output tersirat.

AdmBorkBork
sumber
1

Java, 108 byte

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

Cobalah online!

Penjelasan

Brute force, putar a ^ b hingga menemukan string dengan 10 (atau lebih, tapi itu tidak mungkin karena hanya akan ada 0 sampai 9) karakter unik.

BigDecimaldiperlukan baik karena Math.powtidak cukup akurat (gagal pada kasus 11), dan juga karena mengonversi a Doubleke String secara default menunjukkan notasi ilmiah, yang memecah metode ini untuk menemukan nomor pandigital.

Hypino
sumber
Bukankah Java vars mulai dari 0 secara default? Bisa menghemat 2 byte dengan menghilangkan inisialisasi.
Darrel Hoffman
Variabel @DarrelHoffman Instance lakukan, ya. Variabel yang dicakup secara lokal tidak.
Hypino
Ah, baiklah. Sudah beberapa waktu sejak saya bekerja di Jawa, lupa teknis itu.
Darrel Hoffman
Anda dapat menyimpan 6 byte dengan mengubah new java.math.BigDecimal(a).pow(++b).toString()ke (new java.math.BigDecimal(a).pow(++b)+"")(dan trailing semi-colon tidak harus dihitung untuk fungsi lambda). Cobalah online
Kevin Cruijssen
1

Pyth, 10 8 byte

fq;l{`^Q

Cobalah online di sini .

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

Disimpan 2 byte berkat FryAmTheEggman, kode sebelumnya fq;l{j^QT;

Sok
sumber
Anda dapat menggunakan backtick untuk mengonversi angka menjadi string alih-alih melakukan konversi basis yang akan membuat Anda tidak menggunakan Toperasi daya.
FryAmTheEggman
0

Jeli , 12 11 byte

1*@ṾØDfƑʋ1#

Cobalah online!

Bagaimana itu bekerja

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
sumber
0

Bersih , 107 101 byte

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

Cobalah online!

Mengambil input sebagai Integer, mengembalikanInt

Suram
sumber
0

Atase , 27 byte

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

Cobalah online!

Penjelasan

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

Alternatif

28 byte: ${Generate{Unique@S[x^_]@9}}

29 byte: ${Generate{Unique[S[x^_]]@9}}

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

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

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

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

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

Conor O'Brien
sumber