Apakah ini Nomor Munchausen?

30

Angka Munchausen dalam basis b , juga dikenal sebagai Invarian digit-ke-digit Sempurna atau PDDI adalah jenis bilangan bulat positif yang aneh di mana jumlah digit basis- b dibangkitkan untuk dirinya sendiri sama dengan angka itu sendiri. Mereka diberi nama untuk fiksi Baron Munchausen , yang tampaknya mengangkat dirinya melalui kucirnya sendiri untuk menyelamatkan dirinya dari tenggelam. Konsep terkait adalah angka narsis .

Misalnya, adalah angka Munchausen yang sepele di setiap basis karena . Selain itu, setiap bilangan bulat positif adalah angka dasar-1 Munchausen menurut definisi.111=1

Lebih menarik, adalah nomor 10 Munchaus basis-10 karena , dan pada kenyataannya adalah satu-satunya nomor Munchaus-10 base-10 lainnya .343533+44+33+55=3435

Sebagian daftar nomor Munchausen di setiap basis hingga 35 dapat ditemukan di OEIS sebagai urutan A166623 .

Diberikan bilangan bulat positif , tentukan apakah itu adalah bilangan Munchausen dalam basis apa punn>0b2 .

Aturan

  • Aturan I / O standar berlaku, jadi:
    • Program atau fungsi penuh dapat diterima.
    • Input bisa dari STDIN, sebagai argumen fungsi, dan output bisa ke STDOUT, sebagai nilai pengembalian fungsi, dll.
  • Celah default berlaku.
  • Keluaran harus merupakan salah satu dari dua hasil yang berbeda dan konsisten. Jadi TRUEbaik untuk kebenaran dan FALSEbaik untuk kepalsuan, tetapi Anda dapat membalikkan itu atau kembali Noneuntuk kebenaran dan 1untuk kepalsuan atau apa pun. Silakan tentukan hasil yang dipilih dalam jawaban Anda.
  • Jawaban Anda harus bekerja setidaknya secara teoritis untuk bilangan bulat positif.
  • Angka Munchausen menggunakan konvensi 00=1 , jadi 2 adalah basis-2 angka Munchausen sebagai 11+00=2 . Kode Anda harus mengikuti konvensi ini.
  • Penjelasan sangat dianjurkan, meskipun pengiriman kemungkinan besar akan menggunakan metode pencarian brute-force.
  • Menggunakan bahasa esoteris memberi Anda poin brownies karena Munchausen tampaknya orang yang aneh.

Uji Kasus

Truthy
1 (all bases)
2 (base 2)
5 (base 3)
28 (base 9 and base 25)
29 (base 4)
55 (base 4)
3435 (base 10)
923362 (base 9)
260 (base 128)
257 (base 64 and base 253)

Falsy
3
4
591912
3163
17

Ini adalah , jadi jawaban tersingkat di setiap bahasa (dalam byte) menang!

Giuseppe
sumber
Bisakah kita mengasumsikan basis maksimum yang perlu kita hitung adalah 35/36?
Benjamin Urquhart
7
@BenjaminUrquhart tidak, Anda mungkin tidak; determine if it's a Munchausen number in any base b≥2.
Giuseppe
Bagaimana kalau hanya menebak "tidak." Ada bilangan bulat yang tak terhingga jumlahnya dan jumlah Munchaus yang terbukti terbatas, sehingga kemungkinan memilih nomor Munchausen adalah (n) / (Infinity) = 0. // bebek dan lari
Carl Witthoft
@CarlWitthoft Saya menertawakan saran itu, tapi tentu saja itu akan menjadi pengiriman yang tidak valid :-)
Giuseppe

Jawaban:

13

05AB1E , 7 byte

LвDmOQZ

Cobalah online!

Kasing uji yang lebih besar akan habis pada TIO.

Penjelasan

L         # push range [1 ... input]
 в        # convert input to a digit list in each of these bases
  Dm      # raise each digit to the power of itself
    O     # sum each
     Q    # check each for equality with input
      Z   # max
Emigna
sumber
3
Bagaimana penyaringan basis-1 ini dari hasil?
Shaggy
1
@Shaggy: Dengan konversi basis ini, semua angka adalah 1 dalam basis-1. Satu-satunya angka yang akan mengembalikan true 1^1adalah 1 .
Emigna
5

Jelly , 8 byte

bŻ*`§ċ⁸Ị

Hasil 0untuk Munchausen dan 1lainnya.

Cobalah online!
Atau melihat lima ratus bilangan bulat positif pertama berpisah sebagai[[Munchausen], [non-Munchausen]].

Bagaimana?

bŻ*`§ċ⁸Ị - Link: integer, n
 Ż       - zero-range -> [0,1,2,3,4,...,n]
