พิมพ์ลำดับ


24

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

ได้รับแรงบันดาลใจจากPuzzle นี้โดยกำหนดเป็นจำนวนเต็มn>0ให้พิมพ์ลำดับต่อไปนี้จนกระทั่งถึง non-Integer (ในกรณีที่คุณต้องการแก้ปริศนาด้วยตัวเองก่อน)

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)
หรือมากกว่านั้นโดยสังหรณ์: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...

TestCases:

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

อินพุตและเอาท์พุตอาจถูกนำมาใช้ในรูปแบบที่เหมาะสมใด ๆ ช่องโหว่มาตรฐานนั้นเป็นสิ่งต้องห้ามตามปกติ

ด้วยจิตวิญญาณของคำตอบที่สั้นที่สุดในการชนะ byte!

Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642


เราสามารถส่งคืนลำดับที่ไม่มีที่สิ้นสุดแทนได้หรือไม่ นอกจากนี้เอาต์พุตสำหรับ 1 ถูกต้องหรือไม่ ฉันมีบางอย่างแตกต่างกันหลังจากวันที่ 6
โคล

3
@cole ตั้งแต่ลำดับสิ้นสุดลงฉันไม่คิดว่าคุณสามารถส่งออกรายการที่ไม่มีที่สิ้นสุด
ข้าวสาลี Wizard

1
เราสามารถเอาท์พุท 1 ดัชนีแล้วหรือข้ามองค์ประกอบแรก
Jo King

1
ไม่ต้องพิมพ์ทั้งหมด
infinitezero

1
ใช่คุณอาจ @KevinCruijssen
infinitezero

คำตอบ:


6

05AB1E (ดั้งเดิม) , 18 17 ไบต์

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

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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

ฉันใช้รุ่นเก่าของ 05AB1E ที่นี่และก่อนอื่นให้คำนวณหมายเลขถัดไปก่อนพิมพ์เนื่องจากลูปเป็นแบบ 0 และมันจะทำ/0ซ้ำในครั้งแรก ที่บันทึกไว้นี้ไบต์ในการเปรียบเทียบกับก่อนหน้านี้และN> "*+-/"ใช้งานได้เพราะในเวอร์ชันดั้งเดิมตัวเลขที่ถูกหารด้วย 0 ยังคงเหมือนเดิม ในขณะที่ในเวอร์ชั่นใหม่มันจะกลายเป็น 0; และในทางคณิตศาสตร์ที่แท้จริงมันจะให้การหารด้วยศูนย์ข้อผิดพลาด


11

Scratch 3.0 39 บล็อก / 323 ไบต์

โอ้ eval ฉันคิดถึงคุณ

ลองใช้ที่ขีดข่วนบรรทัด !

อีกทางเลือกหนึ่งเป็นไวยากรณ์ 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

ดูพวกคุณสนุกกับevalแถลงการณ์แฟนซีของคุณ! ไม่ใช่ฉัน! ไม่ ... Scratch ไม่มีหลักฐานดังนั้นฉันต้องทำสิ่งต่าง ๆ อย่างยากลำบาก ... หากมีคำสั่ง

อย่างน้อยก็ไม่ใช่gotos ...


2
ดูคุณสนุกกับถ้างบและการหารลอย! ไม่ใช่ฉัน! ไม่ ... ช่องว่างไม่มี evals, if-statement, หรือ float-division ดังนั้นฉันต้องทำสิ่งที่ยากลำบาก ... gotos และลูปลบเพื่อยืนยันว่าเราสามารถแบ่งเป็นภาษาสแต็ก . ; p (ในความจริงจัง, คำตอบที่ดี, +1 จากฉันฉันไม่สามารถต่อต้านการอ้างถึงคุณในคำตอบของ Whitespace ที่เพิ่งทำเสร็จ )
Kevin Cruijssen

8

ช่องว่าง , 251 227 202 ไบต์

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

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

-24 ไบต์หลังจากที่ความคิดเห็นของ@JoKingn%i > 0แนะนำ แม้ว่าจะมีเพียงif(x < 0)และif(x == 0)มีอยู่ในช่องว่างเพียงแค่การตรวจสอบเป็นพื้นเดียวกับif(x*-1 < 0) เพิ่มเติม -25 ไบต์ขอบคุณที่@JoKingif(x > 0)

คำอธิบาย:

อ้างอิงจากคำตอบ Scratch :

