Root Daya Minimal


22

The kekuatan iterasi minimal dari sejumlah n didefinisikan sebagai berikut:

MPI(n):=nmin(digits(n))

Yaitu, dinaikkan ke digit terendah dalam . Misalnya, dan .nnMPI(32)=322=1024MPI(1234)=12341=1234

The akar daya minimal dari nomor didefinisikan sebagai jumlah yang diperoleh dari berulang kali menerapkan sampai titik tetap ditemukan. Berikut adalah tabel dari akar minimal angka antara 1 dan 25:nMPI

   n              MPR(n)
--------------------------
   1                   1
   2                   1
   3              531441
   4                   1
   5                3125
   6 4738381338321616896
   7                   1
   8            16777216
   9                   1
  10                   1
  11                  11
  12                  12
  13                  13
  14                  14
  15                  15
  16                  16
  17                  17
  18                  18
  19                  19
  20                   1
  21                  21
  22                   1
  23              279841
  24                   1
  25                   1

Tantangan: Menghasilkan angka-angka yang root daya minimalnya tidak sama dengan 1 atau dirinya sendiri.

Berikut adalah 50 angka pertama dalam urutan ini:

3, 5, 6, 8, 23, 26, 27, 29, 35, 36, 39, 42, 47, 53, 59, 64, 72, 76, 78, 82, 83, 84, 92, 222, 222, 223, 227, 228, 229, 233, 237, 237, 254, 263, 267, 268, 269, 273, 276, 277, 278, 279, 285, 286, 287, 289, 299, 296, 335, 338, 339, 342

Aturan

  • Anda dapat menghasilkan nangka pertama dari urutan ini (0 atau 1-diindeks), menghasilkan nistilah th, membuat generator yang menghitung istilah-istilah ini, output banyak dari mereka, dll.
  • Anda dapat mengambil input dan memberikan output di pangkalan apa pun, tetapi perhitungan untuk MPR harus di pangkalan 10. Misalnya, Anda dapat mengambil input ###(di unary) dan output ### ##### ######(di unary)
  • Anda harus menghasilkan angka. Anda mungkin tidak (misalnya) mengeluarkan "3", "5", "6", karena itu adalah string. 3, 5, 6dan 3 5 6keduanya valid. Mengeluarkan 2 3,, "23"atau twenty-threesemuanya dianggap sebagai representasi tidak valid dari nomor tersebut 23. (Sekali lagi, Anda dapat menggunakan basis apa pun untuk mewakili angka-angka ini.)
  • Ini adalah , jadi kode terpendek (dalam byte) menang.

2
Hanya ingin tahu, bagaimana Anda bisa membuktikan bahwa suatu titik tetap ditemukan pada akhirnya untuk semua?
nwellnhof

1
@nwellnhof (bukti kasar.) Misalkan tidak ada titik tetap , yaitu MPR ( x ) tidak ada. Misalkan x i menjadi iterasi ke- i dari fungsi MPI di atas x . Urutan ini adalah sangat meningkat, karena sebuah b > a b c untuk semua a , b , c 2 . Menjadi benar-benar meningkat, probabilitas tidak ada digit di x i menjadi 0 atau 1 cenderung ke 0 karena x i cenderung ke arah .xMPR(x)xsayasayaMPIxSebuahb>SebuahbcSebuah,b,c2xsayaxsaya
Conor O'Brien

Hah. Oea tidak memiliki urutan ini.
Draco18s

@ ConorO'Brien Itu menunjukkan hipotesis Anda masuk akal, tetapi itu tidak membuktikannya.
kasperd

1
@kasperd Demikianlah "bukti kasar" sebelumnya.
Conor O'Brien

Jawaban:


5

05AB1E , 8 byte

Menghasilkan nomor ke- 1 yang diindeks

µNÐΔWm}‹

Cobalah online!

Penjelasan

µ          # run until counter equals input
 NÐ        # push 3 copies of the current iteration index (1-based)
   Δ  }    # run this code until the result no longer changes     
    Wm     # raise the number to the power of its minimum digit
       ‹   # check if greater than the index

Opsional sebagai daftar tak terbatas pada jumlah byte yang sama:

∞ʒDΔWm}‹

Cobalah online!


Tunggu, itu saja? ... Itu terlihat jauh lebih mudah daripada yang saya kira akan ...>.> Saya akan menghapus jawaban saya, karena ini lebih dari dua kali lebih panjang ..
Kevin Cruijssen

