ดำเนินการพิมพ์ย้อนหลัง


102

งานของคุณคือการกลับลำดับที่มีprintsการดำเนินการบางอย่าง


รายละเอียด:
รหัสของคุณจะอยู่ในรูปนี้:

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

คุณจะต้องprint(หรือหรือechoหรือwriteหรือเทียบเท่า) สตริงเหล่านั้นจากที่สี่ถึงครั้งแรก

  • คุณตัดสินใจที่บรรทัดของโปรแกรมของคุณต้องprintสตริง แต่พวกเขาจะต้องอยู่ติดกัน ;

  • ทุกบรรทัดสามารถมีได้เพียงหนึ่งบรรทัดเท่านั้นprintและต้องมีความยาวไม่เกิน60 ไบต์

  • เนื่องจากนี่คือจงสร้างสรรค์และหลีกเลี่ยงการเขียนเพียงgotoอย่างเดียวfor(i){if(i=4)print"Line1";if(i=3)...}

  • คำตอบที่ได้รับการโหวตมากที่สุดใน 2 สัปดาห์ชนะรางวัลนี้

  • เอาต์พุตของคุณต้องเป็นLine4 Line3 Line2 Line1 OR Line4Line3Line2Line1 หรือ Line4\nLine3\nLine2\nLine1 (ซึ่ง\nเป็นบรรทัดใหม่) และจะต้องสร้างขึ้นโดยเรียกใช้printsย้อนหลังเท่านั้น

การเข้ารหัสที่มีความสุข!

อัพเดท: การแข่งขันจบแล้ว! ขอบคุณทุกคน :)


15
ภาษาอาหรับนับหรือไม่ :)

หากคุณสามารถทำตามข้อกำหนดได้แน่นอน: P
Vereos

ต้องการชี้แจงอย่างรวดเร็วหนึ่งกฎ ... เมื่อคุณพูดว่า "ทุก ๆ Like สามารถมีเพียงหนึ่งพิมพ์" คุณหมายถึงบรรทัดข้อความหนึ่งบรรทัดในไฟล์รหัสหรือหนึ่ง LOC / คำสั่ง?
Ruslan

โค้ดทุกบรรทัดสามารถมีการพิมพ์ได้เพียงครั้งเดียว
Vereos

ต้องผ่านการตรวจสอบรหัส - เหมาะสำหรับรหัสการผลิตหรือไม่
แลนซ์

คำตอบ:


183

พลเรือจัตวา 64 พื้นฐาน

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"

83
ฉันไม่สามารถเข้าใจได้ว่าเหตุใดจึงต้องมีหมายเลขบรรทัดจนถึงตอนนี้
ugoren

3
ฉันจะเสนอให้คัดลอก Character ROM ($ D000) ไปที่ RAM ($ 3000) การสลับบิตแมปอักขระสำหรับ "1" <-> "4" และ "2" <-> "3" จากนั้นเรียกใช้โปรแกรมตามลำดับไปข้างหน้า . นี่คือน่ารักกว่า
Mark Lakata

ฉันค่อนข้างมั่นใจว่าคุณไม่สามารถบันทึก / โหลดหรือแสดงรหัสตามลำดับที่แสดงโดยใช้เครื่องมือมาตรฐาน (ไม่สามารถใช้กับ Apple II ได้) สิ่งที่คุณสามารถทำได้ก็คือพิมพ์บรรทัดเหล่านั้นลงในคอนโซล เพื่อให้. และหากได้รับอนุญาตคุณจะไม่สามารถใช้ไลบรารี่เช่น C # SendKeys เพื่อพิมพ์รหัสในภาษาที่ตอบแล้วในลำดับอื่นด้วยแป้นลูกศรเพื่อเลื่อนไปมา
แลนซ์

108

PHP

การละเมิดลำดับความสำคัญ ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";

3
ใน PHP printอาจจะใช้เป็นการแสดงออกเช่นนั้นอาจจะอยู่ใน Perl, 1ค่าตอบแทนของซึ่งเป็นเสมอ !1ส่งคืนbool(false)ซึ่งเมื่อพิมพ์เป็นสตริงจะส่งคืนสตริงว่าง ข้อ จำกัด ที่เหมาะสมมากขึ้นสำหรับ PHP อาจจะต้องใช้echoมากกว่าprint; ข้างต้นจริงๆเป็นเพียงหนึ่งคำสั่ง
primo

