Это номер Мюнхгаузена?


30

Мюнхгаузно Количество в базовом b , также известный как цифра-цифровой инвариант Совершенного или PDDI является типом свойственно положительного целого числа , где сумма его base- b цифр повышал до себя равно самого числа. Они названы в честь вымышленного барона Мюнхгаузена , который, по-видимому, поднял себя через свой хвост, чтобы спасти себя от утопления. Связанное понятие - Нарциссические числа .

Например, 1 является тривиальным числом Мюнхгаузена в каждой базе, потому что 11=1 . Кроме того, каждое положительное целое число является числом Мюнхгаузена с базой 1 по определению.

Что еще более интересно, 3435 - это число Мюнхгаузена с базой 10, потому что 33+44+33+55знак равно3435 , и фактически является единственным другим числом Мюнхгаузена с базой 10 .

Частичный список чисел Мюнхгаузена в каждой базе до 35 можно найти в OEIS как последовательность A166623 .

Учитывая положительное целое число N>0 , определите, является ли оно числом Мюнхгаузена в любом основании б2 .

правила

  • Применяются правила ввода / вывода по умолчанию, поэтому:
    • Полная программа или функции приемлемы.
    • Входные данные могут быть из STDIN, как аргумент функции, а выходные данные могут быть из STDOUT, как возвращаемое значение функции и т. Д.
  • Применяются лазейки по умолчанию.
  • Результатом должен быть один из двух разных последовательных результатов. Так что TRUEэто хорошо для правды и FALSEхорошо для фальши, но вы можете изменить это или вернуться Noneдля правды и 1фальши или что-то еще. Пожалуйста, укажите выбранные результаты в вашем ответе.
  • Ваш ответ должен работать хотя бы теоретически для любого натурального числа.
  • Числа Мюнхгаузена используют условное обозначение 00знак равно1 , поэтому 2 - это число Мюнхгаузена с основанием 2 как 11+00знак равно2 . Ваш код должен следовать этому соглашению.
  • Разъяснения настоятельно приветствуются, хотя в представленных материалах, скорее всего, будет использоваться метод поиска методом перебора.
  • Использование эзотерических языков приносит вам очки брауни, поскольку Мюнхгаузен был явно странным человеком.

Тестовые случаи

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

Это , поэтому выигрывает самый короткий ответ на каждом языке (в байтах)!


Можем ли мы предположить, что максимальная база, которую нам нужно рассчитать, равна 35/36?
Бенджамин Уркхарт

7
@ BenjaminUrquhart нет, вы не можете; determine if it's a Munchausen number in any base b≥2.
Джузеппе

Как насчет просто угадать "нет" Существует счетное бесконечное число целых чисел и доказуемо конечное число Мюнхгаузена, поэтому вероятность выбора числа Мюнхгаузена равна (n) / (Бесконечность) = 0. // уток и
беги

@CarlWitthoft Я посмеялся над предложением, но, конечно, это было бы неверное представление :-)
Джузеппе

Ответы:


13

05AB1E , 7 байтов

LвDmOQZ

Попробуйте онлайн!

Большие тестовые случаи будут превышать время ожидания на TIO.

объяснение

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
Как проходит фильтрация базы-1 по результатам?
лохматый

1
@ Shaggy: с этим базовым преобразованием все числа 1 в base-1. Единственное число, для которого будет возвращаться значение true, 1^1равно 1 .
Эминья

5

Желе , 8 байт

bŻ*`§ċ⁸Ị

Урожайность 0для Мюнхгаузена и др 1.

Попробуйте онлайн!
Или увидеть первые пятьсот положительных целых чисел, разделенных как[[Munchausen], [non-Munchausen]].

Как?

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)

Альтернатива для 1Мюнхгаузена и др 0.:

bŻ*`§ċ>1

Хм ... почему я думаю, что ваша предыдущая версия была действительной, а эта недействительной?
Эрик Outgolfer

Я думаю, что моя предыдущая версия была недействительной, поскольку в ней не говорилось, что это 1был Мюнхгаузен.
Джонатан Аллан

5

J , 33 28 27 байт

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

Попробуйте онлайн!

  • e. вход является элементом ...
  • 1#. сумма каждого ряда ...
  • i.@>: ... ] 0 .. вход и сам вход, переданные как левый и правый аргументы к ...
  • ^~@(#.inv)"0преобразовать правый аргумент (вход) в каждую базу в левом аргументе и поднять каждый результат поэлементно до самого себя ^~@.
  • ::1наконец, это необходимо, потому что вы не можете конвертировать однозначно в базу 1, поэтому это ошибки. в этом случае мы просто возвращаем 1, что не будет совпадать ни с одним числом, кроме 1, что нам и нужно

4

R , 72 69 байт

-1 байт благодаря digEmAll

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

Попробуйте онлайн!

Выходы TRUEдля номеров Мюнхгаузена и др FALSE.

x%/%b^(0:log(x,b))%%b)преобразует xв базу b, а цикл for выполняет остальную часть работы (переназначение F, которое FALSEпо умолчанию).

Мы должны позволить базе bпройти весь путь, x+1а не xзаниматься делом x=1.



@digEmAll Спасибо! Я сбрил еще 2 байта, используя логические значения вместо целых.
Робин Райдер

Я пытался понять, что вы изменили, чтобы сохранить 2 байта от моего, кроме изменения +с помощью |и удаления !, затем я понял, что написал 71, но мой код был на самом деле 70: D
digEmAll

Отличная идея, используя | Кстати!
digEmAll

@digEmAll О, да, я даже не думал проверять количество байтов! :)
Робин Райдер

3

Japt , 13 байт

õ@ìXÄ x_pZ
øN

Сохранено один байт благодаря @Shaggy

Попытайся


@Shaggy Исправлено ценой байта
Воплощение Невежества

Вы можете вернуть этот байт, заменив ÃÃøUна <newline>øN.
лохматый

@ Shaggy Хороший трюк N, я никогда не использовал его раньше!
Воплощение невежества

3

Perl 6 , 51 байт

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

Попробуйте онлайн!

Объяснение:

{                                                 } # 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 байт

Возвращает логическое значение.

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

Попробуйте онлайн!

комментарии

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 байтов

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

Попробуйте онлайн!

Благодаря Adám, ngn и dzaima нам удалось сократить этот ответ на 10 байт с помощью dzaima / APL.

Префикс молчаливая функция. Числа Мюнхгаузена возвращают 1, иначе 0.

Как

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

Древесный уголь , 17 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Моя 16-байтовая попытка не сработала, но это может быть ошибкой в ​​Charcoal, так что следите за этим. Выходы, -если только число не является числом Мюнхгаузена. Объяснение:

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

Python 2 , 83 81 байт

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)

Попробуйте онлайн!

Возвращается 1за правду и 0за фалси. Из-за рекурсии практически невозможно разобраться 591912, но это работает абстрактно.



1

JavaScript (ES6), 88 байт

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

Stax , 15 байт

╡!←!║╝âñ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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.