สร้างโปรแกรม“ hacker typer” ที่แสดงผลซอร์สโค้ดของตัวเอง


25

ถ้าคุณไม่คุ้นเคยกับแฮกเกอร์ typer ดูhackertyper.net ในระยะสั้นมันเป็นโปรแกรมที่ส่งออกหนึ่งชิ้นฐานรหัสต่อการกดแป้นพิมพ์เพื่อผลกระทบตลก แต่รุ่นแฮกเกอร์ตี้เพอร์เฟ็กต์นั้นใช้งานง่ายเกินไป มันเพียงแค่ส่งออกสามตัวอักษรในเวลาเดียวจากชิ้นส่วนของรหัสโดยพลการ สำหรับความท้าทายนี้โปรแกรมจะต้องส่งออกซอร์สโค้ดของตัวเองและพิมพ์โค้ดที่คั่นด้วยช่องว่างหนึ่งอันต่อการกดแป้น

รายละเอียด

  • หนึ่งไม่สามารถรหัสฮาร์ดชื่อไฟล์สำหรับโปรแกรม; จะต้องกำหนดชื่อของมันแบบไดนามิก หากโปรแกรมคอมไพล์ไปยังไฟล์ที่เรียกทำงานได้โปรแกรมอาจผนวกนามสกุลไฟล์มาตรฐานเข้ากับชื่อไฟล์เรียกทำงาน (ยกเว้น. exe หากใช้ Windows) และถือว่าไฟล์ต้นฉบับนั้นอยู่ในไดเรกทอรีของไฟล์เรียกทำงานนั้น ตัวอย่างเช่นหากปฏิบัติการ C ชื่อ "แฮ็กเกอร์" มันควรดึงซอร์สโค้ดของมันจากไฟล์ชื่อ "hacker.c" ในไดเรกทอรีเดียวกัน หากโปรแกรมที่คอมไพล์มีส่วนขยายมันควรถูกดร็อปก่อนที่จะพิจารณาชื่อของซอร์สโค้ด ("typer.exe" -> "typer.cs")
  • โปรแกรมต้องมีช่องว่างอย่างน้อย 5 ช่องโดยมีอักขระอย่างน้อยหนึ่งตัวระหว่างแต่ละช่องว่าง ซึ่งหมายความว่าขนาดที่เล็กที่สุดที่เป็นไปได้สำหรับความท้าทายนี้คือ 9 ไบต์ ช่องว่างไม่จำเป็นต้องมีความสำคัญต่อการทำงานของโปรแกรม
  • การจัดรูปแบบใด ๆ (เยื้องบรรทัดใหม่ ฯลฯ ) จะต้องรักษาไว้ในเอาท์พุท การจัดรูปแบบนี้อาจถูกพิมพ์ด้วยรหัสที่ได้รับหรือตามมันสิ่งที่สำคัญคือการจัดรูปแบบที่จะรักษา
  • หลีกเลี่ยงการใช้ข้อคิดเห็นเพื่อตอบสนองความต้องการพื้นที่ 5 เว้นเสียแต่ว่าไม่มีวิธีอื่นในการติดตั้งช่องว่างในภาษาที่คุณเลือก

แก้ไข : บรรทัดใหม่สามารถใช้แทนหรือเพิ่มเติมจากช่องว่างเป็นตัวแยกชิ้น


1
ฉันสับสนเล็กน้อย โปรแกรมควรเป็นควินินหรือไม่?
Orby

8
วิธีที่คุณอธิบายให้ฟังดูเหมือนว่าเป็นที่ยอมรับได้ในการอ่านรหัสจากไฟล์ต้นฉบับซึ่งไม่น่าจะเป็นควินิน ฉันคิดว่ามันคงจะเป็นการประกวดที่ดีกว่าถ้าโปรแกรมต้องเป็นควินจริง
Orby

