Disarium Dilemma


31

Disarium Dilemma

Disarium ถูกกำหนดให้เป็นหมายเลขที่:

ผลรวมของตัวเลขที่ขับเคลื่อนด้วยตำแหน่งนั้น ๆ เท่ากับจำนวนเดิม


งานของคุณ :

คุณมีความหลงใหลที่แปลกประหลาดกับตัวเลขที่จัดว่าเป็นสัตว์เลี้ยง ความจำเป็นที่จะต้องทำตามวิธีของการแยกแยะนั้นยอดเยี่ยมมากในตัวคุณที่คุณปฏิเสธที่จะอ่านหน้าใด ๆ ที่ไม่ได้มีหมายเลขกำกับไว้ในหนังสือเล่มใดก็ตาม คุณมีสองBIGปัญหา:

  1. อาจารย์ของคุณเพิ่งมอบหมายให้คุณอ่านตำราเรียนจากหน้าหนึ่งnไปอีกหน้าหนึ่งm
  2. คุณตีหัวของคุณอย่างหนักเมื่อสัปดาห์ที่แล้วและดูเหมือนจะจำไม่ได้ว่าจะกำหนดโปรแกรมโดยวิธีใด

เวลาเป็นสิ่งสำคัญดังนั้นรหัสในการกำหนดหน้าเว็บที่คุณจะต้องอ่านจะต้องสั้นที่สุด

คุณจำเป็นต้องระบุทั้งหมดของ disarium ภายในช่วงรวมผ่านnm

ตัวอย่างของ disarium :

89 = 8 1 + 9 2

135 = 1 1 + 3 2 + 5 3

518 = 5 1 + 1 2 + 8 3

นี่คือโค้ดกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงจะชนะ!

นี่คือลำดับที่เต็มรูปแบบของA032799


@ สรุปช่วงรวมฉันจะแก้ไขคำถามเพื่อสะท้อนถึงนี้
CraigR8806

มีการรับประกันขอบเขตหรือไม่nและm? มี disarium ที่มีขนาดใหญ่มาก (12157692622039623539) คำตอบควรจะสามารถระบุได้หรือไม่?
Lynn

@ ลินน์เนื่องจากมีโซลูชั่นจำนวนมากอยู่แล้วฉันจะบอกว่าไม่ควรมีขอบเขตในขอบเขต
CraigR8806

2
@Lynn ไม่มี disarium> 22 หลักดังนั้นในทางที่ขอบเขตถูกผูกไว้แล้ว
นักฟิสิกส์บ้า

3
@MistahFiggins โปรดไปที่ลิงก์ OEIS ที่ด้านล่างของคำถาม คุณจะพบหลักฐานที่แสดงให้เห็นว่าลำดับ Disarium แน่นอนแน่นอน
CraigR8806

คำตอบ:


11

Perl 6 , 40 39 ไบต์

{grep {$_==sum .comb Z**1..*},$^a..$^b}

ลองออนไลน์!

มันทำงานอย่างไร

{                                     }  # A lambda.
                              $^a..$^b   # Range between the two lambda arguments.
 grep {                     },           # Return numbers from that range which satisfy:
               .comb Z  1..*             #  Digits zipped with the sequence 1,2,3,...,
                      **                 #  with exponentiation operator applied to each pair,
           sum                           #  and those exponents summed,
       $_==                              #  equals the number.

8

Python2, 98 89 88 84 ไบต์

lambda n,m:[x for x in range(n,m+1)if sum(int(m)**-~p for p,m in enumerate(`x`))==x]

น่ากลัว จะสั้นลง เริ่มที่จะดูดีขึ้น

นี่คือความพยายามแบบเรียกซ้ำ (86 bytes):

f=lambda n,m:[]if n>m else[n]*(sum(int(m)**-~p for p,m in enumerate(`n`))==n)+f(n+1,m)

ขอบคุณ@Rodสำหรับการบันทึก 4 ไบต์! rangeไปenumerateและอื่น ๆ


เปลี่ยนเป็นenumerateคุณสามารถใช้int(n)แทนได้int(`x`[p])
Rod

7

Perl, 43 ไบต์