อย่างน้อยก็ไม่ใช่gotos ...

มีใครพูดgotoไหม ช่องว่างไม่มีอะไรอื่นนอกจากgotoสร้างทั้งลูปและคำสั่ง if xD นอกจากนี้ยังเป็นภาษาแบบสแต็กดังนั้นฉันต้องสลับ / ยกเลิก / คัดลอกบ่อยๆ และเหนือสิ่งอื่นใด: ช่องว่างไม่มีแม้แต่จุดลอยและการหารจำนวนเต็มเท่านั้นดังนั้นฉันจึงเคยn % i * -1 < 0ออกจากโปรแกรมหากจำนวนเต็มไม่สามารถหารจำนวนปัจจุบันได้

หลอกรหัส:

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

คุณอัจฉริยะอย่างแท้จริง มี upvote ของฉัน!
Jono 2906

@JoKing Whitespace มีif(n == 0)หรือif(n < 0)มีให้เท่านั้น แต่น่าเสียดายที่ไม่มีหรือif(n > 0) if(n != 0)แต่ฉันแน่ใจว่าสามารถทำให้บางแง่มุมง่ายขึ้น วิธีแก้ปัญหาในปัจจุบันนี้เป็นข้อผิดพลาดในการทดลองและแก้ไขข้อผิดพลาด แต่บางทีฉันควรย้อนกลับไปทบทวนวิธีคิดที่สั้นกว่า เมื่อฉันมีเวลาอีกครั้ง และคงหลอกรหัสที่คุณอยู่แน่นอนขวาผมเปลี่ยนi/ nที่สถานที่มากที่สุด ..
เควิน Cruijssen

1
ผมไม่แน่ใจว่าวิธีการทำงานนี้ แต่บางทีคุณอาจจะทำm = n%i; n = n/i; if (m == 0) jump to LOOP; exit program?
โจคิง

1
คุณสามารถย้ายswap top two, copy second itemไปยังลูปโดยรวมแทนที่จะคัดลอกไปยังแต่ละส่วนได้หรือไม่
โจคิง

1
@JoKing ขอบคุณทั้งคำแนะนำเหล่านั้นบันทึกเป็นไบต์ คำแนะนำแรกคือ -7 และ -18 ที่สอง :)
Kevin Cruijssen


7

JavaScript (V8) , 52 ไบต์

พิมพ์กลุ่มของ 4 คำ แรงบันดาลใจจากGB คำตอบของทับทิม

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

ลองออนไลน์!


JavaScript (V8) , 54 ไบต์

พิมพ์เงื่อนไขของลำดับ

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

ลองออนไลน์!


JavaScript (ES6),  59  58 ไบต์

ส่งกลับอาร์เรย์

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

ลองออนไลน์!


5

Perl 6 , 44 ไบต์

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

ลองออนไลน์!

บล็อคโค้ดแบบไม่ระบุชื่อที่ใช้ตัวเลขและส่งคืนลำดับ หากเราสามารถข้ามองค์ประกอบแรกได้ (ซึ่งเหมือนกับองค์ประกอบที่สองอยู่ดี) เราสามารถบันทึก 3 ไบต์โดยการลบ$_,



5

Piet , 297 190 144 codels (432 ไบต์)

รหัส Piet ใหม่

พยายามใช้วิธีการใหม่โดยใช้pointerคำสั่งในฐานะสวิตช์ (k mod 4) เพื่อรวมเอาท์พุทโค้ดทำให้เกิดรูปภาพรหัสขนาด 10x19 ที่หนาแน่นขึ้น จากนั้นฉันก็ตีมันลง 1 แถวและ 2 คอลเลกชั่นถึง 8x18

นี่คือการติดตามเพื่อดูว่ามันทำงานอย่างไร:

ป้อนคำอธิบายรูปภาพที่นี่

บรรทัดแรกพุช 0 บนสแต็กเป็นดัชนีเริ่มต้น (เนื่องจากเราสามารถหาได้เฉพาะpushตัวเลขเท่านั้นเราจะกด 2 อันแล้วย่อตัวลง) จากนั้นอ่านอินพุตเป็นตัวเลข

