Tìm hệ thống truyền động!


29

Người chiến thắng (khá rõ ràng) là Dennis ♦, người đã sử dụng Jelly với 10 byte!

Thử thách này vẫn sẽ ở đây, tuy nhiên kết quả sẽ không được thực hiện nữa.


Hệ thống truyền lực của một số là một khái niệm của John Conway (người cũng đáng chú ý khi thực hiện Trò chơi cuộc sống của Conway, nhưng đó không phải là vấn đề). Nó được định nghĩa như vậy:

Đối với bất kỳ số nào nhập mô tả hình ảnh ở đây..., hệ thống truyền động của số là nhập mô tả hình ảnh ở đây... (tức là mỗi chữ số thứ 2, từ trái sang phải, là một lũy thừa của chữ số trước đó). Quá trình này được lặp lại cho đến khi kết quả là một chữ số.

VÍ DỤ:

2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed 135 => (1^3)5 = 5 1234 => (1^2)(3^4) = 81 => (8^1) = 8 1100 => (1^1)(0^0) = 1 # (0^0) = 1 -42 => -42 # Negative numbers output the input

Thách thức của bạn là, đối với bất kỳ số nào ntrong đầu vào, trả về powertrain(n)(nghĩa là nsau khi quá trình phân tách hệ thống truyền động kết thúc) làm đầu ra.

Đây là mã golf, vì vậy số byte ngắn nhất sẽ thắng.

TUYÊN BỐ TỪ CHỐI-THỨ:

  • Bạn có thể có một số chữ số lẻ trong đầu vào, chữ số cuối cùng sẽ không có công suất.
  • 0 ^ 0 là 1, vì nếu là 0, thì rất nhiều số sẽ ngay lập tức thu gọn thành 0 hoặc 1.
  • Nếu số không thể phá hủy trong bất kỳ phần nào của quá trình tính toán (ví dụ: nếu nó kết thúc bằng 2592), thì bạn chỉ có thể xuất số.
  • Nếu đầu vào là < 10(tức là tất cả các số có một chữ số và âm), hãy xuất đầu vào.

Có lẽ tôi sẽ công bố người chiến thắng sau vài giờ .

Bảng xếp hạng hiện tại:

  1. Thạch ( Dennis ♦ ): 10
  2. Pyth ( DenkerAffe ): 16
  3. MATL ( Don Muesli ): 21
  4. Perl ( TonMedel ): 42
  5. Haskell ( Damien ): 64
  6. Javascript ES6 ( edc65 ): 71
  7. Toán học ( murumb ): 74
  8. Mathicala ( LegionMammal978 ) và Haskell ( Renzeee ): 77
  9. Python 2 ( mathmandan ): 111
  10. Con trăn 3 ( Erwan ): 161
  11. Java 8 ( Màu xanh ): 229
  12. Oracle SQL 11.2 ( Jeto ): 456
  13. Befunge '93 ( Lex ): 490

Một số trường hợp thử nghiệm sẽ được đánh giá cao.
Mego

Vậy đầu vào sẽ có tối đa 4 chữ số?
Denker

7
Điều gì xảy ra nếu một chu kỳ đạt được, nhưng chu kỳ của chu kỳ không phải là 1 hoặc số đầu vào không phải là một phần của chu kỳ?
frageum

1
"Tôi chắc chắn không có bất kỳ phạm vi khả thi nào". Chúng ta có thể cho rằng nó sẽ không bao giờ xảy ra? Tức là cho phép vòng lặp đi mãi mãi nếu đạt được chu kỳ> 1?
Stewie Griffin

6
Các trường hợp thử nghiệm được đề xuất: 1100-42Thật dễ dàng bỏ lỡ các quy tắc về các trường hợp cạnh nếu không xuất hiện trong các trường hợp thử nghiệm.
Dennis

Câu trả lời:


4

Thạch, 15 14 12 10 byte

Ds2*/€Pµ³¡

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

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

Ds2*/€Pµ³¡  Main link. Argument: n