@KevinCruijssen: Saya sendiri agak terkejut. Kupikir akan membutuhkan 12 byte atau lebih ketika melihat tugas.
Emigna

1
Saya memutar-mutar µdan Δtepat setelah tantangan diposting dan mendapatkan jawaban yang sama persis, tapi saya bertanya-tanya mengapa itu tidak berhasil ... Saya menggunakan Ddaripada Ðkarena saya pikir satu salinan akan digunakan oleh fungsi titik tetap dan yang lain dengan fungsi yang lebih kecil, tetapi saya tidak memperhitungkan bahwa saya membutuhkan salinan lain. Terima kasih, Emigna, untuk memecahkan Enimga saya.
Tn. Xcoder

6

Perl 6 , 49 byte

{grep {($_,{$_**.comb.min}...*==*).tail>$_},1..*}

Cobalah online!

Mengembalikan urutan yang tak terbatas. Saya kira versi 45 byte berikut juga berfungsi, tetapi saya tidak dapat membuktikan bahwa titik tetap selalu ditemukan setelah iterasi.

{grep {($_,{$_**.comb.min}...*)[$_]>$_},3..*}

5

J , 41 39 37 byte

(>:[echo^:(<(^0".@{/:~@":)^:_))^:_]1x

Cobalah online!

Yang ini adalah program lengkap mencetak urutan yang tak terbatas. Suatu kesempatan yang sangat langka di mana sebuah program lengkap mengalahkan kata kerja dalam J.

Bagaimana itu bekerja

(>:[echo^:(<mpi_fix))^:_]1x    Using the mpi_fix below; it finds the MPI fixpoint
          (<mpi_fix)           Is mpi_fix greater than the input?
    echo^:                     If so, apply echo; do nothing otherwise
                               echo returns an empty array
 >:[                           Discard the above and return input+1
(                   )^:_       Repeat the above infinitely (increment has no fixpoint)
                        ]1x    starting from arbitrary-precision number 1

J , 41 39 byte