Collumn ซ้ายสุดมีรหัสที่ใช้ร่วมกันของการทำซ้ำหมายเลขและ popping หนึ่งลงในผลลัพธ์จากนั้นย้ายดัชนีที่ด้านบนสุดของสแต็คเพิ่มขึ้นจากนั้นทำซ้ำสามครั้ง จากนั้นเราก็เข้าไปในบล็อกรูปตัว r สีแดงพาสเทลผ่าน cyan cyan สีเข้มสำหรับpointerคำสั่งที่ให้เส้นทางที่แตกต่างกันสำหรับส่วนที่เหลือของดัชนี mod 4 ของเรา

Mod 1 เราออกจากด้านบนเพื่อคูณ ก่อนอื่นเราจะคัดลอกดัชนีของเราลงในภายหลังจากนั้นทำการคูณ หลังจากผ่านไปเป็นสีขาวสำหรับ noop เราป้อน collumn ด้านบนเพื่อแก้ไขซีซีพาริตี้ (มันต้องพลิกหลายครั้งเพื่อให้ลูปมีเสถียรภาพ) ตามด้วยpointer (1)จากแถบบาร์สีม่วงแดง: ทำหน้าที่เป็น จับสี่เส้นทางของเราและส่งเรากลับเข้าไปในวง

Mod 2 เราออกไปข้างหลังเพื่อรวม รูปร่างของบล็อกรหัสสีพาสเทลหมายความว่าเราออกจากแถวด้านบนจากตำแหน่งที่เราป้อนและเราใช้ 3 เรากดลงบนสแต็กโดยออกจาก codel สีแดงเพื่อpointer (3)ตัวเองขึ้นไป Collumns นี้มีช่องว่างสีขาวหน้าเลขคณิตและลำดับการผลักและสลับซีซีแตกต่างกันเล็กน้อยเพราะมิฉะนั้นเราจะมีสีทับซ้อนกับโคเดอร์ที่มีค่าเป็นจำนวนเต็มใน collumn ที่อยู่ใกล้เคียง

Mod 3 ส่งการลบลงมาให้เรา ข้อตกลงเดียวกับการคูณยกเว้นเราข้ามเส้นทางการหารไปทางด้านบน (เนื่องจากสำเนาลับมีความแตกต่างกันเมื่อเข้าสู่แถบสีเขียวพาสเทลการประหารสองครั้งจะออกจากแถบนั้นที่ปลายที่แตกต่างกัน) ในขณะที่ทำเช่นนั้นเราduplicateรับคำสั่งที่ไม่ต้องการดังนั้นเราpopจึงกลับมาพร้อมกับ codel สีเขียวเข้มก่อนเข้าสู่การแก้ไข cc และแถบการรวบรวม

Mod 4 เราไปตรงไปข้างหน้าเพื่อหาร ที่นี่เราต้องสลับสแต็กให้รุนแรงขึ้นอีกครั้งเพื่อให้ได้ n และ a สองคู่เพื่อดำเนินการต่อเนื่องจากเราต้องทดสอบว่าเป็นจำนวนเต็มหรือไม่ เราทำสิ่งที่ฉันทำmodกับคู่แรกจากนั้นnotใช้ผลลัพธ์นั้นเพื่อpointer- ถ้ามันไม่สามารถหารได้เราจะเดินต่อไปเรื่อย ๆ ซึ่งจะส่งpointerคำสั่งสองคำให้เราที่มุมตรงข้ามในบล็อกที่หลบหนีไม่พ้นและสิ้นสุดโปรแกรม มิฉะนั้นเราเลี้ยวขวาและdivideรับคำสั่งจากการเข้าสู่แถบสีม่วงแดง

เวอร์ชั่นเก่า

รหัส Piet

รหัสที่ตรงไปตรงมามาก: กด 1 และอินพุตบนสแต็กจากนั้นวนรอบการดำเนินการทั้งสี่โดย: การสับดัชนีที่ด้านบนสุดของสแต็กเพิ่มขึ้นทีละ 1 ทำซ้ำคัดลอกหนึ่งสำเนากลับลง การทำซ้ำหมายเลขและ popping ลงในเอาต์พุต

สำหรับการหารซึ่งเป็นสิ่งเดียวที่ลำดับสามารถจบได้มันจะสร้าง stack ที่ซับซ้อนกว่าเพื่อตรวจสอบก่อนว่า n mod index == 0 มิฉะนั้นจะเข้าสู่ codel ที่หลีกเลี่ยงไม่ได้และสิ้นสุดลง มิฉะนั้นจะใช้สำเนาที่สองของ i และ n เพื่อทำการหาร


