Czy to numer Munchausena?


30

Munchausena ilość bazy , znany również jako Doskonałe cyfrowy, do-cyfrowego niezmiennika lub PDDI jest szczególny rodzaj dodatniego gdzie całkowita suma jej Base- cyfr podniesiona do siebie jest równa samą liczbę. Nazwano je od fikcyjnego barona Munchausena , który najwyraźniej podniósł się za pomocą własnego kucyka, aby uchronić się przed utonięciem. Pokrewną koncepcją są liczby narcystyczne .bb

Na przykład jest trywialnie liczbą Munchausena w każdej bazie, ponieważ . Ponadto każda dodatnia liczba całkowita jest z definicji liczbą podstawową 1 Munchausena.111=1

Co ciekawsze, 3435 jest liczbą podstawową 10 Munchausen, ponieważ 33+44+33+55=3435 , i tak naprawdę jest to jedyny inny numer bazowy 10 Munchausen .

Częściową listę liczb Munchausena w każdej bazie do 35 można znaleźć w OEIS jako sekwencję A166623 .

Biorąc pod uwagę dodatnią liczbę całkowitą n>0 , określ, czy jest to liczba Munchausena w jakiejkolwiek bazie b2 .

Zasady

  • Obowiązują domyślne reguły we / wy, więc:
    • Pełny program lub funkcje są dopuszczalne.
    • Dane wejściowe mogą być od STDIN jako argument funkcji, a dane wyjściowe mogą być do STDOUT, jako wartość zwracana przez funkcję itp.
  • Obowiązują domyślne luki.
  • Wynik musi być jednym z dwóch różnych, spójnych wyników. Tak TRUEjest w porządku dla prawdy i FALSEjest w porządku dla fałszu, ale możesz to odwrócić lub powrócić Nonedo prawdy i 1dla fałszu lub czegokolwiek innego. Podaj wybrane wyniki w swojej odpowiedzi.
  • Twoja odpowiedź musi działać przynajmniej teoretycznie dla każdej dodatniej liczby całkowitej.
  • Liczby Munchausena używają konwencji , więc jest liczbą podstawową 2 Munchausena jako . Twój kod musi być zgodny z tą konwencją.00=1211+00=2
  • Wyjaśnienia są zdecydowanie zalecane, nawet jeśli w zgłoszeniach najprawdopodobniej zostanie użyta metoda wyszukiwania z użyciem siły brutalnej.
  • Posługiwanie się językami ezoterycznymi przynosi ci punkty, ponieważ Munchausen był najwyraźniej dziwną osobą.

Przypadki testowe

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

To jest , więc wygrywa najkrótsza odpowiedź w każdym języku (w bajtach)!


Czy możemy założyć, że maksymalna podstawa, którą musimy obliczyć, to 35/36?
Benjamin Urquhart

7
@BenjaminUrquhart nie możesz nie; determine if it's a Munchausen number in any base b≥2.
Giuseppe

Może zgadniesz „nie”. Istnieje niezliczona liczba liczb całkowitych i dająca się udowodnić liczba Munchausena, więc prawdopodobieństwo wybrania liczby Munchausena wynosi (n) / (Nieskończoność) = 0. // kaczki i biegi
Carl Witthoft

@CarlWitthoft Śmiałem się z sugestii, ale oczywiście byłoby to nieprawidłowe zgłoszenie :-)
Giuseppe

Odpowiedzi:


13

05AB1E , 7 bajtów

LвDmOQZ

Wypróbuj online!

Większe przypadki testowe przekroczą limit czasu dla TIO.

Wyjaśnienie

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
Jak wygląda filtrowanie bazy-1 na podstawie wyników?
Kudłaty

1
@Shaggy: W przypadku tej konwersji podstawowej wszystkie liczby są równe 1 w bazie-1. Jedyną liczbą, która zwróci wartość true, 1^1jest 1 .
Emigna

5

Galaretka , 8 bajtów