1
@ หรือฉันจะบอกว่าโปรแกรมไม่ได้เป็นควินในความหมายดั้งเดิมโดยไม่คำนึงถึงว่าการอ่านแหล่งที่ได้รับอนุญาตหรือไม่ Quinesไม่มีการป้อนข้อมูล แต่โปรแกรมเหล่านี้ทำอย่างชัดเจน
งานอดิเรกของ Calvin

@DrJPepper สัญลักษณ์แสดงหัวข้อย่อยที่สามของคุณทำให้ดูเหมือนช่องว่างใด ๆ นับเป็นตัวคั่น แต่คุณบอกว่ามีเพียงพื้นที่ว่างเท่านั้น คุณช่วยอธิบายได้ไหม
งานอดิเรกของ Calvin

2
ความท้าทายนี้กระตุ้นให้เกิดการอ่านซอร์สโค้ดของตัวเองซึ่งโดยทั่วไปแล้วการฝึกจะใช้ verboten ในการสร้างควิน
feersum

คำตอบ:


13

ทุบตี, 51 58

for w in $(<$0);do read -sn 1;printf -- "$w ";done

2
มันทุบไม่เปลือก: มันจะไม่ทำงานภายใต้รีบ ( 2: read: Illegal option -s)
F. Hauri

1
สมมติว่าทุบตีสามารถแทนที่cat $0และตัวหนอนด้วย$(<$0)

@ broslow ขอบคุณสำหรับคำติชม ป้ายกำกับทุบตีความยาวเดียวกัน
จะ

1
@ จะไม่มีปัญหา เป็นIFS=\ ความจำเป็นจริงถ้าคุณไม่ shebang หรือไม่ ค่าเริ่มต้น IFS เป็นเหมือนIFS=$'\n\t 'และเนื่องจากคุณไม่มี newline อีกต่อไปฉันไม่คิดว่าคุณจะต้อง จำกัด ให้เหลือแค่พื้นที่ว่าง

1
for w in `<$0`;{ read \-sn1;printf $w\ ;}
jimmy23013

21

HTML และ JavaScript, 123

<head></head><body onload="s=(a=document.all)[i=0].innerHTML" onkeyup="a[2].textContent += s.split(/(?= )/)[i++%6]"></body>

มันทำงานคล้ายกับแฮกเกอร์ Typer แต่มีซอร์สโค้ดของมันเอง แจ้งให้เราทราบหากฉันเข้าใจผิดกฎ

และนี่คือรุ่นที่มีสไตล์ (170 ตัวอักษร):

<head></head>
<body style="background:#000;color:lime" onload="s=(a=document.all)[i=0].innerHTML" onkeyup="a[3].textContent+=s.split(/(?=\s)/)[i++%6]">
<pre></pre></body>

ผมได้ทำสาธิต มันถูกปรับเปลี่ยนเนื่องจาก JS Bin เพิ่มรหัสพิเศษจำนวนมาก แต่แนวคิดทั่วไปเหมือนกัน


2
ฉันจะแปลกใจหากสิ่งนี้แสดงผลไม่ถูกต้องหากไม่มีแท็ก <html> และ <head> และไม่มีการปิด </body> คุณจะประหลาดใจมากที่มีการให้อภัยเบราว์เซอร์ทั้งหมดในเรื่องนี้
จะ

2
@ จะขอบคุณ เหตุผลที่ฉันรวมไว้<head>คือเบราว์เซอร์จะเพิ่มหากไม่มีอยู่ดังนั้นจะปรากฏขึ้นเสมอ ฉันลืมไป<html>ว่า
grc

12

Perl + ศัพท์ :: ReadKey, 56 ไบต์

use
Term'ReadKey;ReadMode
4;open
0;ReadKey,print
for
<0>

ขอขอบคุณที่ThisSuitIsBlackNotสำหรับแรงบันดาลใจเดิมและพรีโม่สำหรับการแนะนำและopen 0<0>

