มันเป็นหมายเลข Munchausen หรือไม่?


30

Munchausen จำนวนในฐานยังเป็นที่รู้จักในฐานะที่เป็นหลักในการหลักคงที่ที่สมบูรณ์แบบหรือ PDDI เป็นชนิดที่แปลกประหลาดของจำนวนเต็มบวกที่ผลรวมของ base-ตัวเลขยกตัวเองจะเท่ากับจำนวนของตัวเอง พวกเขาได้รับการตั้งชื่อตามตัวละครของบารอนมันช์เชาซึ่งดูเหมือนจะยกตัวเองผ่านหางม้าของเขาเองเพื่อช่วยตัวเองจากการจมน้ำ แนวคิดที่เกี่ยวข้องเป็นจำนวนหลงตัวเอง

ยกตัวอย่างเช่นคือนิด ๆ จำนวน Munchausen ในฐานทุกเพราะ 1 นอกจากนี้เลขจำนวนเต็มบวกทุกตัวเป็นตัวเลข Munchausen ฐาน -1 ตามคำจำกัดความ111=1

น่าสนใจมากขึ้นเป็นจำนวน Munchausen ฐาน 10 เพราะและในความเป็นจริงอื่น ๆ เพียงฐาน 10 จำนวน343533+44+33+55=3435

รายชื่อบางส่วนของตัวเลข Munchausen ในทุกฐานถึง 35 สามารถพบได้ใน OEIS เป็นลำดับA166623

ป.ร. ให้ไว้เป็นจำนวนเต็มบวก , ตรวจสอบว่าเป็นจำนวน Munchausen ในฐานใดขn>02

กฎระเบียบ

  • ใช้กฎ I / O เริ่มต้นดังนั้น:
    • โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบเป็นที่ยอมรับ
    • อินพุตสามารถมาจาก STDIN เป็นอาร์กิวเมนต์ฟังก์ชันและเอาต์พุตสามารถเป็น STDOUT เป็นค่าส่งคืนฟังก์ชันเป็นต้น
  • ใช้ช่องโหว่เริ่มต้น
  • ผลลัพธ์จะต้องเป็นหนึ่งในสองผลลัพธ์ที่มีความชัดเจนและสอดคล้องกัน ดังนั้นTRUEก็ดีสำหรับความจริงและFALSEก็ดีสำหรับความเท็จ แต่คุณสามารถกลับสิ่งนั้นหรือคืนความNoneจริงและความ1เท็จหรืออะไรก็ตาม โปรดระบุผลลัพธ์ที่เลือกในคำตอบของคุณ
  • คำตอบของคุณต้องทำงานอย่างน้อยในทางทฤษฎีสำหรับจำนวนเต็มบวกใด ๆ
  • หมายเลข Munchausen ใช้การประชุมดังนั้นเป็นฐาน-2 Munchausen จำนวนเป็น 2 รหัสของคุณจะต้องเป็นไปตามอนุสัญญานี้00=1211+00=2
  • ขอแนะนำให้อธิบายอย่างชัดเจนถึงแม้ว่าการส่งจะใช้วิธีการค้นหาแบบไร้เดียงสาเป็นส่วนใหญ่
  • การใช้ภาษาลึกลับทำให้คุณได้รับคะแนนบราวนี่เนื่องจาก Munchausen เป็นคนแปลก

กรณีทดสอบ

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
Benjamin Urquhart

7
@BenjaminUrquhart ไม่คุณไม่อาจ; determine if it's a Munchausen number in any base b≥2.
Giuseppe

ลองเดาว่า "ไม่" มีจำนวนเต็มจำนวนอนันต์และจำนวน จำกัด ของ Munchausens ดังนั้นความน่าจะเป็นที่จะเลือกหมายเลข Munchausen คือ (n) / (Infinity) = 0 // เป็ดและวิ่ง
Carl Witthoft

