Loạn luân khó xử


31

Loạn luân khó xử

Một Disarium được định nghĩa là một số có:

tổng các chữ số của nó được cung cấp với vị trí tương ứng của chúng bằng với số ban đầu


Nhiệm vụ của bạn :

Bạn có một nỗi ám ảnh kỳ lạ với những con số được phân loại là một disarium. Nhu cầu tuân theo các cách của disarium rất lớn ở bạn đến nỗi bạn từ chối đọc bất kỳ trang nào được đánh số không phải là disarium trong bất kỳ cuốn sách nào. Bạn có hai vấn đề LỚN :

  1. Giáo sư của bạn chỉ định bạn đọc sách giáo khoa của bạn từ trang này nsang trang khácm
  2. Bạn đã đánh vào đầu mình rất nhiều vào tuần trước và dường như không thể nhớ làm thế nào để xác định theo chương trình nếu một số được coi là một disarium.

Thời gian là điều cốt yếu, do đó, mã để xác định các trang bạn sẽ cần đọc cần phải càng ngắn càng tốt.

Bạn cần xác định tất cả các disarium trong phạm vi bao gồm nthông qua m.

Ví dụ về một disarium :

89 = 8 1 + 9 2

135 = 1 1 + 3 2 + 5 3

518 = 5 1 + 1 2 + 8 3

Đây là môn đánh gôn, vì vậy số byte ít nhất sẽ thắng!

Dưới đây là chuỗi đầy đủ của A032799 .


@Firthize Phạm vi bao gồm, tôi sẽ chỉnh sửa câu hỏi để phản ánh điều này.
CraigR8806

Có bất kỳ giới hạn được đảm bảo trên nm? Có một disarium rất lớn (12157692622039623539), câu trả lời có thể xác định nó?
Lynn

@Lynn Cho rằng đã có một số giải pháp, tôi sẽ nói rằng không nên có giới hạn nào trong phạm vi.
CraigR8806

2
@Lynn. Không có disarium> 22 chữ số, vì vậy theo một cách nào đó, phạm vi đã bị giới hạn.
Nhà vật lý điên

3
@MistahFiggins Vui lòng truy cập liên kết OEIS ở cuối câu hỏi. Bạn sẽ tìm thấy một bằng chứng cho thấy chuỗi Disarium thực sự là hữu hạn.
CraigR8806

Câu trả lời:


11

Perl 6 , 40 39 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

{                                     }  # 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 byte

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

Kinh khủng. Sẽ ngắn hơn. Bắt đầu nhìn tốt hơn

Đây là nỗ lực đệ quy của tôi (86 byte):

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

Cảm ơn @Rod đã lưu 4 byte! rangeđến enumeratevà như vậy.


chuyển sang enumerate, bạn có thể sử dụng int(n)thay thếint(`x`[p])
Rod

7

Perl, 43 byte

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

Hãy thử trực tuyến!

Regex thực sự rất mạnh, các bạn.

Giải trình

Điều đầu tiên mà mã thực hiện là đọc hai số nguyên làm đầu vào thông qua <>và tạo một phạm vi từ đầu tiên đến thứ hai với ... Sau đó, nó sử dụng maphàm tiêu chuẩn để lặp qua phạm vi này và áp dụng mã sau cho từng giá trị : say if$_==eval s/./+$&**$+[0]/gr. Điều này có vẻ như vô nghĩa, và nó là như vậy, nhưng đây là những gì đang thực sự xảy ra.

mapngầm lưu giá trị hiện tại của nó trong biến $_. Nhiều hàm và hoạt động của perl sử dụng giá trị này khi không được đưa ra. Điều này bao gồm các biểu thức chính quy, chẳng hạn như s///toán tử thay thế.