1
@ kuldeep.kamboj มันเป็นเพียงการจัดกลุ่มอย่างนั้น: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- ทุกอย่างที่อยู่ด้านขวาของคำสั่งการพิมพ์เป็นส่วนหนึ่งของมัน
bwoebi

4
ดูเหมือนว่าจะทำงานในทุกรุ่น3v4l.org/dpSpKที่น่าประทับใจมาก!
eisberg

3
ใช้เวลาสักครู่เพื่อทำความเข้าใจ (ขอบคุณ @ eisberg สำหรับลิงก์!) แต่ตอนนี้ฉันเข้าใจแล้ว ในขณะที่ตัวแรกprintถูกเรียกใช้ครั้งแรกมันจะไม่เสร็จสิ้นการขจัดสิ่งที่ต้องพิมพ์จนกว่าจะprintมีการเรียกใช้และประเมินผลอย่างสมบูรณ์(ด้านล่าง) และ!s ก็แค่ซ่อนของ 1 ที่จะพิมพ์เป็นอย่างอื่น ยอดเยี่ยม @bwoebi!
sfarbota

1
@sfarbota กฎการอ่านยาก แก้ไขแล้ว. ขอบคุณ :-)
bwoebi

76

C

พฤติกรรมที่ไม่ได้กำหนดเป็นพฤติกรรมที่น่าตื่นเต้นที่สุด!

f(){}
main()
{
   f(printf("Line 1\n"), 
     printf("Line 2\n"), 
     printf("Line 3\n"), 
     printf("Line 4\n"));
}

เอาต์พุตที่แท้จริงอาจแตกต่างกันไปขึ้นอยู่กับคอมไพเลอร์ลิงค์เกอร์ระบบปฏิบัติการและโปรเซสเซอร์ :)


22
ฉันไม่รู้เลยว่าทำไมสิ่งนี้ถึงใช้งานได้จริง +1
svick

7
@svick: เพื่อสนับสนุน varargs คอมไพเลอร์ C ส่วนใหญ่วางอาร์กิวเมนต์ของฟังก์ชันในสแต็กในลำดับย้อนกลับ (ดังนั้นรายการบนสุดของสแต็กจะเป็นอาร์กิวเมนต์ที่ 1 เสมอ) ซึ่งหมายความว่าพวกมันมีแนวโน้มที่จะประเมินข้อโต้แย้งด้วยวิธีเดียวกัน แน่นอนว่าข้อโต้แย้งนี้จะถูกส่งผ่านบนสแต็กซึ่งน้อยลงและน้อยลงด้วยคอมไพเลอร์รุ่นใหม่
Guntram Blohm

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

1
@fluffy: อนิจจาเป็นวิธีอื่น ๆ : C ไม่ถือว่าเครื่องหมายจุลภาค arglist เป็นจุดลำดับซึ่งแตกต่างจากเครื่องหมายจุลภาคอื่น ๆ
Williham Totland

6
@WillihamTotland ดีแล้วฉันรู้รหัสบางอย่างที่ฉันจริงๆต้องแก้ไข ... ขอบคุณ
ปุย

74

ชวา

ใช้การสะท้อนแสง

public class ReversePrint {
    public static void main(String[]a) {
        System.out.println("Line1");
        System.out.println("Line2");
        System.out.println("Line3");
        System.out.println("Line4");
    }
    static {
        try{
            Field f=String.class.getDeclaredField("value");
            f.setAccessible(true);
            f.set("Line1","Line4".toCharArray());
            f.set("Line2","Line3".toCharArray());
            f.set("Line3","Line2 ".trim().toCharArray());
            f.set("Line4","Line1 ".trim().toCharArray());
        }catch(Exception e){}
    }
}

เอาท์พุท:

Line4
Line3
Line2
Line1

คำอธิบายว่าทำไมงานนี้จึงสามารถพบได้ ที่นี่


61
น่ากลัว ฉันชอบมัน.
Roger Lindsjö