D           Convert n into the array of its decimal digits.
 s2         Split into pairs of digits.
   */€      Reduce each pair by exponentiation.
      P     Take the product of the resulting powers.
       µ    Push the preceding chain as a link, and start a new one.
        ³¡  Execute the link n times and return the last result.

Điều này có thể được thực hiện ngắn hơn bằng cách lặp lại đơn giản n, nhưng tôi không có bằng chứng rằng nó hoạt động cho tất cả các đầu vào có thể.
Dennis

1
Bạn nên ok cho bất kỳ số lượng hợp lý. Trong thực tế, bạn gần như chắc chắn ok với BẤT K
TonMedel

@Dennis Hừm, đó là những gì tôi làm trong câu trả lời của mình
Luis Mendo

1
@DonMuesli Và bây giờ tôi đã nghĩ về nó, nó có thể hoạt động. Tỷ lệ nhận được 0 và chỉ số lẻ là áp đảo ...
Dennis

Trong Jelly hiện đại, điều này có thể được thực hiện trong 7 byte:D*2/Pµ¡
Dennis

5

Haskell, 67 64 byte

(>> = (==)) >> = cho đến khi $ p.show là một hàm không tên được lấy một số nguyên làm đầu vào và trả về hệ truyền động của nó.

Đã lưu 3 byte nhờ Zgarb

p(x:y:r)=p[x]^p[y]*p r;p[]=1;p x=read x
(>>=(==))>>=until$p.show

1
((==)=<<g)tiết kiệm hai byte trên (\n->g n==n).
Zgarb

Ồ, tôi không quen với trường hợp ((->) r) của Monad. Cảm ơn vì mánh khóe.
Damien

Hàng loạt dấu chấm câu này (>>=(==))>>=thực sự trông giống như một chuyến tàu!
Andreï Kostyrka

4

Perl, 42 48 byte

Bao gồm +2 cho -lp(bạn cũng có thể bỏ qua -lnhưng tôi thích dòng mới)

Chạy với đầu vào trên STDIN, ví dụ:

perl -lp powertrain.pl <<< 1234

powertrain.pl:

s/\B/1&pos?"**":"*"/eg until++$.>($_=eval)

(trên các perls cũ hơn, bạn cũng có thể thả khoảng trắng giữa regex và cho đến khi)

Điều này sẽ không thể xử lý điểm cố định 24547284284866560000000000nhưng giá trị lớn đó sẽ không hoạt động dù sao đi nữa bởi vì vào thời điểm đó, perl đã chuyển sang ký hiệu số mũ.

Phiên bản trên thực tế sẽ hoạt động nhanh (nhiều nhất là 2592các vòng lặp) cho tất cả các số mà perl có thể biểu thị mà không sử dụng ký hiệu số mũ vì nó được chứng minh rằng không có điểm cố định giữa 259224547284284866560000000000( https://oeis.org/A135385 )

Điều này tuy nhiên giả định một cái gì đó chưa được chứng minh. Về nguyên tắc, có thể có một mức giảm mất nhiều hơn X=10^7các bước (được phỏng đoán rằng không có điểm không cố định nào có nhiều hơn 16 bước, https://oeis.org/A133503 ) có giá trị giảm xuống dưới X(nhưng ở trên 10^7) và sau đó tăng lên lần nữa. Nếu đó là trường hợp tôi phải quay lại:

s/\B/1&pos?"**":"*"/eg until$s{$_=eval}++||/-/

Giải trình

Mã này hoạt động bằng cách đặt ***(xen kẽ) giữa các chữ số

s/\B/1&pos?"**":"*"/eg

vì vậy 2592trở thành 2**5*9**212345trở thành 1**2*3**4*5. Đây là các biểu thức perl hợp lệ có thể được đánh giá bằng

$_ = eval

( 0**01trong perl). Sau đó, chỉ cần đặt một vòng lặp xung quanh đó với một bộ đếm làm cho nó hết hạn. Vì ngoại trừ các điểm cố định, các giá trị giảm xuống rất nhanh, chuỗi hệ thống truyền động hội tụ trước khi bộ đếm có cơ hội thực sự bắt đầu


3

Pyth, 25 18 11 16 byte

?<Q0Qu*F^McjGT2Q

Hãy thử nó ở đây!

7 14 byte được lưu với sự trợ giúp từ @Jakube

Giải trình

? <Q0Qu * F ^ McjGT2Q # Q = eval (đầu vào)

? <Q0Q # Nếu đầu vào là trả về âm Q
     u Q # áp dụng chức năng sau cho đến khi chúng ta đạt được một chu kỳ               
                   # giá trị bắt đầu là Q và giá trị hiện tại là G
           jGT # chia đầu vào thành một danh sách các chữ số
          c 2 # chia thành cặp 2
        ^ M # tính sức mạnh cho mọi cặp
      * F # tính sản phẩm của tất cả các quyền hạn


1
Có phải Pyth về cơ bản chỉ là một phiên bản chơi gôn của Python, ngoại trừ những thay đổi nhỏ?
clismique

1
@Jakube Cảm ơn các gợi ý! :) Vẫn còn sáng sớm đối với tôi ...
Denker

@DerpfacePython Yea, kinda. Có một cái nhìn vào các tài liệu nếu bạn muốn tìm hiểu về nó.
Denker

Không vấn đề gì. ;-)
Jakube