@CarlWitthoft ฉันหัวเราะที่ข้อเสนอแนะ แต่แน่นอนว่าจะเป็นการส่งที่ไม่ถูกต้อง :-)
Giuseppe

คำตอบ:


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 จากผลลัพธ์อย่างไร
Shaggy

1
@Shaggy: ด้วยการแปลงฐานนี้ตัวเลขทั้งหมด1ในฐาน -1 จำนวนเดียวที่จะกลับมาจริงสำหรับ1^1เป็น1
Emigna

5

เยลลี่ขนาด 8 ไบต์

bŻ*`§ċ⁸Ị

ผลตอบแทน0สำหรับ Munchausen และ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)

ทางเลือกสำหรับ1Munchausen และ0อื่น ๆ :

bŻ*`§ċ>1

อืม ... ทำไมฉันถึงคิดว่ารุ่นก่อนหน้าของคุณถูกต้องและอันนี้ไม่ถูกต้อง?
Erik the Outgolfer

ฉันคิดว่ารุ่นก่อนหน้าของฉันไม่ถูกต้องเนื่องจากไม่ได้บอกว่า1มันช์เชิน
Jonathan Allan

5

J , 33 28 27 ไบต์

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

ลองออนไลน์!

  • e. เป็นองค์ประกอบของการป้อนข้อมูล ...
  • 1#. ผลรวมของแต่ละแถวของ ...
  • i.@>: ... ] 0..input และ input เองส่งผ่านเป็นไปทางซ้ายและขวาเพื่อไปที่ ...
  • ^~@(#.inv)"0แปลง ARG ด้านขวา (อินพุต) ไปยังแต่ละฐานใน ARG ด้านซ้ายและเพิ่มผลลัพธ์ตามลำดับให้กับแต่ละตัว^~@ตามลำดับ
  • ::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สำหรับตัวเลข Munchausen และFALSEอื่น ๆ

x%/%b^(0:log(x,b))%%b)แปลงxเป็นฐานbและสำหรับลูปจะทำงานที่เหลือ (การกำหนดใหม่Fซึ่งเป็นFALSEค่าเริ่มต้น)

เราต้องให้ฐานbที่จะไปทุกทางที่จะx+1แทนการที่จะจัดการกับกรณีที่xx=1



@digEmAll ขอบคุณ! ฉันโกนออกไปอีก 2 ไบต์โดยใช้บูลีนแทนจำนวนเต็ม
Robin Ryder

ผมพยายามที่จะเข้าใจสิ่งที่คุณเปลี่ยนไปบันทึก 2 ไบต์จากเหมืองนอกเหนือจากการเปลี่ยนแปลง+ด้วย|และลบ!แล้วผมรู้ว่าผมเขียน 71 แต่รหัสของฉันเป็นจริง 70: D
digEmAll

แนวคิดที่ยอดเยี่ยมโดยใช้ | BTW!
digEmAll

@digEmAll โอ้ใช่ฉันไม่คิดแม้แต่จะตรวจสอบจำนวนไบต์ของคุณ! :)
Robin Ryder

3

Japt , 13 ไบต์

õ@ìXÄ x_pZ
øN

บันทึกหนึ่งไบต์ด้วย @Shaggy

ลองมัน


@Shaggy แก้ไขค่าของไบต์
ศูนย์รวมของความไม่รู้

คุณจะได้รับที่ไบต์กลับโดยการแทนที่ด้วยÃÃøU<newline>øN
Shaggy

@Shaggy Nice trick กับ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

คำนำหน้าฟังก์ชั่นโดยปริยาย ตัวเลข Munchausen ส่งคืน 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 ดังนั้นดูพื้นที่นี้ เอาท์พุท-ยกเว้นว่าเป็นหมายเลข Munchausen คำอธิบาย:

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

ไอคอน , 109 ไบต์

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

ลองออนไลน์!

591912หมดเวลาสำหรับ ไอคอนถือว่า0^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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.