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は入力を無視します。/p:StartupObject=B
MSBuildに送信されるオプションには、BおよびA + Bの18バイトが追加されます。A + Bでのみ厳密に必要ですが、Bにも含めないことは不正行為のように見えます。このように、A + Bのコンパイラフラグは、Aのコンパイラフラグ(なし)とBのコンパイラフラグです。
説明
プログラムAは簡単です。クラスAにはにi
初期化された(未使用の)静的変数が含まれ、2
実行時に最初の引数を出力します。//
最後には、A + Bのコードのために重要であるが、A自体には何もしません。
プログラムBは単独では奇妙ですが、本質的には同じです。にi
初期化された静的変数を含むクラスAを作成し、クラス0
BのMainメソッドを実行します。このメソッドはA.i
1未満であるためプログラムAと同じで、奇妙なものの前に戻ります。ここで改行は必要ありませんが、A + Bにとって重要です。
結合すると、//
プログラムAからはプログラムBからのクラスA宣言がコメントアウトされますが、改行のためにクラスBは問題なく、代わりにプログラムAからA.i
の2
値を参照できます。A.Main()も存在するため、コンパイラフラグによりプログラムはB.Main()を実行します。その結果、プログラムA + Bは引数を出力せず、代わりにB.Main()の次のセグメントに移動します。これは基本的に標準のC#quineです。