4
+1 คนมักจะพูดว่าจาวาสตริงนั้นไม่เปลี่ยนรูป คุณพิสูจน์ว่าพวกเขาไม่ใช่
Victor Stafusa

16
สิ่งนี้น่ารังเกียจอย่างน่ายินดี แต่ไม่เป็นไปตามข้อกำหนดของการดำเนินการย้อนกลับ
Thorbjørn Ravn Andersen

4
@ ThorbjørnRavnAndersen shhhh ... คุณไม่ควรบอกพวกเขาว่า : p
Danny

5
@Victor ใน Java สตริงจะไม่เปลี่ยนรูป ทั่ว Stackoverflow มีคำถามเช่น "ฉันคิดว่า Strings ไม่เปลี่ยนรูป" พวกเขาใช้การสะท้อนและทำให้พวกเขาดูเหมือนไม่เปลี่ยนรูป คำสัญญาของ Java ทำงานดังนี้: "ถ้าคุณใช้สิ่งที่เราเรียน / ในแบบที่เราตั้งใจแล้วเราสัญญาว่าการเรียกร้องของเราถูกต้อง" การสะท้อนกลับไม่ใช่วิธีการเรียนที่ตั้งใจจะใช้
Justin

70

C (และประเภทของ Python)

เวอร์ชันใหม่โดยใช้แมโครเพื่อจัดรูปแบบคำถามให้ลงตัว ตามความคิดเห็นของ Quincunx ฉันเพิ่มreturnเพื่อทำให้ดีขึ้น

มันยังทำงานใน Python แต่มันจะพิมพ์ในลำดับที่ถูกต้อง

#define print"\n",printf(
#define return"\n"))));}
#define def main(){0?

def main():
    print "Line 1"
    print "Line 2"
    print "Line 3"
    print "Line 4"
    return

main();

เวอร์ชันดั้งเดิม - ทั้งสองแบบนั้นเหมือนกันหลังจากการแทนที่แมโคร:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}

1
+1 สำหรับมาโคร อาจรวมถึงอีกหนึ่ง; สิ่งที่ต้องการ#define } 0))));(ผมไม่ทราบว่าวิธีการทำงานในแมโคร C) ด้วยวิธีนี้คุณสามารถมีคำสั่งพิมพ์ในวิธีการหลักไม่มีอะไรอื่น
Justin

@Quincunx คุณไม่สามารถกำหนดได้}แต่คุณสามารถกำหนดreturnได้ซึ่งตอนนี้ฉันทำแล้ว เกือบจะเป็นภาษาพูดได้หลายภาษาแล้ว - printไวยากรณ์ใช้งานได้ในหลายภาษาสคริปต์#defineมักจะเป็นความคิดเห็น แต่main(){..}ไม่สามารถใช้งานในภาษาใดก็ได้ที่ฉันพบ
ugoren

1
@Quincunx และตอนนี้มันเป็นพูดได้หลายภาษาจริงๆ
ugoren