เป็นไปได้ไหมที่จะเพิ่มแถวที่สองและสามเข้าด้วยกัน? นั่นคือหมุนเซลล์สีชมพูที่ (0,1) -> (1,2) เลื่อน 3 เซลล์ตรงกลางลงและหดคอลัมน์ขวาเป็น 1x2 หรือไม่
Veskah

ไม่สะดวก ฉันต้องการเซลล์ 2 เซลล์เพื่อดำเนินการเลี้ยวขวาทั้งสำหรับpush (1) pointerหรือสำหรับเซลล์สีดำด้านบนของเซลล์ที่มีสี
AlienAtSystem

4

C # (Visual C # Interactive Compiler) , 72 , 70 , 69 ไบต์

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

ลองออนไลน์!


1
59 ไบต์โดย porting Arnauldฟังก์ชัน JavaScript เป็นครั้งแรกซึ่งเป็นท่าเรือที่คำตอบทับทิม และใช่อนุญาตให้ส่งออกนี้ได้รับการยืนยันจาก OP ในความคิดเห็นของความท้าทาย
Kevin Cruijssen

@KevinCruijssen ดีฉันไม่ได้คิดเรื่องนั้น!
Innat3

4

Ruby , 56 54 52 ไบต์

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

ลองออนไลน์!

หลังจากความพยายาม (ล้มเหลว) ด้วยevalฉันพบว่าทางออกที่มีความสุขที่สุดคือการสร้างอาร์เรย์ที่มีองค์ประกอบ 4 รายการพร้อมกันอย่างน้อยก็เป็นทับทิม

ขอบคุณ Arnauld สำหรับ -2 ไบต์


53 ไบต์โดยตอบกลับคำตอบสุดท้ายของฉันซึ่งได้แรงบันดาลใจจากคุณ
Arnauld

3
52 ไบต์โดยใช้การปรับปรุงที่แนะนำโดย Shaggy ซึ่งกลายเป็นตราบใน JS แต่บันทึกไบต์ใน Ruby
Arnauld

4

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

การนำกฎมาใช้อย่างธรรมดา:

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]

ลองออนไลน์!

ด้วยสิ่งT<13ต่อไปนี้จากการวิเคราะห์เชิงลึกของตัวต่อ อันที่จริงมีลำดับสามชนิดเท่านั้น: ความยาว 4 เมื่อa⁰ไม่สอดคล้องกับ 1 โมดูโล 8 ความยาว 12 เมื่อa⁰สอดคล้องกับ 21 โมดูโล 32 และความยาว 8 สำหรับกรณีที่เหลือ

รหัสทางเลือกหลีกเลี่ยงการวนซ้ำจบลงด้วยความยาว 87 ไบต์:

`~`=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]

ลองออนไลน์!


1
คุณสามารถลบ{}ไบต์ขนาด -2 ไบต์ได้
Robin Ryder

1
74 ไบต์lengthโดยหลีกเลี่ยง
Robin Ryder

3

Haskell , 104 86 85 ไบต์

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

ลองออนไลน์!

h=สามารถละเว้นเพราะมันใช้เฉพาะสำหรับการทดสอบ

Ah, code golf ซึ่งความซับซ้อนของเวลาที่เพิ่มขึ้นเป็นสองเท่านั้นมีค่าสำหรับการลดตัวละครหนึ่งตัว

104 ไบต์

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

ลองออนไลน์!

ฉันชอบคำตอบนี้ดีกว่า แต่ก็นานกว่า


3

Japt , 25 24 ไบต์

การปรับตัวของอีกGB ทางออกทับทิม

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

ลองมัน

เคล็ดลับหลักที่นี่คือในการบรรทุกเกินพิกัดของcวิธีการสำหรับอาร์เรย์ ส่งต่ออีกอาร์เรย์หนึ่งเป็นอาร์กิวเมนต์และเชื่อมต่อกับอาร์เรย์เดิม ส่งผ่านตัวเลขเป็นอาร์กิวเมนต์เช่นเดียวกับที่เกิดขึ้นในการเรียกซ้ำครั้งล่าสุดและจะทำให้อาร์เรย์ดั้งเดิมมีหลายระดับ1ในกรณีนี้หลังจากการปัดเศษ แต่เนื่องจากอาเรย์นั้นมีความลึกเพียงระดับเดียวจึงไม่มีความสมบูรณ์

%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 ไบต์

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

ลองออนไลน์