map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>

ลองออนไลน์!

Regex นั้นทรงพลังจริงๆพวกคุณ

คำอธิบาย

สิ่งแรกที่โค้ดไม่สามารถอ่านจำนวนเต็มสองจำนวนเป็น input ผ่านและสร้างช่วงจากครั้งแรกที่สองด้วย<> ..จากนั้นก็ใช้มาตรฐานการทำงานเพื่อย้ำผ่านช่วงนี้และนำไปใช้รหัสต่อไปนี้แต่ละค่า:map say if$_==eval s/./+$&**$+[0]/grดูเหมือนว่าพูดพล่อยๆและเป็นชนิด แต่นี่คือสิ่งที่เกิดขึ้นจริง

map$_โดยปริยายเก็บค่าปัจจุบันในตัวแปร ฟังก์ชั่นและการใช้งาน perl จำนวนมากใช้ค่านี้เมื่อไม่มีการกำหนด ซึ่งรวมถึงนิพจน์ทั่วไปเช่นs///ตัวดำเนินการทดแทน

regex การทดแทนมีสี่ส่วนดังนี้:

  1. สตริงที่จะจัดการ โดยปกติผู้ประกอบการ=~จะใช้ในการใช้ regex กับสตริง แต่ถ้าผู้ประกอบการนี้จะหายไปแล้ว regex จะถูกนำไปใช้กับตัวแปรโดยปริยาย$_ซึ่งมีจำนวนปัจจุบันของเราผ่านmapฟังก์ชั่น
  2. สตริงที่จะค้นหา ในกรณีนี้เรากำลังมองหาตัวละครที่ไม่ใช่การขึ้นบรรทัดใหม่ใด ๆ .เดียวแทนด้วยสัญลักษณ์แทน ผลเราจะจับแต่ละหลักแต่ละ
  3. สตริงที่จะแทนที่ด้วย เรากำลังแทนที่เครื่องหมายบวก+ตามด้วยนิพจน์ทางคณิตศาสตร์ผสมกับตัวแปร Perl บางอย่างที่ทำให้ทุกอย่างง่ายขึ้นอย่างมีนัยสำคัญ

ตัวแปรสเกลาร์พิเศษ$&ประกอบด้วยการจับ regex ที่ประสบความสำเร็จครั้งล่าสุดเสมอซึ่งในกรณีนี้คือตัวเลขหลักเดียว ตัวแปรอาเรย์พิเศษ@+ประกอบด้วยรายการของการชดเชยหลังการจับคู่สำหรับการจับคู่ที่ประสบความสำเร็จล่าสุดเช่นดัชนีของข้อความหลังการแข่งขัน $+[0]เป็นดัชนีในข้อความต่อไปทันที$_ $&ในกรณีของ135เราจับตัวเลข1และดัชนี135ของข้อความทันทีหลังจากนั้น (กล่าวคือ35) คือ 1 ซึ่งเป็นเลขชี้กำลังของเรา ดังนั้นเราต้องการยกระดับ$&(1) ให้เป็นพลังของ$+[0](1) และรับ 1 เราต้องการยกระดับ 3 เป็นกำลัง 2 และได้ 9 เราต้องการยก 5 ให้เป็นกำลัง 3 และได้ 125

ถ้าใส่เป็นสตริงที่เกิดคือ135+1**1+3**2+5**3

  1. การแก้ไขการตั้งค่าสถานะ Regex นี่เรากำลังใช้สองธง regex - และ /g บอกให้ล่ามดำเนินการแทนหลังจากพบครั้งแรก (ไม่เช่นนั้นเราก็จะจบลงด้วย) บอกให้ล่ามไม่ต้องดัดแปลงสตริงเดิมและส่งคืนสตริงที่จะเป็นหลังการแทนที่ สิ่งนี้มีความสำคัญเพราะไม่เช่นนั้นจะมีการเขียนทับและเราต้องการเพื่อการเปรียบเทียบ/r/g+1**135/r$_

