เอาต์พุตที่มีความยาวเท่ากับโค้ด


97

ในความท้าทายนี้คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่ไม่มีอินพุตและพิมพ์หรือส่งคืนสตริงที่มีจำนวนไบต์เท่ากันกับโปรแกรม มีกฎไม่กี่ข้อ:

  • คุณสามารถส่งออกไบต์ในช่วง ASCII ที่พิมพ์ได้ (0x20 ถึง 0x7E, รวมแล้ว) หรือขึ้นบรรทัดใหม่ (0x0A หรือ 0x0D)
  • รหัสของคุณจะต้องไม่เป็น quine ดังนั้นรหัสและผลลัพธ์จะต้องแตกต่างกันอย่างน้อยหนึ่งไบต์
  • รหัสของคุณจะต้องมีความยาวอย่างน้อยหนึ่งไบต์
  • หากเอาต์พุตของคุณมีบรรทัดใหม่ต่อท้ายจะเป็นส่วนหนึ่งของจำนวนไบต์
  • หากรหัสของคุณต้องการแฟล็กบรรทัดคำสั่งที่ไม่เป็นมาตรฐานให้นับตามปกติ (เช่นโดยการเพิ่มความแตกต่างในการเรียกใช้มาตรฐานของการใช้ภาษาของคุณในการนับจำนวนไบต์) และความยาวของผลลัพธ์จะต้องตรงกับคะแนนของโซลูชัน เช่นถ้าโปรแกรมของคุณเป็นabและต้องการ-nแฟล็กที่ไม่เป็นมาตรฐาน(เราจะถือว่ามันไม่สามารถใช้ร่วมกับแฟล็กมาตรฐานดังนั้นจึงเป็น 3 ไบต์) คุณควรรวมผลลัพธ์ 5 ไบต์
  • เอาต์พุตไม่จำเป็นต้องเหมือนกันเสมอไปตราบใดที่คุณสามารถแสดงให้เห็นว่าเอาต์พุตที่เป็นไปได้ทุก ๆ
  • กฎควินินแบบปกติใช้ไม่ได้ คุณอาจอ่านซอร์สโค้ดหรือขนาดของมัน แต่ฉันสงสัยว่านี่จะสั้นกว่าการเข้ารหัสในภาษาส่วนใหญ่

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นและใช้วิธีการมาตรฐานใด ๆของการให้ผลลัพธ์ โปรดทราบว่าหากคุณพิมพ์ผลลัพธ์คุณอาจเลือกที่จะพิมพ์ลงในเอาต์พุตมาตรฐานหรือสตรีมข้อผิดพลาดมาตรฐาน แต่จะนับหนึ่งในนั้นเท่านั้น

คุณอาจใช้ภาษาการเขียนโปรแกรมใด ๆแต่โปรดทราบว่าช่องโหว่เหล่านี้เป็นสิ่งต้องห้ามตามค่าเริ่มต้น

นี่คือดังนั้นคำตอบที่สั้นที่สุดที่ถูกต้อง - วัดเป็นไบต์ - ชนะ

ลีดเดอร์บอร์ด



18
"รหัสของคุณต้องไม่เป็นควิน" แต่ ... แต่ ... มันติดแท็กควิน
Okx

4
@Okx เพราะมันเป็น quine ทั่วไปนั่นคือผลลัพธ์ที่ต้องการขึ้นอยู่กับซอร์สโค้ด
Martin Ender

4
@MartinEnder คุณอาจไม่อนุญาตให้ส่งออกโดยใช้รหัสทางออกซึ่งเป็นค่าเริ่มต้น หากคุณอนุญาตให้เกือบทุกโปรแกรมไบต์ในเกือบทุกภาษาได้รับอนุญาต ผู้ใช้รายหนึ่งได้ทำสิ่งนี้แล้ว
Sriotchilism O'Zaic

2
@WheatWizard เอาต์พุตโดยโค้ดออกไม่ใช่สตริงดังนั้นจึงไม่ใช้ที่นี่
Martin Ender

คำตอบ:


204

C (Linux รุ่นใหม่) ขนาด 19 ไบต์

main(){puts('s');}

เมื่อรวบรวมและเรียกใช้งานจะพิมพ์:

Segmentation fault

20
นี่ยอดเยี่ยม: D
Beta Decay

4
นี่เป็นเหมือน "C + ภาษาอังกฤษ unix / posix OS;)"
Florian Castellane

5
ฉันคิดว่าการเขียน "C, Linux ที่ทันสมัย" จะดีกว่าเพียงแค่ "C": ใน Windows ข้อความแสดงข้อผิดพลาดจะแตกต่างกันและในบางครั้งโปรแกรมของ Linux ถูกคอมไพล์ในลักษณะที่สามารถอ่านที่อยู่ 0x73 ('s') ได้ จึงไม่มีข้อยกเว้นเกิดขึ้น
Martin Rosenau