การสร้างอาร์เรย์ที่มีค่าทั้งสี่นั้นได้รับแรงบันดาลใจจากคำตอบ Ruby ของ@GBแต่ตอนนี้ฉันสังเกตเห็นว่าการใช้คำสั่งประกอบไปด้วย if-statement เป็นจำนวนไบต์เดียวกัน:

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

ลองออนไลน์





2

Rutgerขนาด 310 ไบต์

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

ลองออนไลน์!

ประมาณเวลาที่ฉันใช้ Rutger อีกครั้ง น่าเสียดายที่อาจไม่ใช่ภาษาที่ดีที่สุดสำหรับงานเนื่องจากไม่มีรูปแบบevalบังคับให้ฉันใช้สี่ข้อความหาก

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

Rutger ทำงานอย่างไร

คำนำสั้น ๆ เกี่ยวกับวิธีการทำงานของภาษา: ทุกอย่างเป็นงานที่ได้รับมอบหมายหรือฟังก์ชั่นและทุกฟังก์ชั่นใช้เวลาหนึ่งอาร์กิวเมนต์ที่แน่นอน สำหรับการดำเนินการที่ต้องการอาร์กิวเมนต์มากกว่าหนึ่งตัว (เช่นการคูณ) การเรียกครั้งแรกจะส่งกลับฟังก์ชันบางส่วนซึ่งเมื่อถูกเรียกอีกครั้งด้วยอาร์กิวเมนต์ที่สองจะส่งคืนผลลัพธ์ที่คาดหวัง ตัวอย่างเช่น:

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

จะพิมพ์ออก 30: ลองออนไลน์! . แม้ว่าโดยปกติแล้วจะมีความยาวมากกว่าทางเลือกปกติ แต่บางครั้งก็สามารถบันทึกไบต์ได้หากฟังก์ชันถูกเรียกซ้ำ ๆ ด้วยอาร์กิวเมนต์คงที่หนึ่งรายการและอาร์กิวเมนต์ที่เปลี่ยนแปลงหนึ่งรายการเช่นเมื่อพิมพ์ตารางเวลา

กฎข้อโต้แย้งนี้ใช้กับทุกสิ่งที่ไม่ใช่ค่าคงที่หรือตัวแปรรวมถึงลูปและเงื่อนไข อย่างไรก็ตาม loops และเงื่อนไข ( For, Each, While, DoWhile, IfและIfElse) มีความเป็นไปได้ซึ่งหมายความว่าในการทำงานจริงพวกเขาDoฟังก์ชั่นจะต้องเรียกว่า (ดูบรรทัดสุดท้ายในคำตอบ) อีกครั้งนี้สามารถบันทึกไบต์เมื่อเรียกใช้วนซ้ำเดียวกันหรืออนุญาตให้คุณเรียกใช้รหัสโดยพลการระหว่างคำจำกัดความและการทำงานของลูป

สุดท้ายมีสามวิธีในการอ้างถึงตัวแปรซึ่งทั้งหมดนี้ใช้ในโปรแกรมนี้ สิ่งแรกคือการอ้างอิงโดยตรงโดยที่ชื่อตัวแปรจะขึ้นต้นด้วย$สัญลักษณ์ การเข้าถึงค่าของตัวแปรโดยตรงและส่งกลับ ที่สองคือการอ้างอิงการทำงานซึ่งไม่มีตัวอักษรนำหน้า สิ่งนี้อนุญาตให้โค้ดแยกความแตกต่างระหว่างฟังก์ชั่น (อาจเป็นบางส่วน) ที่กำหนดให้กับตัวแปรและตัวแปรจริงที่มีค่าเฉพาะ ในที่สุดการอ้างอิงทางอ้อมนำหน้าด้วย@สัญลักษณ์สร้างตัวแปร (หากยังไม่มีอยู่) และส่งคืนวัตถุตัวแปรภายในขอบเขตที่กำหนด สิ่งนี้ช่วยให้คุณสร้างตัวแปรลูป (เช่นiในfor i in range(...))

วิธีแก้ปัญหาที่เกิดขึ้นจริง

นี่คือรหัส ungolfed:

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

ลองออนไลน์!

ในขณะที่คุณสามารถดูจะเริ่มต้นด้วยการกำหนดตัวแปรที่สามn, eและaซึ่งเป็นตัวแทนของการป้อนข้อมูลองค์ประกอบการเปลี่ยนแปลงในลำดับและจำนวนการปรับเปลี่ยนสำหรับแต่ละองค์ประกอบใหม่ตามลำดับ จากนั้นเราจะสร้างลูปสักครู่:

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

