Munchausen Numarası mı?


30

Bir Münchausen sayısı baz içinde b , aynı zamanda olarak da bilinen mükemmel parmak-haneli değişmez veya PDDI da baz-toplamı pozitif tamsayı kendine özgü bir türüdür kendilerine yükseltilmiş basamak sayısının kendisine eşittir. Onlar boğulmaktan kurtulmak için kendi at kuyruğu ile kendini açıkça çıkaran kurgusal Baron Munchausen adına seçildi . İlgili bir kavram Narsistik rakamlardır .b

Örneğin, temelde her bazda bir Munchausen sayısıdır, çünkü . Ek olarak, her pozitif tamsayı, tanımına göre temel-1 Munchausen sayısıdır.111=1

Daha ilginç olarak, bir baz-10 Munchausen numarasıdır, çünkü ve aslında sadece diğer baz-10 Munchausen numarasıdır .343533+44+33+55=3435

OEIS'de A166623 dizisi olarak 35'e kadar her kaidede bulunan Munchausen sayılarının kısmi bir listesi bulunur .

Olumlu bir tamsayı verildiğinde , herhangi bir bazında bir Munchausen numarası olup olmadığını .n>0b2

kurallar

  • Varsayılan G / Ç kuralları geçerlidir, yani:
    • Tam program veya fonksiyonlar kabul edilebilir.
    • Girdi, işlev argümanı olarak STDIN'den olabilir ve çıktı, işlev geri dönüş değeri vb. Olarak STDOUT olabilir.
  • Varsayılan boşluklar uygulanır.
  • Çıktı iki farklı, tutarlı sonuçtan biri olmalıdır. Öyleyse TRUE, truthy FALSEiçin iyi ve falsy için iyidir, ancak bunu tersine çevirebilir ya da Nonetruthy ile 1sahte ya da her neyse geri döndürebilirsiniz . Lütfen seçtiğiniz sonuçları cevabınızda belirtiniz.
  • Cevabınız, pozitif bir tamsayı için en azından teorik olarak çalışmak zorunda.
  • Munchausen sayıları kuralını kullanır , bu yüzden bir bazdır-2 Munchausen sayısı . Kodunuz bu sözleşmeye uymalıdır.00=1211+00=2
  • Sunumlar büyük olasılıkla kaba kuvvet arama yöntemini kullansa bile, açıklamalar şiddetle teşvik edilmektedir.
  • Ezoterik dilleri kullanmak, Munchausen görünüşte garip bir insan olduğundan, kek puanları kazanıyor.

Test Kılıfları

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

Bu , yani her dilde (bayt cinsinden) en kısa cevap kazanır!


Hesaplamak için gereken maksimum tabanın 35/36 olduğunu varsayabilir miyiz?
Benjamin Urquhart

7
@ BenjaminUrquhart hayır, olmayabilir; determine if it's a Munchausen number in any base b≥2.
Giuseppe

Sadece "hayır" ı tahmin etmeye ne dersin? Sayılabilir bir tam sayı ve son derece sınırlı sayıda Munchausens vardır, bu yüzden bir Munchausen numarası seçme olasılığı (n) / (Infinity) = 0'dır. // ördekler ve koşular
Carl Witthoft

@CarlWitthoft Öneriye güldüm, ama elbette bu geçersiz bir sunum olurdu :-)
Giuseppe

Yanıtlar:


13

05AB1E , 7 bayt

LвDmOQZ

Çevrimiçi deneyin!

Büyük test vakaları TIO'da zaman aşımına uğrayacak.

açıklama

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

3
Bu filtreleme tabanı-1 sonuçlardan nasıl?
Shaggy,

1
@Shaggy: Bu temel dönüşüm ile tüm sayılardır 1 baz-1'de. İçin de geçerlidir dönecektir tek sayı 1^1ise 1 .
Emigna

5

Jöle , 8 bayt

bŻ*`§ċ⁸Ị

Verim 0Munchausen'ten için ve 1aksi.

Çevrimiçi deneyin!
Ya da ilk beş yüz pozitif tamsayılar bölmek bkz olarak[[Munchausen], [non-Munchausen]].

Nasıl?

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)

1Munchausen için alternatif ve 0başka:

bŻ*`§ċ>1