เมื่อการแทนที่ทั้งหมดเสร็จสิ้นเราจะได้รับนิพจน์ทางคณิตศาสตร์ซึ่งประเมินด้วยevalฟังก์ชัน +1**1+3**2+5**3ได้รับการประเมินเข้าซึ่งเมื่อเทียบกับจำนวนเดิม1 + 9 + 125 = 135 135เนื่องจากทั้งสองมีค่าเท่ากันรหัสจึงพิมพ์ตัวเลข


ทางออกที่สวยงาม (โปรดทราบว่าสิ่งนี้จะไม่ทำงานคืออินพุตแรกคือ 0 แต่ฉันไม่แน่ใจว่าสำคัญ) ไม่กี่ไบต์ในการเล่นกอล์ฟ:map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
Dada

และ"@+"เป็น 1 ไบต์สั้นกว่า$+[0]:)
Dada

7

JavaScript (ES7), 105 91 89 88 83 79 82 81 ไบต์

ขอบคุณ Arnauld สำหรับการบันทึก 20B และ ETHProductions สำหรับการบันทึก 6B!

a=>b=>[...Array(b).keys()].filter(c=>c>=a&([...c+''].map(d=>c-=d**++e,e=0),!c))

การใช้

กำหนดฟังก์ชันให้กับตัวแปรและกำหนดค่าต่ำสุดและสูงสุดเป็นอาร์กิวเมนต์ ตัวอย่าง:

f=a=>b=>[...Array(b).keys()].filter(c=>c>=a&([...c+''].map(d=>c-=d**++e,e=0),!c))
f(0)(90)

เอาท์พุต

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 89]

การเล่นกอล์ฟต่อไป

ดูเหมือนว่าจะเป็นสนามกอล์ฟที่ดี แต่มีพื้นที่สำหรับการปรับปรุงอยู่เสมอ ... ฉันคิดว่า


ใช่ที่จริงแล้วค่อนข้างสั้นกว่าเล็กน้อย ขอบคุณ!
ลุค

1
สามารถเปลี่ยนคุณd**(e+1)เพื่อd**-~eที่จะบันทึกไบต์ที่สอง
ETHproductions

ขอบคุณสำหรับเคล็ดลับเพิ่มมัน เพียง 2 ไบต์ก่อนที่เราจะพ่ายแพ้ Python ...
ลูกา

คุณสามารถใช้แทน& &&อีกหนึ่งไบต์ที่จะไป ...
Arnauld

ฉันเพิ่งเปลี่ยนมันในสำเนาของฉัน ... เดาว่าคุณเร็วขึ้น
ลุค

6

JavaScript (Firefox 52+), 68 ไบต์

f=(n,m)=>(e=0,[for(d of t=n+'')t-=d**++e],t||alert(n),n-m&&f(n+1,m))

alertฟังก์ชั่นซ้ำที่เอาท์พุทผ่าน ทำงานใน Developer Edition ของ Firefox ซึ่งคุณสามารถดาวน์โหลดได้ในหน้านี้ Firefox รุ่นก่อนหน้าไม่รองรับ**ผู้ให้บริการและไม่มีเบราว์เซอร์อื่นที่รองรับ[for(a of b)c]ไวยากรณ์

ตัวอย่างการทดสอบ

สิ่งนี้ใช้.mapแทนการเข้าใจอาเรย์และMath.powแทนที่จะใช้**ดังนั้นมันจึงควรทำงานในเบราว์เซอร์ทั้งหมดที่รองรับ ES6



5

Python 3, 100 ไบต์

lambda n,m:{*range(10),89,135,175,518,598,1306,1676,2427,2646798,0xa8b8cd06890f2773}&{*range(n,m+1)}

ไม่ใช่วิธีที่สั้นที่สุด แต่เป็นวิธีที่น่ารัก มีการแยกกันอย่างไม่ จำกัด จำนวนมาก ดูหน้า OEIS เพื่อการพิสูจน์ที่ดี นี่คือทั้งหมดของพวกเขา


นี่คือการใช้ hard-coding ซึ่งเป็นmeta.codegolf.stackexchange.com/a/1063/55243ซึ่งเป็นช่องโหว่ของช่องโหว่ฉันขอแนะนำให้คุณเปลี่ยนคำตอบให้เหมาะกับกฎมาตรฐาน
george

