¿Es un número Munchausen?

30

Un número de Munchausen en la base b , también conocido como un invariante perfecto de dígito a dígito o PDDI es un tipo peculiar de número entero positivo donde la suma de sus dígitos de base b elevados para sí mismos es igual al número mismo. Se llaman así por el ficticio barón Munchausen , que aparentemente se alzó a través de su propia cola de caballo para evitar ahogarse. Un concepto relacionado son los números narcisistas .

Por ejemplo, 1 es trivialmente un número Munchausen en cada base porque 11=1 . Además, cada entero positivo es un número Munchausen base-1 por definición.

Más interesante aún, 3435 es un número Munchausen de base 10 porque 33+44+33+55=3435 , y de hecho es el único otro número Munchausen de base 10 .

Se puede encontrar una lista parcial de números Munchausen en cada base hasta 35 en el OEIS como secuencia A166623 .

Dado un número entero positivo n>0 , determine si es un número Munchausen en cualquier base b2 .

Reglas

  • Se aplican las reglas predeterminadas de E / S, por lo tanto:
    • El programa completo o las funciones son aceptables.
    • La entrada puede ser de STDIN, como un argumento de función, y la salida puede ser de STDOUT, como un valor de retorno de función, etc.
  • Se aplican las lagunas predeterminadas.
  • El resultado debe ser uno de dos resultados distintos y consistentes. Entonces TRUEestá bien para la verdad y FALSEestá bien para la falsedad, pero puedes revertir eso o regresar Nonepor la verdad y 1por la falsedad o lo que sea. Por favor, especifique los resultados seleccionados en su respuesta.
  • Su respuesta tiene que funcionar al menos teóricamente para cualquier número entero positivo.
  • Los números de Munchausen usan la convención 00=1 , entonces 2 es un número de Munchausen base-2 como 11+00=2 . Su código debe seguir esta convención.
  • Se recomiendan encarecidamente las explicaciones, aunque las presentaciones probablemente utilizarán el método de búsqueda de fuerza bruta.
  • Usar lenguajes esotéricos te da puntos de brownie ya que Munchausen era aparentemente una persona extraña.

Casos de prueba

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

Este es el , por lo que gana la respuesta más corta en cada idioma (en bytes).

Giuseppe
fuente
¿Podemos suponer que la base máxima que necesitamos calcular es 35/36?
Benjamin Urquhart
77
@BenjaminUrquhart no, no puedes; determine if it's a Munchausen number in any base b≥2.
Giuseppe
¿Qué tal simplemente adivinando "no"? Hay un número infinito de enteros y un número de Munchausens probablemente finito, por lo que la probabilidad de elegir un número de Munchausen es (n) / (Infinito) = 0. // se agacha y corre
Carl Witthoft
@CarlWitthoft Me reí de la sugerencia, pero por supuesto sería una presentación inválida :-)
Giuseppe

Respuestas:

13

05AB1E , 7 bytes

LвDmOQZ

Pruébalo en línea!

Los casos de prueba más grandes se agotarán en TIO.

Explicación

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
fuente
3
¿Cómo se filtra esta base-1 de los resultados?
Shaggy
1
@ Shaggy: con esta conversión de base, todos los números son 1 en base-1. El único número que devolverá verdadero 1^1es 1 .
Emigna
5

Jalea , 8 bytes

bŻ*`§ċ⁸Ị

Rendimientos 0para Munchausen y 1otros.

Pruébalo en línea!
O vea los primeros quinientos enteros positivos divididos como [[Munchausen], [non-Munchausen]].

¿Cómo?

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 para 1Munchausen y 0otros:

bŻ*`§ċ>1
Jonathan Allan
fuente
Um ... ¿por qué creo que tu versión anterior era válida y esta no es válida?
Erik the Outgolfer
Creo que mi versión anterior no era válida ya que no decía que 1era Munchausen.
Jonathan Allan
5

J , 33 28 27 bytes

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