Um ... neden önceki sürümünüzün geçerli olduğunu ve bunun geçersiz olduğunu düşünüyorum?
Outgolfer Erik,

Sanırım önceki 1sürümüm , bunun Munchausen olduğunu söylemediğinden geçersizdi .
Jonathan Allan,

5

J , 33 28 27 bayt

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

Çevrimiçi deneyin!

  • e. Giriş bir unsurudur ...
  • 1#. Her satırın toplamı ...
  • i.@>: ... ] 0..put ve giriş kendisi, sol ve sağ olarak geçti ...
  • ^~@(#.inv)"0sağ argümanı (giriş) sol argümandaki her bir kata dönüştürün ve her sonucu elemanlı olarak kendine kaldırın ^~@.
  • ::1Sonunda buna ihtiyaç vardır çünkü benzersiz olarak 1. üsse dönüştüremezsiniz, bu yüzden hata yapar. Bu durumda, sadece 1 döndürürüz, 1 dışında herhangi bir sayı ile eşleşmeyecektir , istediğimiz şey budur.

4

R , 72 69 bayt

DigEmAll sayesinde -1 bayt

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

Çevrimiçi deneyin!

TRUEMunchausen sayıları ve FALSEdiğer çıktılar .

x%/%b^(0:log(x,b))%%b)dönüştürür xtabanına bve (yeniden atama işin geri kalanı yapar döngü için Fise, FALSEvarsayılan olarak).

Davayı ele balmak x+1yerine üsse sonuna kadar gitmesine izin xvermeliyiz x=1.



@digEmAll Teşekkürler! Tamsayılar yerine booleanlar kullanarak başka bir 2 byte'ı kestim.
Robin Ryder

Sana değişen yanında madenden 2 bayt kaydetmek için değiştirildi anlamaya çalışıyordu +ile |ve kaldırma !, o zaman ben 71 yazdım fark ama benim kod aslında 70 idi: D
digEmAll

Kullanma harika bir fikir | Btw!
digEmAll

@digEmAll Oh evet, bayt sayınızı kontrol etmeyi bile düşünmedim! :)
Robin Ryder


3

Perl 6 , 51 bayt

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

Çevrimiçi deneyin!

Açıklama:

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


3

JavaScript (ES7), 60 bayt

Bir Boolean değeri döndürür.

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

Çevrimiçi deneyin!

Yorumlananlar

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

3

APL (dzaima / APL) , 23 13 bayt

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

Çevrimiçi deneyin!

Adám, ngn ve dzaima sayesinde, dzaima / APL kullanarak bu cevaptan 10 byte çıkmayı başardık.

Önek özelliği. Munchausen sayıları 1, diğer 0 döndürür.

Nasıl

⊢∊⊂+.*⍨⍤⊤⍨¨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.


2

Kömür , 17 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. 16 baytlık denemem işe yaramadı ama bu Kömür'de bir hata olabilir, bu yüzden bu boşluğu izleyin. Çıkışlar -sayı sürece Munchausen sayıdır. Açıklama:

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


2

Haskell, 61 bayt

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

TrueMunchausen ve benzeri için döndürür False.

Çevrimiçi deneyin!


2

C (gcc) -lm , 79 75 bayt

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;}

Çevrimiçi deneyin!

0Munchausen sayıları ve diğerlerini döndürür 1.


ayrıca 75 bayt

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;}

Çevrimiçi deneyin!


2

Python 2 , 83 81 bayt

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)

Çevrimiçi deneyin!

1Truthy ve falsey 0için döndürür . Özyineleme nedeniyle, pratik olarak başa çıkamaz 591912, ancak soyut olarak çalışır.



1

JavaScript (ES6), 88 bayt

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}

1

Simge , 109 bayt

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

Çevrimiçi deneyin!

İçin zaman aşımına uğradı 591912. Simge0^0 taşma olarak kabul edilir ve bu yüzden sıfır için ek bir kontrole ihtiyacım var.


1

Stax , 15 bayt

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

Koş ve hata ayıkla

Büyük test vakaları için çok uzun sürüyor.

Açıklama:

{^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
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.