สองวิธีแรกกำหนดว่าทำงานโดยไม่มีช่องว่างได้อย่างไร มันprintจะถูกแทนที่ด้วย"\n",printf(?
phuclv

@ LưuVĩnhPhúc - พื้นที่เป็นตัวเลือก มันเข้ามาแทนที่อย่างที่คุณพูด
ugoren

61

ES6 (ใช้โหมดย้อนกลับ;)

ว้าวดูเหมือนว่านักออกแบบของ ECMAScript จะมองการณ์ไกลอย่างไม่น่าเชื่อเมื่อพวกเขาทำส่วนหลังของสเป็ค:

// activate backwards mode:
'use backwardsˈ; \* mode backwards in now *\
code of lines some \
\*code*\ "Line1" print \*code*\
\*code*\ "Line2" print \*code*\
\*code*\ "Line3" print \*code*\
\*code*\ "Line4" print \*code*\
code of lines some \
⁏ˈforwards useˈ // back to ˈnormal'.

// So simple! No need to do anything this complicated:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

เอาต์พุต (การประเมินผลจริง ๆ ):

"Line4Line3Line2Line1"

โปรดทราบว่าคุณว่าของแบบฟอร์มขอมีเพียง backwardification เล็กน้อยเพื่อให้พอดีกับไวยากรณ์ของโหมดที่ โปรดทราบว่าโหมดนี้รองรับเฉพาะ Firefox รุ่นล่าสุดในขณะนี้

หมายเหตุสุดท้าย: จริง ๆ แล้วไม่มีโหมดย้อนกลับ แต่นี่ยังคงเป็นสคริปต์ที่ถูกต้องที่ทำงานใน Firefox (คัดลอกทุกสิ่ง) : D


ES6 "โหมดหละหลวม"

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

// activate "lax" mode:
`use laxˋ; // also works: ˋuse relaxˋ, ˋuse guessingˋ, ˋuse whatevsˋ, etc.
//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code
ˋuse normalˋ; // same as ˋuse default`.

// Again, compare to inferior, illegible "traditional" ES6:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

โปรดทราบว่าขณะนี้ " โหมดหละหลวม " มีให้บริการเฉพาะใน Firefox> = 34. P


7
ลิงก์ทั้งหมด 3 รายการที่คุณโพสต์นำไปสู่ ​​404 เรื่องตลกแบบนี้หรือไม่?
จัดการ

8
อา ฉันเห็นแล้ว เครื่องมือเน้นข้อความคือผู้สมรู้ร่วมของคุณที่นี่
จัดการ

12
นี่คือการประกวดคอมโบความนิยมและการหมุนรอบรหัสใช่ไหม :) ฉันรักมัน.
ไม่ใช่ชาร์ลส์ที่

8
นี่คือการใช้ Javascript ในทางที่ผิด ฉันชอบมัน.
Seiyria

2
ส่อเสียด. Soooo ส่อเสียด ....
David Conrad

59

C

main()
{
  int i = 0;
  for(; i == 0; printf("Line 1\n"))
    for(; i == 0; printf("Line 2\n"))
      for(; i == 0; printf("Line 3\n"))
        for(; i == 0; printf("Line 4\n"))
          i = 1;
}

56

ทับทิม

print 'Line1' unless
print 'Line2' unless
print 'Line3' unless
print 'Line4'

แก้ไข: อีกวิธีหนึ่งคือ

def method_missing(meth,*)
  puts meth.to_s.sub('print'){}
end

printLine1(
printLine2(
printLine3(
printLine4)))

38
ฉันชอบสิ่งนี้เพราะมันมีเมท
เรย์

2
คุณจะไม่โพสต์คำตอบสองข้อถ้าคุณมีวิธีแก้ปัญหาสองข้อใช่ไหม
TheConstructor

3
นี่จะดูไม่น่าดูrubyด้วยรหัสบล็อคหรือไม่ pastebin.com/LDWpxKx8
จัดการ

2
@PacMani ผู้ห้ามไม่ใช้พื้นที่สีขาวพวกเขาใช้พื้นที่สีขาว
corsiKa

@ จัดการงานที่ดีอย่างหนึ่ง! ฉันคิดว่าmethod_missingมันเป็น Ruby-ish ที่น่ารัก
ประวัติศาสตร์ 24

49

PHP

ฉันรู้ว่านี่เป็นบ้า ...

goto d;
a: print "Line1\n"; goto end;
b: print "Line2\n"; goto a;
c: print "Line3\n"; goto b;
d: print "Line4\n"; goto c;
end: exit;

66
เสียงที่คุณได้ยินก็คือ Dijkstra กำลังหมุนอยู่ในหลุมศพของเขา :-)
Gareth

24
บางคนคิดว่า "มีความคิดสร้างสรรค์และหลีกเลี่ยงการเขียนแค่goto" ;-)
TheConstructor

22
@TheConstructor ส่วนที่สร้างสรรค์ใช้ goto ใน PHP ;)
NikiC

1
เต็มไปด้วยชัยชนะ
Nick T

41

Haskell

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

a << b = (const a =<< b)

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"

5
คำแนะนำ:(<<) = flip (>>)
Bergi

@Bergi นั่นเป็นอีกวิธีในการเขียนมันฉันคิดว่าสง่างามยิ่งขึ้นไปอีก จริง ๆ แล้วฉันรู้สึกประหลาดใจเล็กน้อยที่เห็นสิ่งที่ไม่ได้กำหนดไว้ในคำนำ (หรือ Control.Monad)
shiona

