En Küçük Çeşitlendiren Üs


20

Bir pandigital sayı , en az bir kez 0 ila 9 arasındaki her basamağı içeren bir tamsayıdır. 1234567890, 1902837465000000 ve 9023289761326634265 hepsi pandigital. Bu zorluğun amaçları doğrultusunda, 123456789 gibi sayılar pandigital değildir, çünkü 123456789 = 0123456789 olsa da 0 içermezler.

Bir farklı tamsayılar çifti bir tamsayı çifti olan (bir,b) bu tür birb Pandigital olup. b çeşitlendirme üs denir .

Zorluk: bir tamsayısı verildiğinde , karşılık gelen en küçük çeşitlendirme üssü b bulun . Bu bir , bu yüzden bayttaki en kısa program kazanıyor.

(Böyle bir üs olduğunu varsayabilirsiniz, yani programınıza 10 gücü gibi geçersiz giriş verilmeyecektir.)

Çözümünüz, verilen test senaryolarını en azından işleyebilmelidir, ancak teorik olarak tüm geçerli girdileri ele almalıdır.

Bu OEIS ile ilgili A090493 .

Test senaryoları

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
Özel bir durumu belirtmek istiyorum 1234567890 -> 1.
Bubbler

@ Kabarcık Eklendi.
Conor O'Brien

üsler sınır dışı mı?
sudo rm -rf slash

1
123456789Pandigital gibi bir şey mi sayılır? 0123456789Kesinlikle pandigital olan eşittir .
Wastl

1
@wastl hayır, öyle değil.
Conor O'Brien

Yanıtlar:


9

Brachylog (v2), 9 bayt

;.≜^dl10∧

Çevrimiçi deneyin!

Bu bir işlev gönderimi. TIO bağlantısı, bir işlevi tam bir programa dönüştüren bir sarıcı içerir.

açıklama

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


5

Perl 6 , 32 bayt

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

Çevrimiçi deneyin!

Oldukça açıklayıcı.

açıklama

{                              }  # 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 bayt

Girişi BigInt değişmezi olarak alır. 1 yerine true değerini döndürür .

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

Çevrimiçi deneyin!


2
JS'nin şu an bigint'i olduğunu unutmaya devam ediyorum: D
Conor O'Brien

Hiçbir şey maç için görünmüyor Yani 1 yerine gerçek adresinde açıklanan dönen ilgili biraz şüpheli değilim codegolf.meta.stackexchange.com/questions/9263/...
Sparr

3
@Sparr İşte mevcut fikir birliği.
Arnauld

Teşekkürler. Bağlantımla ilgili yeni bir Cevap yazdım.
Sparr


4

Haskell, 50 bayt

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

Çevrimiçi deneyin!

Aynı bayt sayısı:

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

3

J , 25 bayt

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

Çevrimiçi deneyin!

Tek monadik fiil. Giriş, genişletilmiş bir tamsayı olmalıdır (örn. 2x).

Nasıl çalışır