9
ฉันเข้าร่วมเว็บไซต์เพียงเพื่อโหวตคำตอบนี้
Nitish

7
น่าประทับใจอย่างนี้ไม่ใช่โปรแกรม C ที่พิมพ์เอาต์พุต แต่เชลล์ที่มันทำงานอยู่
Dennis

80

Excel, 11 ไบต์

รุ่นภาษานอร์เวย์:

=SMÅ(13^9)

เวอร์ชั่นภาษาอังกฤษ (12 ไบต์):

=LOWER(17^9)

สร้างหมายเลข n หลักและแปลงเป็นข้อความโดยแปลงเป็นตัวพิมพ์เล็ก


106
สิ่งนี้ให้ความหมายใหม่ทั้งหมดในการ "เลือกภาษาที่เหมาะสมสำหรับงาน"
Martin Ender

4
นี่เป็นความคิดที่ดี มันจะสั้นลงหากจะ=9^7&""สร้างหมายเลข 7 หลักในภาษาใดภาษาหนึ่งและมีขนาดเพียง 7 ไบต์
OpiesDad

@OpiesDad ทางออกที่ดีฉันคิดว่าคุณควรโพสต์เป็นคำตอบเพื่อให้ฉันสามารถ upvote
pajonk

4
@ มาร์ตินเอนเดอร์มันทำให้ฉันขบขันว่าการตลกขบขัน / การเก็งกำไรของคุณจะเพิ่มขึ้นมากกว่าคำตอบนี้ (แม้ว่ามันจะใกล้เคียง)
HyperNeutrino

55

เขาวงกต 4 ไบต์

!!>@

ลองออนไลน์!

พิมพ์ 0000

คำอธิบาย

!   Print an implicit 0 from the stack.
!   Print an implicit 0 from the stack.
>   Rotate the source code right by one cell, so the code now becomes

    @!!>

    The IP is moved along, so it's now at the end of the line, which is 
    a dead end. So the IP turns around and starts moving left.
!   Print an implicit 0 from the stack.
!   Print an implicit 0 from the stack.
@   Terminate the program.

6
นั่นฉลาดเกินไป มี +1 อยู่บ้าน!
caird coinheringaahing


40

เรติน่า 2 ไบต์

no

ลองออนไลน์!

พิมพ์0และป้อนบรรทัด

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

สิ่งที่ง่ายที่สุดถัดไปที่ต้องทำคืออาศัยอยู่กับ Retina แสดงตัวเลขหลักเดียว (จำนวนการจับคู่ของ regex บางส่วนกับอินพุตว่าง) และเราสามารถทำได้ด้วยการล้มเหลวจำนวนมาก (หรือการจับคู่) รูปแบบ 2 ไบต์


27
+1 สำหรับรหัสที่บอกไม่ให้เรียกใช้: P
Christopher

33

Mathematica, 2 ไบต์

4!

ปัจจัย

24


1
Gah! ฉลาดเกินไป
tuskiomi

2
เอาชนะฉันไป! +1 ( ฉันคิดว่าคุณควรจะพูดถึงว่านี่คือในรุ่น REPL ของ Mathematica.)
เกร็กมาร์ติน

หากนี่เป็นคำตอบที่สมเหตุสมผลคำตอบ "1" จะไม่เป็นคำตอบที่สมเหตุสมผลหรือไม่ (การใส่ '1' ลงใน REPL ของ Mathematica จะส่งคืน '1' ด้วย ... )
Mark Segal

3
@ MarkSegal ที่จะละเมิด no-quine-rule
AlexR

6
กฎ: ... "... รหัสและผลลัพธ์จะต้องแตกต่างกันอย่างน้อยหนึ่งไบต์"
J42161217

29

C, 20 ไบต์

f(){printf("%20d");}

ส่งออกตัวเลขจำนวนหนึ่งซึ่งมีช่องว่างให้มีความยาว 20. (จำนวนใดจะเกิดอะไรขึ้นกับหน่วยความจำถัดไป)

ตัวอย่างบางส่วนทำงานบนระบบของฉัน:

llama@llama:...code/c/ppcg121056samelen$ ./a.out 
           -666605944
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
          -1391039592
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
           1727404696
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
             10717352
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
           1485936232

เป็นความอัปยศที่เอาต์พุตไม่สามารถเป็นไบต์แบบสุ่มได้เนื่องจากจะอนุญาตให้ใช้โซลูชัน 19 ไบต์นี้:

f(){write(1,f,19);}

ซึ่งส่งออกขยะ 19 ไบต์โดยเริ่มจากที่fอยู่ของ


ฉันดีใจที่ได้เห็นคำตอบที่ใช้ประโยชน์จากกฎการส่งออกที่แตกต่างกัน :)
Martin Ender

segfault นี้ไม่สามารถหรือ
แดเนียล