@shiona: ใช่มันเป็นเรื่องที่น่าแปลกใจที่จะพลาด อย่างมีความสุขเราก็มีผู้ประกอบการทั้ง Applicatives: และ<* *>
Tikhon Jelvis

@TikhonJelvis จริง ๆ แล้ว<*ผู้ดำเนินการสมัครแตกต่างจากนี้<<: a <* bเทียบเท่ากับdo x<-a;b;return xมันคือผลของมันaก่อน
ภูมิใจ haskeller

40

Perl

use threads;

$a=threads->create(sub {sleep(5); print("Line1\n");});
$b=threads->create(sub {sleep(4); print("Line2\n");});
$c=threads->create(sub {sleep(3); print("Line3\n");});
$d=threads->create(sub {sleep(2); print("Line4\n");});

$a->join();
$b->join();
$c->join();
$d->join();

22
นี่คือเหตุผลทางทฤษฎีไม่รับประกันว่าจะพิมพ์ในลำดับย้อนกลับที่แน่นอน
Cruncher

4
@Cruncher ฉันรู้ แต่มี 1 วินาทีช่องว่างในการพิมพ์ในสิ่งอื่น ๆ นอกเหนือจากการสั่งซื้อย้อนกลับจะบางสวย
Gareth

3
@Gareth นั่นเป็นเหตุผลที่ผมเอียงในทางทฤษฎี :)
Cruncher

3
@ Cruncher นั่นไม่ใช่สิ่งที่ทำให้มันสนุกเหรอ?
Pierre Arlaud

@ ครูเกอร์ในลักษณะเดียวกับที่ในทางทฤษฎีอะตอมของฉันสามารถผ่านกำแพงได้หรือไม่
cdeange

37

HTML + CSS

<p>Line 1</p>
<p>Line 2</p>
<p>Line 3</p>
<p>Line 4</p>

CSS:

body {margin-top:7em}
p + p {margin-top:-4em}

ดูjsFiddle

แก้ไข:
เพื่อให้สอดคล้องกับกฎระเบียบที่ดีกว่าที่นี่เป็นตัวแปรในรูปแบบ XML printที่ใช้จริง

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="style.css"?>
<root>
  <print>Line 1</print>
  <print>Line 2</print>
  <print>Line 3</print>
  <print>Line 4</print>
</root>

โดย style.css ควรเป็น

* {display:block; margin-top:3em}
print + print {margin-top:-3em}

HTML ที่ไม่มี CSS

และสำหรับ heck ของมันนี่คือไม่มี CSS

<table>
<tfoot><tr><td><table><tfoot><tr><td>Line 1</tr></tfoot>
<tbody><tr><td>                      Line 2</table></tfoot>
<tbody><tr><td><table><tfoot><tr><td>Line 3</tr></tfoot>
<tbody><tr><td>                      Line 4</table></tbody>
</table>

ซอ


2
ใครช่วยอธิบายการลงคะแนนได้บ้าง? มันจะทำงานเมื่อพิมพ์คุณรู้
นาย Lister

คุณสามารถทำได้p {float:right;}
Noyo

แต่ผลลัพธ์จะเป็นหนึ่งบรรทัด!
Mr Lister

... และนั่นได้รับอนุญาต :]
Noyo

1
... และนั่นไม่ได้รับอนุญาต : D คุณยังสามารถห่อไว้ใน div div {float:left}และเพิ่มกฎแบบ
Noyo

23

C ++

#include <iostream>
#define Q(x,y) x ## y
#define P(x,y) Q(x, y)
#define print S P(s, __LINE__) =
struct S { const char *s; S(const char *s): s(s) {} ~S() { std::cout << s << std::endl; } };
int main() {
    print "Line1";
    print "Line2";
    print "Line3";
    print "Line4";
}

(ตัวแปรท้องถิ่นถูกทำลายในลำดับย้อนกลับของการประกาศ)

C ++ 11

