CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】この処理は?【コードを読もう】解答と解説

2017.11.14 Category:CodeIQ問題解説・リーダーボード Tag:

  • 4
  • このエントリーをはてなブックマークに追加

言語不問で、プログラムにちなんだ謎を解く「謎解きプログラム」。

あなたは見事、謎を解けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

【謎解きプログラム】この処理は?【コードを読もう】

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

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

問題のオープニング

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

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

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

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

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

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

問題1

Javaの基本的なメソッドの内部のコードが示されます。コードは短いものですので、普段Javaを使わない人でも読みこなせるものです。

このコードのメソッド名は■で隠されています。示された処理をたどり、どのメソッドのコードなのかを、選択肢から選んでください。

● java.lang.Boolean

public static String ■(boolean b) {
    return b ? "true" : "false";
}

● 選択肢

equals …… 同値か否か
toString …… 文字列化
compare …… 値を比較

● 答え

問題の処理を日本語で表すと、以下のようになります。

引数bがtrueなら、文字列"true"を戻す。
引数bがfalseなら、文字列"false"を戻す。

この処理は、引数を文字列に変えていると言い換えてもよいです。つまり「文字列化」を行なっているわけです。

「同値か否か」は判定していません。「値を比較」しているわけでもありません。

というわけで、答えは選択肢2の「toString …… 文字列化」になります。以下、完全な「toString」のコードを示します。

toString

public static String toString(boolean b) {
    return b ? "true" : "false";
}

その他の処理(equals、compare)のコードも掲載します。

equals

private final boolean value;

public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

compare

public static int compare(boolean x, boolean y) {
    return (x == y) ? 0 : (x ? 1 : -1);
}

問題2

Javaの基本的なメソッドの内部のコードが示されます。コードは短いものですので、普段Javaを使わない人でも読みこなせるものです。

このコードのメソッド名は■で隠されています。示された処理をたどり、どのメソッドのコードなのかを、選択肢から選んでください。

● java.lang.Math

public static int ■(int a, int b) {
    return (a <= b) ? a : b;
}

● 選択肢

max …… 大きい方
min …… 小さい方
abs …… 絶対値

● 答え

問題の処理を日本語で表すと、以下のようになります。

引数の数値aが、引数の数値b以下なら、引数の数値aを戻す。
引数の数値aが、引数の数値b以下でないなら、引数の数値bを戻す。

この処理は、引数の数値aとbのうち、小さい方を戻していると言い換えてもよいです。つまり「小さい方」を得ています。

「大きい方」を得ているわけでも、「絶対値」を得ているわけでもないです。

というわけで、答えは選択肢2の「min …… 小さい方」になります。以下、完全な「min」のコードを示します。

min

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

その他の処理(max、abs)のコードも掲載します。

max

public static int max(int a, int b) {
    return (a >= b) ? a : b;
}

abs

public static int abs(int a) {
    return (a < 0) ? -a : a;
}

問題3

Javaの基本的なメソッドの内部のコードが示されます。コードは短いものですので、普段Javaを使わない人でも読みこなせるものです。

このコードのメソッド名は■で隠されています。示された処理をたどり、どのメソッドのコードなのかを、選択肢から選んでください。

● java.lang.String

private final char value[];

public String ■(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

● 選択肢

getBytes …… バイト配列取得
substring …… 部分文字列
contains …… 含まれるか
concat …… 末尾に連結
trim …… 前後の空白削除

● 答え

「private final char value[];」は、String内のプライベートなプロパティになります。

問題の処理を日本語で表すと、以下のようになります。

引数の文字列strの長さを得て、変数otherLenに格納する。
    変数otherLenの長さが0(文字列が空)なら、自身の文字列を戻す。
変数value(自身の文字配列)の長さを得て、変数lenに格納する。
変数valueのコピーである文字配列を、valueとstrの長さの合計のサイズで作成して、変数bufに格納する。
文字列strの内容を、変数bufのlenの位置にコピーする。
変数bufから新しい文字列を作成して戻す。

この処理は、自身の末尾に、引数strを結合した文字列を作成して、戻していると言い換えてもよいです。つまり「末尾に連結」をしているわけです。

「バイト配列取得」でも「部分文字列」でも「含まれるか」でも「前後の空白削除」でもありません。

というわけで、答えは選択肢2の「concat …… 末尾に連結」になります。以下、完全な「concat」のコードを示します。

concat

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

その他の処理(getBytes、substring、contains、trim)のコードも掲載します。同じ名前のメソッドが複数ある場合は、その内の1つだけを掲載します。

getBytes の一例

public byte[] getBytes() {
    return StringCoding.encode(value, 0, value.length);
}

substring の一例

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > value.length) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    int subLen = endIndex - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
            : new String(value, beginIndex, subLen);
}

contains

public boolean contains(CharSequence s) {
    return indexOf(s.toString()) > -1;
}

trim

public String trim() {
    int len = value.length;
    int st = 0;
    char[] val = value;

    while ((st < len) && (val[st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}

CodeIQ運営事務局より

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

  • 4
  • このエントリーをはてなブックマークに追加

■関連記事

数学の問題をプログラミングで解こう!「ループ・トラッキング」問題解説... 問題のおさらい 自然数 n に対し、関数 Fn(x) を次のように定義します(floor():床関数)。 例えば n=10, x=1 のとき、F10(1) = floor(4×1×9÷10) = 3 です。 さて、整数 k(0 ≦ k ≦ n)に対して、関数 Fn による変換を繰り返し行い...
【謎解きプログラム】どんな結果になる?【アロー関数】解答と解説... 【謎解きプログラム】どんな結果になる?【アロー関数】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間...
数学の問題をプログラミングで解こう!「カウント・スリー」問題解説... 問題のおさらい 自然数を 1 から順に書き並べていきます。 このとき、3 の数字が現れる回数を数えます。 自然数 n に対し、ちょうど n 個目の 3 の数字が現れたときに書いている数を F(n) と定義します。 例えば F(10)=35 です。 下の通り、10 個目の 3 は、35 を書いて...
【息抜き】カードを上手く並べよう【言語不問】解答と解説... 【息抜き】カードを上手く並べよう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 あなたは、11から99までの、89枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス...
【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説... 【コードミステリ】数字に隠されたメッセージ【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。 それでは以下、問題とその解...
数学の問題をプログラミングで解こう!「ディバイド・アウト」問題解説... 問題のおさらい 自然数 n と素数 p に対し、n の階乗(n!)を p でこれ以上割り切れなくなるまで繰り返し割り、その商をさらに p で割ったときの余りを F(n, p) と定義します。 例えば F(12, 5)=4 です。 12!(=479001600)は 5 で最大 2 回割ることができ...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