ガジェット通信 GetNews

見たことのないものを見に行こう
ワンダーウーマン

【謎解きプログラム】Hello, world! できるのはどれ?【Java】解答と解説

DATE:
  • ガジェット通信 GetNewsを≫

【謎解きプログラム】Hello, world! できるのはどれ?【Java】

本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内に謎が解けない場合は、このPCのデータは消失する。

 謎は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

説明

画面には、Coding Sandbox(Java8を選択)で実行するためのソースコードが3種類表示されています。

この中で、実際に動作して、「Hello, world!」が出力されるのは、どれでしょう?

問題1

// 選択肢1
class Main {
public static void main(String[] args) {
print(“Hello, world!”);
}
}

// 選択肢2
class Main {
public static void main(String[] args) {
System.out.print(‘Hello, world!’);
}
}

// 選択肢3
class Main {
public static void main(String[] args) {
System.out.print(“Hello, world!”);
}
}

3つのコードで違う部分を抜き出してみます。

print(“Hello, world!”);

System.out.print(‘Hello, world!’);

System.out.print(“Hello, world!”);

選択肢1ですが、Javaでは、直接 print や println する命令はありません。標準出力に文字列を出力するには、System.out の print や println などを使用します。

選択肢2、3ですが、Javaでは文字列は「’(シングルクオーテーション)」ではなく、「”(ダブルクオーテーション)」で囲います。「’(シングルクオーテーション)」はchar型の文字(1文字)になります。

そのため、3番目の選択肢の以下が答えになります。

// 選択肢3
class Main {
public static void main(String[] args) {
System.out.print(“Hello, world!”);
}
}

今回は、直接Coding Sandbox(Java8を選択)で確認すればよいので、サンプルはなしです。

問題2

// 選択肢1
class Main {
public static void main(String[] args) {
System.out.printf(“%2$s, %1$s!”, “Hello”, “world”);
}
}

// 選択肢2
class Main {
public static void main(String[] args) {
System.out.append(“Hello, world!”);
}
}

// 選択肢3
class Main {
public static void main(String[] args) {
System.out.write(“Hello, world!”.getBytes(), 0, 1);
}
}

3つのコードで違う部分を抜き出してみます。

System.out.printf(“%2$s, %1$s!”, “Hello”, “world”);

System.out.append(“Hello, world!”);

System.out.write(“Hello, world!”.getBytes(), 0, 1);

System.outは、PrintStreamクラスです。

選択肢1の、printf メソッドは、書式文字列を使い、出力可能です。そして、1$は1番目の引数。2$は2番目の引数となります。問題では、「%2$s, %1$s!」「Hello」「world」となっているため、「world, Hello!」と出力されてしまいます。

「%2$s, %1$s!」の、2や1の数値から、n番目の引数を取るのだろうと想像できます。

選択肢2の、appendメソッドは、append(CharSequence csq) 形式で出力可能です。

選択肢3の、writeメソッドは、write(byte[] buf, int off, int len) あるいは、write(int b) の引数を取ります。選択肢3では、前者のメソッドになります。そして、オフセットが0、長さが1なので、先頭から1文字のみを出力してしまいます。

このメソッドを知らなくても、「.getBytes()」でバイト配列になっていることが分かれば、続く「0, 1」が、オフセットと長さだと想像できます。

そのため、2番目の選択肢の以下が答えになります。知識がなくとも消去法で、答えを出せます。

// 選択肢2
class Main {
public static void main(String[] args) {
System.out.append(“Hello, world!”);
}
}

今回は、直接Coding Sandbox(Java8を選択)で確認すればよいので、サンプルはなしです。

問題3

// 選択肢1
class Main {
static {
System.out.print(“Hello, world!”);
}
public static void main(String[] args) {}
}

// 選択肢2
class Main {
{
System.out.print(“Hello, world!”);
}
public static void main(String[] args) {}
}

// 選択肢3
class Main {
Object o = new Object(){{
System.out.print(“Hello, world!”);
}};
public static void main(String[] args) {}
}

3つのコードで違う部分を抜き出してみます。

static {
System.out.print(“Hello, world!”);
}

{
System.out.print(“Hello, world!”);
}

Object o = new Object(){{
System.out.print(“Hello, world!”);
}};

インスタンスイニシャライザを利用した書き方です。

選択肢1の、class Main 直下の static {} 内は、クラスがロードされたタイミングで実行されます。

選択肢2の、class Main 直下の {} 内は、new Main(); した時に実行されます。

選択肢3は、無名クラス+インスタンスイニシャライザです。選択肢2同様に new Main(); するか、Object o の前に static を付けると、実行されます。

そのため、1番目の選択肢の以下が答えになります。

// 選択肢1
class Main {
static {
System.out.print(“Hello, world!”);
}
public static void main(String[] args) {}
}

今回は、直接Coding Sandbox(Java8を選択)で確認すればよいので、サンプルはなしです。

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。