In trình tự


24

21, 21, 23, 20, 5, 25, 31, 24 ,?

Lấy cảm hứng từ Câu đố này , được đưa ra một số nguyên , in ra chuỗi sau cho đến khi bạn đạt được một số nguyên (không bị hỏng, trong trường hợp bạn muốn tự mình giải câu đố)n>0

a0=n
a4k+1=a4k(4k+1)
a4k+2=a4k+1+(4k+2)
a4k+3=a4k+2(4k+3)
a4k+4=a4k+3/(4k+4)
hoặc trực quan hơn: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...

TestCase:

1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26

Đầu vàođầu ra có thể được thực hiện trong bất kỳ định dạng hợp lý, các lỗ hổng tiêu chuẩn bị cấm như bình thường.

Theo tinh thần của , câu trả lời ngắn nhất bằng byte sẽ thắng!

Hộp cát: https://codegolf.meta.stackexchange.com/a/18142/59642


Thay vào đó chúng ta có thể trả về một danh sách vô hạn của chuỗi không? Ngoài ra, đầu ra cho 1 có đúng không? Tôi đã có một cái gì đó khác sau ngày 6
cole

3
@cole Kể từ khi chuỗi kết thúc, tôi không nghĩ bạn có thể đưa ra một danh sách vô hạn.
Thuật sĩ lúa mì

1
Chúng ta có thể xuất 1 chỉ mục, tức là bỏ qua phần tử đầu tiên không?
Jo King

1
Không, toàn bộ chuỗi phải được in.
infinitezero

1
Có, bạn có thể @KevinCruijssen
infinitezero

Câu trả lời:


6

05AB1E (di sản) , 18 17 byte