bŻ*`§ċ⁸Ị

Wydajność 0dla Munchausen i 1nie tylko.

Wypróbuj online!
Lub zobacz pierwsze pięćset dodatnich liczb całkowitych podzielonych jako[[Munchausen], [non-Munchausen]].

W jaki sposób?

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)

Alternatywa dla 1Munchausen i 0poza tym:

bŻ*`§ċ>1

Um ... dlaczego myślę, że twoja poprzednia wersja była ważna, a ta jest nieprawidłowa?
Erik the Outgolfer

Myślę, że moja poprzednia wersja była nieprawidłowa, ponieważ nie mówiłem, że 1to Munchausen.
Jonathan Allan

5

J , 33 28 27 bajtów

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

Wypróbuj online!

  • e. jest wejściem elementem ...
  • 1#. suma każdego wiersza ...
  • i.@>: ... ] 0.. wejście i samo wejście, przekazywane jako lewy i prawy argument do ...
  • ^~@(#.inv)"0przekonwertuj prawy argument (dane wejściowe) na każdą bazę w lewym arg i podnieś każdy wynik elementowo do siebie ^~@.
  • ::1w końcu jest to potrzebne, ponieważ nie można jednoznacznie przekonwertować na bazę 1, więc błędy. w tym przypadku zwracamy po prostu 1, który nie będzie pasował do żadnej liczby oprócz 1, a tego właśnie chcemy

4

R , 72 69 bajtów

-1 bajt dzięki digEmAll

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

Wypróbuj online!

Dane wyjściowe TRUEdla liczb Munchausena i FALSEnie tylko.

x%/%b^(0:log(x,b))%%b)konwertuje xna bazę b, a pętla for wykonuje resztę pracy (ponowne przypisanie F, co jest FALSEdomyślnie).

Musimy pozwolić bazie bprzejść do samego końca, x+1zamiast xzajmować się sprawą x=1.



@digEmAll Thanks! Ogoliłem kolejne 2 bajty, używając boolanów zamiast liczb całkowitych.
Robin Ryder

Starałem się zrozumieć, co zmieniło się uratować 2 bajty z kopalni oprócz zmieniających +się |i usuwanie !, a potem zdałem sobie sprawę, pisał 71 ale mój kod był rzeczywiście 70: D
digEmAll

Świetny pomysł przy użyciu | BTW!
digEmAll

@digEmAll O tak, nawet nie pomyślałem o sprawdzeniu liczby bajtów! :)
Robin Ryder


3

Perl 6 , 51 bajtów

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

Wypróbuj online!

Wyjaśnienie:

{                                                 } # 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 bajtów

Zwraca wartość logiczną.

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

Wypróbuj online!

Skomentował

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 bajtów

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

Wypróbuj online!

Dzięki Adámowi, ngn i dzaima udało nam się zgolić 10 bajtów tej odpowiedzi przy użyciu dzaima / APL.

Funkcja ukrywania przedrostka. Liczby Munchausena zwracają 1, w przeciwnym razie 0.

W jaki sposób

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

Węgiel drzewny , 17 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Moja 16-bajtowa próba nie zadziałała, ale może to być błąd w Charcoal, więc uważaj na to miejsce. Wyprowadza, -chyba że liczba jest liczbą Munchausena. Wyjaśnienie:

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 bajtów

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

Zwraca Truedla Munchausen iFalse nie tylko.

Wypróbuj online!


2

C (gcc) -lm , 79 75 bajtów

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

Wypróbuj online!

Zwraca 0numery Munchausen i 1nie tylko.


także 75 bajtów

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

Wypróbuj online!


2

Python 2 , 83 81 bajtów

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)

Wypróbuj online!

Zwraca 1za prawdę i 0falsey. Z powodu rekurencji praktycznie nie mogę sobie z tym poradzić 591912, ale działa w sposób abstrakcyjny.



1

JavaScript (ES6), 88 bajtów

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

Ikona , 109 bajtów

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

Wypróbuj online!

Przekroczono limit czasu 591912. Ikona traktuje 0^0jak przepełnienie i dlatego potrzebuję dodatkowego sprawdzenia na zero.


1

Stax , 15 bajtów

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

Uruchom i debuguj

Trwa bardzo długo w przypadku większych przypadków testowych.

Wyjaśnienie:

{^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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.