b        - (n) to base (vectorises)
   `     - with left as both arguments:
  *      -   exponentiation (vectorises)
    §    - sums
     ċ   - count occurrences of:
      ⁸  -   n
       Ị - is insignificant (abs(x) <= 1)

Alternatif untuk 1Munchausen dan 0sebaliknya:

bŻ*`§ċ>1
Jonathan Allan
sumber
Um ... mengapa saya berpikir bahwa versi Anda sebelumnya valid dan yang ini tidak valid?
Erik the Outgolfer
Saya pikir versi saya sebelumnya tidak valid karena tidak mengatakan itu 1adalah Munchausen.
Jonathan Allan
5

J , 33 28 27 byte

e.1#.i.@>:^~@(#.inv ::1)"0]

Cobalah online!

  • e. adalah input elemen ...
  • 1#. jumlah dari setiap baris ...
  • i.@>: ... ] 0..input dan input itu sendiri, diteruskan sebagai argumen kiri dan kanan untuk ...
  • ^~@(#.inv)"0konversikan arg (input) kanan ke setiap basis di arg kiri dan naikkan setiap hasil dengan elemen itu sendiri ^~@.
  • ::1akhirnya ini diperlukan karena Anda tidak dapat mengonversi secara unik ke basis 1, sehingga kesalahan. dalam hal ini, kami hanya mengembalikan 1, yang tidak akan cocok dengan angka apa pun kecuali 1, yang kami inginkan
Jonah
sumber
4

R , 72 69 byte

-1 byte terima kasih untuk digEmAll

function(x){for(b in 1+1:x)F=F|!sum((a=x%/%b^(0:log(x,b))%%b)^a)-x;F}

Cobalah online!

Output TRUEuntuk nomor Munchausen dan FALSElainnya.

x%/%b^(0:log(x,b))%%b)dikonversi xke basis b, dan loop untuk melakukan sisa pekerjaan (menugaskan kembali F, yang secara FALSEdefault).

Kita harus mengizinkan pangkalan buntuk melangkah lebih jauh x+1daripada xmenangani kasus ini x=1.

Robin Ryder
sumber
@digEmSemua Terima Kasih! Saya mencukur 2 byte lain dengan menggunakan boolean alih-alih bilangan bulat.
Robin Ryder
Saya mencoba memahami apa yang Anda ubah untuk menyimpan 2 byte dari saya selain mengubah +dengan |dan menghapus !, kemudian saya menyadari saya menulis 71 tetapi kode saya sebenarnya 70: D
digEmAll
Ide bagus menggunakan | BTW!
digEmAll
@digEmAll Oh ya, saya bahkan tidak berpikir untuk memeriksa jumlah byte Anda! :)
Robin Ryder
3

Japt , 13 byte

õ@ìXÄ x_pZ
øN

Disimpan satu byte berkat @Shaggy

Cobalah

Perwujudan Ketidaktahuan
sumber
@ Shaggy Diperbaiki dengan biaya satu byte
Perwujudan Ketidaktahuan
Anda bisa mendapatkan yang byte kembali dengan mengganti ÃÃøUdengan<newline>øN .
Shaggy
@ Shaggy Trik yang bagus dengan N, saya tidak pernah menggunakannya sebelumnya!
Perwujudan Ketidaktahuan
3

Perl 6 , 51 byte

{?grep {$_==sum [Z**] .polymod($^a xx*)xx 2},^$_+2}

Cobalah online!

Penjelasan:

{                                                 } # Anonymous code block
 ?grep {                                  }         # Do any
                                           ,^$_+2   # Of the bases from 2 to n+1
            sum                              # Have the sum of
                      .polymod($^a xx*)      # The digits of n in that base
                [Z**]                  xx 2  # Raised to the power of themselves
        $_==                                 # Equal to the original number?
Jo King
sumber
3

Ruby , 50 byte

TIO kehabisan waktu pada 591912. Entah bagaimana tepi Perl oleh 1 byte ... (pada saat penulisan)

->n{(2..n+1).any?{|b|n.digits(b).sum{|d|d**d}==n}}

Cobalah online!

Nilai Tinta
sumber
3

JavaScript (ES7), 60 byte

Mengembalikan nilai Boolean.

n=>(F=b=>(g=n=>n&&g(n/b|0)+(n%=b)**n)(n)==n||b<n&&F(b+1))(2)

Cobalah online!

Berkomentar