ลิงก์ TIO อยู่ที่ไหน
CalculatorFeline

@Daniel ไม่ตัวเลขที่พิมพ์จะมาจากเนื้อหาก่อนหน้าของการ%esiลงทะเบียน
Doorknob

8
@Doorknob แต่ก็ยังมีพฤติกรรมที่ไม่ได้กำหนดดังนั้นคอมไพเลอร์ซาดิสต์คนอื่น ๆ อาจทำอะไรที่แตกต่างไปจากที่นี่โดยสิ้นเชิง
Sarge Borsch

29

Bash บน Linux, 6

uname

(ตามด้วยขึ้นบรรทัดใหม่)

เอาต์พุตLinuxตามด้วยบรรทัดใหม่


2
ในทางเทคนิคunameไม่ใช่ทุบตีในตัว - มันแยกปฏิบัติ
Jason Musgrove


@GammaFunction คุณเห็นunameว่าเป็น bash builtin หรือไม่ ทุก distro ฉันสามารถวางบนมือของฉันในตอนนี้มันเป็นไบนารีที่แยกจากกันรวมทั้ง TIO ตรงกันข้ามในขณะที่คำตอบที่เชื่อมโยงของคุณแสดงumaskเป็นบิวด์ในเชลล์ส่วนใหญ่ / ทั้งหมด
Digital Trauma

ฉันไม่เห็นunameว่าเป็นคนในตัว เมื่อฉันพูดว่า "-1 และเป็น builtin จริง ๆ " ฉันหมายถึง "คำตอบนี้ใช้umaskสำหรับ -1 ไบต์และumaskเป็น builtin จริง ๆ "
GammaFunction

@GammaFunction ขออภัย - ฉันเข้าใจความหมายของ "-1" ในความคิดเห็นของคุณผิด - ฉันคุ้นเคยกับความหมายเหล่านั้น downvote และความคิดเห็นอธิบายว่าทำไม
Digital Trauma

27

Javascript ES6, 9 ไบต์

การใช้เทมเพลตสตริง

_=>`${_}`

f=

_=>`${_}`

console.log(f());
console.log(typeof f());


มีการ undefinedพิจารณาสตริง?
Shaggy

3
@Shaggy ดูการแก้ไข ฉันใช้การแก้ไขสตริง
Weedoze

ว้าวนี่เป็นโพสต์ที่สองของฉันใน PPCG และ 14 upvotes! ขอบคุณ
Weedoze

1
ทำไมเวย์ง่าย ๆ ที่คุณสามารถทำได้มันยาก? (_=>_+'').
GOTO 0

1
@ GOTO0 โอเคคุณเก็บวงเล็บไว้ นี่เป็นอีกทางเลือกหนึ่ง โดยส่วนตัวแล้วฉันชอบ hehe ของฉัน
Weedoze

24

Pyramid Scheme , 74 43 42 bytes

บันทึกแล้ว 31 ไบต์ขอบคุณ Khuldraeseth na'Barya! บันทึก 1 ไบต์ต้องขอบคุณโซลูชันที่ออกแบบใหม่ของ JoKing!

  ^
 /^\
^---^
-^ ^-
 -^-
 /2\
/ 8 \
-----

ลองออนไลน์! ส่งออกตัวเลข 41 หลัก28^28 = 33145523113253374862572728253364605812736ตามด้วยบรรทัดใหม่ต่อท้าย


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

  ^
 / \
/out\
-----^
    /^\
   ^---^
  /1\ /9\
 /606\---
/51015\
-------

ลองออนไลน์!

ขาออก71277303925397560663333806233294794013421332605135474842607729452115234375= 160651015 ** 9หรือประมาณ 10 74


6
เฮ้คุณพยายามขายภาษาของคุณหรือไม่ ถ้าเป็นเช่นนั้นคุณถูกจับกุม - The Cops
NoOneIsHere

2
@NOOne อยู่ที่ไหนให้อภัย?
Conor O'Brien

3
ขออภัยมันเรียกว่า Pyramid Scheme ซึ่งเป็นชื่อของประเภทของการหลอกลวง
NoOne อยู่ที่นี่

1
ohhhhhhhhhhhh rofl
Conor O'Brien

1
การส่งออกโดยปริยายทำให้คุณได้รับลงไป43 ไบต์
Khuldraeseth na'Barya

23

Python 2 , 9 ไบต์

print{+1}

สิ่งนี้จะพิมพ์set([1])และป้อนบรรทัด

ลองออนไลน์!


11
จากโปรแกรมเดรัจฉานบังคับให้เริ่มต้นด้วยการprintมีโซลูชั่นที่ไม่มีที่สั้นลงและมีเพียงคนที่ 9 ไบต์สายพันธุ์นี้และหลุยส์ print 1e5Mendo
xnor

23

Python 2 , 9 ไบต์

