È un numero di Munchausen?


30

Un numero di Munchausen nella base B , noto anche come invariante da cifra a cifra perfetta o PDDI è un tipo peculiare di numero intero positivo in cui la somma delle sue cifre di base B sollevate a se stesse è uguale al numero stesso. Prendono il nome dal barone immaginario Munchausen , che apparentemente si sollevò attraverso la sua coda di cavallo per salvarsi dall'annegamento. Un concetto correlato sono i numeri narcisistici .

Ad esempio, 1 è banalmente un numero di Munchausen in ogni base perché . Inoltre, ogni numero intero positivo è un numero di Munchausen in base 1 per definizione.11=1

Ancora più interessante, è un numero di Munchausen in base 10 perché , e in realtà è l'unico altro numero di Munchausen in base 10 .343533+44+33+55=3435

Un elenco parziale dei numeri di Munchausen in ogni base fino a 35 può essere trovato sull'OEIS come sequenza A166623 .

Dato un numero intero positivo , determinare se si tratta di un numero di Munchausen in qualsiasi base .n>0b2

Regole

  • Si applicano le regole I / O predefinite, quindi:
    • Il programma completo o le funzioni sono accettabili.
    • L'input può essere da STDIN, come argomento di funzione, e l'output può essere su STDOUT, come valore di ritorno di una funzione, ecc.
  • Si applicano scappatoie predefinite.
  • L'output deve essere uno dei due risultati distinti e coerenti. Quindi TRUEva bene per la verità e FALSEva bene per la falsità, ma puoi invertirla o tornare Noneper la verità e 1per la falsità o altro. Si prega di specificare i risultati selezionati nella risposta.
  • La tua risposta deve funzionare almeno teoricamente per qualsiasi numero intero positivo.
  • I numeri di Munchausen usano la convenzione , quindi è un numero di Munchausen base-2 come . Il tuo codice deve seguire questa convenzione.00=1211+00=2
  • Le spiegazioni sono fortemente incoraggiate, anche se molto probabilmente gli invii useranno il metodo di ricerca della forza bruta.
  • L'uso delle lingue esoteriche ti fa guadagnare punti brownie poiché Munchausen era apparentemente una persona strana.

Casi test

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

Questo è , quindi vince la risposta più breve in ogni lingua (in byte)!


Possiamo supporre che la base massima che dobbiamo calcolare sia 35/36?
Benjamin Urquhart

7
@BenjaminUrquhart no non puoi; determine if it's a Munchausen number in any base b≥2.
Giuseppe

Che ne dici di indovinare "no". Esiste un numero infinitamente numerabile di numeri interi e un numero dimostrabile di Munchausens, quindi la probabilità di scegliere un numero di Munchausen è (n) / (Infinito) = 0. // anatre e corre
Carl Witthoft

@CarlWitthoft Ho riso del suggerimento, ma ovviamente sarebbe una presentazione non valida :-)
Giuseppe

Risposte:


13

05AB1E , 7 byte

LвDmOQZ

Provalo online!

I casi di test più grandi scadranno su TIO.

Spiegazione

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
In che modo questo filtro base-1 dai risultati?
Shaggy

1
@Shaggy: con questa conversione di base, tutti i numeri sono 1 in base-1. L'unico numero che restituirà true per 1^1è 1 .
Emigna

5

Gelatina , 8 byte

bŻ*`§ċ⁸Ị

Rendimenti 0per Munchausen e 1non.

Provalo online!
Oppure vedi i primi cinquecento numeri interi positivi divisi come[[Munchausen], [non-Munchausen]].

Come?

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)

Alternativa per 1Munchausen e 0altrimenti:

bŻ*`§ċ>1

Uhm ... perché penso che la tua versione precedente fosse valida e questa non è valida?
Erik the Outgolfer

Penso che la mia versione precedente non fosse valida poiché non diceva che 1era Munchausen.
Jonathan Allan,

5

J , 33 28 27 byte

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

Provalo online!

  • e. l'ingresso è un elemento di ...
  • 1#. la somma di ogni riga di ...
  • i.@>: ... ] 0..input e input stesso, passati come args left e right a ...
  • ^~@(#.inv)"0converte l'arg (input) di destra in ciascuna base dell'arg di sinistra e solleva ciascun risultato in modo elementare su se stesso ^~@.
  • ::1infine questo è necessario perché non è possibile convertire in modo univoco in base 1, quindi errori. in questo caso, restituiamo semplicemente 1, che non corrisponderà per nessun numero tranne 1, che è quello che vogliamo

4

R , 72 69 byte

-1 byte grazie a digEmAll

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

Provalo online!

Uscite TRUEper numeri di Munchausen e FALSEnon.

x%/%b^(0:log(x,b))%%b)viene convertito xin base be il ciclo for esegue il resto del lavoro (riassegnazione F, che è FALSEdi default).

Dobbiamo consentire alla base bdi andare fino in fondo x+1invece di xgestire il caso x=1.



@digEmAll Grazie! Mi sono rasato altri 2 byte usando valori booleani anziché interi.
Robin Ryder,

Stavo cercando di capire che cosa si è modificato per salvare 2 byte dal mio Oltre a cambiare +con |e la rimozione !, poi ho capito che ho scritto 71 ma il mio codice era in realtà 70: D
digEmAll

Ottima idea usando | A proposito!
digEmAll

@digEmAll Oh sì, non ho nemmeno pensato di controllare il conteggio dei byte! :)
Robin Ryder


3

Perl 6 , 51 byte

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

Provalo online!

Spiegazione:

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

Rubino , 50 byte

TIO è scaduto il 591912. In qualche modo, il Perl si spegne di 1 byte ... (al momento della scrittura)

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

Provalo online!


3

JavaScript (ES7), 60 byte

Restituisce un valore booleano.

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

Provalo online!

Commentate

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 byte

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

Provalo online!

Grazie ad Adám, ngn e dzaima, siamo riusciti a eliminare 10 byte da questa risposta usando dzaima / APL.

Prefisso funzione tacita. I numeri di Munchausen restituiscono 1, altrimenti 0.

Come

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

Carbone , 17 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Il mio tentativo di 16 byte non ha funzionato, ma potrebbe trattarsi di un bug in Carbone, quindi osserva questo spazio. Emette a -meno che il numero non sia un numero di Munchausen. Spiegazione:

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

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

Provalo online!

Restituisce i 0numeri di Munchausen e1 contrario.


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

Provalo online!


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)

Provalo online!

Ritorna 1per la verità e 0per la falsità. A causa della ricorsione, praticamente non ci si può occupare 591912, ma funziona in astratto.



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}

1

Icona , 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

Provalo online!

Time out per 591912. L'icona considera 0^0un overflow ed è per questo che ho bisogno di un controllo aggiuntivo per zero.


1

Stax , 15 byte

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

Esegui ed esegui il debug

Richiede molto tempo per i casi di test più grandi.

Spiegazione:

{^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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.