วงเล็บปีกกา ( {และ}) กำหนดบล็อกของรหัสที่คำสั่งสุดท้ายในบล็อกเป็นเงื่อนไขสำหรับห่วงในขณะที่ ในกรณีนี้เราจะเริ่มต้นด้วยการกำหนดฟังก์ชั่นแบบโมดูโลบางส่วนซึ่งจะใช้เวลาในอาร์กิวเมนต์ที่สองและผลตอบแทนm e % mจากนั้นเราเรียกฟังก์ชันนี้บางส่วนด้วย1 เป็นอาร์กิวเมนต์ที่สองส่งคืน 0สำหรับจำนวนเต็มและจำนวนเต็มที่ไม่ใช่ศูนย์สำหรับการลอย จากนั้นเราคำนวณตรรกะที่ไม่เกี่ยวกับเรื่องนี้การจับคู่01 และ n0,n0.

ต่อไปเรามาถึงความประหลาดประหลาดที่แน่นอนซึ่งประกอบด้วยร่างกายของ while loop:

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

ส่วนหลักของการวนซ้ำนี้เป็นการวนซ้ำซึ่งวนซ้ำ 4คูณการวนซ้ำของ while loop แต่ละครั้งมีตัวแปรการวนซ้ำของxและประกอบด้วย:

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

คำสั่งแรกจะพิมพ์การวนซ้ำของลำดับก่อนการแก้ไข จากนั้นเราสร้างฟังก์ชั่นบางส่วนเพื่อตรวจสอบความเท่าเทียมกันกับตัวแปรลูปxและพบคำสั่งสี่รายการ แต่ละคำสั่งการตรวจสอบหากxมีค่าเท่ากับ 1, 2, 3 หรือ 4 ตามลำดับและจากนั้นได้รับมอบหมายkให้แต่ละฟังก์ชั่นใน*, +, -และ/แล้วทำให้มันเป็นฟังก์ชั่นบางส่วนกับeเป็นอาร์กิวเมนต์ของมัน สุดท้ายเรากำหนดeที่จะkทำงานกับเป็นอาร์กิวเมนต์ที่สองและที่เพิ่มขึ้นaa


2

Ruby , 52 ไบต์

->n{i=0.0;n=[p(n)/i+=1,n*i,n+i,n-i][i%4]until 0<n%1}

ลองออนไลน์!


บันทึก 2 ไบต์: i=0และใช้การลอยเป็นอาร์กิวเมนต์ของฟังก์ชัน
GB

@GB ดีขอบคุณ เราได้รับอนุญาตให้ป้อนข้อมูลต้องลอยหรือไม่?
Reinstate Monica iamnotmaynard



2

พื้นฐาน TI83 / 84, 69 ไบต์

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

เราตั้งค่าตัวนับใน A และล้าง L1 เพื่อให้เราสามารถใช้มันเพื่อติดตามลำดับ จากนั้นเราทำซ้ำจนกระทั่งขั้นตอนการหารทำให้เกิดเศษส่วน ภายในวงเราแรกเก็บ N ไปยังรายการ การจัดเก็บองค์ประกอบหนึ่งผ่านจุดสิ้นสุดของรายการหรือรายการว่างจะสร้างองค์ประกอบนั้นดังนั้นที่เก็บทั้งสองนี้จะเพิ่มผลลัพธ์ของการหารเมื่อไม่ทำให้เกิดเศษส่วนและเริ่มต้นรายการในระหว่างการส่งครั้งแรก จากนั้นเราจะใช้ augment เพื่อผนวก 3 เทอมถัดไปของลำดับ คณิตศาสตร์มีขนาดเล็กลงสองสามไบต์โดยการคำนวณคำศัพท์ A4k + 3 ในตัวแปร O จากนั้นเบส A4k + 2 และ A4k + 4 ปิด O. จากนั้นเราทำการหารแยกต่างหากเพื่อรีเซ็ต N สำหรับการตรวจสอบซ้ำและเพิ่ม 4 ถึง A