[N"/*+-"Nè.VÐïÊ#=

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

[                # Start an infinite loop:
 N               #  Push the 0-based loop-index
  "/*+-"         #  Push string "/*+-"
        Nè       #  Index into this string with the loop-index
          .V     #  And use a 05AB1E-eval to calculate the next number
 Ð               #  Triplicate this number
  ï              #  Cast it to an integer
   Ê             #  And if it's NOT equal to the number we triplicated:
    #            #   Stop the infinite loop
  =              #  Print the number without popping

Tôi đang sử dụng phiên bản kế thừa của 05AB1E tại đây và trước tiên cũng tính số tiếp theo trước khi in, vì vòng lặp dựa trên 0 và nó sẽ thực hiện /0trong lần lặp đầu tiên. Điều này đã lưu một byte so với trước đó N>"*+-/". Điều này chỉ hoạt động, bởi vì trong phiên bản cũ, một số được chia cho 0 vẫn giữ nguyên; trong khi đó trong phiên bản mới, nó sẽ trở thành 0; và trong toán học thực tế, nó sẽ cho một phép chia bằng 0.


11

Cào 3.0 39 khối / 323 byte

Ôi, tôi nhớ bạn

Hãy thử nó trên dòng đầu!

Ngoài ra, như cú pháp SB:

when gf clicked
delete[all v]of[o v
ask()and wait
set[. v]to(answer
set[n v]to(1
repeat until<(n)contains[.
if<((n)mod(4))=(0
set[. v]to((. )*(n
else
if<((n)mod(4))=(1
change[. v]by(n
else
if<((n)mod(4))=(2
change[. v]by((0)-(n
else
set[. v]to((. )/(n
end
end
end
add(n)to[o v
change[n v]by(1
end
delete(length of(o))of[o v

Nhìn vào các bạn, vui chơi với những evaltuyên bố ưa thích của bạn ! Chà, không phải tôi! Không ... Scratch không có evals, vì vậy tôi phải làm mọi thứ một cách khó khăn ... nếu tuyên bố.

Ít nhất đó không phải gotolà ...


2
Nhìn vào bạn, vui chơi với câu lệnh if và float float! Chà, không phải tôi! Không ... Khoảng trắng không có evals, if-statement hoặc float-Division, vì vậy tôi phải thực hiện mọi thứ theo cách khó khăn ... gotovà một vòng lặp trừ để xác minh xem chúng ta có thể phân chia bằng ngôn ngữ dựa trên ngăn xếp không . ; p (Trong tất cả sự nghiêm túc, câu trả lời hay, +1 từ tôi! Tôi không thể cưỡng lại việc trích dẫn bạn trong câu trả lời Whitespace vừa hoàn thành của tôi .)
Kevin Cruijssen

8

Khoảng trắng , 251 227 202 byte

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][N
S S N
_Create_Label_LOOP][S N
S _Duplicate_top][T N
S T _Print_as_integer][S S S T  S T S N
_Push_10_newline][T N
S S _Print_as_character][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S T S S T   N
_Copy_2nd_item][S T S S T   N
_Copy_2nd_item][S N
S _Duplicate_top][S S S T   S S N
_Push_4][T  S T T   _Modulo][S N
S _Duplicate_top][N
T   S S N
_If_0_Jump_to_Label_DIVIDE][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate_top][N
T   S T N
_If_0_Jump_to_Label_MULTIPLY][S S S T   N
_Push_1][T  S S T   _Subtract][N
T   S S S N
_If_0_Jump_to_Label_ADD][S N
T   _Swap_top_two][S T  S S T   N
_Copy_2nd_item][T   S S T   _Subtract][N
S N
N
_Jump_to_LOOP][N
S S S N
_Create_Label_DIVIDE][S N
N
_Discard_top][T S T S _Divide][S T  S S T   S N
_Copy_3nd_item][S T S S T   S N
_Copy_3nd_item][T   S T T   _Modulo][N
T   S N
_If_0_Jump_to_Label_LOOP][N
N
N
_Exit_Program][N
S S T   N
_Create_Label_MULTIPLY][S N
N
_Discard_top][T S S N
_Multiply][N
S N
N
_Jump_to_Label_LOOP][N
S S S S N
_Create_Label_ADD][T    S S S _Add][N
S N
N
_Jump_to_Label_LOOP]

Chữ cái S(dấu cách), T(tab) và N(dòng mới) được thêm vào dưới dạng chỉ tô sáng.
[..._some_action]chỉ thêm vào giải thích.

Dùng thử trực tuyến (chỉ có khoảng trắng, tab và dòng mới).

-24 byte sau khi nhận xét về @JoKing đề xuất n%i > 0. Mặc dù chỉ if(x < 0)if(x == 0)có sẵn trong Whitespace, chỉ cần kiểm tra if(x*-1 < 0)về cơ bản là giống như if(x > 0).
Thêm -25 byte nhờ @JoKing .

Giải trình:

Trích dẫn từ câu trả lời Scratch :

Ít nhất đó không phải gotolà ...

Có ai nói gotokhông? Khoảng trắng không có gì khác ngoài gotoviệc tạo cả hai vòng lặp và câu lệnh if. xD Ngoài ra, đây là ngôn ngữ dựa trên ngăn xếp, vì vậy tôi phải trao đổi / loại bỏ / sao chép khá thường xuyên. Và trên hết là: Khoảng trắng thậm chí không có dấu phẩy động và chỉ phân chia số nguyên, vì vậy tôi đã sử dụng n % i * -1 < 0để thoát khỏi chương trình nếu số nguyên không thể chia số hiện tại.

Mã giả:

Integer n = STDIN as input
Integer i = 0
Label LOOP:
  Print n as number
  i = i + 1
  Integer t = i % 4
  If(t == 0):
    Jump to Label DIVIDE
  t = t - 1
  If(t == 0):
    Jump to Label MULTIPLY
  t = t - 1
  If(t == 0):
    Jump to Label ADD
  n = n - i
  Jump to Label LOOP
Label DIVIDE:
  n = n / i
  Integer m = n % i
  If(m == 0):
    Jump to Label LOOP
  Exit program
Label MULTIPLY:
  n = n * i
  Jump to Label LOOP
Label ADD:
  n = n + i
  Jump to Label LOOP

Bạn thiên tài tuyệt đối. Có upvote của tôi!
Jono 2906

@JoKing Khoảng trắng chỉ có if(n == 0)hoặc if(n < 0)có sẵn. Tiếc là không có if(n > 0)hoặc if(n != 0). Nhưng tôi chắc chắn một số khía cạnh có thể được đơn giản hóa. Giải pháp hiện tại này là một thử nghiệm và sửa lỗi, nhưng có lẽ tôi nên lùi lại một bước và suy nghĩ lại một cách tiếp cận ngắn hơn. Khi tôi có thời gian một lần nữa. Và đã sửa mã giả, bạn thực sự đã đúng tôi đã chuyển i/ nở hầu hết các nơi ..
Kevin Cruijssen

1
Tôi không chắc điều này khả thi đến mức nào, nhưng có lẽ bạn có thể làm được m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program?
Jo King

1
Bạn cũng có thể di chuyển swap top two, copy second itemđến vòng lặp tổng thể thay vì sao chép nó vào từng phần?
Jo King

1
@JoKing Cảm ơn, cả hai gợi ý đã lưu byte. Gợi ý đầu tiên là -7 và thứ hai -18. :)
Kevin Cruijssen


7

JavaScript (V8) , 52 byte

In nhóm 4 điều khoản. Lấy cảm hứng từ câu trả lời Ruby của GB .

n=>{for(k=0;n%1==0;n/=k+=3)print(n,n*=++k,n-~k,--n)}

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


JavaScript (V8) , 54 byte

In các điều khoản của trình tự.

n=>{for(k=0;n%1==0;n=eval(n+'*+-/'[k++&3]+k))print(n)}

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


JavaScript (ES6),  59  58 byte

Trả về một mảng.

f=(n,k)=>k&&(n=eval(n+'/*+-'[k&3]+k))%1?[]:[n,...f(n,-~k)]

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


5

Perl 6 , 44 byte

{$_,{($_,<* + - />[$++%4]~++$).EVAL}...^*%1}

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

Khối mã ẩn danh lấy một số và trả về một chuỗi. Nếu chúng ta có thể bỏ qua phần tử đầu tiên (luôn luôn giống với phần tử thứ hai), chúng ta có thể lưu 3 byte bằng cách loại bỏ phần tử$_,



5

Piet , 297 190 144 codel (432 byte)

Mã mới

Đã thử một cách tiếp cận mới bằng cách sử dụng pointerlệnh như switch (k mod 4) để thống nhất mã đầu ra, dẫn đến hình ảnh mã 10x19 dày hơn. Sau đó, tôi đánh gôn xuống 1 hàng và 2 đồng nghiệp xuống còn 8x18.

Đây là một dấu vết, để xem nó hoạt động như thế nào:

nhập mô tả hình ảnh ở đây

Dòng đầu tiên đẩy 0 trên ngăn xếp dưới dạng chỉ mục bắt đầu (vì chúng tôi chỉ có thể là pushsố tự nhiên, chúng tôi đẩy 2 số rồi trừ), sau đó đọc đầu vào dưới dạng số.

Collumn ngoài cùng bên trái có mã được chia sẻ nhân đôi số và đưa một số vào đầu ra, sau đó di chuyển chỉ mục lên trên cùng của ngăn xếp, tăng nó và sau đó nhân đôi ba lần. Sau đó chúng tôi nhập khối hình chữ r màu đỏ pastel thông qua codel màu lục lam cho một pointerlệnh cung cấp cho chúng tôi các đường dẫn khác nhau cho phần còn lại của chỉ số mod 4.

Mod 1, chúng tôi thoát qua đầu để nhân lên. Trước tiên, chúng tôi xáo trộn một bản sao của chỉ mục của chúng tôi xuống sau đó, sau đó thực hiện phép nhân. Sau khi chuyển qua màu trắng cho một noop, chúng ta nhập coll coll bên trên để sửa lỗi chẵn lẻ cc (nó cần được lật một số chẵn để giữ cho vòng lặp ổn định), tiếp theo là pointer (1)đi vào thanh magenta: Nó hoạt động như một bắt cho bốn con đường của chúng tôi và gửi chúng tôi trở lại vào vòng lặp.

Mod 2, chúng ta thoát ngược về tổng. Hình dạng của khối mã pastel có nghĩa là chúng ta thoát một hàng phía trên từ nơi chúng ta đã nhập và chúng ta sử dụng 3 khối mà chúng ta đẩy lên ngăn xếp bằng cách thoát qua codel đỏ để pointer (3)tự mình đi lên. Các collumn này có khoảng trắng trước số học và một thứ tự đẩy và chuyển đổi cc hơi khác nhau, bởi vì nếu không, chúng ta sẽ có sự trùng lặp màu với các codel có giá trị nguyên trong các colleter lân cận.

Mod 3 gửi chúng tôi xuống để trừ. Tương tự như phép nhân, ngoại trừ chúng ta đi qua đường phân chia trên đường lên (Vì cc có tính chẵn lẻ khác nhau khi vào thanh màu xanh lá cây pastel, hai lệnh thực thi thoát khỏi thanh đó ở các đầu khác nhau). Trong khi làm như vậy, chúng tôi nhận một duplicatelệnh không mong muốn , vì vậy chúng tôi popsẽ quay lại với codel màu xanh đậm trước khi vào thanh điều chỉnh và bộ sưu tập cc.

Mod 4, chúng tôi đi thẳng về phía trước để phân chia. Ở đây, trước tiên chúng ta phải xáo trộn lại ngăn xếp nghiêm ngặt hơn để có được hai cặp n và a để thực hiện các thao tác trên, bởi vì chúng ta cần kiểm tra xem nó có phải là số nguyên không. Chúng tôi thực hiện việc đó modtrên cặp đầu tiên, sau đó notlà kết quả, sau đó sử dụng nó cho một pointer- nếu nó không chia hết, chúng tôi tiếp tục đi thẳng, điều này sẽ gửi cho chúng tôi hai pointerlệnh vào góc đối diện vào khối không thể tách rời và do đó kết thúc chương trình. Nếu không, chúng tôi rẽ phải và nhận dividelệnh từ thanh magenta.

Phiên bản cũ

Mã số

Mã rất đơn giản: Đẩy 1 và đầu vào trên ngăn xếp, sau đó lặp qua bốn thao tác bằng cách: Xáo trộn chỉ số trên đầu ngăn xếp, tăng nó lên 1, sao chép nó, xáo trộn một bản sao xuống, thực hiện thao tác số học, nhân đôi số lượng và đưa một cái vào đầu ra.

Đối với phép chia, đây là lần duy nhất mà chuỗi có thể kết thúc, nó tạo ra một ngăn xếp phức tạp hơn để kiểm tra trước nếu n mod index == 0, nếu không, nó sẽ nhập vào codel không thể mã hóa và chấm dứt. Mặt khác, nó sử dụng bản sao thứ hai của i và n để thực hiện phép chia.


Nó sẽ có thể kết hợp hàng thứ hai và thứ ba với nhau? Tức là, xoay ô màu hồng ở (0,1) -> (1,2), dịch chuyển 3 ô ở giữa xuống và thu nhỏ cột bên phải thành 1x2?
Veskah

Không dễ dàng. Tôi cần 2 ô để thực hiện rẽ phải, cho một push (1) pointerhoặc cho một ô màu đen trên đầu một ô màu.
AlienAtSystem

4

C # (Trình biên dịch tương tác Visual C #) , 72 , 70 , 69 byte

n=>{for(int i=1;n%1==0;n=new[]{n/i,n*i,n+i,n-i}[i++%4])Write(n+" ");}

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


1
59 byte bằng cách chuyển hàm JavaScript đầu tiên của Arnauld , là cổng của câu trả lời Ruby . Và vâng, đầu ra này được cho phép, chỉ cần nhận được xác nhận từ OP trong các bình luận về thử thách.
Kevin Cruijssen

@KevinCruijssen tốt, tôi sẽ không nghĩ ra điều đó!
Innat3

4

Ruby , 56 54 52 byte

f=->n,z=1{n%1>0?[]:[n,n*=z,n-~z,n-=1]+f[n/=z+3,z+4]}

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

Sau một số nỗ lực (thất bại) với eval, tôi phát hiện ra rằng giải pháp hạnh phúc nhất là xây dựng mảng với 4 phần tử cùng một lúc, ít nhất là trong ruby.

Cảm ơn Arnauld cho -2 byte.


53 byte bằng cách chuyển lại câu trả lời cuối cùng của tôi, được lấy cảm hứng từ bạn.
Arnauld

3
52 byte bằng cách sử dụng một cải tiến được đề xuất bởi Shaggy hóa ra chỉ dài bằng JS nhưng lưu một byte trong Ruby.
Arnauld

4

R , 90 byte , 87 byte 85 byte 80 byte 74 73 byte

Việc thực hiện đơn giản các quy tắc:

a=scan();while(T<13)a=c(a,d<-a[T]*T,d+T+1,e<-d-1,e/((T<-T+4)-1));a[!a%%1]

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

với những T<13điều sau đây từ một phân tích sâu hơn về câu đố. Thật vậy, chỉ có ba loại trình tự: những loại có độ dài 4, khi a⁰ không đồng dạng với 1 modulo 8; những người có độ dài 12 khi a⁰ đồng dạng với 21 modulo 32; và những người có chiều dài 8 cho các trường hợp còn lại.

Một mã thay thế tránh các vòng lặp kết thúc dài hơn với 87 byte:

`~`=rep;b=(scan()-1)*c(32~4,8,40~3,1,9~3)/32+c(1,1,3,0~3,6,-c(8,1,9,-71,17)/8);b[!b%%1]

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


1
Bạn có thể loại bỏ {}-2 byte.
Robin Ryder

1
74 byte bằng cách tránh length.
Robin Ryder

3

Haskell , 104 86 85 byte

n#i=n:(cycle[(/),(*),(+),(-)]!!floor i)n i#(i+1)
takeWhile((==).ceiling<*>floor).(#1)

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

h=thể bỏ qua vì nó chỉ được sử dụng để thử nghiệm.

Ah, mã golf, trong đó sự gia tăng bậc hai về độ phức tạp thời gian đáng để giảm một ký tự.

104 byte

f=flip
g x=scanl(f($))x.zipWith(f($))[1..].cycle$f<$>[(*),(+),(-),(/)]
takeWhile((==).ceiling<*>floor).g

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

Tôi thích câu trả lời này tốt hơn, nhưng than ôi nó dài hơn.


3

Japt , 25 24 byte

Một điều chỉnh khác của giải pháp Ruby của GB .

%1ª[UU*=°VU´ÒVU]cßU/=V±3

Thử nó

Thủ thuật chính ở đây là quá tải cphương thức cho mảng. Truyền cho nó một mảng khác như là một đối số và nó nối nó với mảng ban đầu. Truyền cho nó một số làm đối số, như xảy ra trong lệnh gọi đệ quy cuối cùng và nó làm phẳng mảng ban đầu theo nhiều cấp độ - 1trong trường hợp này, sau khi làm tròn. Nhưng, vì mảng chỉ sâu một cấp, làm phẳng nó không có tác dụng.

%1ª[UU*=°VU´ÒVU]cßU/=V±3     :Implicit input of integer U
%1                           :U modulo 1
  ª                          :Logical OR with
   [                         :Construct and array containing
    U                        :  U
     U*=                     :  U multiplied by
        °V                   :    V (initially 0) prefix incremented
          U´                 :  The new value of U, postfix decremented
            ÒV               :    Subtract the bitwise negation of V
              U              :  The now-decrmented U
               ]             :End array
                c            :Concatenate, or flatten by
                 ß           :  Recursive call to the programme with argument
                  U/=        :    U divided by
                     V±3     :      V incremented by 3

2

Java 8, 84 byte

n->{for(int i=1;n%1==0;n=new float[]{n/i,n*i,n+i,n-i}[i++%4])System.out.println(n);}

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

Việc tạo một mảng với tất cả bốn giá trị được lấy cảm hứng từ câu trả lời Ruby của @GB , mặc dù bây giờ tôi nhận thấy rằng việc sử dụng một câu lệnh if tạm thời là cùng một lượng byte:

n->{for(int i=0;n%1==0;n=++i%4<1?n/i:i%4<2?n*i:i%4<3?n+i:n-i)System.out.println(n);}

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





2

Rutger , 310 byte

n=e=$Input;
a=0;
w=While[{m=Modulo[$e];Not[m[1]];}];
w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];
Do[$w];

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

Đó là khoảng thời gian tôi sử dụng lại Rutger. Thật không may, nó có thể không phải là ngôn ngữ tốt nhất cho nhiệm vụ, vì nó không có hình thức nào eval, buộc tôi phải sử dụng bốn câu lệnh if

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

Cách thức hoạt động của Ruthger

Một lời giới thiệu ngắn gọn về cách ngôn ngữ hoạt động: Mọi thứ đều là một nhiệm vụ hoặc một chức năng và mỗi chức năng đều có chính xác một đối số. Đối với các hoạt động yêu cầu nhiều hơn một đối số (ví dụ: phép nhân), cuộc gọi đầu tiên trả về một hàm một phần , khi được gọi lại với đối số thứ hai, sẽ trả về kết quả mong đợi. Ví dụ:

left = Times[5];
Print[left[6]];

sẽ in ra 30: Dùng thử trực tuyến! . Mặc dù thông thường, nó dài hơn so với thay thế thông thường, đôi khi nó có thể lưu byte, nếu một hàm được gọi lặp lại với một đối số không đổi và một đối số thay đổi, ví dụ như khi in ra các bảng lần.

Quy tắc một đối số này áp dụng cho mọi thứ không phải là hằng hoặc biến, bao gồm các vòng lặp và các điều kiện. Tuy nhiên, các vòng lặp và điều kiện ( For, Each, While,DoWhile , IfIfElse) là doable , có nghĩa là để thực sự chạy chúng, các Dochức năng phải được gọi (xem dòng cuối cùng trong câu trả lời). Một lần nữa, điều này có thể lưu byte khi liên tục chạy cùng một vòng lặp hoặc cho phép bạn chạy mã tùy ý giữa định nghĩa và chạy vòng lặp.

Cuối cùng, có ba cách để chỉ các biến, tất cả đều được sử dụng trong chương trình này. Đầu tiên là tham chiếu trực tiếp , trong đó tên biến được thêm tiền tố bằng $ký hiệu. Điều này truy cập trực tiếp vào giá trị của biến và trả về nó. Thứ hai là tham chiếu chức năng , không có ký tự tiền tố. Điều này cho phép mã phân biệt giữa các hàm (có khả năng một phần) được gán cho các biến và các biến thực tế có chứa một giá trị cụ thể. Cuối cùng, tham chiếu gián tiếp , có tiền tố là một @ký hiệu, tạo ra một biến (nếu nó chưa tồn tại) và trả về đối tượng biến trong một phạm vi nhất định. Điều này cho phép bạn tạo một biến vòng lặp (ví dụ: itrong for i in range(...)).

Giải pháp thực tế hoạt động như thế nào

Đây là mã không được mã hóa:

n = elem = $Input;
var = 0;
while = While[{
	mod = Modulo[$elem];
	Not[mod[1]];
}];
while = while[{
for = For[4];
for = for[@index];
for = for[{
	Print[$elem];
	equal = Equal[$index];

	if = If[{ equal[1]; }];
	if = if[{ func = Times[$elem]; }];
	Do[$if];

	if = If[{ equal[2];}];
	if = if[{ func = Add[$elem];}];
	Do[$if];

	if = If[{ equal[3];}];
	if = if[{ func = Subtract[$elem];}];
	Do[$if];

	if=If[{ equal[4];}];
	if=if[{ func = Divide[$elem];}];
	Do[$if];

	elem = func[var = Increment[$var]];
	}];
	Do[$for];
}];
Do[$while];

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

Như bạn có thể thấy, nó bắt đầu bằng cách gán ba biến n , ea, trong đó đại diện cho đầu vào, yếu tố thay đổi trong trình tự, và số thay đổi cho mỗi phần tử mới tương ứng. Sau đó chúng ta tạo một vòng lặp while:

w=While[{m=Modulo[$e];Not[m[1]];}];

Các dấu ngoặc ( {}) xác định một khối mã, trong đó câu lệnh cuối cùng trong khối là điều kiện cho vòng lặp while. Trong trường hợp này, chúng tôi bắt đầu bằng cách xác định hàm modulo một phần, sẽ lấy trong đối số thứ hai mvà trả về e % m. Sau đó chúng ta gọi hàm này một phần với1 như là đối số thứ hai của nó, trở lại 0cho số nguyên và số nguyên khác không cho số float. Sau đó, chúng tôi tính toán logic không phải của điều này, ánh xạ01n0,n0.

Tiếp theo chúng ta đến với sự quái dị tuyệt đối bao gồm cơ thể của vòng lặp while:

w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];

Phần chính của vòng lặp này là một vòng lặp for, lặp đi lặp lại 4lần mỗi lần lặp của vòng lặp while, có một biến lặp xvà bao gồm:

Print[$e];
q=Equal[$x];
i=If[{q[1];}];i=i[{k=Times[$e]    ;}];Do[$i];
i=If[{q[2];}];i=i[{k=Add[$e]      ;}];Do[$i];
i=If[{q[3];}];i=i[{k=Subtract[$e] ;}];Do[$i];
i=If[{q[4];}];i=i[{k=Divide[$e]   ;}];Do[$i];
e=k[a=Increment[$a]];

Câu lệnh đầu tiên in ra mỗi lần lặp của chuỗi trước khi sửa đổi nó. Sau đó, chúng ta tạo một hàm một phần để kiểm tra sự bằng nhau với biến vòng lặp xvà gặp bốn câu lệnh if. Mỗi kiểm tra tuyên bố nếu xbằng 1, 2, 3 hoặc 4 tương ứng, và sau đó chuyển nhượng kcho mỗi chức năng trong *, +, -/, sau đó làm cho nó thành một chức năng một phần với enhư là đối số của nó. Cuối cùng, chúng ta gán eđể kchạy với atư cách là đối số thứ hai và tăng dần a.





2

TI83 / 84 CƠ BẢN, 69 byte

1→A
DelVar L1Prompt N
Repeat fPart(N
N→L1(A
NA-1→O
augment(L1,{NA,Ans+A+2,Ans→L1
O/(A+3→N
A+4→A
End
Disp L1

Chúng tôi thiết lập bộ đếm trong A và xóa L1 để chúng tôi có thể sử dụng nó để theo dõi chuỗi. Chúng tôi sau đó lặp lại cho đến khi bước phân chia gây ra một phần. Trong vòng lặp đầu tiên chúng tôi lưu trữ N vào danh sách. Việc lưu trữ một phần tử qua cuối danh sách hoặc danh sách trống sẽ tạo ra phần tử đó, vì vậy, phần lưu trữ này sẽ thêm kết quả của phép chia khi nó không gây ra phân số và khởi tạo danh sách trong lần truyền đầu tiên. Sau đó, chúng tôi sử dụng augment để nối 3 điều khoản tiếp theo của chuỗi. Toán học tính ra một vài byte nhỏ hơn bằng cách tính thuật ngữ A4k + 3 trong biến O và sau đó căn cứ A4k + 2 và A4k + 4 tắt O. Sau đó, chúng tôi thực hiện phép chia riêng để đặt lại N cho kiểm tra lặp lại và thêm 4 vào A.

Tôi đặt một L1 L ở cuối nhưng tôi không chắc nó lý tưởng như thế nào vì không có cách nào tốt để phù hợp với tất cả các điều khoản trên màn hình. Thực tế người dùng sẽ thực thi L1 sau khi chương trình chạy thủ công để cuộn qua các kết quả.


1

Than , 29 byte

NθW¬﹪θ¹«Iθ⸿≔§⟦∕θⅉ×θⅉ⁺θⅉ⁻θⅉ⟧ⅉθ

Hãy thử trực tuyến!Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập giá trị ban đầu.

W¬﹪θ¹«

Lặp lại cho đến khi giá trị không còn là số nguyên.

Iθ⸿

In giá trị trên dòng riêng của nó.

≔§⟦∕θⅉ×θⅉ⁺θⅉ⁻θⅉ⟧ⅉθ

Tính toán bốn phép toán số học có sẵn và chọn một phép toán chính xác tùy thuộc vào số dòng đầu ra hiện tại.


1

Python 3 , 78 76 byte

f=lambda n:n[-1]%1and n[:-1]or f(n+[eval(f"n[-1]{'/*+-'[len(n)%4]}len(n)")])

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

Lấy đầu vào dưới dạng danh sách 1 mục và nối tiếp đệ quy mục tiếp theo của chuỗi cho đến khi nó không phải là số nguyên.

Trong trường hợp không cho phép nhập dữ liệu làm danh sách, đây là phiên bản được vá rất nhanh, lấy đầu vào là int.

Nhập dưới dạng số nguyên, 102 byte

f=lambda n:type(n)==int and f([n])or n[-1]%1and n[:-1]or f(n+[eval(f"n[-1]{'/*+-'[len(n)%4]}len(n)")])

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

+2 byte nhờ tôi quên đặt tên hàm đệ quy ...
-4 byte nhờ Jitse


1
Cách tiếp cận tốt đẹp! Vì chức năng của bạn là đệ quy, nó không thể ẩn danh. Bạn nên bao gồm f=trong mã chính của bạn. Tuy nhiên, bạn cũng có thể lưu 4 byte kể từ khi cần n[-1]len(n)không cần phải niềng răng. Hãy thử trực tuyến!
Jitse

Không chắc chắn về việc lấy danh sách thay vì số nguyên (tôi khuyên bạn nên hỏi OP), nhưng n[:-(n[-1]%1>0)]or f...sẽ tiết kiệm một byte
Jonathan Allan

1

Cành , 164 byte

Được rồi, điều này thực sự khủng khiếp khủng khiếp để viết.

Hạn chế:

  • Không returns! Bạn đầu ra hoặc không đầu ra
  • Không while vòng lặp. Bạn phải sử dụng đệ quy hoặc không có gì
  • Không có cách dễ dàng để đầu ra! Bạn phải lặp lại đầu ra mọi lúc
  • Bạn không thể cung cấp cho các biến một giá trị mà không sử dụng set thẻ
  • Không có cách dễ dàng để thoát khỏi một vòng lặp. Không có break, continue,goto hoặc tương đương. Điều này làm cho một vòng lặp không thể sử dụng.
  • Chỉ có 1 vòng lặp: for ... in ....và nó lặp trên tất cả các phần tử trong một mảng, không có cách nào dừng lại.

Tất cả những người làm cho mã lớn!
Này, tôi thậm chí còn làm nó dài hơn câu trả lời Java!
Miễn là câu trả lời JavaScript của @ Arnauld ! ... Với cả 3 phương án kết hợp.

Đây là mã:

{%macro a(b,n=1)%}{{n<2?b}}{%set b=b*n%},{{b}}{%set b=b+n+1%},{{b}}{%set b=b-(n+2)%},{{b}}{%set b=b/(n+3)%}{%if(b//1)==b%},{{b~_self.a(b,n+4)}}{%endif%}{%endmacro%}

Bạn có thể dùng thử trên https://twigfiddle.com/zw5zls


Cách sử dụng:

Đơn giản chỉ cần nhập tệp và gọi macro đầu tiên.

{% import 'file.twig' as a %}

{{ a.a(21) }} {# 21,21,23,20,5,25,31,24,3,27,37,26 #}

Để có một mảng có thể sử dụng, bạn có thể làm a.a(21)|split(',') .


Ung dung:

{% macro calc(number, index = 1) %}
    {% if index < 2 %}
        {{ number }}
    {% endif %}

    {% set number = number * index %},{{ number }}
    {% set number = number + index + 1 %},{{ number }}
    {% set number = number - (index + 2) %},{{ number }}
    {% set number = number / (index + 3) %}

    {#
        verifies if it is an integer.
        this is done with an integer division with 1 and compare with itself
        if both values are the same, the number is an integer
        otherwise, it is a floating-point number
    #}
    {% if (number // 1) == number %}
        ,{{ number ~ _self.calc(number, index + 4) }}
    {% endif %}
{% endmacro %}

Nên dễ đọc.
Câu trả lời không có căn cứ này sẽ KHÔNG đưa ra đầu ra chính xác, vì nó sẽ ném các khoảng trắng ngẫu nhiên.
Nó tồn tại chỉ đơn thuần là có thể đọc được.

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.