É um número de Munchausen?

30

Um número de Munchausen na base b , também conhecido como invariante perfeito de dígito a dígito ou PDDI é um tipo peculiar de número inteiro positivo em que a soma dos dígitos da base b elevados para si mesmos é igual ao número em si. Eles são nomeados para o fictício Barão Munchausen , que aparentemente se ergueu através de seu próprio rabo de cavalo para se salvar do afogamento. Um conceito relacionado são os números narcisistas .

Por exemplo, 1 é trivialmente um número de Munchausen em todas as bases porque 11=1 . Além disso, todo número inteiro positivo é um número Munchausen de base 1 por definição.

Mais interessante, 3435 é um número Munchausen de base 10 porque 33+44+33+55=3435 e, de fato, é o único outro número Munchausen de base 10 .

Uma lista parcial dos números de Munchausen em todas as bases até 35 pode ser encontrada no OEIS como sequência A166623 .

Dado um número inteiro positivo n>0 , determine se é um número de Munchausen em qualquer base b2 .

Regras

  • As regras de E / S padrão se aplicam, portanto:
    • Programa completo ou funções são aceitáveis.
    • A entrada pode ser de STDIN, como argumento de função, e a saída pode ser para STDOUT, como um valor de retorno de função, etc.
  • Aplicam-se brechas padrão.
  • A saída deve ser um dos dois resultados distintos e consistentes. O mesmo TRUEvale para a verdade e FALSEpara a falsidade, mas você pode reverter isso ou retornar Nonepara 1a verdade e a falsidade ou qualquer outra coisa. Especifique os resultados selecionados em sua resposta.
  • Sua resposta deve funcionar pelo menos teoricamente para qualquer número inteiro positivo.
  • Os números de Munchausen usam a convenção 00=1 , então 2 é um número de Munchausen de base 2 como 11+00=2 . Seu código deve seguir esta convenção.
  • As explicações são fortemente encorajadas, embora as submissões provavelmente usem o método de busca por força bruta.
  • O uso de idiomas esotéricos ganha pontos extras, já que Munchausen era aparentemente uma pessoa estranha.

Casos de teste

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

Isso é , então a resposta mais curta em cada idioma (em bytes) vence!

Giuseppe
fonte
Podemos assumir que a base máxima que precisamos calcular é 35/36?
Benjamin Urquhart
7
@BenjaminUrquhart não, você não pode; determine if it's a Munchausen number in any base b≥2.
Giuseppe
Que tal adivinhar "não". Há um número infinitamente contável de números inteiros e um número comprovadamente finito de Munchausens; portanto, a probabilidade de escolher um número de Munchausen é (n) / (Infinito) = 0. // patos e corre
Carl Witthoft
@CarlWitthoft Eu ri da sugestão, mas é claro que isso seria um envio inválido :-)
Giuseppe

Respostas:

13

05AB1E , 7 bytes

LвDmOQZ

Experimente online!

Os casos de teste maiores expirarão no TIO.

Explicação

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
fonte
3
Como essa filtragem é a base-1 dos resultados?
Shaggy
1
@ Shagy: Com esta conversão de base, todos os números são 1 na base-1. O único número que retornará verdadeiro para 1^1é 1 .
Emigna
5

Gelatina , 8 bytes

bŻ*`§ċ⁸Ị

Rende 0para Munchausen e 1outros.

Experimente online!
Ou veja os primeiros quinhentos inteiros positivos divididos como[[Munchausen], [non-Munchausen]].

Quão?

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 e 0caso contrário:

bŻ*`§ċ>1
Jonathan Allan
fonte
Um ... por que eu acho que sua versão anterior era válida e esta é inválida?
Erik the Outgolfer
Acho que minha versão anterior era inválida, pois não dizia que 1era Munchausen.
Jonathan Allan
5

J , 33 28 27 bytes

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

Experimente online!

  • e. é a entrada um elemento de ...
  • 1#. a soma de cada linha de ...
  • i.@>: ... ] 0..input e a própria entrada, passados ​​como argumentos à esquerda e à direita para ...
  • ^~@(#.inv)"0converta o arg direito (entrada) em cada base no arg esquerdo e aumente cada resultado elementwise para si mesmo ^~@.
  • ::1finalmente, isso é necessário porque você não pode converter exclusivamente na base 1, por isso erros. nesse caso, simplesmente retornamos 1, que não corresponde a nenhum número, exceto 1, que é o que queremos
Jonah
fonte
4

R , 72 69 bytes

-1 byte graças a digEmAll

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

Experimente online!

Saídas TRUEpara números de Munchausen e FALSEoutros.

x%/%b^(0:log(x,b))%%b)converte xem base be o loop for faz o resto do trabalho (reatribuição F, que é FALSEpor padrão).

Precisamos permitir que a base bpercorra todo o caminho, em x+1vez de xlidar com o caso x=1.

Robin Ryder
fonte
@digEmAll Thanks! Raspei outros 2 bytes usando booleanos em vez de números inteiros.
Robin Ryder
Eu estava tentando entender o que você mudou para salvar 2 bytes de mina além de mudar +com |e remover !, então eu percebi que eu escrevi 71, mas meu código era na verdade 70: D
digEmAll
Ótima idéia usando | BTW!
digEmAll
@digEmAll Ah, sim, eu nem pensei em verificar sua contagem de bytes! :)
Robin Ryder
3

Japonês , 13 bytes

õ@ìXÄ x_pZ
øN

Guardou um byte graças a @Shaggy

Tente

Modalidade de ignorância
fonte
@Shaggy Corrigido ao custo de um byte
Modalidade de ignorância
Você pode recuperar esse byte substituindo ÃÃøUpor <newline>øN.
Shaggy
@ Shaggy truque agradável com N, eu nunca usei antes!
Modalidade de ignorância
3

Perl 6 , 51 bytes

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

Experimente online!

Explicação:

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

Ruby , 50 bytes

O TIO atingiu o tempo limite de 591912. De alguma forma, limita o Perl em 1 byte ... (no momento da escrita)

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

Experimente online!

Value Ink
fonte
3

JavaScript (ES7), 60 bytes

Retorna um valor booleano.

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

Experimente online!

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

APL (dzaima / APL) , 23 13 bytes

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

Experimente online!

Graças a Adám, ngn e dzaima, conseguimos extrair 10 bytes dessa resposta usando dzaima / APL.

Função de prefixo tácito. Os números de Munchausen retornam 1, mais 0.

Quão

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

Carvão , 17 bytes

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

Experimente online! Link é a versão detalhada do código. Minha tentativa de 16 bytes não funcionou, mas isso pode ser um bug no Charcoal, portanto, observe este espaço. Saídas -, a menos que o número seja um número Munchausen. Explicação:

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
fonte
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]

Retorna Truepara Munchausen e Falseoutros.

Experimente online!

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

Experimente online!

Retorna 0para números de Munchausen e 1outros.


também 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;}

Experimente online!

attinat
fonte
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)

Experimente online!

Retorna 1para verdade e 0para falsey. Por causa da recursão, praticamente não é possível lidar com isso 591912, mas funciona em abstrato.

Chas Brown
fonte
1

Perl 6 , 66 65 bytes

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

Experimente online!

bb94
fonte
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
fonte
1

Ícone , 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

Experimente online!

Tempos limite para 591912. O ícone trata 0^0como um estouro e é por isso que preciso de uma verificação adicional para zero.

Galen Ivanov
fonte
1

Stax , 15 bytes

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

Execute e depure

Leva muito tempo para os casos de teste maiores.

Explicação:

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