โปรดทราบว่าการขึ้นบรรทัดใหม่หลังจากforนั้นไม่จำเป็นจริง ๆ ยกเว้นว่าฉันจะต้องรวมหนึ่งบรรทัดใหม่ที่ใดที่หนึ่งเพื่อให้ช่องว่างนับขึ้นไปถึงขั้นต่ำที่ระบุห้า

นอกจากนี้โปรดทราบว่าเช่นเดียวกับการส่งของ ThisSuitIsBlackNot โปรแกรมนี้ต้องการโมดูลTerm :: ReadKeyจาก CPAN ใน Debian / Ubuntu Linux sudo apt-get install libterm-readkey-perlโมดูลนี้หากไม่ได้อยู่แล้วสามารถติดตั้งได้อย่างง่ายดายด้วยคำสั่ง

นอกจากนี้เพื่อบันทึกอักขระไม่กี่ตัวโปรแกรมนี้ไม่ได้เรียกคืนโหมดอินพุตให้เป็นปกติเมื่อออกดังนั้นคุณอาจพบว่าตัวเองไม่สามารถเห็นสิ่งที่คุณพิมพ์หลังจากนั้น การดำเนินการคำสั่งเชลล์stty saneหรือresetควรแก้ไข ปัญหานี้อาจได้รับการแก้ไขในราคา 10 ไบต์พิเศษด้วย:

use
Term'ReadKey;ReadMode
4;open
0;ReadKey,print
for<0>;ReadMode
0

โบนัส: Pure quine ขนาด 81 ไบต์

$_=q{use
Term'ReadKey;ReadMode
4;ReadKey,say
for
split$/,
"\$_=q{$_};eval"};eval

อีกครั้งบรรทัดใหม่หลังจากเครื่องหมายจุลภาคจำเป็นเพียงเพื่อให้บรรลุห้าขั้นต่ำช่องว่าง

ซึ่งแตกต่างจากโปรแกรม 56- ไบต์ข้างต้นรุ่นนี้ไม่จำเป็นต้องอ่านซอร์สโค้ดของตัวเองเนื่องจากมันใช้ quine - โดยเฉพาะบน quine นี้:

$_=q{say"\$_=q{$_};eval"};eval

สิ่งที่ดีเกี่ยวกับควินินนี้คือมันสามารถพกพา "น้ำหนักบรรทุก" โดยพลการภายในq{ }บล็อกได้โดยไม่ต้องทำซ้ำ ในขณะที่มันไม่สามารถเอาชนะได้<0>ในระยะเวลาอันสั้น แต่มันก็เข้าใกล้ได้มาก

หมายเหตุ: โปรแกรมนี้ใช้คุณสมบัติ Perl 5.10+ sayดังนั้นจึงจำเป็นต้องเรียกใช้ด้วยสวิตช์บรรทัดคำสั่ง-M5.010(หรือ-E) ต่อฉันทามติจัดตั้งขึ้นเมื่อเมตา, สวิทช์ดังกล่าวใช้ในการเปิดใช้งานคุณลักษณะภาษาที่ทันสมัยไม่นับเป็นอักขระพิเศษ ทางออกที่สั้นที่สุดที่ฉันสามารถค้นหาได้sayคือ 83 ไบต์:

$_=q{use
Term'ReadKey;ReadMode
4;ReadKey,print
for
split/^/,
"\$_=q{$_};eval"};eval

ทั้งสองสิ่งนี้สามารถทำให้เป็นมิตรกับเทอร์มินัลได้มากขึ้นด้วย (การรวมสองบรรทัดสุดท้ายและ) การแทรก:

;ReadMode
0

}ก่อนที่สุดท้าย


ว้าว. แค่ว้าว เด็ดมาก
ThisSuitIsBlackNot ไม่ได้

+1 แต่ฉันแนะนำให้มีนิสัยพิมพ์stty saneแทนreset(ซึ่งในบางระบบอาจทำอะไรมากกว่าแค่รีเซ็ตพารามิเตอร์เทอร์มินัลบางตัว ^^)
Olivier Dulac