print 1e5

เอาต์พุตที่แสดงมีการขึ้นบรรทัดใหม่ที่ต่อท้าย

ลองออนไลน์!


การขึ้นบรรทัดใหม่ต่อท้ายจะนับเป็นตัวละครเท่าที่ออกหรือไม่ มิฉะนั้นจะพิมพ์แปดไบต์
OldBunny2800

@ OldBunny2800 ใช่ท้าทายว่าถ้าผลลัพธ์ของคุณมีการขึ้นบรรทัดใหม่ต่อท้ายเหล่านั้นเป็นส่วนหนึ่งของการนับไบต์ อย่างไรก็ตามฉันจะชี้แจงว่าในคำตอบของฉัน
Luis Mendo

18

brainfuck , 25 ไบต์

--[-->+<]+++++[->-.....<]

ลองออนไลน์! หมายเหตุ: ต้องมีการนำไปใช้กับเซลล์ที่ไม่ได้ลงทะเบียน 8 บิต

เอาท์พุท:

~~~~~}}}}}|||||{{{{{zzzzz

คำอธิบาย

--[         254
 -->+<]      /2 = 127 into the second cell
+++++[      Five times
 ->-.....<]  Print the second cell - 1 five times

4
มีหลากหลายรูปแบบ BF เช่นเทปขนาด 8 บิตเซลล์ infite หรือเทป จำกัด และเซลล์ที่ไม่มีที่สิ้นสุด ฉันค่อนข้างมั่นใจว่าคุณเป็นรุ่นเซลล์ 8 บิตที่ไม่ได้ลงนาม แต่ฉันคิดว่ามันจะดีถ้าคุณรวมมันไว้ในคำตอบของคุณ
Roman Gräf

@ RomanGräfจุดที่ดี! ฉันมักจะรวมข้อมูลนั้นหากจำเป็นต้องมีการใช้งานที่ไม่ได้มาตรฐาน คำตอบนี้ควรทำงานกับการใช้งานมาตรฐานใด ๆ (เซลล์ที่ไม่มีเครื่องหมาย 8 บิตเทปใด ๆ ) แต่ฉันจะเพิ่มบันทึกย่อเพื่อชี้แจง
Zack C.

คุณไม่มีโปรแกรมขนาด 1 ไบต์.ที่พิมพ์NULLอักขระที่ไม่สามารถพิมพ์ได้หรือไม่?
Graviton

@ Graviton นั่นจะเป็นการละเมิดกฎข้อแรกของการท้าทายนี้ อย่างไรก็ตามนั่นเป็นวิธีแก้ปัญหาที่ถูกต้องในอนุพันธ์ BF ที่ค่าเริ่มต้นเป็นค่าที่พิมพ์ได้ (ดู: สมองตอบของฉัน )
Zack C.


16

C (Ideone) ขนาด 14 ไบต์

f(){warn(0);}

บน Ideoneซึ่งตั้งชื่อไฟล์เรียกทำงานของมันprogเอาต์พุตนี้จะขึ้นอยู่กับบรรทัดใหม่ต่อท้าย

prog: Success

C (GCC) 15 ไบต์

f(){warn(00);}

เนื่องจาก GCC เขียนไฟล์ปฏิบัติการที่ตั้งชื่อa.outตามค่าเริ่มต้น (ในกรณีที่ไม่มีแฟล็กเพิ่มเติมที่อาจมีค่าใช้จ่ายเป็นไบต์) ผลลัพธ์นี้จะแสดงสิ่งต่อไปนี้ด้วยการขึ้นบรรทัดใหม่

a.out: Success

7
@MDXF ข้อมูลจำเพาะระบุโปรแกรมหรือฟังก์ชั่นดังนั้นการส่งฟังก์ชั่นจึงสมบูรณ์ เนื่องจากชื่อไฟล์ไม่ได้ถูกเลือกโดยผู้ใช้ที่นี่ (ทั้ง Ideone และ gcc มีค่าเริ่มต้น) ฉันคิดว่านี่เป็นสิ่งที่ดี (ความเห็นส่วนตัว)
Dennis

15

C (gcc) , 18 17 ไบต์

f(){puts('@C');}

โปรดทราบว่ามีการไบต์ STX ( 0x02 ) ระหว่างและ@C

ลองออนไลน์!

ความเบา

สิ่งนี้ได้รับการทดสอบด้วย gcc 6.3.1 และ clang 3.9.1 บน Fedora 25, gcc 4.8.4 บน Ubuntu 14.04.4 และ gcc 4.8.3 บน openSUSE 13.2 ซึ่งพิมพ์ผลลัพธ์ต่อไปนี้

inux-x86-64.so.2

ฉันคาดว่าสิ่งนี้จะผลิตผลลัพธ์เดียวกันกับทุกรุ่นของ gcc ตราบใดที่มันรวบรวมเพื่อปฏิบัติการประเภทต่อไปนี้

ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2

แพลตฟอร์มที่แตกต่างกันจะต้องใช้ที่อยู่หน่วยความจำที่แตกต่างกันและอาจมีลำดับที่แตกต่างกันสำหรับไบต์ในค่าคงที่อักขระหลายตัว

ตัวอย่างเช่นการแทนที่@\2Cด้วยการ@\2\4พิมพ์exec/ld-elf.so.1และการขึ้นบรรทัดใหม่ใน FreeBSD 11 ด้วย clang 3.8.0

การตรวจสอบออฟไลน์

$ printf "%b\n" "f(){puts('@\2C');}main(){f();}" > quine.c
$ gcc -w -o quine quine.c
$ ./quine
inux-x86-64.so.2
$ ./quine | wc -c
17

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

โดยค่าเริ่มต้น LD ใช้0x400000เป็นที่อยู่ฐานของส่วนข้อความที่มีความหมายว่าเราสามารถพบเนื้อหาที่เอลฟ์เริ่มต้นที่อยู่หน่วยความจำ0x400000

ELF 640 ไบต์แรกนั้นส่วนใหญ่ไม่ขึ้นอยู่กับรหัสต้นฉบับที่แท้จริง ตัวอย่างเช่นหากการประกาศของfตามมาด้วยmain(){f();}และไม่มีอะไรอื่นพวกเขามีลักษณะดังนี้

00000000: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  .ELF............
00000010: 02 00 3e 00 01 00 00 00 00 04 40 00 00 00 00 00  ..>.......@.....
00000020: 40 00 00 00 00 00 00 00 e8 19 00 00 00 00 00 00  @...............
00000030: 00 00 00 00 40 00 38 00 09 00 40 00 1e 00 1b 00  ....@.8...@.....
00000040: 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00  ........@.......
00000050: 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00  @.@.....@.@.....
00000060: f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00  ................
00000070: 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00  ................
00000080: 38 02 00 00 00 00 00 00 38 02 40 00 00 00 00 00  8.......8.@.....
00000090: 38 02 40 00 00 00 00 00 1c 00 00 00 00 00 00 00  8.@.............
000000a0: 1c 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  ................
000000b0: 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00  ................
000000c0: 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00  ..@.......@.....
000000d0: 04 07 00 00 00 00 00 00 04 07 00 00 00 00 00 00  ................
000000e0: 00 00 20 00 00 00 00 00 01 00 00 00 06 00 00 00  .. .............
000000f0: 08 0e 00 00 00 00 00 00 08 0e 60 00 00 00 00 00  ..........`.....
00000100: 08 0e 60 00 00 00 00 00 1c 02 00 00 00 00 00 00  ..`.............
00000110: 20 02 00 00 00 00 00 00 00 00 20 00 00 00 00 00   ......... .....
00000120: 02 00 00 00 06 00 00 00 20 0e 00 00 00 00 00 00  ........ .......
00000130: 20 0e 60 00 00 00 00 00 20 0e 60 00 00 00 00 00   .`..... .`.....
00000140: d0 01 00 00 00 00 00 00 d0 01 00 00 00 00 00 00  ................
00000150: 08 00 00 00 00 00 00 00 04 00 00 00 04 00 00 00  ................
00000160: 54 02 00 00 00 00 00 00 54 02 40 00 00 00 00 00  T.......T.@.....
00000170: 54 02 40 00 00 00 00 00 44 00 00 00 00 00 00 00  T.@.....D.......
00000180: 44 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  D...............
00000190: 50 e5 74 64 04 00 00 00 b0 05 00 00 00 00 00 00  P.td............
000001a0: b0 05 40 00 00 00 00 00 b0 05 40 00 00 00 00 00  ..@.......@.....
000001b0: 3c 00 00 00 00 00 00 00 3c 00 00 00 00 00 00 00  <.......<.......
000001c0: 04 00 00 00 00 00 00 00 51 e5 74 64 06 00 00 00  ........Q.td....
000001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001f0: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................
00000200: 52 e5 74 64 04 00 00 00 08 0e 00 00 00 00 00 00  R.td............
00000210: 08 0e 60 00 00 00 00 00 08 0e 60 00 00 00 00 00  ..`.......`.....
00000220: f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00  ................
00000230: 01 00 00 00 00 00 00 00 2f 6c 69 62 36 34 2f 6c  ......../lib64/l
00000240: 64 2d 6c 69 6e 75 78 2d 78 38 36 2d 36 34 2e 73  d-linux-x86-64.s
00000250: 6f 2e 32 00 04 00 00 00 10 00 00 00 01 00 00 00  o.2.............
00000260: 47 4e 55 00 00 00 00 00 02 00 00 00 06 00 00 00  GNU.............
00000270: 20 00 00 00 04 00 00 00 14 00 00 00 03 00 00 00   ...............

การใช้เช่นmain(int c, char**v){f();}แทนที่จะเปลี่ยนบางไบต์ แต่ไม่ใช่ออฟเซ็ตของสตริง/lib64/ld-linux-x86-64.so.2ซึ่งเราจะใช้ในการสร้างผลผลิต

ออฟเซ็ตของสตริงดังกล่าวคือ0x238และมีความยาว 27 ไบต์ เราเพียงต้องการที่จะพิมพ์ 17 ไบต์ (และคนสุดท้ายที่จะได้รับการขึ้นบรรทัดใหม่ถ้าเราใช้puts) ดังนั้นเราเพิ่ม11เพื่อชดเชยที่จะได้รับ0x243 , offset inux-x86-64.so.2ของ เพิ่ม0x400000และ0x243ให้0x400243inux-x86-64.so.2ตำแหน่งของหน่วยความจำ

ในการรับที่อยู่หน่วยความจำนี้เราสามารถใช้ค่าคงที่อักขระหลายตัวซึ่งแสดงพฤติกรรมที่กำหนดโดยการนำไปปฏิบัติ 0x400243คือ(64) (2) (67)ในฐาน 256 และค่าคงที่อักขระหลายตัวของ gcc ใช้คำสั่งไบต์ขนาดใหญ่ดังนั้นจึง'@\2C'ให้ที่อยู่หน่วยความจำของสตริงที่ต้องการ

สุดท้ายputsพิมพ์ (ต่อท้ายด้วย null) ที่ตำแหน่งหน่วยความจำนั้นและขึ้นบรรทัดใหม่ตามด้วยการสร้างเอาต์พุต 17 ไบต์


นี่เป็นเวทย์มนตร์ ... นี่ถือว่าเป็นลำดับไบต์ของชุดประกอบที่คอมไพล์หรืออะไร
Patrick Roberts

ขาออกในระบบของฉัน (Linux กับ GCC 6.3.1): เมื่อรวบรวมกับU เมื่อรวบรวมกับ -Df=mainUmain(){f();}
MD XF

@PatrickRoberts ณ จุดนี้ฉันไม่แน่ใจจริงๆว่าสมมติฐานคืออะไร เนื่องจากมันโผล่มารอบ ๆ ในไฟล์ ELF ที่ประกอบขึ้นมามันจึงขึ้นอยู่กับทุกสิ่งที่คอมไพเลอร์เขียนก่อนรหัสจริง
Dennis

@MDXF พบวิธีที่สั้นกว่าในการรับที่อยู่หน่วยความจำที่เหมาะสม มันทำงานบน Ubuntu 14.04 VPS ของฉันตอนนี้ แต่ ymmv
เดนนิส

@Dennis ใช้งานได้ดีตอนนี้ (แดง) เงินรางวัลเป็นของคุณถ้าภายในสิ้นสัปดาห์ไม่มีใครหาทางแก้ปัญหาที่สั้นกว่านี้
MD XF

13

Brainfuck แก้ไขตัวเอง 5 ไบต์

<[.<]

ลองออนไลน์!

เอาท์พุท:

]<.[<

คำอธิบาย:

ง่ายมากพิมพ์ต้นฉบับในสิ่งที่ตรงกันข้าม ใน SMBF เนื้อหาของโปรแกรมจะถูกเก็บไว้บนเทปทางด้านซ้ายของตำแหน่งเริ่มต้นของตัวชี้ การเลื่อนไปทางซ้ายและการพิมพ์จะส่งรหัสต้นฉบับไปด้านหลัง

เนื่องจากแหล่งที่มาของการอ่านได้รับอนุญาตในการท้าทายนี้จึงควรอยู่ในกฎอย่างแน่นอน


13

เครื่องคำนวณเลขคณิตพื้นฐาน 2 ไบต์

1=

พิมพ์1.หรือ:

    |
    |
    |  .

บนจอแสดงผลเจ็ดส่วนที่งี่เง่า

หากต้องการทำซ้ำให้เลือกเครื่องคิดเลขแบบสุ่ม พวกเขาทุกคนมีภาษาการเขียนโปรแกรมนี้ติดตั้งอย่างใด


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

มัน1.ไม่ใช่1xหรือ นอกจากนี้ยังเป็นควินซึ่งไม่ได้รับอนุญาตตามกฎ
Erik the Outgolfer

ไม่1=ฉันยุ่งมาก ฉันหมายถึง1xมากกว่าโดยนัยเท่ากับ แต่ฉันลืมนั่น=คือปุ่ม
OldBunny2800

มันให้ผลลัพธ์1ทั้งกับ TI-36 และ TI-84 CE ของฉันเท่านั้น สิ่งเหล่านี้จะไม่นับเป็นเครื่องคิดเลข "พื้นฐาน" หรือไม่?
Benjamin Urquhart

ไม่เครื่องคิดเลข TI 84 ไม่ใช่เครื่องคิดเลขเป็นเครื่องคิดเลขกราฟ ฉันไม่รู้เกี่ยวกับ 36 แต่ฉันค่อนข้างแน่ใจว่าเป็นเครื่องคิดเลขวิทยาศาสตร์ คำตอบนี้สำหรับเครื่องคิดเลขสี่ฟังก์ชั่น
OldBunny2800

13

ฟูเรียร์, 26 22 20 ไบต์

5^(`na`&i)` Batman!`

ลองใช้กับ FourIDE!

ขาออก:

nananananana Batman!

สำหรับการใช้อักษรตัวพิมพ์ใหญ่ที่เหมาะสมจะมี 4 ไบต์พิเศษ:

`N`7^(`an`i^~i)`a Batman!`

ลองใช้กับ FourIDE!

Nanananananananana Batman!

RIP Adam West


1
คุณไม่ต้องรวม NC (เฉพาะในกรณีที่คุณพิมพ์สายอักขระสำหรับความท้าทายนี้ (และนั่นอาจจะโง่)
Christopher

@Christopher Huh ฉันไม่รู้
Beta Decay

12

Brachylogขนาด 1 ไบต์

w

ลองออนไลน์!

คำอธิบาย

wคือ "การเขียน" ในตัว ที่นี่มันจะเขียนอินพุต เนื่องจากอินพุตเป็นตัวแปรอิสระwจะติดป้ายกำกับว่าเป็นจำนวนเต็มก่อนพิมพ์ 0เลขที่แรกก็พยายามที่จะเป็น


Here, it will write the Input.'อินพุท' เป็นโปรแกรมตัวเองหรือไม่? สิ่งนี้ไม่นับเป็นการอ่านแหล่งที่มาซึ่งเป็นการโกงค่าเริ่มต้นในควินิน
MD XF

4
@MDXF "กฎควินินปกติใช้ไม่ได้"
Rob Watts

3
@MDXF อินพุตเป็นตัวแปร Brachylog พิเศษที่คุณสามารถตั้งค่าเมื่อเรียกใช้โปรแกรม Brachylog มันจะเข้าไปในส่วนการป้อนข้อมูลของ TryItOnline ที่นี่เราไม่ได้ตั้งค่าอะไรกับอินพุตดังนั้นจึงเป็นตัวแปรอย่างมีประสิทธิภาพ มันไม่ใช่โปรแกรม
เสียชีวิต

10

Java (OpenJDK 8) , 11 ไบต์

o->1e8-1+""

ลองออนไลน์!

เอาท์พุท:

9.9999999E7

เพียงคำตอบที่ละเอียดอ่อนกว่าคำตอบที่ชัดเจน()->"".format("%23s",0).

ประหยัด

  • 18 -> 16 ไบต์: การรวมที่ได้เปรียบของการปัดเศษและกำลังเพิ่มขึ้น 10 ด้วย PunPun1000
  • 16 -> 13 ไบต์: สูตรที่ดีกว่าขอบคุณ JollyJoker
  • 13 -> 11 ไบต์: สูตรที่ปรับปรุงแล้วขอบคุณ Kevin Cruijssen

2
()->1E10-1+"", "9.999999999E9" (13)ช่วยประหยัดอีกสามไบต์
JollyJoker

1
คุณสามารถบันทึก 1 ไบต์โดยเปลี่ยน1e10เป็น1e9หรือ 2 ไบต์โดยใช้อินพุตว่างแทน()สิ่งนี้: o->1e8-1+""(เอาต์พุต9.9999999E7; length & byte-count 11 )
Kevin Cruijssen

9

05AB1E , 1 ไบต์

õ

สร้างบรรทัดใหม่หนึ่งบรรทัด õผลักสตริงว่างและมันจะถูกส่งออกโดยนัยกับการขึ้นบรรทัดใหม่

ลองออนไลน์!

โซลูชัน 2 ไบต์อื่น ๆ เพื่อความพึงพอใจในการรับชมของคุณ (เอาต์พุตอยู่ในวงเล็บปีกกาและเอาต์พุตทั้งหมดมีบรรทัดใหม่ต่อท้าย):

X, (1)
Y, (2)
¾, (0)
¼, (1)
¶, (newline)
ð, (space)
Î, (0)

มีวิธีแก้ไขเพิ่มเติมอีก 2 ไบต์


"ซึ่งเป็นวิธีการแสดงผลที่ยอมรับได้" สำหรับโซลูชันฟังก์ชันเท่านั้นไม่ใช่สำหรับโปรแกรมทั้งหมด
Martin Ender

@MartinEnder การแก้ปัญหาเหล่านั้นจะนับเป็นฟังก์ชั่นแล้วใช่ไหม ไม่แน่ใจจริงๆเพราะฉันไม่ค่อยได้ใช้ฟังก์ชั่นที่นี่
Okx

ฉันไม่รู้จักพอเกี่ยวกับ 05AB1E แต่พวกมันจะพิจารณาเฉพาะฟังก์ชั่นเท่านั้นหากพวกเขาเป็นนิพจน์ที่ประเมินผลเป็นวัตถุฟังก์ชั่น (ซึ่งฉันสงสัยว่าพวกเขาทำเพราะใช้พวกเขาทันที
Martin Ender

9

V / vim, 1 ไบต์

o

พิมพ์บรรทัดใหม่ขึ้นหนึ่งบรรทัด

ลองออนไลน์!

มีหลายสายพันธุ์ในเรื่องนี้ที่จะทำงานด้วย ตัวอย่างเช่น,

O

ในกลุ่มและ

Ä
ä
ï
Ï

ใน V.

นอกจากนี้ยังมีโซลูชันสามไบต์จำนวนมากมากมาย ตัวอย่างเช่น:

3ii
i³i
¬ac

ทั้งหมดนี้มีเฉพาะกับ V.


3ii ไม่ขยายจนกว่าคุณจะกด Escape ดังนั้นควรเป็นสามหรือสี่ไบต์ (หรือกดแป้นแทนที่จะ)
algmyr

@algmyr ในเสียงเรียกเข้าคุณถูกต้อง มันจะต้องเป็น4ii<ESC>อย่างไรก็ตาม V โดยปริยายเติมในการหลบหนีเมื่อสิ้นสุดโปรแกรม
DJMcMayhem

8

แบตช์ 12 ไบต์

@echo %OS%

จำนวนไบต์รวมถึงการขึ้นบรรทัดใหม่สำหรับทั้งสคริปต์และเอาต์พุตซึ่งก็คือ

Windows_NT

ดูเหมือนว่าจะเป็น 11 ไบต์ไม่ใช่ 12
Erik the Outgolfer

@EriktheOutgolfer cmd.exeแน่นอนว่าจะสะท้อน CRLF หลังจากWindows_NTนั้นจึง 12 ไบต์
Neil

ถ้าอย่างนั้นคุณควรชี้แจง
Erik the Outgolfer

8

Hexagony 3 ไบต์

o!@

ลองออนไลน์!

111พิมพ์

กางออก:

 o !
@ . .
 . .

o!@แต่รหัสที่เป็นจริงเพียงแค่เรียกใช้ในการสั่งซื้อ

o   Set the memory edge to 111, the code point of 'o'.
!   Print this value as a decimal integer.
@   Terminate the program.



7

MATL , 2 ไบต์

H

มีการขึ้นบรรทัดใหม่

ลองออนไลน์!

คำอธิบาย

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



7

เยลลี่ขนาด 1 ไบต์

V

ค่อนข้างไม่กี่ Jelly หนึ่ง byters - นี่คือหนึ่ง - 0มันประเมินอาร์กิวเมนต์ซ้ายซึ่งเมื่อไม่มีอะไรจะให้เป็นอินพุทเริ่มต้นที่จะเป็นศูนย์ซึ่งจะประเมินให้เป็นศูนย์และผลที่ได้จะถูกพิมพ์โดยปริยายเป็น

ลองออนไลน์!

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

¡¢£¦©½¿€ÇÑÞßçıȷñ÷þ"#&',-./0123456789:;?@IMRTVZ\`dmpstxyz{}~°³⁴⁵⁹ƓƈɠḶỌṬḊĖİĿṄȮṖṘẆẊṃọṣṭḃḟḣŀṁṗṡẋż’“

หมายเหตุ:

  • โปรแกรมขนาด 1 ไบต์ส่วนใหญ่จะพิมพ์ a 0(no-ops / ให้ผลลัพธ์รายการที่มีค่าศูนย์เดียวซึ่งพิมพ์ a 0) ส่วนอื่น ๆ ส่วนใหญ่จะพิมพ์ a 1( 0=0และอื่น ๆ)

  • เป็นโปรแกรมหนึ่งที่ไม่ให้ผลผลิตไบต์ที่แตกต่างกันแต่อย่างใดอย่างหนึ่งซึ่งอยู่นอกช่วงตามข้อกำหนด - มันผลิต null ไบต์ (ปลดเปลื้อง0ตัวอักษร)

  • สร้างช่องว่าง (ตัวอักษร)

  • สร้างการป้อนบรรทัด (ตัวอักษร)

  • บางไบต์ที่ใช้งานได้ในขณะนี้อาจไม่สามารถทำได้ในอนาคต - มีจำนวนไบต์ที่ค่อนข้างถูกสงวนไว้ (ฉันเชื่อว่า) สำหรับค่า niladic ซึ่งเมื่อได้รับมอบหมายแล้ว


1
ลิงก์ตายเพื่อbyte
Weedoze

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