Có bốn phần trong biểu thức thay thế:

  1. Chuỗi được thao tác. Thông thường, toán tử =~được sử dụng để áp dụng regex cho chuỗi, nhưng nếu toán tử này vắng mặt, thì regex được áp dụng cho biến ẩn $_, chứa số hiện tại của chúng ta thông qua maphàm.
  2. Chuỗi để tìm kiếm. Trong trường hợp này, chúng tôi đang tìm kiếm bất kỳ ký tự không phải dòng mới nào, được biểu thị bằng ký tự đại diện .. Trong thực tế, chúng tôi đang nắm bắt từng chữ số riêng lẻ.
  3. Chuỗi để thay thế bằng. Chúng ta đang thay thế một dấu cộng +theo sau là một biểu thức toán học, trộn lẫn với một số biến Perl kỳ diệu giúp mọi thứ dễ dàng hơn đáng kể.

Biến vô hướng đặc biệt $&luôn chứa toàn bộ lần chụp regex thành công cuối cùng, trong trường hợp này là một chữ số. Biến mảng đặc biệt @+luôn chứa một danh sách các độ lệch postmatch cho trận đấu thành công cuối cùng, tức là chỉ mục của văn bản sau trận đấu. $+[0]là chỉ mục trong $_văn bản ngay sau đây $&. Trong trường hợp 135, chúng tôi nắm bắt chữ số 1và chỉ số trong 135văn bản ngay sau đó (cụ thể là 35) là 1, đó là số mũ của chúng tôi. Vì vậy, chúng tôi muốn tăng $&(1) lên sức mạnh của $+[0](1) và nhận được 1. Chúng tôi muốn tăng 3 lên sức mạnh của 2 và nhận được 9. Chúng tôi muốn tăng 5 lên sức mạnh của 3 và nhận được 125.

Nếu đầu vào là 135, chuỗi kết quả là +1**1+3**2+5**3.

  1. Cờ sửa đổi Regex. Ở đây chúng tôi đang sử dụng hai cờ regex - /g/r. /gnói với thông dịch viên tiếp tục thay thế sau khi tìm thấy đầu tiên (nếu không chúng tôi sẽ kết thúc +1**135). /ryêu cầu trình thông dịch không sửa đổi chuỗi gốc và thay vào đó trả về chuỗi sẽ là gì sau khi thay thế. Điều này rất quan trọng, vì nếu không, nó sẽ ghi đè lên $_và chúng ta cần nó cho mục đích so sánh.

Khi toàn bộ sự thay thế được thực hiện, chúng ta sẽ có một biểu thức toán học, được đánh giá bằng evalhàm. +1**1+3**2+5**3được đánh giá thành 1 + 9 + 125 = 135, được so sánh với số ban đầu 135. Vì hai số này bằng nhau, mã in số.


Giải pháp đẹp. (Lưu ý rằng điều này sẽ không hoạt động là đầu vào đầu tiên là 0, nhưng tôi không chắc nó có vấn đề gì không). Một vài byte để chơi gôn:map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
Dada

"@+"ngắn hơn 1 byte so với $+[0]:)
Dada

7

JavaScript (ES7), 105 91 89 88 83 79 82 81 byte

Cảm ơn Arnauld vì đã tiết kiệm 20B và ETHSản phẩm để tiết kiệm 6B!

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

Sử dụng

Gán hàm cho một biến và cung cấp cho nó tối thiểu và tối đa làm đối số. Thí dụ:

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

Đầu ra

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

Chơi gôn thêm

Điều này có vẻ khá tốt, nhưng luôn có cơ hội để cải thiện ... tôi nghĩ vậy.


Vâng, đó thực sự là khá ngắn hơn một chút. Cảm ơn!
Luke

1
Bạn có thể thay đổi d**(e+1)để d**-~ecứu hai byte.
Sản phẩm ETH

Cảm ơn các mẹo, thêm nó. Chỉ còn 2 byte nữa trước khi chúng tôi đánh bại Python ...
Luke

Bạn có thể sử dụng &thay vì &&. Thêm một byte để đi ...
Arnauld