ทางออกที่ดีมาก FWIW, open F,$0และ<F>จะถูกแทนที่ด้วยและopen 0 <0>นอกจากนี้ฉันขอยืนยันว่าหนึ่งโพสต์ในเมตาไม่ได้ประกอบด้วยฉันทามติ ตัวเลือก-M5.01ไม่ได้"นำภาษาไปสู่จุดที่เฉพาะเจาะจง"ตามที่ผู้เขียนแนะนำไว้มันเปิดใช้งานคุณสมบัติต่างๆ ไม่มีรุ่นของ perl ที่เปิดใช้งานคุณลักษณะเหล่านี้ตามค่าเริ่มต้น
primo

3
@primo: โปรดโพสต์คำตอบของคุณเองไปยังเมตาดาต้าหากคุณไม่เห็นด้วยกับที่มีอยู่ ความจริงที่ว่าไม่มีใครทำเช่นนั้นในสามปีครึ่งจนถึงตอนนี้แนะนำให้มีฉันทามติที่สมเหตุสมผลอย่างน้อยในหมู่ผู้ประจำการที่นี่ที่ไปเยี่ยมเมตา แต่ฉันทามติสามารถเปลี่ยนแปลงได้เสมอ (อย่างไรก็ตามวิธีที่ฉันเห็นถ้าruby golfscript.rb foo.gsนับเป็นคำสั่งที่ถูกต้องในการเรียกใช้โปรแกรมที่เขียนใน GolfScript แล้วperl -M5.010 foo.plควรนับเป็นคำสั่งที่ถูกต้องในการเรียกใช้โปรแกรมที่เขียนใน "Perl 5.10" แต่อาร์กิวเมนต์ดังกล่าวเป็นของเมตาไม่ใช่ ที่นี่)
Ilmari Karonen

5

Python 3 - 124 ไบต์ - 7 ช่องว่าง


รหัส:

from curses import*
s=initscr();noecho()
for x in open(__file__).read().split(" "):s.getch();s.addstr(x+" ")
echo();endwin()

Ungolfed:

from curses import*
# init curses
screen=initscr()
noecho()
# split code into spaces
code = open(__file__).read().split(" ")
for x in code:
    # wait for keypress
    screen.getch()
    # print a bit
    screen.addstr(x+" ")
# deactivate curses
echo()
endwin()

รุ่น Styled:

from curses import*
s=initscr();noecho();start_color();init_pair(2,COLOR_GREEN,COLOR_BLACK)
for x in open(__file__).read().split(" "):s.getch();s.addstr(x+" ",color_pair(2))
echo();endwin()

4

ทับทิม, 85 , 71

require"io/console";f=File.open __FILE__;loop{STDIN.raw &:getc;print f.read(3)||exit}

เลวร้ายเกินไปที่IO#rawไม่ได้เป็นส่วนหนึ่งของห้องสมุดมาตรฐาน

การปรับปรุง

require"io/console";24.times{|q|STDIN.raw &:getc;$><<IO.read($0,3,q*3)}

สิ่งนี้จะกำจัดการเรียกไปยัง Kernel # exit และใช้ตัวแปรส่วนกลางเพื่อทำให้รหัสสั้นลง


4

Befunge - 21