#include <iostream>
int main() {
    struct S { void (*f)(); S(void (*f)()): f(f) {} ~S() { f(); } } s[] = {
        {[](){ std::cout << "Line1" << std::endl; }},
        {[](){ std::cout << "Line2" << std::endl; }},
        {[](){ std::cout << "Line3" << std::endl; }},
        {[](){ std::cout << "Line4" << std::endl; }},
    };
}

(เหมือนกันมาก แต่ใช้ lambdas และสมาชิก data array แทน)


ฉันโพสต์โซลูชันโดยใช้std::functionและฉันพยายามที่จะกำจัดมัน ตอนนี้ฉันไม่ต้องการเพราะคุณได้รับมัน!
sergiol


21

จาวาสคริ

setTimeout(function(){console.log("Line 1");},900);
setTimeout(function(){console.log("Line 2");},800);
setTimeout(function(){console.log("Line 3");},700);
setTimeout(function(){console.log("Line 4");},600);

การใช้งาน1,2,3,4เป็นไทม์เอาต์ก็ใช้งานได้สำหรับฉัน (อย่างไรก็ตามฉันไม่ทราบว่าพฤติกรรมนี้เป็นมาตรฐานใน ECMAScript หรือไม่)
ComFreek

1
@ComFreek: setTimeoutเป็นมาตรฐานใน HTML5 / ตัวจับเวลาไม่ใช่ใน ES นอกจากนี้ยังระบุการหมดเวลาอย่างน้อย 4ms :-)
Bergi

1
@Bergi ใช่แล้วคุณพูดถูก! มาตรฐาน HTML - ตัวจับเวลา - ถ้าใครสนใจ
ComFreek

1
รันสิ่งนี้บนเครื่องที่ช้าพอ (เช่น 8086 ที่รันแอปพลิเคชั่นอื่น ๆ อีกหลายตัว) และจะล้มเหลว (โดยไม่สำเร็จฉันหมายถึงคำสั่งจะไม่ถูกย้อนกลับเนื่องจากจะใช้เวลา> = 100ms ในการดำเนินการแต่ละคำสั่ง
Jeff Davis

1
@ lastr2d2 จำลองคอมพิวเตอร์ช้าในขณะที่มีลูปเป็นธรรมอัตนัย แต่ฉันคิดว่านี้จะเป็นมากขึ้นเช่นมันjsfiddle.net/7zbKw/1 หมายเหตุจากwhatwg.org/specs/web-apps/current-work/multipage/ … "API นี้ไม่รับประกันว่าตัวจับเวลาจะทำงานอย่างถูกต้องตามกำหนดเวลาความล่าช้าเนื่องจากภาระของ CPU งานอื่น ๆ ฯลฯ คาดว่าจะเป็นไปได้"
Jeff Davis

20

C

พยายามทำให้เคล็ดลับในคำถามมีความคิดสร้างสรรค์มากที่สุด:

#include <stdio.h>
#define print if (i == __LINE__) puts
static unsigned i;
int main(void) {
  while (--i) {
    print("Line 1");
    print("Line 2");
    print("Line 3");
    print("Line 4");
  }
  return 0;
}

3
การใช้ #define ในทางที่ผิด: P +1
masterX244

15

BF

สมมติว่าเซลล์ห่อ

++++[->+
----[> (line 1) .[-]<]++++
---[> (line 2) .[-]<]+++
--[> (line 3) .[-]<]++
-[> (line 4) .[-]<]+
<]

ทำไมมันถึงได้ผล

บรรทัดแรกและบรรทัดสุดท้ายประกอบด้วยลูปที่วนซ้ำสี่ครั้ง (counter = cell0)

ภายในลูปมีตัวแปรตัวนับ ( cell1) ที่เพิ่มขึ้นทุกการวิ่ง

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

(line 1)การแสดงที่คุณควรจะทำให้ข้อความที่ถูกพิมพ์ ลูกศรในลูปจะจัดสรรcell2เพื่อการนี้ [-]ล้างออกcell2หลังจากที่คุณใช้มัน


14

ทุบตี

ในความทรงจำของSleepSortที่เคารพและSleepAddฉันนำเสนอให้คุณ ... SleepReverse :

#!/bin/bash

function print(){(sleep $((4-$1));echo "Line $1";)&}

print 1
print 2
print 3
print 4

เพื่อให้มีลักษณะเหมือนรายละเอียดการใช้งาน$1และ$2: function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
ThinkChaos

13

ชวา

import java.io.PrintStream;
import java.util.concurrent.FutureTask;

public class Print {
  public static void main(String[] args) {
    new FutureTask<PrintStream>(new Runnable() {
      public void run() {
        new FutureTask<PrintStream>(new Runnable() {
          public void run() {
            new FutureTask<PrintStream>(new Runnable() {
              public void run() {
                System.out.append("Line1"); }
            }, System.out.append("Line2")).run(); }
        }, System.out.append("Line3")).run(); }
    }, System.out.append("Line4")).run();
  }
}

มันอยู่ในช่วงเวลาที่เหมาะสม ... ;-)