5
ฉันไม่คิดว่านี่เป็นการละเมิดกฎการเข้ารหัสเนื่องจากโปรแกรมยังคง "ทำงาน" และเอาต์พุตไม่ได้ถูกกำหนดค่าตายตัว
Alex Howansky

4

R, 100 ไบต์

function(n,m,x=n:m)x[sapply(x,function(y)sum(as.integer(el(strsplit(c(y,""),"")))^(1:nchar(y)))==y)]

ฟังก์ชั่นที่ไม่มีชื่อที่ใช้เวลาและn mเช่นเดียวกับใน R การแบ่งจำนวนเต็มเป็นเวกเตอร์ที่เป็นตัวเลขนั้นน่าเบื่อและกินจำนวนไบต์มาก สิ่งนี้ทำให้ฟังก์ชั่นค่อนข้างช้าและใช้ได้กับเลขจำนวนเต็ม 32 บิตเท่านั้น


4

เยลลี่ 11 ไบต์

D*J$S⁼
rÇÐf

ลองออนไลน์!

รับสิ่งนี้จาก 16 เป็น 11 ด้วยความช่วยเหลือจาก @miles!

คำอธิบาย:

rÇÐf    Main link, arguments are m and n
r       Generate a list from m to n
 Ç      Invoke the helper link
  Ðf    And filter out all that don't return 1 on that link

D*J$S⁼  Helper link, determines if item is Disarium
D       Break input (the current item of our list in Main) into digits (135 --> [1, 3, 5])
  J$    Create a range from 1 to x, where x is the number of digits             [1, 2, 3]
 *      Raise each digit to the power of their respective index 
    S⁼  And return a 1 if the sum of powers is equal to the helper-link's input

คุณสามารถใช้Jเพื่อรับดัชนี วิธีที่สั้นกว่าอาจD*J$S⁼รวมลิงก์ทั้งสองของคุณเข้าด้วยกัน
ห่างจาก

มาถึงที่ข้อสรุปว่าประมาณ 20 วินาทีที่ผ่านมา ขอบคุณ!
steenbergh

3

CJam , 23 ไบต์

q~),\>{_Ab_,,:).#:+=},p

ลองออนไลน์!

คำอธิบาย

q~                      Get and eval all input
  ),\>                  Get the range between m and n, inclusive
      {                 For each number in the range...
       _Ab               Duplicate and get the list of digits
          _,,:)          Duplicate the list, take its length, make the range from 1 to length
               .#        Vectorize with exponentiation; computes first digit^1, second^2, etc
                 :+      Sum the results
                   =     Compare to the original number
                    },  Filter the range to only numbers for which the above block is true
                      p Print nicely


3

Python 2.X, 92 ไบต์

lambda m,n:[k for k in range(m,n+1)if sum(int(j)**(i+1) for i,j in enumerate(list(`k`)))==k]

ช่องว่างที่ไร้ประโยชน์หลังจากแต่นี้ไม่ได้เป็นปัญหาที่เกิดขึ้นเมื่อคุณได้รับการกำจัดวงเล็บด้วยการทำ(i+1) -~i
Yytsi

นั่นจะทำให้ความพยายามของฉันเป็นแบบเดียวกันกับคุณ!
hashcode55

เกือบจะ คุณมีlist('k')ซึ่งฉันไม่มี อย่างไรก็ตามคุณยังสามารถลบช่องว่าง :)
Yytsi

3

Python 2 , 84 ไบต์

วิธีการใช้โปรแกรมแบบเต็มปัจจุบันมีความยาวเท่ากับโซลูชันแลมบ์ดา

a,b=input()
while a<=b:
 t=p=0
 for x in`a`:p+=1;t+=int(x)**p
 if t==a:print a
 a+=1

ลองออนไลน์!


อืมมม ฉันคิดเกี่ยวกับคำตอบที่แน่นอนเกือบ input()แต่ทิ้งเนื่องจากความสับสนกับ ดีมาก! +1
Yytsi

3

Japt 15 ไบต์

òV f_¥Zì £XpYÄÃx

ทดสอบออนไลน์!นี่เป็นความร่วมมือระหว่าง @obarakon และตัวฉันเอง