4
@DerpfacePython Pyth khởi đầu chỉ là "rút ngắn Python", nhưng để gọi nó là bây giờ sẽ không rõ ràng. Pyth đã chuyển hướng đáng kể từ Python.
Mego

3

Python 2, 111 byte

def p(n,b=0,o=''):
 if n<1:return n
 for c in str(n):o+=c+'**'[b:];b=~b
 j=eval(o+'1');return p(j)if j-n else j

Ý tưởng là để tạo ra một chuỗi các chữ số nơi của nđược tách ra bởi các hoạt động mà luân phiên giữa ***, và sau đó evallà chuỗi. (Các giải pháp khác sử dụng ý tưởng tương tự; xem ví dụ câu trả lời Perl của TonMedel .)

Vì vậy, các hoạt động chuyển đổi qua lại giữa '**'[0:], đó là **, và '**'[-1:], chỉ là *.

Tuy nhiên, vào cuối for-loop, chuỗi kết thúc bằng một thao tác (cái này hoặc cái kia), vì vậy chúng ta cần bỏ thao tác cuối cùng, hoặc nếu không thì thêm một chữ số khác, để chuỗi có ý nghĩa.

May mắn thay, nối thêm 1vào cuối sẽ hoạt động bất kể hoạt động nào là cuối cùng. (Nếu bạn thích, 1là một danh tính một phía từ bên phải, cho cả phép nhân và số mũ. Một cách khác để nói điều này là powertrain(n) == powertrain(10*n + 1)cho tất cả n>0.)

Cuối cùng, nếu kết quả của việc evalxảy ra giống với đầu vào (như trong một 1chu kỳ dài), hàm sẽ chấm dứt. Mặt khác, hàm gọi chính nó trên kết quả. (Nó sẽ bị treo vĩnh viễn trên bất kỳ chu kỳ dài nào > 1, nhưng theo nhận xét của OP, tôi được phép cho rằng không có chu kỳ nào như vậy.)

(Lưu ý: giải thích trên hoạt động cho các số nguyên dương một chữ số, vì đầu vào một chữ số nsẽ được hoàn thành n**1sẽ dẫn đến một 1mô-đun. Tuy nhiên, chúng tôi cũng cần chấp nhận đầu vào không tích cực, do đó, có một điều kiện tại bắt đầu ngắn mạch nếu đầu vào nhỏ hơn 1. Chúng tôi có thể loại bỏ dòng đó và lưu 17 byte, nếu đầu vào được đảm bảo không âm.)


Điều này nghe có vẻ thiên vị, nhưng ... upvote vì là Python 2. Và nó có một lời giải thích.
clismique

@DerpfacePython Cảm ơn! (Tôi đoán điều này cũng sẽ hoạt động tốt trong Python 3 ...)
mathmandan

3

Java 8, 265 244 229 byte

