4

同じプログラムが実行されているときに、ソース プログラム全体を出力として表示する方法をインタビューで尋ねられました。

  • 通常File-handling、これには概念を使用しますが、このタスクを達成する他の方法はありますか

これに対する提案はありますか?

更新された解決策:何かを調査したところ、解決策が得られました。Quine で解決できます

  • String arrayコードを実行してソースプログラムを出力しますが、 @Basileが以下にコメントしたように、プログラム全体を入力として与える必要があります
4

3 に答える 3

1

これは、実行時にそれ自体が表示されるプログラムです。秘密は、配列自体の文字列を除いて、プログラムの行を含む文字列の配列を作成することです。したがって、配列の前にコード行を表示する最初のループがあります。次に、配列 Strings を表示するループがあり、次にコードの残りの行を表す配列 Strings を表示するループがあります。

スペース文字の ASCII 値は 32 で、二重引用符の ASCII 値は 34 であることに注意してください。以下で「quote」と「sixSpaces」を作成する理由は、それらを表示するときにエスケープ文字 \、引用符を表示しようとするとき。

public class ProgramThatDisplaysItself {

public static void main(String[] args) {
char space = (char)32;
char quote = (char)34;
String emptyStr = new String();
String spaceStr = String.valueOf(space);
String sixSpaces =
  emptyStr.concat(spaceStr).concat(spaceStr).concat(spaceStr)
          .concat(spaceStr).concat(spaceStr).concat(spaceStr);

String linesOfCode[] = {
  "package programthatdisplaysitself;",
  "",
  "public class ProgramThatDisplaysItself {",
  "",
  "  public static void main(String[] args) {",
  "    char space = (char)32;",
  "    char quote = (char)34;",
  "    String emptyStr = new String();",
  "    String spaceStr = String.valueOf(space);",
  "    String sixSpaces = ",
  "      emptyStr.concat(spaceStr).concat(spaceStr).concat(spaceStr)",
  "              .concat(spaceStr).concat(spaceStr).concat(spaceStr);",
  "",
  "    String linesOfCode[] = {",
  // Note: here's where the String array itself is skipped
  "    };",
  "",
  "    for ( int i = 0; i < 14; i++ ) {",
  "      System.out.println( linesOfCode[i] );",
  "    } // end for i",
  "",
  "    for ( int j = 0; j < linesOfCode.length; j++ ) {",
  "      System.out.println( sixSpaces + quote + linesOfCode[j] + quote + ',' );",
  "    } // end for j",
  "",
  "    for ( int k = 14; k < linesOfCode.length; k++ ) {",
  "      System.out.println( linesOfCode[k] );",
  "    } // end for k",
  "",
  "  } // end main()",
  "",
  "} // end class ProgramThatDisplaysItself",
}; // end linesOfCode[]
//display the lines until the String array elements
for ( int i = 0; i < 14; i++ ) {
  System.out.println( linesOfCode[i] );
} // end for i

//display the String array elements
for ( int j = 0; j < linesOfCode.length; j++ ) {
  System.out.println( sixSpaces + quote + linesOfCode[j] + quote + ',' );
} // end for j

//display the lines after the String array elements
for ( int k = 14; k < linesOfCode.length; k++ ) {
  System.out.println( linesOfCode[k] );
} // end for k

} // end main()

} // end class ProgramThatDisplaysItself
于 2013-10-26T05:44:23.723 に答える
0

バイトコードになったら、そこからソースコードを取得できるとは思いません。これを達成する唯一の方法は、プログラムがそのコードの文字列コピーを保持するか、コンパイルして印刷するために使用されるファイルから同じソースをロードする場合です。

編集:Quineコンピューターをチェックした後、例はコードのコピーであるプログラム内で文字列を使用することでした。

于 2013-10-26T05:21:27.243 に答える