มันทำงานอย่างไร

òV f_¥Zì £XpYÄÃx   // Implicit: U, V = input integers
òV                 // Create the inclusive range [U...V].
   f_              // Filter to only the items Z where...
               x   //   the sum of
      Zì           //   the decimal digits of Z,
         £XpYÄÃ    //   where each is raised to the power of (index + 1),
     ¥             //   is equal to Z.
                   // Implicit: output result of last expression

ใน Japt เวอร์ชั่นล่าสุดxยอมรับฟังก์ชั่นเป็นอาร์กิวเมนต์ซึ่งทำให้เราสามารถเล่นไบต์อื่นได้:

òV f_¥Zì x@XpYÄ

ทดสอบออนไลน์!


2

Clojure, 107 ไบต์

#(for[i(range %(inc %2)):when(=(int(apply +(map(fn[i v](Math/pow(-(int v)48)(inc i)))(range)(str i))))i)]i)

การใช้สมการนั้นยาวมาก


สามารถบันทึกสองสามไบต์โดยการทำ(.pow(-(int v)48M)
หน้าผา

2

TI-Basic, 85 ไบต์

Input 
For(I,X,Y
If I<=9 or sum(I={89,135,175,518,598,1306,1676,2427,2646798,12157692622039623539
Disp I
End

ฉันไม่ทราบว่าอนุญาตให้เข้ารหัสอย่างหนัก :)
Abel Tom

@AbelTom มันช่วยได้จริงๆว่าซีรี่ส์นี้มี 20 เทอมเท่านั้น นอกจากนี้การแปลงตัวเลขเป็นสตริงใน TI-Basic ใช้จำนวนไบต์จำนวนมาก วิธีแก้ปัญหาอื่นเท่านั้นที่จะได้int(log(ทุกหมายเลขจากนั้นก็ทำการเพิ่มพลัง อาจจะสั้นกว่านี้ แต่ฉันสงสัย
Timtech

วิธีการป้อนข้อมูลนั้นฉลาดมาก แต่เป็นภาพร่าง คุณต้องอยู่ในFUNCโหมดและต้องตั้งค่าหน้าต่างเพื่อรวมจุดเข้าของคุณ ดูเหมือนพกพาไม่พอสำหรับฉัน
Jakob

@ JakobCornell โดยปกติแล้ว calc อยู่ในFUNCโหมดแม้ว่าฉันจะเห็นสิ่งที่คุณพูดเกี่ยวกับความละเอียดของอินพุต แต่วิธีนี้ค่อนข้างธรรมดาในการเล่นกอล์ฟ คุณสามารถPrompt X,Yแทนได้เสมอ
Timtech

2

Haskell, 61 ไบต์

n#m=[i|i<-[n..m],i==sum(zipWith(^)(read.pure<$>show i)[1..])]

ตัวอย่างการใช้งาน->5 # 600[5,6,7,8,9,89,135,175,518,598]

ตรวจสอบแต่ละหมายเลขในช่วงi [n..m]ตัวเลขถูกแยกออกโดยเปลี่ยนiเป็นสตริง ( show) และทำให้ถ่านแต่ละตัวเป็นหนึ่งองค์ประกอบสตริง ( pure) ซึ่งเปลี่ยนเป็นจำนวนเต็มอีกครั้ง ( read) ไปรษณีย์บรรดาองค์ประกอบหมายเลขฉลาดกับ[1..]ผ่านฟังก์ชั่นและใช้^sum


2

PHP, 92 91 88 ไบต์

บันทึกได้ 3 ไบต์ขอบคุณ @AlexHowansky

for([,$n,$m]=$argv;$n<=$m;$s-$n++?:print"$s,")for($i=$s=0;_>$b=($n._)[$i++];)$s+=$b**$i;

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง พิมพ์เครื่องหมายจุลภาคต่อท้าย -rทำงานด้วย


1
ประหยัดสามด้วยfor([,$n,$m]=$argv;$n<=$m;
Alex Howansky

แปลกที่งานพิมพ์มี แต่เสียงสะท้อนไม่ได้ ฉันเดาเพราะเสียงก้องไม่ส่งคืนสิ่งใด - ไม่เป็นโมฆะอย่างผิดปกติ
Alex Howansky

@AlexHowansky: มันก็แปลกที่"$n"[index]และ"_$n"[index]ผลิตแจงข้อผิดพลาดในขณะที่"89"[index]และ$s="$n";$s[index]ดีอย่างสมบูรณ์
ติตัส

อืมใช่ว่ามันดูแปลกในตอนแรก แต่หลังจากตรวจสอบเอกสารแล้วพวกเขาก็บอกอย่างชัดเจนว่าคุณลักษณะนี้ใช้งานได้กับตัวอักษรสตริงเท่านั้น
Alex Howansky

หึหึดีงานนี้ แต่มันอาจจะไม่ได้ช่วยให้คุณประหยัดไบต์ใด ๆ :("_$n")[index]
อเล็กซ์ Howansky

2

Mathematica, 59 ไบต์

Select[Range@##,Tr[(d=IntegerDigits@#)^Range@Length@d]==#&]&

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อจะรับอาร์กิวเมนต์จำนวนเต็มสองรายการและส่งคืนรายการจำนวนเต็ม (d=IntegerDigits@#)^Range@Length@dสร้างรายการของตัวเลขของตัวเลขไปยังพลังที่เหมาะสม Tr[...]==#ตรวจสอบว่าผลรวมของพลังตัวเลขเหล่านั้นเท่ากับจำนวนเดิมหรือไม่


2

MATLAB, 88 73 ไบต์

@(n,m)find(arrayfun(@(n)n==sum((num2str(n)-48).^(1:log10(n)+1)),n:m))+n-1

คำตอบเดิม:

function g(n,m);a=n:m;a(arrayfun(@(n)n==sum((num2str(n)-'0').^(1:floor(log10(n))+1)),a))

num2str(n)-'0'แยกnเป็นเวกเตอร์หลักของมันและเป็นหนึ่งเวกเตอร์โฮลดิ้งจำนวนตัวเลขใน1:floor(log10(n))+1 nขอบคุณที่บันทึกการเล่นกอล์ฟลงไปยังฟังก์ชันที่ไม่ระบุชื่อซึ่งช่วยประหยัด 15 ไบต์


1

Haskell , 82 76 75 ไบต์

n!m=[x|x<-[n..m],x==x#(length.show)x]
0#i=0
n#i=(div n 10)#(i-1)+mod n 10^i

ลองออนไลน์! การใช้งาน:5 ! 175

การตรวจสอบนี้ตัวเลขในช่วงแต่ละnไปmถ้าตัวเลข disarium mและเป็นเหตุค่อนข้างช้าขนาดใหญ่


รุ่นที่เร็วกว่า: (93 ไบต์)

n!m=[x|x<-[0..9]++[89,135,175,518,598,1306,1676,2427,2646798,12157692622039623539],x>=n,x<=m]

ลองออนไลน์!


1

C (gcc) , 136 ไบต์

r[]={0,0};f(n){if(n)f(n/10),r[1]=pow((n%10),*r)+r[1]+.5,r[0]++;else*r=1,r[1]=0;}g(m,x){for(;m<=x;m++){f(m);if(m==r[1])printf("%d,",m);}}

ส่วนหัวที่กำหนด pow บน TIO เพราะเหตุผลบางอย่างมันไม่ได้รวม pow โดยอัตโนมัติ คอมพิวเตอร์ของฉันทำดังนั้นฉันจะไปกับสิ่งนั้น

ลองออนไลน์!


1

MATL , 16 ไบต์

&:"@tFYAtn:^s=?@

ลองออนไลน์!

&:        % Input two n, m implicitly. Push array [n n+1 ... m]
"         % For each k in that array
  @       %   Push k
  tFYA    %   Duplicate. Convert to decimal digits
  tn:     %   Duplicate. Push [1 2 ... d], where d is the number of digits
  ^       %   Element-wise power
  s       %   Sum of array
  =       %   Compare with previous copy of k: is it equal?
  ?       %   If so
    @     %     Push k
          %   End, implicit
          % End, implicit
          % Display stack, implicit

1

แบตช์ 115 ไบต์

@for %%d in (0 1 2 3 4 5 6 7 8 9 89 135 175 518 598 1306 1676 2427 2646798)do @if %%d geq %1 if %%d leq %2 echo %%d

รุ่นที่มีเลขคณิต 32- บิตเท่านั้นซึ่งไม่มีทางเปรียบเทียบหมายเลข disarium ล่าสุด แต่ถ้าคุณยืนยันในการเปรียบเทียบสตริงแล้วสำหรับ 402 ไบต์:

@echo off
for %%d in (0 1 2 3 4 5 6 7 8 9 89 135 175 518 598 1306 1676 2427 2646798 12157692622039623539)do call:c %1 %%d&&call:c %%d %2&&echo %%d
exit/b
:c
call:p %1 %2
set r=%s%
call:p %2 %1
:g
if %r:~,1% lss %s:~,1% exit/b0
if %r:~,1% gtr %s:~,1% exit/b1
if %r%==%s% exit/b0
set r=%r:~1%
set s=%s:~1%
goto g
:p
set s=%1
set t=%2
:l
set s=0%s%
set t=%t:~1%
if not "%t%"=="" goto l

1

Python 2, 100 ไบต์

for i in range(input(),input()+1):x=sum(int(`i`[n])**-~n for n in range(len(`i`)));print("",x)[x==i]

ฉันยังไม่ได้มีโอกาสทำงานนี้ (ทำสิ่งนี้บนโทรศัพท์ของฉัน)


มันใช้งานไม่ได้ ไวยากรณ์ไม่ถูกต้องและเมื่อแก้ไขแล้วจะพิมพ์เฉพาะค่าบูลีน เริ่มต้นจากเลขชี้กำลัง 0 ซึ่งไม่ถูกต้องเช่นกัน sumนอกจากนี้คุณไม่จำเป็นต้องวงเล็บภายใน
Yytsi

นี่ไม่ใช่การตรวจสอบหมายเลขที่ไม่ลงรอยกัน
hashcode55

@ hashcode55, fixed (?)
Daniel

@TuukkaX ตอนนี้มันน่าจะใช้ได้แล้วฉันคิดว่า
Daniel

ฉันไม่ได้อยู่ในคอมพิวเตอร์ แต่ควรพิมพ์บรรทัดใหม่ในการทำซ้ำแต่ละครั้งซึ่งiเป็น Disarium ฉันไม่ทราบว่าจะอนุญาตหรือไม่ แต่ฉันจะบอกว่าไม่เนื่องจากเอาต์พุตว่างเปล่ามาก
Yytsi

1

สกาลา132 129 ไบต์

(% :Int,^ :Int)=>for(i<- %to^)if(((0/:(i+"").zipWithIndex)((z,f)=>{z+BigInt(f._1.toInt-48).pow(f._2+1).intValue}))==i)println(i)

การแก้ไข 129: การเปลี่ยนชื่อตัวแปรของลูปจาก&เป็นiช่องว่างสามช่องที่บันทึกไว้


คำอธิบาย

สำหรับแต่ละค่าในช่วงอินพุต:

  • แปลงเป็นสตริงด้วย +""
  • ใช้zipWithIndexในการสร้างรายการของสิ่งอันดับที่มีอักขระของตัวเลขและดัชนี
  • พับรายการด้วยการคืนค่า int ของถ่านแต่ละตัวลบ 48 (บรรทัดสูงสุด 0-9) กลับสู่พลังของดัชนีรายการบวกหนึ่งรายการ (เพื่อเริ่มต้นที่ ^ 1)
  • หากผลลัพธ์ตรงกับอินพุตให้พิมพ์

ความคิดเห็น

ในที่สุดก็มีการเรียนรู้วิธีการfoldและการzipWithIndexทำงาน ฉันไม่มีความสุขกับintการแปลง แต่ผมรู้สึกยินดีกับความกระชับของและfoldzipWithIndex


1

อ็อกเทฟ, 88 87 ไบต์

ขอบคุณ MattWH สำหรับการบันทึกไบต์ (f (x) -48 เทียบกับ f (x) - '0'

@(n,m,f=@num2str,a=n:m)a(a==cell2mat(arrayfun(@(x){sum((f(x)-48).^(1:nnz(f(x))))},a)))

วิ่ง:

>> f=@(n,m,f=@num2str,a=n:m)a(a==cell2mat(arrayfun(@(x){sum((f(x)-'0').^(1:nnz(f(x))))},a))) 
>> f(0,1000)
ans = 
      1     2     3     4     5     6     7     8     9    89   135   175   518   598

คำอธิบาย

@(n,m,                                              % Create an anonymous function and pass it n and m as paramteres
    f=@num2str,                                     % Will be using the num2str mehtod twice, set the variable f to the handle to save on bytes
        a=n:m)                                      % Create a vector 'a' and populate it with the numbers n through m
            a(a==                                   % Logically index into a, where the values of a match Disarium numbers
                cell2mat(                           % Convert the cell array returned by arrayfun into a matrix, so we can use it in the logical index
                    arrayfun(@(x){                  % Call the following function on every element of a, using the index named 'x'
                        sum(                        % Sum the matrix that results from the following computation
                            (f(x)-'0')              % Convert the value at index x into a string, then break it into a matrix by subtracting the string '0'.
                                                    % This results in the matrix [1 3 5] for the number 135.
                                .^                  % Compute the element-wise power with the following matrix
                                    (1:nnz(f(x)))   % Create a matrix with the range 1 to the length of the number at index x. This results in the matrix 
                                                    % [1 2 3] for the number 135.
                        )                           % Closes the sum statement
                    },a)                            % Closes the arrayfun statement, passing the matrix a to be operated on
                )
            )

1

C 175 169 ไบต์

f(a,b){for(j=a;j<b;j++){n,i=0,x=0;s=0;n=j;while(n!=0){n/=10;i++;}a[i];n=j;while(n!=0){a[i-x-1]=n%10;n/=10;x++;}for(x=0;x<i;x++)s+=(int)pow(a[x],x+1);if(j==s)printf("%d ",s);}}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

void f(int a, int b)
{

  for(int j=a; j<b;j++)
  {
    int n,i=0,x=0;
    int s=0;
    n=j;

   //Convert each number from 'n' to 'm' and store it in an int array 
   while(n)
   {
     n/=10;
     i++;     
   }
   int a[i]; 

   n=j;       
   while(n)
   {
    a[i-x-1]=n%10;
    n/=10;
    x++;     
   }

  //Calculate sum of digits powered with their respective position
  for(x=0;x<i;x++)
   s+=(int)pow(a[x], x+1);

   //Print Desarium
   if(j==s)
    printf("%d ", sum);     
 }

}

สามารถย่อให้สั้นลงได้ แต่ฉันไม่เห็นในตอนนี้

@TuukkaX ขอบคุณสำหรับการบันทึก 6 ไบต์


ทั้งสองสามารถเปลี่ยนเป็นn!=0 n
Yytsi

คุณพูดถูกแล้วมันสมเหตุสมผลแล้ว!
Abel Tom

0

ชวา

s->{long i=0,j=0,c,d;for(;j!=s;){String []f=Long.toString(i).split("");for(d=0,c=0;d<f.length;)c+=Math.pow(Long.valueOf(f[d]),++d);if(i==c)j++;}return i;}

คำอธิบาย

s    - index
i    - iteration variable
j    - matches
c    - sum of each digit^its index
d    - index of digit in i

0

Python 3: 131 ไบต์

n=int(input())
m=int(input())
R=[x for x in range(n,m+1)]
O=[sum(map(int,str(x)))for x in R]
F=[(x**(O.index(x)))for x in O]
L=[x for x in F for w in R if x==w]
print(list(set(L)))

หลังจากสร้างรหัสนี้จะเห็นได้ชัดว่ามีจำนวน Disariums จำกัด ดังนั้นจึงอาจเป็นไปได้ที่จะตรวจสอบสิ่งเหล่านี้อย่างชัดเจนมากกว่าการใช้รายการความเข้าใจที่ยากมากในการแก้ปัญหานี้

ลองออนไลน์!

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