บรรทัดต้องอยู่ติดกัน
Timtech

พวกมันอยู่ติดกันไม่น้อยไปกว่าเช่นกับcodegolf.stackexchange.com/a/20660/16293ไม่มีใครพูดว่าพวกเขาควรมีลักษณะเหมือนกัน จะลบอักขระบรรทัดใหม่บางรายการ ;-)
TheConstructor

โอเคเยี่ยม :-)
Timtech


12

ทุบตี

มาที่นี่สคริปต์คู่หน้า:

#!/bin/bash
s=1
if [ $s -ne 0 ]; then tac $0 | bash; exit; fi
s=0
echo "Line1"
echo "Line2"
echo "Line3"
echo "Line4"

2
ฉันไม่เคยรู้tacมาก่อนว่ามีอยู่จริง! ฮ่าฮ่าขอบคุณ
Noyo

11

เสียงกระเพื่อมสามัญ№ 1

ง่ายต่อการเขียนngorpแมโครที่ดำเนินการรูปแบบในลำดับย้อนกลับ:

(macrolet ((ngorp (&body ydob) `(progn ,@(reverse ydob))))
  (ngorp
   (write-line "Line 1")
   (write-line "Line 2")
   (write-line "Line 3")
   (write-line "Line 4")))
Line 4
Line 3
Line 2
Line 1

เสียงกระเพื่อมสามัญ№ 2

นี่คือปัญหาที่เกิดขึ้นอย่างแท้จริง รหัสจากคำถามปรากฏในโปรแกรมโดยไม่มีการแก้ไข:

(macrolet ((execute-prints-backwards (&body body)
             `(progn 
                ,@(nreverse (mapcar (lambda (string)
                                      (list 'write-line string))
                                    (remove-if-not 'stringp body))))))
  (execute-prints-backwards

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

  ))
Line4
Line3
Line2
Line1

10

PHP

evalตัวแปรอื่น:

$lines=array_slice(file(__FILE__),-4); // get last 4 lines of current file
eval(implode('',array_reverse($lines)));exit; // eval lines reversed and exit
print "Line1\n";
print "Line2\n";
print "Line3\n";
print "Line4\n";

1
เนียน! อย่างไรก็ตามฉันรู้สึกถูกบังคับให้ชี้ให้เห็นว่านี่เป็นความคิดที่เลวร้ายจริงๆ
David Kryzaniak

9

F #

let inline (?) f g x = g x; f x

(printfn "Line1%s") ?
 (printfn "Line2%s") ?
  (printfn "Line3%s") ?
   (printfn "Line4%s") ""

เพิ่งสร้างตัวดำเนินการแบบกำหนดเองที่ดำเนินการฟังก์ชันในลำดับย้อนกลับ


3
ฉันค่อนข้างแน่ใจ (?) f (g (x)) = g (x); f (x) เป็นแคลคูลัสและไม่ใช่การเขียนโปรแกรม
Jeff Davis

2
@JeffDavis: ค่อนข้างแน่ใจว่า(?) f g xอ่านคร่าว ๆ(?)(f, g, x)ไม่ใช่f(g(x))
Eric

9

ไป (Golang)

package main

import "fmt"

func main() {
    defer fmt.Println("Line 1")
    defer fmt.Println("Line 2")
    defer fmt.Println("Line 3")
    defer fmt.Println("Line 4")
}

ลองใช้: http://play.golang.org/p/fjsJLwOFn2


ฉันต้องการโพสต์รหัสเดียวกันแน่นอน แท้จริงไบต์ต่อไบต์เหมือนกันทุกประการ
ศิลปะ

@ ศิลปะน่ากลัว! ฉันหวังว่าจะเห็นมากขึ้นไปใช้ในรหัสกอล์ฟ
cory.todd

อาจจะไม่เกิดขึ้น ไปไม่ดีจริง ๆ ถูกบีบอัดพวกเขาจงใจ จำกัด โครงสร้างแปลก ๆ เพื่อให้คุณไม่สามารถสร้างระเบียบไม่สามารถอ่านได้ แต่ในกรณีนี้ (และอาจเป็นการแข่งขันความนิยมอื่น ๆ ) มันมีโอกาส
ศิลปะ

8

Python3

print("Line1",
print("Line2",
print("Line3",
print("Line4") or '') or '') or '')

สามารถสั้นลงได้ 6 ไบต์โดยการลบช่องว่างทั้งหมดในบรรทัดสุดท้าย


7

จาวาสคริ

[
  "console.log('Line1')",
  "console.log('Line2')",
  "console.log('Line3')",
  "console.log('Line4')"
].reverse().forEach(function(e){eval(e)})

C ++ 11

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<std::function<void()>> functors;
    functors.push_back([] { std::cout << "Line1"; });
    functors.push_back([] { std::cout << "Line2"; });
    functors.push_back([] { std::cout << "Line3"; });
    functors.push_back([] { std::cout << "Line4"; });
    std::reverse(functors.begin(),functors.end());
    std::for_each (functors.begin(), functors.end(), [](std::function<void()> f) {f();});
    return 0;
}

แทนที่จะเป็นstd::reverseและstd::for_eachใช้เพียงwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen

7

ชุด

echo off

call :revers ^
echo.line1 ^
echo.line2 ^
echo.line3 ^
echo.line4

:revers
if not "%2"=="" call :revers %2 %3 %4 %5 %6 %7 %8 %9
%1

ยินดีต้อนรับสู่ codegolf! โพสต์ที่ดี
Cruncher

7

C #

แทนที่จะเรียกวิธีการเรียกใช้โดยตรงฉันกำลังสร้างวิธีแบบไดนามิกที่มีสำเนาของ IL bytecode ของ Run ยกเว้นว่าตัวถูกดำเนินการโหลดสตริง opcode ซึ่งทำให้วิธีการใหม่เพื่อแสดงสตริงในลำดับย้อนกลับ

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;

namespace TestApp
{
    class Program
    {
        public static void Run()
        {
            Console.WriteLine("Line 1");
            Console.WriteLine("Line 2");
            Console.WriteLine("Line 3");
            Console.WriteLine("Line 4");
        }


        static void Main(string[] args)
        {
            var method = typeof(Program).GetMethod("Run");
            var il = method.GetMethodBody().GetILAsByteArray();
            var loadStringOperands = new Stack<int>();
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    loadStringOperands.Push(BitConverter.ToInt32(il, i + 1));
                    i += 4;
                }
            }

            var run = new DynamicMethod("Run", typeof(void), null);
            var gen = run.GetILGenerator(il.Length);
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    var str = method.Module.ResolveString(loadStringOperands.Pop());
                    gen.Emit(OpCodes.Ldstr, str);
                    i += 4;
                }
                else if (il[i] == OpCodes.Call.Value)
                {
                    var mInfo = method.Module.ResolveMethod(BitConverter.ToInt32(il, i + 1)) as MethodInfo;
                    gen.Emit(OpCodes.Call, mInfo);
                    i += 4;
                }
                else if (il[i] == OpCodes.Ret.Value)
                {
                    gen.Emit(OpCodes.Ret);
                }
            }

            run.Invoke(null, null);
        }
    }
}

6

หลาม

อีกวิธีใช้ eval()

a = [
"print('Line1')",
"print('Line2')",
"print('Line3')",
"print('Line4')"]

for line in reversed(a):
    eval(line)

มันไม่ซับซ้อน แต่เข้าใจง่าย


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