>:@]^:(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

Raket , 110 96 bayt

UltimateHawk sayesinde -14 bayt!

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

Çevrimiçi deneyin!


1
Bu, işlev yerine yinelenerek 96 bayta kısaltılabilir(define(f n[b 1])(if(= 10(length(remove-duplicates(string->list(~v(expt n b))))))b(f n(+ b 1))))
Ultimate Hawk

@UltimateHawk Teşekkürler! Varsayılan parametreleri unuttum ... (yardımcı işlev de varsayılan parametre b'yi
Galen Ivanov

2

Python 3 , 52 47 bayt

@BMO sayesinde

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

Çevrimiçi deneyin!


Sadece bir adım yukarı ama eski kodu kaldırabilir ve başlık satırına "<s> 52 </s> 47" koyabilirsiniz. Herkes merak ediyorsa düzenleme günlüğü eski sürümlerini koruyacak
Veskah

2

05AB1E (eski) , 10 9 bayt

Bay Xcoder sayesinde 1 bayt tasarruf edildi

XµINmÙgTQ

Çevrimiçi deneyin!

açıklama

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
Eski 1 bayt kaydeder: 1µINmÙgTQ- Çevrimiçi deneyin!
Bay Xcoder

@ Mr.Xcoder: Oh evet, o zamanlar örtük çıktı elde ettik N. Teşekkürler!
Emigna

1

Kömür , 19 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

Listenin uzunluğundaki giriş gücünün içermediği rakamlar kalmayana kadar boş dizeyi boş listeye tekrar tekrar itin.

ILυ

Listenin uzunluğunu yazdırın.


Neden inişli çıkışlı?
Luis Mendo

1

K (ngn / k) , 76 bayt

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

Çevrimiçi deneyin!

{ } argüman ile işlev x

|(99#10)\x sayıları 99 ondalık basamaklı ters liste olarak gösteririz - bunu bağımsız değişkene yapın

a::Küresel değişkene atamak a(k hiçbir ucu bulunur. İhtiyacımız abiz alt-fonksiyonların içinde kullanabilirsiniz böylece küresel olması)

{ }{ }\ ilk işlev falsey döndürürken, ara sonuçları koruyarak ikinci işlevi (aka while döngüsü) uygulamaya devam edin

a*\:xher bir arakamının her bir rakamının çarpımı x("dış ürün")

99 99#a*\:x,0 0'lık fazladan bir sütun ekleyin ve tekrar 99x99'a yeniden şekillendirin, bu, i-sıradaki satırı i öğeleri sağa kaydırır, sola 0s ekler (99x99 daha büyük girişler için taşmalara neden olabilir)

+/ toplam

{+/2 99#,/|0 10\x,0}/ yaymak taşıma:

  • { }/ yakınsamaya kadar başvurmaya devam et

  • 0 10\x divmod by 10 (bir çift liste)

  • |0 10\x moddiv tarafından 10

  • 2 99#,/|0 10\x,0 moddiv 10 ile "div" kısmı 1 basamak sağa kaydırıldı

  • +/ toplam

{10>#?(+/|\0<|x)#x} - pandigital için (değil) kontrol edin:

  • |x ters x

  • 0< hangi rakamlar sıfırdan farklı

  • |\ kısmi maksimum

  • +/ sum - bu, içindeki ilk 0 sayısını sayar x

  • 10> 10'dan az mı?

# güçler dizisinin uzunluğu - sonuç budur


1

PowerShell , 107 bayt

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

Çevrimiçi deneyin!

Oldukça basit, [bigint]her yerde kullanmamız gereken bir utanç . Giriş alıyoruz $a, ardından forbaşlatıcı ile bir döngü kuruyoruz $b=1.

Artırdığımız her yineleme $b olmadığını kontrol ettikten sonra $a ^ $b(aracılığıyla powgönderilir) toCharArra y, sortile ed -unique bayrak, daha sonra -joinbir dizi halinde bir araya ed -nadlı eQual aralığına 0..9da -joinbir dizeye ed.

Bu ağız dolusu. Örneğin, bu karşılaştırmak istiyorsunuz 7 ^ 5 = 16807 --> "01678"karşı "0123456789", eşit değiliz belirlemek ve döngü devam eder.

Döngüden çıktıktan sonra, $bgirdilerimize hangisinin uygun olduğunu belirledik ve bunu boru hattında bırakın. Çıktı örtük.


1

Java, 108 bayt

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

Çevrimiçi deneyin!

açıklama

Kaba kuvvet, bir ^ b'yi 10 (veya daha fazla karakter içeren bir dize bulana kadar döngüye sokar, ancak bu yalnızca 0 ila 9 arası karakter olacağından imkansızdır).

BigDecimalher ikisi de gereklidir, çünkü Math.powyeterince doğru değildir (durumda başarısız olur 11) ve ayrıca Doublea'yı bir String'e varsayılan olarak dönüştürmek , bu bir pandigital numarası bulma yöntemini kıran bilimsel gösterimi gösterir.


Java vars varsayılan olarak 0'da başlamıyor mu? Başlatma işlemini ortadan kaldırarak 2 bayt kaydedilebilir.
Darrel Hoffman

@DarrelHoffman Örnek değişkenleri var, evet. Yerel kapsamdaki değişkenler bunu yapmaz.
Hypino

Ah, tamam. Java'da çalıştığımdan beri biraz zaman geçti, bu teknikliği unuttum.
Darrel Hoffman

Bu değiştirerek 6 byte kaydetmek new java.math.BigDecimal(a).pow(++b).toString()için (new java.math.BigDecimal(a).pow(++b)+"")(ve arka yarı kolon lambda fonksiyonları için sayılması zorunda değildir). Çevrimiçi deneyin
Kevin Cruijssen

1

Pyth, 10 8 bayt

fq;l{`^Q

Burada çevrimiçi deneyin .

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

FryAmTheEggman, önceki kod sayesinde 2 bayt kaydedildi fq;l{j^QT;


Sayıları bir dizeye dönüştürmek için backtick komutunu kullanmak yerine, temel işlem yapmak yerine temel işlemde kalmanıza izin verir T.
FryAmTheEggman

0

Jöle , 12 11 bayt

1*@ṾØDfƑʋ1#

Çevrimiçi deneyin!

Nasıl çalışır

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

Temiz , 107101 bayt

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

Çevrimiçi deneyin!

Girdiyi şu şekilde alır Integer, döndürürInt



0

Ataşesi , 27 bayt

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

Çevrimiçi deneyin!

açıklama

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

Alternatifler

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

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

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

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

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

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.