n =>                   // n = input
  ( F = b =>           // F = recursive function taking a base b
    ( g = n =>         //   g = recursive function taking an integer n
      n &&             //     if n is not equal to 0:
        g(n / b | 0) + //       do a recursive call with floor(n / b)
        (n %= b) ** n  //       and add (n mod b) ** (n mod b)
    )(n)               //   initial call to g with the original value of n
    == n ||            //   return true if the result is equal to n
    b < n &&           //   otherwise, if b is less than n:
      F(b + 1)         //     try with b + 1
  )(2)                 // initial call to F with b = 2
Arnauld
sumber
3

APL (dzaima / APL) , 23 13 byte

⊢∊⊂+.*⍨⍤⊤⍨¨2

Cobalah online!

Berkat Adám, ngn dan dzaima, kami berhasil mencukur 10 byte dari jawaban ini dengan menggunakan dzaima / APL.

Awalan fungsi diam-diam. Angka Munchausen menghasilkan 1, jika tidak 0.

Bagaimana

⊢∊⊂+.*⍨⍤⊤⍨¨2  Prefix tacit function, argument will be called 

             2  Generate the integer sequence [2..⍵]
          ⊤⍨¨   Convert  to each base in the vector
     +.*⍨⍤       Raise each digit of each element in the vector to itself, then sum
⊢∊⊂             Check if  is in the resulting vector.
J. Sallé
sumber
2

Arang , 17 byte

Nθ¬Φθ⁼θΣE↨θ⁺²ιXλλ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Upaya 16 byte saya tidak berhasil tetapi itu mungkin bug di Charcoal, jadi perhatikan ruang ini. Keluaran -kecuali nomor tersebut adalah nomor Munchausen. Penjelasan:

Nθ                  Input `n` as a number
   Φθ               Try bases `2` .. `n+1`
       Σ            Sum of
         ↨θ         `n` converted to base
           ⁺²ι      Next trial base
        E           Each digit
              Xλλ   Raised to its own power
     ⁼              Equals
      θ             `n`
  ¬                 Logical Not
Neil
sumber
2

Haskell, 61 byte

_#0=0
b#n|m<-mod n b=m^m+b#div n b
f n=elem n$1:map(#n)[2..n]

Pengembalian Trueuntuk Munchausen dan Falsesebaliknya.

Cobalah online!

nimi
sumber
2

C (gcc) -lm , 79 75 byte

f(n,b,i,g,c){for(g=b=1;b+++~n;g*=!!c)for(c=i=n;c-=pow(i%b,i%b),i/=b;);n=g;}

Cobalah online!

Pengembalian 0untuk nomor Munchausen, dan 1sebaliknya.


juga 75 byte

a,b;f(n){for(a=b=1;b+++~n;a*=g(n)!=n);n=a;}g(n){n=n?g(n/b)+pow(n%b,n%b):0;}

Cobalah online!

attinat
sumber
2

Python 2 , 83 81 byte

def f(n,b=2):
 s=0;m=n
 while m:k=m%b;s+=k**k;m/=b
 return s==n or b<n>0<f(n,b+1)

Cobalah online!

Kembali 1untuk kebenaran dan 0kepalsuan. Karena rekursi, secara praktis tidak bisa berurusan dengan 591912, tetapi ia bekerja secara abstrak.

Chas Brown
sumber
1

Perl 6 , 66 65 byte

{$^a==1||[+] map {$a==[+] map {$_**$_},$a.polymod($_ xx*)},2..$a}

Cobalah online!

bb94
sumber
1

JavaScript (ES6), 88 byte

f=n=>{for(b=2;n-b++;){for(c=0,r=n;r;r=(r-a)/b)c+=(a=(r%b))**a;if(n==c)return 1}return 0}
Naruyoko
sumber
1

Ikon , 109 byte

procedure m(n)
every k:=2to n&{i:=n;s:=0
while{a:=i%k;a<:=1;s+:=a^a;0<(i/:=k)}
n=s&return 1}
return n=1|0
end

Cobalah online!

Waktu habis untuk 591912. Ikon memperlakukan 0^0sebagai overflow dan itu sebabnya saya perlu cek tambahan untuk nol.

Galen Ivanov
sumber
1

Stax , 15 byte

╡!←!║╝âñoêû►╦ä▓

Jalankan dan debug itu

Butuh waktu sangat lama untuk kasus uji yang lebih besar.

Penjelasan:

{^xs|E{c|*m|+x=m|a Full program, unpacked
                   Implicitly input x
{              m   Map over bases [1 .. x]
 ^                   Increment base (effectively mapping over [2 .. x+1])
  xs                 Tuck x below base
    |E               Get digits of x in base
      {   m          Map over digits:
       c|*             copy and power
           |+        Sum
             x=      sum = x?
                |a Check if any element in array is true
                   Implicit output
wastl
sumber