ฉันวาง Disp L1 ไว้ท้ายสุด แต่ฉันไม่แน่ใจว่ามันสมบูรณ์แบบเพราะไม่มีวิธีที่ดีในการปรับคำศัพท์ทั้งหมดบนหน้าจอ ผู้ใช้จะเรียกใช้ L1 ตามความเป็นจริงหลังจากที่โปรแกรมรันด้วยตนเองเพื่อเลื่อนดูผลลัพธ์


1

ถ่าน 29 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน คำอธิบาย:

Nθ

ป้อนค่าเริ่มต้น

W¬﹪θ¹«

ทำซ้ำจนกว่าค่าจะไม่เป็นจำนวนเต็มอีกต่อไป

Iθ⸿

พิมพ์ค่าในบรรทัดของตัวเอง

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

คำนวณสี่การดำเนินการทางคณิตศาสตร์ที่มีอยู่และเลือกหนึ่งที่ถูกต้องขึ้นอยู่กับหมายเลขบรรทัดปัจจุบัน


1

Python 3 , 78 76 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นรายการ 1 รายการและผนวกรายการลำดับถัดไปซ้ำ ๆ จนกระทั่งมันไม่ใช่จำนวนเต็ม

ในกรณีที่ไม่อนุญาตให้ป้อนข้อมูลเป็นรายการนี่เป็นเวอร์ชั่นที่ได้รับการแก้ไขอย่างรวดเร็วซึ่งรับอินพุตเป็น int

อินพุตเป็นจำนวนเต็ม 102 ไบต์

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

ลองออนไลน์!

+2 ไบต์ขอบคุณที่ฉันลืมตั้งชื่อฟังก์ชั่นวนซ้ำ ...
-4 ไบต์ขอบคุณ Jitse


1
วิธีการที่ดี! เนื่องจากฟังก์ชั่นของคุณเกิดซ้ำมันจึงไม่สามารถไม่ระบุตัวตนได้ คุณควรรวมf=ไว้ในรหัสหลักของคุณ อย่างไรก็ตามคุณยังสามารถบันทึก 4 ไบต์ตั้งแต่n[-1]และlen(n)ไม่จำเป็นต้องอยู่ในเครื่องหมายวงเล็บ ลองออนไลน์!
Jitse

ไม่แน่ใจเกี่ยวกับการรับรายการแทนที่จะเป็นจำนวนเต็ม (ฉันขอแนะนำให้ถาม OP) แต่n[:-(n[-1]%1>0)]or f...จะบันทึกไบต์
Jonathan Allan

1

Twig , 164 ไบต์

โอเคนี่มันช่างน่ากลัวจริงๆที่จะเขียน

ข้อ จำกัด :

  • ไม่returns! คุณออกหรือไม่เอาท์พุท
  • ไม่มีwhileลูป คุณต้องใช้การสอบถามซ้ำหรือไม่มีอะไร
  • ไม่มีวิธีที่ง่ายในการส่งออก! คุณต้องทำซ้ำเอาต์พุตทุกครั้ง
  • คุณไม่สามารถให้ค่าตัวแปรโดยไม่ต้องใช้setแท็ก
  • ไม่มีวิธีง่ายๆในการออกจากวง ไม่มีbreak, continue, gotoหรือคล้ายกัน ทำให้ไม่สามารถใช้การวนซ้ำได้
  • มีเพียงวงเดียวเท่านั้น: for ... in ....และมันวนรอบองค์ประกอบทั้งหมดในอาร์เรย์โดยไม่มีทางหยุด

ทั้งหมดนี้ทำให้รหัสมีขนาดใหญ่มาก!
เฮ้ฉันทำมันนานกว่าคำตอบ Java!
ตราบเท่าที่คำตอบ JavaScript ของ @ Arnauld ! ... เมื่อรวมตัวเลือกทั้งหมด 3 ตัวเข้าด้วยกัน

นี่คือรหัส:

{%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%}

คุณสามารถลองได้ที่https://twigfiddle.com/zw5zls


วิธีใช้:

เพียงนำเข้าไฟล์และเรียกแมโครแรก

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

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

a.a(21)|split(',')ที่จะมีอาร์เรย์ที่สามารถใช้งานได้ที่คุณสามารถทำได้


Ungolfed:

{% 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 %}

ควรอ่านง่าย
คำตอบที่ไม่ดีนี้จะไม่ให้ผลลัพธ์ที่ถูกต้องเนื่องจากมันจะโยนช่องว่างแบบสุ่ม
มันมีอยู่เพียงเพื่อให้มนุษย์อ่านได้

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