>:^:(>:(^0".@{/:~@":)^:_)^:_@>:@]^:[&0x

Cobalah online!

Kata kerja monadik. Diberikan indeks berbasis 1, mengembalikan angka pada indeks itu. Catatan kaki memeriksa bahwa 20 istilah pertama sudah benar.

Membaca kata "fixpoint", saya langsung berpikir, "Oh ya, ^:_akan melakukan pekerjaan yang hebat." Kemudian saya berakhir dengan kekejian pada wajah-wajah yang marah dan sedih ini. Dan itu bahkan bukan kereta, itu kata kerja tunggal .

Tidak Digubah & Cara kerjanya

nth_term =: >:^:(>:(^0".@{/:~@":)^:_)^:_@>:@]^:[&0x

mpi =: ^0".@{/:~@":    Find the MPI
             /:~@":    Sort the string representation
        0   {          Take first item
         ".@           Convert back to number
       ^               Raise the input to the power of above

mpi_fix =: mpi^:_      Find the MPI fixpoint

next_term =: >:^:(>:mpi_fix)^:_@>:    Given a number, find the next term
                               @>:    Increment once, and then...
                  >:mpi_fix           Is mpi_fix not greater than input?
             >:^:           ^:_       Increment while the above is true

nth_term =: next_term@]^:[&0x    Given one-based index, find the nth term
            next_term@]          Apply next_term monadically
                       ^:[       n times
                          &0x    to the starting value of zero

Integer presisi arbitrer 0xdiperlukan untuk menghitung fixpoint secara akurat, misalnya dari angka 6.


Besar! Itu banyak ^:, kepala saya mulai sakit pada yang kedua dari mereka :)
Galen Ivanov


33 byte: _&(_&(]]+]>:(^{.@/:~&.":)^:_)>:)*mengambil input sebagai bilangan bulat yang diperluas
mil

4

Pyth , 10 byte

.f>u^GshS`

Cobalah online!

nGZZQ.fQu^GshS`GZ

Kode root daya minimal berfungsi dengan menemukan titik tetap uuntuk meningkatkan angka saat ini Gke kekuatan digit minimalnya, yang sama dengan digit pertama ( h) diurutkan secara leksikografis ( S), kemudian dikonversi kembali ke integer ( s).


4

Jelly , 10 byte

*DṂƊƬḊCȦµ#

Tautan monadik yang mengambil bilangan bulat I,, dari STDIN yang menghasilkan Ientri pertama .

Cobalah online!

( *DṂƊƬṪ%@µ#bekerja untuk 10 juga)

Bagaimana?

Menghitung mulai n=0sampai inputhasil kebenaran dari fungsi monadik ditemukan dan menghasilkan nitu.

Fungsi berulang kali menerapkan fungsi monadik lain yang dimulai dengan x=ndan mengumpulkan nilai xhingga hasilnya tidak lagi unik. (misalnya: 19hasil [19]; hasil ; 23hasil [23,529,279841]; 24hasil [24, 576, 63403380965376, 1]; dll ...) dan kemudian dequeues hasilnya (menghilangkan nilai paling kiri), melengkapi semua nilai ( 1-x) dan menggunakan Ȧuntuk menghasilkan 0ketika ada nol dalam daftar atau jika kosong.

Fungsi terdalam meningkatkan arus xke semua digit xdan kemudian menjaga minimum (melakukan ini adalah byte menyimpan lebih dari menemukan digit minimum terlebih dahulu).

*DṂƊƬḊCȦµ# - Link (call the input number I)
         # - count up from 0 and yield the first I for which this yields a truthy value:
        µ  -   a monadic chain:
    Ƭ      -     collect until results are not unique:
   Ɗ       -       last three links as a monad:
 D         -         convert to a list of decimal digits
*          -         exponentiate
  Ṃ        -         minimum
     Ḋ     -     dequeue
      C    -     compliment
       Ȧ   -     any-and-all?

Penggunaan cerdik ƬḊCȦdi sana. :-)
Erik the Outgolfer

Ṫ>mengambil 0:(
Jonathan Allan

4

Mathematica, 59 51 byte

-8 Bytes berkat Misha Lavrov .

Select[Range@#,#<(#//.x_:>x^Min@IntegerDigits@x)&]&

Fungsi murni. Mengambil nomor sebagai input, dan mengembalikan daftar istilah hingga nomor tersebut sebagai output. Tidak ada yang rumit di sini.


FixedPointbiasanya tidak sebagus //.(kependekan ReplaceRepeated) dalam kode golf. Di sini, kami dapat menyimpan beberapa byte dengan Select[Range@#,1<(#//.x_:>x^Min@IntegerDigits@x)!=#&]&.
Misha Lavrov

Juga, jika MPI (x) bukan 1 atau x, maka selalu lebih besar dari x, jadi solusi yang lebih pendek adalah Select[Range@#,#<(#//.x_:>x^Min@IntegerDigits@x)&]&.
Misha Lavrov

3

Python 3 , 90 88 byte

-2 bytes oleh @mypetlion

def F(x):m=x**int(min(str(x)));return[int,F][m>x](m)
x=1
while 1:x<F(x)and print(x);x+=1

Cobalah online!

printsebagai ekspresi menyimpan dua byte daripada menggunakan ifpernyataan dalam Python 2. Fmenghitung fixpoint MPI; sisanya memberikan urutan tak terbatas ke STDOUT.


Ubah return m>x and F(m)or mke return[int,F][m>x](m)untuk menyimpan 2 byte.
mypetlion


3

Haskell, 67 62 byte

filter((<)<*>until((==)=<<g)g)[1..]
g a=a^read[minimum$show a]

Mengembalikan daftar yang tak terbatas.

Cobalah online!



2

Java 10, 178 173 byte

v->{for(int x=1,m;;){var b=new java.math.BigInteger(++x+"");for(m=9;m>1;)b=b.pow(m=(b+"").chars().min().orElse(0)-48);if(b.compareTo(b.valueOf(x))>0)System.out.println(x);}}

Port jawaban Ruby @GB , juga dicetak tanpa batas.

Cobalah online.

Penjelasan:

v->{             // Method with empty unused parameter and no return-type
  for(int x=1,   //  Start an integer `x` at 1
      m;         //  Temp integer for the smallest digit, starting uninitialized
      ;){        //  Loop indefinitely
    var b=new java.math.BigInteger(++x 
                 //   Increase `x` by 1 first
          +"");  //   And create a BigInteger `b` for the new `x`
    for(m=9;     //   Reset `m` to 9
        m>1;)    //   Loop as long as the smallest digit is not 0 nor 1
      b=b.pow(m=(b+"").chars().min().orElse(0)-48
                 //    Set `m` to the smallest digit in `b`
              ); //    Set `b` to `b` to the power of digit `m`
    if(b.compareTo(b.valueOf(x))>0)
                 //   If `b` is larger than `x`:
      System.out.println(x);}}
                 //    Print `x` with a trailing newline


1

JavaScript (Node.js) , 98 90 89 86 byte

-3 byte terima kasih @Conor O'Brien

function*(){for(n=0n;;x>n&&(yield n))for(x=++n;(b=Math.min(...""+x))-1;)x**=BigInt(b)}

Cobalah online!

Menggunakan fakta bahwa M.PR(n)>n jika M.PR(n){1,n}

Tampaknya generator lebih pendek daripada mengembalikan array nangka?

Atau mencetak tanpa batas - 72 byte

for(n=0n;;x>n&&alert(n))for(x=++n;(b=Math.min(...""+x))-1;)x**=BigInt(b)

Cobalah online!


86 byte dengan memindahkan beberapa aliran kontrol, menghilangkan kawat gigi. (terutama: if(x>n)yield nuntuk x>n&&(yield n)sebagai ekspresi)
Conor O'Brien



0

Racket , 270, 257 233 byte

(define(f n)(local((define(m x)(expt x(-(first(sort(map char->integer(string->list(~v x)))<))48)))(define(g y)(if(= y(m y))y(g(m y))))(define(k x l)(if(=(length l)n)l(if(< x(g x))(k(+ x 1)(cons x l))(k(+ x 1)l)))))(reverse(k 1'()))))

Cobalah online!

Ini adalah raket pertamaku pengiriman , jadi pasti bisa bermain golf lebih jauh. Namun demikian saya agak puas, setidaknya untuk mengelola menyelesaikan tugas.

Lebih mudah dibaca:

(define (f n)
  (local ((define (m x)
           (expt x
                 (- (first (sort (map char->integer (string->list (~v x)))
                                 <))
                    48)))
         (define (g y)
           (if
             (= y (m y))
             y
             (g (m y))))
         (define (k x l)
           (if (= (length l) n)
               l
               (if (< x (g x))
                   (k (+ x 1) (cons x l))
                   (k (+ x 1) l))))
    (reverse (k 1 '()))))

0

Aksioma, 168 byte

u(x)==(y:=x::String;x^reduce(min,[ord(y.i)-48 for i in 1..#y])::NNI)
q(a:PI):PI==(b:=a;repeat(c:=u(b);c=b=>break;b:=c);b)
z(x)==[i for i in 1..x|(m:=q(i))~=1 and m~=i]

Fungsi untuk menggunakannya adalah z (); di sini ia mencetak angka-angka yang memiliki nomor satu korrisponden bukan 1, tidak sendiri dan kurang dari argumennya.

(6) -> z 1000
 (6)
 [3, 5, 6, 8, 23, 26, 27, 29, 35, 36, 39, 42, 47, 53, 59, 64, 72, 76, 78, 82,
  83, 84, 92, 222, 223, 227, 228, 229, 233, 237, 239, 254, 263, 267, 268,
  269, 273, 276, 277, 278, 279, 285, 286, 287, 289, 296, 335, 338, 339, 342,
  346, 347, 348, 354, 358, 363, 365, 372, 373, 374, 376, 382, 383, 386, 392,
  394, 395, 399, 423, 424, 426, 427, 428, 432, 433, 435, 436, 442, 447, 459,
  462, 464, 466, 467, 468, 469, 476, 477, 479, 483, 487, 488, 489, 493, 494,
  523, 524, 527, 529, 533, 537, 542, 546, 553, 556, 557, 562, 563, 572, 573,
  577, 582, 583, 584, 594, 595, 598, 623, 626, 627, 629, 632, 633, 642, 646,
  647, 648, 663, 664, 669, 672, 676, 682, 683, 684, 693, 694, 695, 698, 722,
  724, 729, 736, 759, 763, 773, 775, 782, 786, 823, 829, 835, 846, 847, 856,
  873, 876, 885, 893, 894, 896, 923, 924, 928, 933, 953, 954, 962, 969, 973,
  974, 984, 993, 994, 995]
                                               Type: List PositiveInteger

0

Visual Basic .NET (.NET Core) , 290 byte (termasuk impor)

Iterator Function A()As System.Collections.IEnumerable
Dim i=B.One,q=i,p=i
While 1=1
q=i-1
p=i
While q<>p
For j=0To 9
If p.ToString.Contains(j)Then
q=p
p=B.Pow(p,j)
Exit For
End If
Next
End While
If p>1And p<>i Then Yield i
i+=1
End While
End Function

Cobalah online!

Membutuhkan impor berikut:

Imports B = System.Numerics.BigInteger

Ini menggunakan fungsi iterator untuk mengembalikan daftar bilangan bulat tak terbatas (dimuat malas) yang memenuhi kriteria. PenggunaanBigInteger untuk menghindari batasan ukuran, khususnya dengan perhitungan menengah.

Tidak golf:

Iterator Function A() As System.Collections.IEnumerable
    Dim i As B = 1
    While True
        Dim prevProduct As B = 0
        Dim product As B = i
        While prevProduct <> product
            For j = 0 To 9
                If product.ToString.Contains(j) Then
                    prevProduct = product
                    product = B.Pow(product, j)
                    Exit For
                End If
            Next
        End While
        If product <> 1 And product <> i Then
            Yield i
        End If
        i += 1
    End While
End Function

0

Common Lisp , 238 byte

(defun x(m n o p q)(setf i(sort(map 'list #'digit-char-p(prin1-to-string m))#'<))(setf j(expt m(first i)))(cond((= q p)nil)((and(= n j)(not(= n 1))(not(= n o)))(cons o(x(1+ o)0(1+ o)p(1+ q))))((= n j)(x(1+ o)0(1+ o)p q))(t(x j j o p q))))

Cobalah online!


0

APL (NARS), 96 karakter, 192 byte

r←f w;k;i;a
   r←⍬⋄k←1
A: i←k
B: →C×⍳i=a←i*⌊/⍎¨⍕i⋄i←a⋄→B
C: →D×⍳(a=k)∨a=1⋄r←r,k
D: k+←1⋄→A×⍳k≤w

tes (hasil parsial untuk argumen 22 tampaknya jauh lebih besar sehingga <21 argumen saya tidak tahu apakah boleh ok)

  f 21
3 5 6 8 


0

C (dentang) + -DL=long long -lm, 213 byte

q(char*a,char*b){return*a>*b;}L f(L a){char*c;asprintf(&c,"%lld",a);qsort(c,strlen(c),1,q);L b=pow(a,*c-48);return b>a?f(b):b;}i;g(j){for(i=0;j;i++){L x=f(i);x!=i&x!=1&x>0&&printf("%d\n",i)&&j--;}}

Cobalah online!

Fungsi g(j)mencetak jistilah pertama dari urutan.


Kembali dengan a=...menyimpan selusin byte.

Dan x>1bukannya x!=1&x>0.

Namun, yang pertama membutuhkan perubahan ke GCC.

0

Sekam , 16 12 10 byte

fS>ωṠ^o▼dN

Disimpan 6 byte berkat H.PWiz.
Cobalah online!

Penjelasan

fS>ωṠ^o▼dN
f        N       Filter the natural numbers where...
   ω             ... the fixed point...
    Ṡ^o▼d        ... of raising the number to its smallest digit...
 S>              ... is greater than the number.

Anda dapat mengubah di sini dengan S>. Ini memungkinkan Anda untuk meletakkan semuanya dalam satu baris. Juga, tampaknya Anda keliru meninggalkan tautan tio sebelumnya
H.PWiz

0

Japt , 44 byte


_ì ñ g
_gV ¥1?Z:ZpZgV)gW
@@[1X]øXgW}fXÄ}gUÄ

Cobalah online!

Secara substansial berbeda dari jawaban Japt lainnya.

Penjelasan:

                        Empty line preserves the input

_ì ñ g                Function V finds the smallest digit in a number Z
 ì                          Get the digits of Z
   ñ                        Sort the digits
     g                      Get the first (smallest) digit


_gV ¥1?Z:ZpZgV)gW     Function W finds the MPR of a number Z
 gV ¥1?Z                    If V(Z) is 1, then it's stable; return it
        :ZpZgV)             Otherwise get MPI of Z...
               gW           And call W on it ( MPR(Z) == MPR(MPI(Z)) )

@@[1X]øXgW}fXÄ}gUÄ    Main program
@             }gUÄ      Get the nth number by repeatedly applying...    
 @        }fXÄ              Find the next smallest number X which returns false to...
       XgW                    MPR(X)
      ø                       is either...
  [1X]                        1 or X

Dalam hal kemungkinan bermain golf di masa depan, saya melakukan banyak hal secara manual memanggil fungsi pada nomor, yang saya duga dapat dikurangi tetapi saya tidak yakin bagaimana caranya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.