Đây là câu trả lời đầu tiên của tôi, nhưng tôi đã đọc trang web này một thời gian và nghĩ rằng tôi biết những gì tôi đang làm. Ít nhất là nó đánh bại befunge và SQL ...

Thật không may, giống như các câu trả lời khác, câu trả lời này không hoạt động cho 24547284284866560000000000 do java được xây dựng trong các hạn chế về cách số nguyên lớn có thể nhận được.

Đã lưu 36 byte nhờ @JackAmmo

public int p(int n){if(n<10)return n;int i=1,t=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){int a=(int)Math.pow(10,i);r[s-i++]=n%a/(a/10);}for(i=0;i<s-1;i++)t*=Math.pow(r[i],r[++i]);if(s%2==1)t*=r[s-1];return n==t?n:p(t);}

Giải thích

public int powertrain(int input){
    //handles negative and 1-digit cases
    if(input<10)return input;
    //initialize output variable       
    int total=1;
    // get "length" of number. Shorter than getting length of string representation
    int size=(int)Math.log10(input)+1;
    //initialize array to store digits
    int[] array=new int[size];
    //Now, because Java doesn't have support
    // for the "**" operation, and the way of turning
    // an integer into a string takes too many bytes,
    // I decided just to put every digit into an array with
    // math and iterate from there
    for(int i=1;i<=size;){
        int place=(int)Math.pow(10,i);
        //crazy math. Saved 1 byte by incrementing i when accessed
        array[size-i++]=input%place/(place/10);
    }
    for(int i=0;i<size-1;i++)
        //This is where the train happens.
        //Saved 1 byte by incrementing while accessing 
        //again, instead of i+=2 and i+1
        total*=Math.pow(array[i],array[++i]);
    //Make sure last number isn't left out if size is odd
    if(size%2==1)
        total*=array[size-1];
    //if we end up with same number, stop.
    //otherwise, keep recurring
    return input==total?input:powertrain(total);
}

Trong lần đầu tiên của bạn nếu ... khác thì if(n<10)return n;else{...}điều đó là không cần thiết vì về mặt logic, mọi thứ trong khối khác sẽ chỉ chạy khi n <10 là sai. Loại bỏ cái khác và 2 dấu ngoặc phù hợp sẽ giúp bạn tiết kiệm 6 byte. Có một tình huống tương tự với lần cuối của bạn nếu ... khác if(n==t)return n;else return p(t);loại bỏ khoảng trống khác và khoảng trắng sau nó để lưu thêm 5 byte. Trong thực tế, bạn có thể rút ngắn nó hơn nữa nếu bạn sử dụng toán tử bộ ba thay vì nếu ... khác như vậyreturn n==t?n:p(t);
Jack Ammo

bạn có thể lưu thêm một vài byte (17 tôi nghĩ) bằng cách khai báo t, s, r và vòng lặp for i cùng nhauint t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
Jack Ammo

@JackAmmo Tôi không biết các biến có thể được khai báo như vậy, tôi sẽ phải thử nó. Cảm ơn bạn đã giúp đỡ!
Blue

vâng, bạn chỉ cần cẩn thận với thứ tự khai báo chúng nếu bạn đang sử dụng cái này để khởi tạo cái khác (như cách r sử dụng s để xác định độ dài của nó)
Jack Ammo

đối với số lượng lớn tùy ý, bạn nên xem tài liệu của lớp BigInteger của java.oracle.com/javase/8/docs/api/java/math/BigInteger.html
Jack Ammo

2

JavaScript (ES6) 71

Một hàm đệ quy, dừng khi tìm thấy sự lặp lại. Điều này không thể hoạt động cho các vòng lặp dài hơn (lặp lại 2 giá trị trở lên) nhưng dường như điều này không thể xảy ra, ít nhất là trong phạm vi giới hạn của độ chính xác của số javascript (17 chữ số)

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

Kiểm tra

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

function go()
{
  v=+I.value
  R.textContent=f(v)
}  

go()
<input id=I value="1234"><button onclick="go()">Go</button>
<span id=R></span>


Thật tuyệt +'1'khi giết hai con chim bằng một hòn đá!
Neil