Tôi chỉ thay đổi điều đó trong bản sao địa phương của tôi ... Đoán bạn nhanh hơn.
Lu-ca

6

JavaScript (Firefox 52+), 68 byte

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

Hàm đệ quy xuất ra thông qua alert. Hoạt động trong Phiên bản dành cho nhà phát triển của Firefox mà bạn có thể tải xuống trên trang này . Các phiên bản trước của Firefox không hỗ trợ **nhà điều hành và không có trình duyệt nào khác hỗ trợ [for(a of b)c]cú pháp.

Kiểm tra đoạn

Điều này sử dụng .mapthay vì hiểu mảng, và Math.powthay vì **, vì vậy nó sẽ hoạt động trong tất cả các trình duyệt hỗ trợ ES6.


6

05AB1E , 12 byte

Đã lưu 2 byte nhờ Emigna

ŸvygLySmOyQ—

Hãy thử trực tuyến!

Ÿ            # push [a .. b]
 vy          # for each
   gL        # push [1 .. num digits]
     yS      # push [individual digits]
       m     # push [list of digits to the power of [1..num digits] ]
        O    # sum
         yQ— # print this value if equal

ŸvygLySmOyQ—nên làm việc cho 12 byte.
Emigna

5

Python 3, 100 byte

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

Không phải là cách tiếp cận ngắn nhất, nhưng là một cách khá dễ thương. Có rất nhiều disariums; xem trang OEIS để có bằng chứng tốt Đây là tất cả trong số họ.


Đây là việc sử dụng mã hóa cứng, đó là một lỗ hổng meta.codegolf.stackexchange.com/a/1063/55243 Tôi khuyên bạn nên thay đổi câu trả lời của mình để phù hợp với các quy tắc chuẩn
george

5
Tôi không nghĩ rằng điều này vi phạm quy tắc mã hóa cứng, vì chương trình vẫn "hoạt động" và đầu ra không được mã hóa cứng.
Alex Howansky

4

R, 100 byte

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

Hàm không tên mà mất nm. Như mọi khi trong R, việc chia các số nguyên thành một vectơ chữ số là tẻ nhạt và ăn rất nhiều byte. Điều này làm cho hàm tương đối chậm và chỉ hoạt động đối với số nguyên 32 bit.


4

Thạch , 11 byte

D*J$S⁼
rÇÐf

Hãy thử trực tuyến!

Giảm thứ này xuống từ 16 đến 11, với sự giúp đỡ của @miles!

Giải trình:

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

Bạn có thể sử dụng Jđể có được chỉ số. Một cách ngắn hơn có thể D*J$S⁼kết hợp hai liên kết của bạn vào một
dặm

Đã đến chính xác kết luận đó khoảng 20 giây trước. Thnx!
steenbergh

3

CJam , 23 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

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]

Khoảng trắng vô dụng sau đó (i+1), nhưng đây không phải là vấn đề, khi bạn thoát khỏi dấu ngoặc đơn bằng cách thực hiện -~i.
Yytsi

Điều đó sẽ khiến nỗ lực của tôi giống hệt như của bạn!
hashcode55

Hầu hết. Bạn có list('k'), cái mà tôi không có. Tuy nhiên, bạn vẫn có thể xóa khoảng trắng :)
Yytsi

3

Python 2 , 84 byte

Một cách tiếp cận chương trình đầy đủ, hiện có cùng độ dài với giải pháp lambda.

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

Hãy thử trực tuyến!


Hừm. Tôi nghĩ về câu trả lời gần như chính xác, nhưng bị loại bỏ do nhầm lẫn với input(). Rất đẹp! +1.
Yytsi

3

Japt, 15 byte

òV f_¥Zì £XpYÄÃx

Kiểm tra nó trực tuyến! Đây là sự hợp tác giữa @obarakon và tôi.