Pruébalo en línea!

  • e. es la entrada un elemento de ...
  • 1#. la suma de cada fila de ...
  • i.@>: ... ] 0..input y la entrada en sí, pasados ​​como argumentos izquierdo y derecho a ...
  • ^~@(#.inv)"0 Convierta el argumento derecho (entrada) a cada base en el argumento izquierdo y eleve cada resultado en sentido propio ^~@ .
  • ::1finalmente esto es necesario porque no puede convertir únicamente a la base 1, por lo que es un error. en este caso, simplemente devolvemos 1, que no coincidirá con ningún número excepto 1, que es lo que queremos
Jonás
fuente
4

R , 72 69 bytes

-1 byte gracias a digEmAll

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

Pruébalo en línea!

Salidas TRUE para números de Munchausen y FALSEotros.

x%/%b^(0:log(x,b))%%b)se convierte xen baseb , y el bucle for hace el resto del trabajo (reasignación F, que es FALSEpor defecto).

Necesitamos permitir que la base bllegue hasta el final en x+1lugar de xmanejar el caso x=1.

Robin Ryder
fuente
@digEmAll ¡Gracias! Afeité otros 2 bytes usando booleanos en lugar de enteros.
Robin Ryder
Yo estaba tratando de comprender lo que ha cambiado para salvar 2 bytes de la mina además de cambiar +con |y eliminar !, entonces me di cuenta de que escribí mi código 71 pero en realidad era 70: D
digEmAll
Gran idea usando | Por cierto!
digEmAll
@digEmAll ¡Oh, sí, ni siquiera pensé en comprobar tu recuento de bytes! :)
Robin Ryder
3

Japt , 13 bytes

õ@ìXÄ x_pZ
øN

Guardado un byte gracias a @Shaggy

Intentalo

Encarnación de la ignorancia
fuente
@Shaggy Corregido a costa de un byte
Encarnación de la ignorancia
Puede recuperar ese byte reemplazándolo ÃÃøUcon <newline>øN.
Shaggy
@Shaggy Buen truco con N, ¡nunca lo había usado antes!
Encarnación de la ignorancia
3

Perl 6 , 51 bytes

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

Pruébalo en línea!

Explicación:

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

Ruby , 50 bytes.

TIO agotó el tiempo en 591912. De alguna manera supera a Perl por 1 byte ... (al momento de escribir)

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

Pruébalo en línea!

Tinta de valor
fuente
3

JavaScript (ES7), 60 bytes

Devuelve un valor booleano.

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

Pruébalo en línea!

Comentado

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
fuente
3

APL (dzaima / APL) , 23 13 bytes

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

Pruébalo en línea!

Gracias a Adám, ngn y dzaima, logramos eliminar 10 bytes de esta respuesta usando dzaima / APL.

Función de prefijo tácito. Los números de Munchausen devuelven 1, de lo contrario 0.

Cómo

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

Carbón , 17 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Mi intento de 16 bytes no funcionó, pero eso podría ser un error en el carbón, así que mira este espacio. Salidas a -menos que el número sea un número Munchausen. Explicación:

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
fuente
2

Haskell, 61 bytes

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

Devoluciones Truepara Munchausen y de Falseotra manera.

Pruébalo en línea!

nimi
fuente
2

C (gcc) -lm , 79 75 bytes

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

Pruébalo en línea!

Devoluciones 0para números Munchausen, y de 1otra manera.


también 75 bytes

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

Pruébalo en línea!

attinat
fuente
2

Python 2 , 83 81 bytes

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)

Pruébalo en línea!

Vuelve 1por veracidad y 0por falsey. Debido a la recursividad, prácticamente no se puede tratar 591912, pero funciona en abstracto.

Chas Brown
fuente
1

JavaScript (ES6), 88 bytes

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
fuente
1

Ícono , 109 bytes

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

Pruébalo en línea!

Tiempos de espera para 591912. Icon trata 0^0como un desbordamiento y es por eso que necesito una verificación adicional para cero.

Galen Ivanov
fuente
1

Stax , 15 bytes

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

Ejecutar y depurarlo

Toma mucho tiempo para los casos de prueba más grandes.

Explicación:

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