~ $ g , 1 +:54*`#@_:0

ฉันค่อนข้างพอใจกับสิ่งนี้เพราะฉันเพิ่งรู้เรื่องเบฟจ์ หากคุณไม่ทราบ "พิมพ์" ในหน้าต่างป๊อปอัพที่คุณสามารถเรียกใช้มันที่นี่หรือที่นี่จนกว่าฉันจะหาล่ามออนไลน์ที่ดี



2

งูหลาม 3-299

a="""from curses import*
s=initscr()
raw()
noecho()
for x in e:
 s.getch()
 s.addstr(x+' ')
nocbreak()
echo()
endwin()
""";b="""e=(a+'a=#%s#;b=#%s#;%s'%(a,b,b.replace('#','""''"',4))+'exec(a)').split(' ')
""";e=('a="""%s""";b="""%s""";%s'%(a,b,b.replace('#','""''"',4))+'exec(a)').split(' ')
exec(a)

ควินของมัน ย่อจาก 507 โดยใช้execและย้ายข้อความบางคำไปรอบ ๆ


2

C, 211 186 ไบต์

โซลูชันของฉันใน C โดยใช้ไลบรารี curses อาจยาวกว่าโซลูชัน C ตัวอื่น แต่ก็เป็นควิน แม้ว่าคำถามจะไม่ต้องการ แต่ก็ยังค่อนข้างดี มันยังใช้งานได้ดี:

#define R(x)#x
#define T(x)R(x)
#define S(p)char*s="#define R(x)#x\n#define T(x)R(x)\n#define S(p)"p"\nS(T(S(p)))";main(){initscr();noecho();while(*s)if(~getch())addch(*s++);}
S(T(S(p)))

รุ่นที่อ่านง่ายขึ้นพร้อมความคิดเห็นและเนื้อหา:

#define R(x)#x /* macros to convert the source code in S into a C-string */
#define T(x)R(x)
#define S(p) char*s="#define R(x)#x\n" \
                    "#define T(x)R(x)\n" \
                    "#define S(p) " p "\n" \
                    "S(T(S(p)))";\
    main(){\
        initscr();\
        noecho(); /* don't echo input */ \
        while(*s)\
            if(~getch()) /*true if character has been typed */ \
                addch(*s++);\
}
S(T(S(p)))

รวบรวมกับ:

gcc -o h h.c -lncurses

2

C - 136 135 132 ไบต์ (Windows เท่านั้น)

*fopen();**v;b[ 1<<20];main(p,q){v=q; strcpy(b,*v);strcat(b,".c") ;for(*v=fopen(b,"r");~fscanf(*v,"%s",b);printf("%s ",b))getch();} 

หมายเหตุ: มีช่องว่างในตอนท้ายของโปรแกรมซึ่งอาจจะไม่ปรากฏขึ้น

ฉันไม่สามารถรับประกันได้ว่าโปรแกรมนี้จะทำงานบนคอมพิวเตอร์เครื่องเดียวนอกเหนือจากของฉันเองเพราะมันแฮ็คอย่างสุด ๆ สิ่งต่าง ๆ จะง่ายขึ้นมากเมื่อทุกคนมีเครื่อง 32- บิตเท่านั้น จากนั้นฉันก็ไม่จำเป็นต้องกังวลเกี่ยวกับsizeof(int*)การเป็น 8 (ซึ่งแน่นอนคือฉันพิมพ์ออกมาเพื่อให้แน่ใจ) ในขณะที่sizeof(int)4

อย่างมีความสุขชื่อของไฟล์เรียกทำงานจะถูกเก็บไว้ในสตริงแรกใน argv อย่างไรก็ตามการวางตัวชี้เป็นอาร์กิวเมนต์ในฟังก์ชั่นหมายความว่าฉันต้องระบุประเภทของอาร์กิวเมนต์ทั้งหมดไปยังฟังก์ชัน - อย่างชัดเจนซึ่งหมายความว่าฉันจะต้องพิมพ์intสองครั้ง - เสียอักขระจำนวนมาก โชคดีที่ฉันพบวิธีแก้ปัญหา ฉันมีข้อโต้แย้งที่สองถึงหลักqเป็นเพียง int อื่น จากนั้นกำหนดให้qกับตัวแปรประเภทint**จัดการอย่างใดเพื่อคว้าไบต์ที่จำเป็นทั้งหมดจากกอง

ฉันไม่ประสบความสำเร็จในการค้นหาลูกเล่นใด ๆ เพื่อตีความประเภทการส่งคืนของfopenเป็นตัวชี้โดยไม่ต้องประกาศฟังก์ชัน

แก้ไข: สังเกตเห็นฉันควรใช้~fscanf(*v,"%s",b)แทนfscanf(*v,"%s",b)>0ตั้งแต่กลับเป็น -1 เมื่อถึง EOF


segfaults นี้สำหรับฉันดังนั้นฉันไม่สามารถทดสอบได้ แต่คุณควรจะสามารถที่จะประกาศตัวชี้โมฆะ ( void **v;) fopen()แทนการสร้างต้นแบบ
Comintern

@Comintern fopenการเปลี่ยนแปลงนี้ไม่ได้ช่วยให้ฉันไปอย่างถูกต้องในการจัดเก็บผลมาจากการ ฉันไม่เห็นว่าทำไมการแทนที่โมฆะสำหรับ int ควรสร้างความแตกต่างเนื่องจากพอยน์เตอร์ทุกตัวมีขนาดเท่ากัน
feersum

จุดดี. ยังคงสั้นกว่าและมีเสถียรภาพมากขึ้นในการประกาศพอยน์เตอร์ แต่นี่ใช้งานได้จริงสำหรับฉัน: b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}(ฉันต้องแทนที่getchar()ด้วยgetch())
Comintern

@Centtern รหัสของคุณยังคงเกิดปัญหากับระบบของฉัน แต่มันก็ดีที่จะทำให้มันใช้งานได้ ฉันเดาว่าเป็นเหมือนที่ฉันพูด - โปรแกรมแต่ละรุ่นจะทำงานบนคอมพิวเตอร์ 1 เครื่อง
feersum

ทำไมคุณไม่ใช้ K&R prototypes? เช่น*fopen()แทน*fopen(a,b)?
FUZxxl

1

Perl - 87 ไบต์

#!/usr/bin/perl -040
use Term::ReadKey;open F,$0;ReadMode 3;print''.<F>while ReadKey 0

ฉันไม่เห็นอะไรเลยในกฎเกี่ยวกับสิ่งที่ต้องทำเมื่ออ่านไฟล์จนจบดังนั้นมันจึงรอการป้อนข้อมูลหลังจากพิมพ์อันสุดท้าย


1

node.js พร้อม LiveScript:

#!/usr/local/bin/lsc
console.log <| require \fs .readFileSync __filename, encoding: \utf8

รุ่นอะซิงโครนัส:

#!/usr/local/bin/lsc
require \fs .readFile __filename, encoding: \utf8, -> console.log &1

1

คอบร้า - 147

class P
    def main
        while 1,for a in File.readLines(CobraCore.exePath[:-4]+'.cobra'),print if('[Console.readKey]'and (Console.cursorLeft=0)<1,a,'')*

CobraCore.exePath มีประโยชน์มาก!


1

Javascript ES6, 154

Firefox 154 :

(a= (i=1,b="(a= "+a+")()",s="") => {window.onkeydown=()=>{clear();i=b.indexOf(" ",i+1),d=b.slice(0,i<0?b.length:i);console.log(s+d);if(i<0){i=0,s+=d}}})()

Chrome 175 :

( a= function (i,s){b="( a= "+a+")()";c=console,window.onkeydown=function(){c.clear();s=s||"",i=b.indexOf(" ",i+1),d=b.slice(0,i<0?b.length:i);c.log(s+d);if(i<0){i=0,s+=d}}})()

ทั้ง 274 :

( a= function (i,s){b="( a= "+a+")()";c=console,window.onkeydown=function(){(clear)?clear():c.clear?c.clear():0;s=s||"",i=b.indexOf(" ",i+1),d=b.slice(0,i<0?b.length:i);c.log(s+d);if(i<0){i=0,s+=d}}})()

Ungolfed (chrome):

( a= function (i,s){        // starting index | undefined, output string
    b="( a= "+a+")()";      // get a string representation of the function
    c=console,
    window.onkeydown=function(){    // on each key down event
        c.clear();                  // clear the output 
        s=s||"";
        i=b.indexOf(" ",i+1);       // get the index of next space
        d=b.slice(0,i<0?b.length:i);// get the string part wanted
        c.log(s+d);                 // print the string
        if(i<0){
            i=0,                    // reset counters
            s+=d                    // adding the string to the main output
        }
    }
})()

มีสองรุ่นเนื่องจาก Chrome ไม่ได้จัดการฟังก์ชั่นลูกศรและคอนโซลไม่ได้ล้างด้วยวิธีเดียวกัน

Firefox หนึ่งทำงานกับ firebug ดูเหมือนว่าคอนโซลนักพัฒนาซอฟต์แวร์เริ่มต้นจะไม่สามารถล้างออกจากสคริปต์ได้


คุณพลาดข้อกำหนดที่ผู้ใช้ต้องกดปุ่มสุ่มเพื่อพิมพ์ผลลัพธ์หรือไม่
เครื่องมือเพิ่มประสิทธิภาพ

แน่นอน! จะเขียนสิ่งนี้อีกครั้ง
Hacketo

0

Groovy - 379

import java.nio.file.*
Path p = Paths.get(System.getProperty("user.dir"))
DirectoryStream<Path> f = Files.newDirectoryStream(p,"*.groovy")
try{for(e in f){read(e.toAbsolutePath().toString())}}
catch(Exception e){ }
finally{f.close()}

void read(String x){
    def s = new File(x).text
    for(e in s.replace("%n"," %n").split(" ")) 
        print e + " " 
    Thread.sleep(200)
}   

เนื่องจากไม่มีgetch()หรือเทียบเท่าในภาษา Java และ Java-esque เช่น Groovy ... โดยทั่วไปโค้ดของฉันไม่ได้จัดการกับการกดปุ่ม นั่นคือทั้งหมด: D


0

C, 248 ตัวอักษร

จริงควิน

ใช้งานได้ในยูนิกซ์เท่านั้นใน Windows จะใช้งานได้โดยใช้ _getch

main(){char *p="main(){char *p=\"%s\",s[400];sprintf(s,p,p);system(\"stty raw\");for(p=s;*p!=0;putchar(*p++))getchar();system(\"stty cooked\");}",s[400];sprintf(s,p,p);system("stty raw");for(p=s;*p!=0;putchar(*p++))getchar();system("stty cooked");}

0

HTML และ Javascript ขนาด 232 ไบต์

<body><script>var n=0;var f=function (){document.onkeypress=function(){document.body.innerHTML+=("&lt;body>&lt;script>var n=0;var f="+f.toString()+"f()&lt;/script>&lt;/body>").split(" ")[n]+" ";n++;}};f()</script></body>

Javascript ดั้งเดิมของ Quine แต่ได้รับการแก้ไข

JSFiddle ที่นี่


0

SmileBASIC, 79 75 ไบต์

LOAD"PRG1:"+PRGNAME$()
PRGEDIT 1
@L
IF BUTTON(2)THEN?PRGGET$();
WAIT
GOTO@L

เป็นเรื่องง่ายมากที่จะได้รับ LINE เฉพาะของโปรแกรมใน SmileBASIC ดังนั้นฉันจึงใส่ช่องว่างก่อนที่แต่ละบรรทัดจะแตก ฉันคิดว่าฉันฉลาดมากวางช่องว่างก่อนที่จะหยุดแต่ละบรรทัด แต่เห็นได้ชัดว่าเราได้รับอนุญาตให้ใช้ตัวแบ่งบรรทัดแทนช่องว่าง ...

คำอธิบาย:

LOAD "PRG1:"+PRGNAME$() 'load the code into slot 1 so we can easily read 1 line at a time
PRGEDIT 1 'Edit slot 1
@LOOP
IF BUTTON(2) THEN 'When a button is pressed...
                   PRINT PRGGET$(); 'get a line of code and print it
WAIT 'delay so we don't detect the same press multiple times in a single frame.
GOTO @LOOP 

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