#16 "(}23!@)(" 3//*v\D@;'[af2.qc]'#)"14";n4
#/*` PkPPZ (22)S"[!(>7 7*,;68*,@;'1,@␉␉␉␉ q
#>␉
# >36!@␉
#`<`
#<]+<[.>-]>[
#{
#z}
#
#=x<R+++++[D>+++++++EAL+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52PLEASE,2SUB#2<-#32DOREADOUT,2DOGIVEUPDOiiipsddsdoh]>+.-- -. >][
#x%+>+=+~tt .
#D>xU/-<+++L
#R+.----\).>]|
#[#[(}2}20l0v01k1kx0l0ix0jor0h0h1d111x0eU0bx0b0o1d0b0e0e0@O6O4/0m1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10vx0v0l111111^_) 0046(8+9+9+9+9+=!)
###|
'\';echo 50;exit;';print((eval("1\x2f2")and(9)or(13))-(0and 4)^1<<(65)>>(62))or"'x"or'({({1})({1}[(0)])}{1}\{1})'#}#(prin 45)(bye)|/=1/24=x<$+@+-@@@@=>+<@@@=>+<?#d>+.--./
__DATA__=1#"'x"//
#.\."12"__*'
###;console.log 39
""""#//
=begin //
#sseemeePaeueewuuweeeeeeeeeeCisajjap*///;.int 2298589328,898451655,12,178790,1018168591,84934449,12597/*
#define p sizeof'p'-1?"38":"37"
#include<stdio.h>
main ( )/*/
#
#"`#"\'*/{puts (p);}/*'"`"
/*
<>{#65}//
#}
disp 49#//
#{
1}<>//
$'main'//
#-3o4o#$$$
#<R>"3"O.
=end #//
"""#"#//
#}
#s|o51~nJ;#:p'34'\=#print (17)#>27.say#]#print(47)#]#echo 21
#sss8␛dggi2␛ `|1|6$//''25 16*///89^_^_Z222999"26
␉
เป็นแท็บ␛
ตัวอักษรตัวอักษร ESC ตัวอักษร; การแลกเปลี่ยนแบบสแต็กจะทำให้โปรแกรมหยุดทำงาน ฉันขอแนะนำให้คัดลอกโปรแกรมจากช่อง "อินพุต" ของลิงก์ TIO ด้านล่างหากคุณต้องการใช้งาน
ต้องการเรียนรู้เพิ่มเติมหรือไม่ ลองใช้การสนทนาหลายเหลี่ยม !
ลองออนไลน์!
คะแนน VIP ( เครื่องพิมพ์อเนกประสงค์จำนวนเต็ม ): .008186 (เพื่อปรับปรุงรายการต่อไปควรมีไม่เกิน 1151 ไบต์)
โปรแกรมนี้พิมพ์51ในการประชุม, 50ใน Bash, 49ในคู่, 48ใน Deadfish ~, 47ใน Lily, 46ใน Cubix, 45ใน PicoLisp, 44ในอัลฟา, 43ในตาข่าย, 42ในความชั่วร้าย, 41ในสมอง *** , 40ใน Minimal-2D, 39ใน CoffeeScript, 38ใน C, 37ใน C ++, 36ใน Labyrinth, 35ใน INTERCAL, 34 in Rail, 33ในเหตุการณ์, 32 in Whirl,31ในเบฟเฟส -98ใน Modular SNUSP, 30ใน Whitespace, 29ใน Trigger, 28ใน Brain-Flak, 27ใน Perl 6, 26ใน 05AB1E, 25 in Pip, 24 in Thutu, 23ใน Hexagony, 22 in Underload, 21 in Nim, 20 in Prelude , 19ใน Reng, 18ใน Cardinal, 17ใน Julia, 16ใน Pyth, 15ใน Haystack, 14ในTurtlèd, 13ใน Ruby, 12ใน Fission, 1110ใน Befunge-93, 9ใน Perl 5, 8ใน Retina, 7ใน Japtf, 6ใน SMBF, 5ใน Python 2, 4ใน> <>, 3ใน Minkolang, 2ในVink และ1ใน Python 3
การตรวจสอบ
ภาษาส่วนใหญ่ผ่านการทดสอบโดยไดรเวอร์ทดสอบที่แสดงด้านบน
เหรงสามารถทดสอบการส่งออก 19 ที่นี่
Modular SNUSP สามารถทดสอบการส่งออก 31 ที่นี่
รูปทรงลูกบาศก์ของ Cubix ดูที่นี่
มีการตรวจสอบเหตุการณ์โดยทำให้โทเค็นสมดุลตามที่อธิบายไว้ในคำตอบก่อนหน้า
สำหรับเดดฟิช ~ สามารถทดสอบกับเอาต์พุต 48 ด้วยวิธีนี้ได้ได้ โปรดทราบว่า Deadfish ~ จะใช้รูปหลายภาษาเพื่อป้อนบน stdin แต่และพิมพ์จำนวน>>
พรอมต์ไปยังเอาต์พุตมาตรฐานซึ่งเป็นผลลัพธ์ที่หลีกเลี่ยงไม่ได้ในการรันโปรแกรม Deadfish ใด ๆ
สามารถทดสอบชุดประกอบเพื่อส่งออก 51 ได้ที่นี่
ขอขอบคุณและขอแสดงความยินดี
เมื่อคำตอบ 50-in-1-k ของ @ ais523 ลดลง 2 สัปดาห์ที่ผ่านมาน้ำตาไหลอาบแก้มของฉัน มันสวยเกินไป และมันก็อยู่ใน Bash มันสมบูรณ์แบบเกินไป
ฉันหันไปหาภรรยาและพูดว่า“ ฉันคิดว่าคนพูดหลายภาษาเสร็จแล้ว” รู้สึกภูมิใจอย่างมาก
เธอหันมามองฉันในตาหยุดสักครู่แล้วพูดว่า“ ดี เอาขยะออกไป”
สิ่งที่เธอหมายถึงคือเธอรู้สึกดีใจอย่างยิ่งสำหรับฉันและเพื่อนในอินเทอร์เน็ตของฉัน ขอขอบคุณและขอแสดงความยินดีกับทุกคน
คำอธิบายการชุมนุม
ในวันที่ตามมาจิตใจของฉันยังคงหลงทางกลับไปที่บางสิ่งบางอย่าง @ ais523 พูดในการสนทนาหลายภาษาก่อนที่จะโพสต์ Bash เขาชี้ให้เห็นว่าบางส่วนของการชุมนุมใช้#
ความคิดเห็นตามบรรทัดและ/*
บล็อกความคิดเห็น นั่นก็เพียงพอแล้วสำหรับฉันที่จะค่อยๆสูญเสียความคิดของฉันในอีก 2 สัปดาห์ข้างหน้า
มีความท้าทายโดยนัยในรูปหลายภาษาที่จะรวมภาษาที่ถูกกฎหมาย ฉันใช้คำที่ถูกต้องตามกฎหมายที่นี่อย่างอิสระ แต่ฉันคิดว่าเราทุกคนสามารถห้อมล้อมสิ่งที่ฉันได้รับ มันเป็นสิ่งหนึ่งที่จะรวม Brainf *** แต่มันเป็นอีกสิ่งหนึ่งที่รวมเอา Mathlab หรือ R. Assembly ไว้ในหมวดหมู่หลังอย่างแน่นอนและจิตใจของฉันก็ไม่สามารถปล่อยมันไปได้ แต่ฉันไม่รู้จักสมัชชาดังนั้นนี่เป็นการต่อสู้ที่ยากเย็นแสนเข็ญ
หลังจากต่อสู้กับปัญหาไปพักหนึ่งมองหาหนทางสำหรับ Assembly และ C / C ++ เพื่ออยู่ร่วมกันฉันพบว่านี่เป็นเอกสารสำหรับแอสเซมเบลอร์ GNU:
เพื่อให้เข้ากันได้กับแอสเซมบลีที่ผ่านมาบรรทัดที่ขึ้นต้นด้วย '#' มีการตีความพิเศษ การทำตาม '#' ควรเป็นนิพจน์แบบสัมบูรณ์ (ดูนิพจน์): หมายเลขบรรทัดโลจิคัลของบรรทัดถัดไป จากนั้นอนุญาตให้ใช้สตริง (ดูสตริง): หากมีชื่อไฟล์โลจิคัลใหม่ ส่วนที่เหลือของบรรทัดถ้ามีควรเป็นช่องว่าง
สิ่งนี้ฉันสังเกตว่าคล้ายกับคำสั่งพรีโปรเซสเซอร์ของเราสำหรับ C / C ++ ในบรรทัดที่ 1 ของโพลิกอน หลังจากการทดลองและข้อผิดพลาดฉันพบว่า#1 “bla” 1//*
จะใส่ความคิดเห็นบล็อกสำหรับสภาเท่านั้น
และมีหลายภาษาที่ทำ
ด้วยปัญหาการบล็อคที่ใหญ่ที่สุดได้รับการแก้ไขฉันจึงตัดสินใจออกตัวอย่างที่ดีของโลกนี้
.intel_syntax noprefix
.section .data
msg: .asciz "51"
.section .text
.global _start
_start:
# write syscall
mov rax, 1
# file descriptor, standard output
mov rdi, 1
# message address
mov rsi, OFFSET FLAT:msg
# length of message
mov rdx, 14
# call write syscall
syscall
#End the Program
mov rax, 60
mov rdi, 0
syscall
เครดิตของผู้เขียนหลัก
อันที่จริงฉันโกหกเมื่อหนึ่งนาทีที่แล้วรหัสแอสเซมบลีรุ่นแรกที่ฉันใช้คือในรูปแบบ AT&T ซึ่งเป็นหนึ่งในสองสาขาไวยากรณ์ของแอสเซมบลี หนึ่งในองค์ประกอบหลักของไวยากรณ์ AT&T คือการอ้างอิงการลงทะเบียนใช้%
คำนำหน้าและนี่เป็นปัญหาสำหรับกลุ่มคนที่พูดได้หลายภาษา พระคาร์ดินัลใช้%
เป็นจุดกำเนิดของตัวชี้ดังนั้นถ้าเราทิ้งขยะ%
ประมาณหนึ่งอันมันก็เหมือนกับปฏิกิริยาฟิชชันที่สอง
สาขาวากยสัมพันธ์อื่น ๆ ที่ไม่ได้ใช้ %
เป็นคำนำหน้าลงทะเบียนเรียกว่าไวยากรณ์ของ Intel การหาประโยชน์ที่เราใช้ในกลุ่มคนหลายภาษาเพื่อให้ผ่านบรรทัดแรกและป้อนความคิดเห็นแบบบล็อกอยู่ใน GNU Assembler (GAS หรือ AS โดยย่อ) AS มีคุณสมบัติที่มีความสุขในการอนุญาตให้ทั้งสองสาขาวากยสัมพันธ์ คุณเพียงแค่ต้องประกาศว่าคุณต้องการใช้ไวยากรณ์ของ Intel ซึ่งเกิดขึ้นในบรรทัดที่ 1 ของรหัสแอสเซมบลี
แอสเซมบลีใช้รีจิสเตอร์ซึ่งเป็นตำแหน่งหน่วยความจำขนาดเล็กจำนวนมากซึ่งตั้งอยู่บน CPU เพื่อความเร็วในการเข้าถึง นี่ไม่ใช่เอกลักษณ์ของแอสเซมบลีอื่นนอกจากความจริงที่ว่าการใช้งานของพวกเขานั้นไม่ได้แยกออกจากความกังวลของนักพัฒนา
มีรีจิสเตอร์หลากหลายชนิดที่ใช้เพื่อวัตถุประสงค์ที่ต่างกัน จาก Wikipedia:
•ขวานคูณ / หารโหลดสตริง & จัดเก็บ
•นับ CX สำหรับการทำงานของสตริงและการเลื่อน
•ที่อยู่พอร์ต DX สำหรับเข้าและออก
•การลงทะเบียนดัชนี BX สำหรับ MOVE
•แต้ม SP ไปที่ด้านบนสุดของสแต็ก
• BP ชี้ไปที่ฐานของเฟรมสแต็ก
• SI ชี้ไปที่แหล่งข้อมูลในการดำเนินการสตรีม
• DI ชี้ไปยังปลายทางในการดำเนินการสตรีม
AX ถูกใช้ในบรรทัดฟังก์ชัน _start ที่นี่: mov rax, 1
. r
ในrax
บ่งชี้ว่าหน่วยความจำ 64 บิต หากเราสลับค่านี้เป็นค่าe
ที่แสดงถึงหน่วยความจำแบบ 32 บิตซึ่งใช้ได้กับตัวประมวลผลแบบ 64 บิตโดยสิ้นเชิง เราจะไม่ใช้ครึ่งบนของหน่วยความจำที่มีอยู่ เพื่อระบุหน่วยความจำ 16 บิตคุณแค่ใช้ax
ซึ่งก็ดีสำหรับเราเพราะเราเพิ่งพิมพ์จำนวนเต็ม ดังนั้นเราสามารถตีกอล์ฟได้ไม่กี่ไบต์โดยเปลี่ยนการอ้างอิงการลงทะเบียนทั้งหมดเป็น 16 บิต
r
เอาล่ะไม่มากทั้งหมดที่ลงทะเบียนลำดับที่อาจลดลง mov rsi, OFFSET FLAT:msg
. หากคุณคุ้นเคยกับแอสเซมบลี แต่ไม่ใช่คำสั่งนี้นั่นเป็นเพราะนี่เป็นลักษณะเฉพาะของ AS อย่างน้อยที่สิ่งที่ผมรวบรวมได้จากนี้lea rsi,m
ซึ่งช่วยให้ผมทองลงคำสั่งเพียงแค่
หลังจากนี้ฉันพบจากประสบการณ์ที่ฉันสามารถล้ม_start:
ลงเพียง_p
และตัดออก.global _start
ทั้งหมดโดยมีเพียงคำเตือนที่ออก ประการที่สองก็จะลดลงเพียงตัวแปรตัวเดียวmsg:
p:
ฉันเลือกp
ทั้งตัวแปรสตริงและฟังก์ชั่นเริ่มต้นเพื่อชดเชยบางส่วนของs
สมัชชาที่เพิ่มเข้ามาเพื่อประโยชน์ของ Alphuck
จากนั้นฉันก็ใส่;
คำสั่งเพื่อกำหนดขอบเขตเพื่อที่จะทำให้พวกเขาทั้งหมดในบรรทัดเดียว นี่คือหลักเพื่อหลีกเลี่ยงการต่อท้ายมากเกินไป#//
ในแต่ละบรรทัดเพื่อประโยชน์ของ Thutu นอกจากนี้ฉันสังเกตว่าแอสเซมเบลอร์ของเราไม่ปรากฏตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ดังนั้นฉันเพิ่งจะใส่อักขระต่าง ๆ ขึ้นหรือลงเพื่อหลีกเลี่ยงความไม่สมดุลของเหตุการณ์
กอล์ฟนี้เราต้องการ:
.intel_syntax noprefix;.text;mov ax,1;mov di,1;lea rsi,m;mov dx,2;syscall;mov ax,60;mov di,0;syscall;m:.asciz "51"
หลังจากทั้งหมดนี้Japtéและ Underload เป็นเด็กที่มีปัญหาเพียงคนเดียวในคำตอบนี้ Japt มีเนื้อบางส่วนที่มีการ*
เพิ่มในบรรทัดที่ 1 แต่ดูเหมือนว่าจะได้รับการแก้ไขโดยการย้อนกลับไปยังputs(p);
บรรทัดจากคำตอบ C ++ ฉันลงเอยด้วยการโยน a (
ในบรรทัดนี้แล้วปิดมันลงบนเส้นของ Octive นี่เป็นสิ่งที่ Underload จะหยุดการโจมตี การรักษาที่คล้ายกันมีอยู่ในบรรทัดที่ 1 เพื่อเพิ่มใน*
นั้น
นี่เพียงพอที่จะตอบสนองความต้องการไบต์ของความท้าทายนี้ อันที่จริงฉันตรวจสอบสิ่งนี้ด้วยการผลิตโพลีกล็อตรุ่นนี้ แต่ฉันต้องการพยายามปรับปรุงคะแนนวีไอพีเช่นกันถ้าเป็นไปได้ และเนื่องจากฉันได้ทำตามข้อกำหนดทั้งหมดของความท้าทายฉันก็รู้สึกว่าตกลงที่จะร่วมมือกันตีรหัส ดังนั้นฉันจึงหยุดพูดคุยกับคนหลายภาษาเพื่อขอความช่วยเหลือจากสนามกอล์ฟ
เราจะต้องลงลึก
@ ais523 แสดงให้เห็นถึงเทคนิคการส่งคำแนะนำไปยังแอสเซมเบลอร์เป็นรหัสเครื่องด้วยคำสั่งนี้
.text;.long 2298589328,898451655,12,178790,1018168591,84934449,12597
รหัสเครื่องเป็นชุดของคำแนะนำเชิงตัวเลขที่ดำเนินการโดยตรงโดย CPU ซึ่งสามารถแสดงเป็นทศนิยมฐานสิบหกหรือฐานแปด ทศนิยมของเรานั้นสั้นที่สุดเนื่องจาก (ฐานสิบหกนำหน้า0x
เพื่อเป็นตัวแทน) .long
คำสั่งที่นี่จะทำให้การประกาศว่าสิ่งที่ตามมาคือชุดของคำแนะนำรหัสเครื่องทศนิยม
ฉันแหย่ที่ข้อความนี้เช่นกันเพื่อดูว่าผู้ประกอบจะอนุญาตอะไรบ้างและทำการเปลี่ยนแปลงสองสามครั้ง ครั้งแรกฉันพบว่าฉันสามารถลบ.text;
ทั้งหมดพร้อมกับปัญหาการเตือนเท่านั้นซึ่งเป็นการประหยัดไบต์ขายค่อนข้าง หลังจากนั้นไม่นานฉันก็พบว่าคำสั่งนี้ในเอกสารข้อมูลจำเพาะของ AS
. long เหมือนกับ .int
เย็น. ดังนั้นเราสามารถทำการสลับนั้นเป็นไบต์ที่รวดเร็ว ตอนนี้การชุมนุมของเรา แต่รหัสเครื่องจริงถูกตัดลงไปที่นี้
.int 2298589328,898451655,12,178790,1018168591,84934449,12597
.
ในขณะนี้เป็นสิ่งที่ดีและดีมันค่อนข้างยากที่จะทำงานกับรหัสเครื่องโดยตรงและฉันต้องการอย่างน้อยดูวิธีการแปลทั้งหมด ในอุดมคติแล้วเราต้องการแยกรหัสเครื่องกลับไปเป็นชุดประกอบ วิธีที่ง่ายที่สุดในการทำเช่นนั้นคือการถ่ายโอนออบเจ็กต์ซึ่ง @ ais523 แสดงให้ฉันเห็นด้วยข้อมูลโค้ดนี้
นี่คือข้อมูลโค้ด
และนี่เป็นเพียงการชุมนุม
nop
mov $0x1,%al
mov %eax,%edi
lea 0xc(%rip),%rsi
mov $0x2,%dx
syscall
mov $0x3c,%al
xor %edi,%edi
syscall
.byte 0x35
xor %eax,(%rax)
ลิงค์นั้นยังแสดงตัวเลขฐานสิบหกตัวอักษร 2 ตัวพร้อมกับแต่ละบรรทัดของชุดประกอบ ที่สอดคล้องกับคำแนะนำทศนิยม ตัวอย่างเช่นถ้าคุณใส่2298589328
ลงในนี้ทศนิยมเพื่อแปลงฐานสิบหกคุณจะได้รับ8901B090
กลับมา และถ้าคุณดูอย่างใกล้ชิดคำสั่งเหล่านี้คือคำสั่งฐานสิบหก 4 อันดับแรกจากการถ่ายโอนข้อมูลวัตถุ (ในลำดับที่กลับกัน)
จากสิ่งที่ฉันสามารถบอกได้ว่าชุดเลขฐานสิบหก 4 ชุดมักใช้เพื่อแปลงเป็นทศนิยมและเคล็ดลับการประหยัดไบต์หลักที่ใช้ที่นี่คือการจัดโครงสร้างชุดประกอบเพื่อให้ตัวเลขฐานสิบหกจำนวนสุดท้ายในชุด 4 ของเราเป็น 00 เพื่อนำเลขศูนย์เมื่อเราใส่ลงใน.int
คำสั่งที่เพิ่งถูกละเว้น
นี่คือสิ่งที่เกิดขึ้นใน 12
แถลงการณ์ 0c 00 00 00
ในส่วนฐานสิบหกของวัตถุที่ถ่ายโอนข้อมูลนี้อยู่
เท่าที่ความเข้าใจของฉันเกี่ยวกับการประชุมได้รับใน 2 สัปดาห์ เป็นอะไรที่ผิดพลาดแน่นอน!
อุบัติการณ์
เหตุการณ์ที่เกิดขึ้นเป็นการแก้ปัญหาที่ยากขึ้นในการนำแอสเซมบลีที่สั้นกว่ามาใช้ นี่คือรายงานเหตุการณ์
!
ในบรรทัดที่ 2 detokenizes !
ครั้งแรกEA
ในบรรทัด INTERCAL detokenizes ตัวเอง
ช่องว่างสุดท้ายของบรรทัดที่สองถึงบรรทัดสุดท้ายทำให้โทเค็นสเปซ - อวกาศว่าง
85
ในบรรทัดสุดท้าย detokenizes
R
ใน#<R>"3"O.
detokenizesR
65
ในโท<>{#65 }//
เค็น65
16
ในบรรทัดสุดท้าย detokenizes ตัวเอง
89
ในบรรทัดสุดท้ายโทเค็นตัวเอง
พระราชาคณะ
ฉันเพิ่งรู้ว่าฉันได้เปลี่ยนแปลงพระคาร์ดินัลที่ฉันลืมเอกสาร ฉันใช้เวลาในการค้นหาวิธีการบันทึกไบต์และตัดสินใจเรียนรู้ที่สำคัญ หลังจากเวลาเล็กน้อยด้วยเอกสารฉันเห็นบรรทัดนี้
=
คัดลอกค่าที่แอคทีฟของตัวชี้ไปยังค่าที่ไม่ได้ใช้งาน
นี่ไม่ใช่เคล็ดลับที่ใช้ในกลุ่มคนหลายภาษา วิธีการแก้ปัญหาเก่ารวมถึงคำแนะนำเหล่านี้: `++ ~ * t
++
ไม่เกิน 2
~
เปลี่ยนสแต็คที่ใช้งานอยู่
*
เพิ่มสแต็ค
ฉันรู้ว่า~*
สามารถทำได้ด้วยการ=
เรียนการสอนดังนั้นฉันจึงปรับแก้ปัญหาเพื่อให้ได้การแลกเปลี่ยนสแต็กที่ไร้ประโยชน์และเพิ่มในการประหยัดไบต์ขนาดเล็กนี้