A: 95 ไบต์
class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//
ลองออนไลน์!
B: 438 + 18 ไบต์
class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}
ลองออนไลน์!
A + B: 533 + 18 ไบต์
class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}
ลองออนไลน์!
A และ B รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง A + B จะละเว้นอินพุตใด ๆ 18 ไบต์บน B และ A + B จะถูกเพิ่มสำหรับ/p:StartupObject=B
ตัวเลือกที่ส่งไปยัง MSBuild มันจำเป็นอย่างยิ่งสำหรับ A + B เท่านั้น แต่ดูเหมือนว่าการโกงไม่มีใน B ด้วยวิธีนี้แฟล็กคอมไพเลอร์สำหรับ A + B คือแฟล็กคอมไพเลอร์สำหรับ A (none) บวกกับคอมไพเลอร์แฟล็กสำหรับ B
คำอธิบาย
โปรแกรม A ตรงไปตรงมา คลาส A มีตัวแปรแบบคงที่ (ไม่ได้ใช้) i
เริ่มต้น2
และพิมพ์อาร์กิวเมนต์แรกเมื่อเรียกใช้ //
ที่สิ้นสุดเป็นสิ่งสำคัญสำหรับรหัส A + B แต่ไม่ทำอะไรเลยในตัวเอง
โปรแกรม B นั้นแปลกแยกกัน แต่โดยพื้นฐานแล้วจะเหมือนกัน มันสร้างคลาส A ที่มีตัวแปรสแตติกi
เริ่มต้น0
แล้วและเรียกใช้วิธีการหลักของ Class B ซึ่งทำเช่นเดียวกับโปรแกรม A เพราะA.i
น้อยกว่า 1 และส่งกลับก่อนสิ่งแปลก ๆ ไม่จำเป็นต้องขึ้นบรรทัดใหม่ที่นี่ แต่มีความสำคัญสำหรับ A + B
เมื่อรวมกันแล้ว//
โปรแกรมจากความคิดเห็นจะประกาศคลาส A จากโปรแกรม B แต่เนื่องจากบรรทัดใหม่ของคลาส B นั้นใช้ได้การอนุญาตให้A.i
อ้างถึง2
ค่าจากโปรแกรม A แทน ธงคอมไพเลอร์ทำให้โปรแกรมรัน B.Main () เนื่องจาก A.Main () ก็มีอยู่เช่นกัน ผลลัพธ์ก็คือโปรแกรม A + B จะไม่เอาท์พุทอาร์กิวเมนต์ แต่ไปที่เซ็กเมนต์ต่อไปนี้ของ B.Main () ซึ่งโดยพื้นฐานแล้วเป็นเพียงC # quineมาตรฐาน