Làm thế nào nó hoạt động

ò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

Trong phiên bản mới nhất của Japt, xchấp nhận một hàm làm đối số, cho phép chúng ta chơi một byte khác:

òV f_¥Zì x@XpYÄ

Kiểm tra nó trực tuyến!


2

Clojure, 107 byte

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

Thực hiện các phương trình là rất dài.


có thể tiết kiệm một vài byte bằng cách thực hiện(.pow(-(int v)48M)
cliffroot

2

TI-Basic, 85 byte

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

Tôi không biết mã hóa cứng được cho phép. :)
Abel Tom

@AbelTom Vâng, nó thực sự giúp bộ truyện này chỉ có 20 điều khoản. Ngoài ra, chuyển đổi số thành chuỗi trong TI-Basic cần rất nhiều byte. Chỉ có giải pháp khác là int(log(mỗi số và sau đó thực hiện các quyền hạn. Có lẽ điều này là ngắn hơn, nhưng tôi nghi ngờ nó.
TimTech

Đó là phương pháp đầu vào rất thông minh nhưng loại sơ sài. Bạn cần ở trong FUNCchế độ và cửa sổ phải được thiết lập để bao gồm điểm đầu vào của bạn. Có vẻ như không đủ di động với tôi.
Jakob

@JakobCornell Theo mặc định, calc ở FUNCchế độ, mặc dù tôi thấy bạn đang nói gì về độ phân giải đầu vào. Nhưng, phương pháp này khá phổ biến trong việc chơi golf. Bạn luôn luôn có thể Prompt X,Ythay thế.
TimTech

2

Haskell, 61 byte

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

Ví dụ sử dụng 5 # 600-> [5,6,7,8,9,89,135,175,518,598].

Kiểm tra từng số itrong phạm vi [n..m]. Các chữ số được trích xuất bằng cách biến ithành một chuỗi ( show) và biến mỗi char thành một chuỗi phần tử ( pure) được biến thành một số nguyên một lần nữa ( read). Zip các phần tử số khôn ngoan với [1..]thông qua chức năng ^và lấy sum.


2

PHP, 92 91 88 byte

3 byte được lưu cảm ơn @AlexHowansky

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

lấy đầu vào từ các đối số dòng lệnh; in một dấu phẩy. Chạy với -r.


1
Lưu ba vớifor([,$n,$m]=$argv;$n<=$m;
Alex Howansky

Lạ là in hoạt động ở đó nhưng echo không. Tôi đoán bởi vì echo không trả lại bất cứ thứ gì - thậm chí không có giá trị, kỳ quặc.
Alex Howansky

@AlexHowansky: Nó cũng lạ "$n"[index]"_$n"[index]tạo ra các lỗi phân tích cú pháp trong khi "89"[index]$s="$n";$s[index]hoàn toàn ổn.
Tít

Hmm vâng, điều đó có vẻ kỳ lạ lúc đầu, nhưng sau khi kiểm tra tài liệu, có vẻ như họ nói rõ ràng rằng tính năng này chỉ hoạt động đối với các chuỗi ký tự.
Alex Howansky

Heh heh điều này hoạt động tốt, nhưng nó có thể không tiết kiệm cho bạn bất kỳ byte nào:("_$n")[index]
Alex Howansky

2

Toán học, 59 byte

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

Hàm không tên lấy hai đối số nguyên và trả về danh sách các số nguyên. (d=IntegerDigits@#)^Range@Length@dtạo danh sách các chữ số của một số cho các lũy thừa thích hợp; Tr[...]==#phát hiện xem tổng của các số lũy thừa đó có bằng số ban đầu hay không.


2

MATLAB, 88 73 byte

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

Câu trả lời gốc:

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

num2str(n)-'0'chia a nthành một vectơ các chữ số của nó và 1:floor(log10(n))+1là một vectơ giữ một đến số chữ số trong n. Nhờ đăng nhập vào golf xuống một chức năng ẩn danh, tiết kiệm 15 byte.


1

Haskell , 82 76 75 byte

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

Hãy thử trực tuyến! Sử dụng:5 ! 175

Cái này kiểm tra từng số trong phạm vi nđể mxem nó có phải là số disarium không và do đó khá chậm m.


Phiên bản nhanh hơn: (93 byte)

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

Hãy thử trực tuyến!


1

C (gcc) , 136 byte

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

Tiêu đề xác định pow trên TIO vì một số lý do, nó không tự động bao gồm pow. Máy tính của tôi đã làm, vì vậy tôi sẽ lăn lộn với điều đó.

Hãy thử trực tuyến!


1

MATL , 16 byte

&:"@tFYAtn:^s=?@

Hãy thử trực tuyến!

&:        % 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

Hàng loạt, 115 byte

@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

Batch chỉ có số học 32 bit, không có cách nào để so sánh số disarium cuối cùng, nhưng nếu bạn khăng khăng so sánh chuỗi, thì với giá trị là 404 byte:

@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 byte

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

Tôi chưa có cơ hội để chạy nó (làm điều này trên điện thoại của tôi).


Điều này không hoạt động. Cú pháp không chính xác và khi được sửa, sẽ chỉ in các giá trị boolean. Bắt đầu từ số mũ 0, cũng không chính xác. Ngoài ra, bạn không cần dấu ngoặc vuông bên trong sum.
Yytsi

Đây không phải là kiểm tra số disarium.
hashcode55

@ hashcode55, đã sửa (?)
Daniel

@TuukkaX, bây giờ tôi nên làm việc
Daniel

Tôi không ở trên máy tính, nhưng điều này sẽ in một dòng mới trên mỗi lần lặp, trong đó ilà một Disarium. Tôi không biết liệu điều này có được phép hay không, nhưng tôi sẽ nói không, vì đầu ra rất trống.
Yytsi

1

Scala, 132 129 byte

(% :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)

Chỉnh sửa 129: Thay đổi tên biến của vòng lặp từ &thành iba khoảng trắng đã lưu.


Giải trình

Đối với mỗi giá trị trong phạm vi đầu vào:

  • chuyển đổi nó thành một chuỗi với +""
  • sử dụng zipWithIndexđể tạo danh sách các bộ dữ liệu chứa char của chữ số và chỉ mục của nó
  • gấp danh sách bằng cách trả lại mỗi giá trị int của char trừ 48 (các dòng lên đến 0-9) cho sức mạnh của chỉ số danh sách của nó cộng với một (để bắt đầu từ ^ 1)
  • nếu kết quả khớp với đầu vào, hãy in nó

Bình luận

Cuối cùng có xung quanh để học cách foldzipWithIndexlàm việc. Tôi không hài lòng với các intchuyển đổi, nhưng tôi hài lòng với sự cô đọng của foldzipWithIndex.


1

Octave, 88 87 byte

Cảm ơn MattWH vì đã lưu một byte (f (x) -48 so với f (x) - '0')

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

Chạy:

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

Giải trình

@(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 byte

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

Phiên bản bị đánh cắp:

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

}

Có thể rút ngắn theo một cách nào đó, nhưng tôi không nhìn thấy nó vào lúc này.

@TuukkaX Cảm ơn bạn đã lưu 6 byte.


Cả hai n!=0có thể được thay đổi thành n.
Yytsi

Bạn nói đúng, điều đó thật có ý nghĩa!
Abel Tom

0

Java

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

Giải trình

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

0

Python 3: 131 byte

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

Sau khi tạo mã này, rõ ràng là có một số lượng giới hạn, do đó có thể khả thi hơn để kiểm tra các mã này một cách rõ ràng thay vì sử dụng quá nhiều sự hiểu biết danh sách vốn là khó khăn đối với các giải pháp lớn cho giải pháp này.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.