Tôi không biết liệu bạn đã điều tra chưa, nhưng điều tốt nhất tôi có thể làm replacelà dài hơn 1 byte:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Neil

@Neil Tôi cũng đã cố gắng hết sức, nhưng chuỗi mẫu đó là một ý tưởng mới ...
edc65

1

Toán học, 77 byte

Times@@(If[#2<1,1,#^#2]&)@@@Partition[IntegerDigits@#,2,2,1,1]&~FixedPoint~#&

Chức năng ẩn danh. Không quá phức tạp.


Mặc dù vậy, tôi vẫn có thể có một lời giải thích?
clismique 14/03/2016

1

Befunge 720 490 byte

Không thể cưỡng lại để làm thêm một lần nữa sau khi Không bao giờ cho tôi biết tỷ lệ cược . Vì vậy, tôi đã tối ưu hóa "ASCII-evil" của phần trước. Trong trường hợp này, tôi thấy không cần phải để con trỏ lệnh chạy qua các chữ số để đọc chúng, vì vậy tôi đã không nỗ lực để làm cho chúng có thể đọc được. Vì vậy, bây giờ nó là một số hóa nhiều hơn.

Một lần nữa, nếu các bạn muốn một lời giải thích, hãy cho tôi biết trong các bình luận, tôi sẽ cố gắng tạo ra một số mô tả hữu ích. Bạn có thể sao chép dán mã vào trình thông dịch . Tôi đã thấy rằng ví dụ 24547284284866560000000000 xuất 0, nhưng dường như đó là một vấn đề khi nhận được giá trị lớn như vậy từ một điểm trên lưới, vì bạn có thể thấy rõ giá trị chính xác được lưu trữ trong các bước cuối cùng.

v                                                    //top row is used for "variables"
>&:0`#v_.@                                           //initialize the counter                          
v     <                           g01_v#-p01:  <     //on our way back to the digitifier, check if we're done
>::>210p>55+%:10g0p-55+/:v            >10g.@         //digitifier, creates a series of ASCII characters at the top line, one for each digit in the source
        ^p01+1g01    _v#:<
v1$$                  <                              //forget some remainders of the digitifier, put 1 on the stack as a base of calculation
                      v p0-1g01-1g0-1g01*g0g01<      //taking powers of each pair of digit
>10g2-!#v_10g1-!#v_  1>                10g1-0g|
^                                  p01-2g01  *<
        >10g0g*  >                             ^     //extra multiplication with last digit if the number of digits was odd

Phiên bản này cũng hỗ trợ đầu vào tiêu cực. Đó là một cải tiến tuyệt vời trên phiên bản trước, nếu tôi tự nói như vậy. Ít nhất 1 lỗi đã được sửa và kích thước đã giảm đi rất nhiều.


Cần bao nhiêu byte nữa để điều này nhập số âm?
clismique 11/03/2016

Tôi không chắc chắn trung thực. Tôi đã có một số vấn đề với số âm và viết chúng ở đâu đó trong lưới. Tôi sẽ thử lại lần nữa.
rael_kid

Tôi chỉ tìm thấy một lỗi khác. Tôi đã quản lý để thêm hỗ trợ cho các số âm. Tôi sẽ đăng cập nhật sớm! Nó có thể sẽ có cùng số lượng byte, vì tôi đếm toàn bộ lưới.
rael_kid 11/03/2016

1

Haskell, 100 79 77 byte

g x|x==h x=x|1<2=g$h x;h=i.map(read.(:[])).show;i[]=1;i[a]=a;i(a:b:c)=a^b*i c

Không chơi gôn:

g x|x==h x=x|1<2=g$h x
h=i.map(read.(:[])).show
i[]=1
i[a]=a
i(a:b:c)=a^b*i c

Hàm này chia đầu vào thành các chữ số và thực hiện thủ thuật thông qua i .

EDIT: Cảm ơn nimi cho một số lời khuyên.


Một vài lời khuyên: a) i(a:[])=ai[a]=a, b) không cần max 1, bởi vì 0^0 = 1trong Haskell, c) thay thế (:[])bằng pure, d) di chuyển letbên trong gvào một chức năng riêng biệt và thay thế if ... then ... elsebằng các vệ sĩ:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
nimi

purekhông phải trong Prelude, nhưng phần còn lại của các mẹo hoạt động, cảm ơn. Tôi đã cố gắng làm điều đó với những người bảo vệ, nhưng cuối cùng đã sử dụng ;trước người bảo vệ và điều đó không hiệu quả, nhưng bây giờ tôi biết nó nên hoạt động như thế nào.
Renzeee 11/03/2016

purenằm trong Prelude đi kèm với cơ sở-4.8.2.0. Không biết khi nào nó được giới thiệu. Bạn không cần ( )trong i([a])=a.
nimi

1

Toán học, 74 byte

0~f~0=f[]=1
f@n_=n
f[a_,b_,c___]:=f[c]a^b
#//.i_/;i>0:>f@@IntegerDigits@i&

Giải trình

Giải pháp này sử dụng hàm trợ giúp f, lấy các chữ số của số làm đối số và áp dụng một lần lặp của hoạt động tàu điện. Dòng cuối cùng là một hàm thuần túy được tạo ra để khai thác ReplaceRepeatedhàm (hay gọi //.tắt là), áp dụng quy tắc cho một biểu thức (trong trường hợp này là đối số #của hàm thuần) cho đến khi nó không thay đổi nữa. Quy tắc i_/;i>0:>f@@IntegerDigits@ithay thế bất cứ điều gì không âm với hàm fđược áp dụng cho các chữ số thập phân của nó.


Dòng 2 không hoạt động (sử dụng :=)
CalculatorFeline

Xin giải thích?
clismique 14/03/2016

@CatsAreFluffy Tôi không thấy vấn đề của bạn với dòng 2. Nó hoạt động tốt với tôi!
murumb

SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>, Set::write: Tag Times in 1 f[n_] is Protected. >>Các lỗi thứ hai sẽ biến mất khi tôi sử dụng :=vs =.
Máy

Xin lỗi, không thể tái tạo lỗi đó. Nhưng đầu ra của bạn chỉ ra rằng ngắt dòng là một phần của vấn đề. Vui lòng thử phiên bản với ;s thay vì ngắt dòng:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
murphy

1

MATL , 21 byte

tt0>*:"V!UtQgv9L2#)^p

Có thể mất vài giây để tạo đầu ra.

EDIT (ngày 30 tháng 7 năm 2016): mã được liên kết thay thế 9Lbằng cách 1Lthích ứng với những thay đổi gần đây trong ngôn ngữ.

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

Điều này sử dụng hai thủ thuật sau để giảm số byte với chi phí hiệu quả mã:

  • Lặp lại nthời gian thay vì chờ đợi cho đến khi một chu kỳ được tìm thấy. Điều này được chấp nhận theo nhận xét của OP.
  • Đối với một số chữ số lẻ, một trận chung kết 1sẽ phải được thêm vào để hoàn thành hoạt động điện cuối cùng. Thay vào đó, số lượng thêm vào 1là số chữ số. Điều này đảm bảo số chẵn, vì vậy tất cả các hoạt động điện có thể được thực hiện (ngay cả khi những 1^1hoạt động cuối cùng là hoạt động không cần thiết ).

Mã số:

t         % implicitly take input x. Duplicate
t0>*      % duplicate. Is it greater than 0? Multiply. This gives 0 if input is negative,
          % or leaves the input unchanged otherwise
:         % Generate array [1,2,...,x]
"         % for each (repeat x times)
  V       %   convert x to string
  !       %   transpose into column char array
  U       %   convert each char into number
  tQg     %   duplicate. Add 1 so that no entry is zero. Convert to logical: gives ones
  v       %   concatenate vertically
  9L2#)   %   separate odd-indexed and even-indexed entries
  ^       %   element-wise power
  p       %   product of all entries
          % implicitly end for each
          % implicitly display

Uh ... heh heh heh ... khi tôi nói "vòng lặp số", ý tôi là những con số đã đi như thế này - a, b, a, bad infinitum (nhiều hơn một thuật ngữ). Nếu một thuật ngữ được lặp lại, thì bạn nên xuất số đó. Xin lỗi nếu điều đó không thực sự rõ ràng.
clismique 11/03/2016

Nếu một thuật ngữ được lặp lại, tôi sẽ đưa ra con số đó. Tôi đưa ra kết quả sau nhiều lần lặp lại
Luis Mendo

Ồ, giờ thì tôi đã hiểu ... chỉ cần hỏi, có bao nhiêu lần lặp lại (xấp xỉ)? Bởi vì khi tôi nhập 2592vào đầu vào, nó dường như không xuất ra bất cứ thứ gì trong một thời gian dài.
clismique 13/03/2016

Số lần lặp là số đầu vào, vì vậy 2592 trong trường hợp đó. Vâng, phải mất một lúc
Luis Mendo

0

Python 3, 169 161 byte

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s];s+='1'*(len(s)%2==1);r=1;
  for i,j in zip(s[::2],s[1::2]):r*=int(i)**int(j);s=str(r);
 return o[-1]

Ungoldfed

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s]
  s+='1'*(len(s)%2==1)
  r=1
  for i,j in zip(s[::2],s[1::2]):
   r*=int(i)**int(j)
  s=str(r)
 return o[-1]

Các kết quả

>>> [f(i) for i in ['135', '1234', '642', '2592', '-15']]
['5', '8', '2592', '2592', '-15']

@PeterTaylor Đã sửa!
Erwan

Bạn có thể đặt nhiều câu lệnh trong một dòng nếu bạn tách chúng bằng một ;cách này giúp bạn tiết kiệm cho bạn khoảng trắng có ý định. Ngoài ra, bạn có thể đặt phần thân của vòng lặp for trên cùng một dòng.
Denker

Chơi golf được đề xuất:def f(s,o=[['1',s]["-"in s]],n=int): while s not in o: o+=[s];s+=1*(len(s)%2<1);r=1 for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j) s=str(r) return o[-1]
Máy

@CatsAreFluffy o=[['1',s]["-"in s]]trong đối số mặc định không hoạt động đối với tôi, nó gây ra lỗi 'không được xác định'
Erwan

Rất tiếc, di chuyển o đến dòng tiếp theo.
Máy

0

Oracle SQL 11.2, 456 byte

WITH v(n,c,i,f,t)AS(SELECT:1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL UNION ALL SELECT DECODE(SIGN(c-i+1),-1,t,n),DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),DECODE(SIGN(c-i+1),-1,1,i+1),DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))FROM v,XMLTABLE(f)WHERE i<=c+2 AND:1>9)CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

Không chơi gôn

WITH v(n,c,i,f,t) AS
(
  SELECT :1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL
  UNION ALL
  SELECT DECODE(SIGN(c-i+1),-1,t,n),
         DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),
         DECODE(SIGN(c-i+1),-1,1,i+1),
         DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),
         DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))
  FROM v,XMLTABLE(f) WHERE i<=c+2 AND :1>9 
)  
CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0
SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

v là một khung nhìn đệ quy, các tham số là

n: số để chia thành 2 phần chữ số

c: số gồm 2 chữ số

i: phần 2 chữ số hiện tại để tính

f: chuỗi nối các lũy thừa với * làm dấu phân cách

t: đánh giá của f

Các DECODE chuyển sang số tiếp theo để phân tách và tính toán khi tất cả các phần của số hiện tại được thực hiện.

XMLTABLE (f) lấy một biểu thức để đánh giá nó, đưa kết quả vào cột giả "cột_value". Đây là phiên bản chơi gôn của http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html

CYCLE là bản dựng tiên tri trong phát hiện chu kỳ và được sử dụng làm điều kiện thoát.

Vì kết quả cho: 1 <10 là: 1 và v không trả về hàng nào cho các trường hợp đó, SUM buộc một hàng có NULL làm giá trị. NVL trả về: 1 là kết quả nếu hàng là null.


Lời giải thích ở đâu?
clismique 11/03/2016
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.