Java8Puzzler・その1

5/14に迫ったJava Day TokyoでJavaPuzzlerが行われるそうです。

Terada Yoshio ‏@yoshioterada

Java Day Tokyo 2013 : 16:45-17:35 に「帰ってきた Java パズラー」を実施します。Javaの素人から玄人まで楽しんで頂けるとても楽しいセッションです。パズラーが出す質問に皆様、難問正解できるかな ?! #jdt2013

https://twitter.com/yoshioterada/status/331705664424509442

恐らくJavaSE8のパズラーになるんでしょう。

大学の関係で残念ながらJava Day Tokyoに行けないのですがすごく面白そうですね。
行けないのが実に残念なので4問ほど考えてみました。
初めて作ったのですが難しいですね。

コンパイルして実行せずに答えを考えてみてください。

なおOpenJDKのProjectLambdaのリポジトリの5/8時点の最新のコミットに準拠しています。

第一問

各文字列の長さを出力するプログラムです。

import java.util.stream.*;

public class Puzzler1
{
    public static void main(String[] args)
    {
        String s = Stream.of("Hello", "Fizz", "Buzz", "JavaSE8")
            .map(String::length)
            .map(Integer::toString)
            .collect(Collectors.toStringJoiner(", "))
            .toString();
        System.out.println(s);
    }
}

正解の選択肢は以下の5つです。*1

(1): 「5, 4, 4, 7, 」
(2): 「5, 4, 4, 7」
(3): 「[5, 4, 4, 7]」
(4): コンパイルエラー
(5): 実行時エラー

第二問

遇奇を判別して出力します。

import java.util.stream.*;

public class Puzzler2
{
    public static void main(String[] args)
    {
        String s = IntStream.range(1, 10)
            .filter(_ -> _ % 2 == 0)
            .mapToObj(Integer::toString)
            .collect(Collectors.toStringJoiner(", "))
            .toString();
        System.out.println(s);
    }
}

選択肢は以下の5つです。

(1): 「2, 4, 6, 8, 10」
(2): 「2, 4, 6, 8」
(3): 「1, 3, 5, 7, 9」
(4): コンパイルエラー
(5): 実行時エラー

第三問

エラトステネスの篩をStreamで実装。

import java.util.*;
import java.util.stream.*;

public class Puzzler3
{
    public static void main(String[] args)
    {
        List<Integer> primes = new ArrayList<Integer>();
        prime(2, 13, primes);
        String s = primes.stream()
            .map(Object::toString)
            .collect(Collectors.toStringJoiner(", "))
            .toString();

        System.out.println(s);
    }

    public static void prime(int start, int end, List<Integer> primes)
    {
        // TODO: error check
        prime(IntStream.range(start, end), primes);
    }

    public static void prime(IntStream s, List<Integer> l)
    {
        OptionalInt firstOpt = s.findFirst();

        if (firstOpt.isPresent())
        {
            int first = firstOpt.getAsInt();

            l.add(first);
            prime(s.filter(n -> n % first != 0), l);
        }
    }
}

選択肢は以下の4つです。

(1): 「2, 3, 5, 7, 11」
(2): 「2, 3, 5, 7, 11, 13」
(3): コンパイルエラー
(4): 実行時エラー

第四問

遇奇を判別して出力します。

import java.util.stream.*;

public class Puzzler4
{
    public static String toString(IntStream is)
    {
        return is.mapToObj(Integer::toString)
            .collect(Collectors.toStringJoiner(", "))
            .toString();
    }

    public static void main(String[] args)
    {
        IntStream is = IntStream.range(1, 10);

        IntStream even = is.filter(n -> n % 2 == 0);
        IntStream odd = is.filter(n -> n % 2 != 0);

        System.out.println(toString(even));
        System.out.println(toString(odd));
    }
}

選択肢は以下の5つです。

(1): 「2, 4, 6, 8 : 1, 3, 5, 7, 9」
(2): 「1, 3, 5, 7, 9 : 2, 4, 6, 8」
(3): 「2, 4, 6, 8 : 」
(4): コンパイルエラー
(5): 実行時エラー



2013/5/9 20:47: 第三問と第四問を修正しました。
2013/5/21 22:45: 第四問の一部を変更しました。

*1:「」内が出力になります