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:「」内が出力になります