JJUG CCC 2017 TOKYO で LINE からこんな問題を出されました:
IntStream.range(0,4)
.mapToObj(idx -> new int[]{"SUSI". charAt(idx),
"LINE". charAt(idx)})
.map(p -> p[0]*p[0]*311-p[0]*49_578+p[1]*1320+1_876_615)
.map(value -> (char) (value / 60))
.forEach(System.out::print);
追いかけてみる
IntStream.range(0,4)
// [ 0, 1, 2, 3 ]
.mapToObj(idx -> new int[]{"SUSI". charAt(idx),
"LINE". charAt(idx)})
// [ ['S','L'], ['U','I'], ['S','N'], ['I','E'] ]
.map(p -> p[0]*p[0]*311-p[0]*49_578+p[1]*1320+1_876_615)
// [ 'S'*'S'*311-'S'*49578 + 'L'*1320 + 1876615,
// 'U'*'U'*311-'U'*49578 + 'I'*1320 + 1876615,
// 'S'*'S'*311-'S'*49578 + 'N'*1320 + 1876615,
// 'I'*'I'*311-'I'*49578 + 'E'*1320 + 1876615 ]
// = [ 83* 83*311- 83*49578 + 76*1320 + 1876615,
// 85* 85*311- 85*49578 + 73*1320 + 1876615,
// 83* 83*311- 83*49578 + 78*1320 + 1876615,
// 73* 73*311- 73*49578 + 69*1320 + 1876615 )
// = [ 4440,
// 5820,
// 7080,
// 5820 )
.map(value -> (char) (value / 60))
// [ 74, 97, 118, 97 ]
.forEach(System.out::print);
どうやってつくるの?
[ [83, 76], [85, 73], [83, 78], [73, 69] ] -> [ 74, 97, 118, 97 ]
という変換をする関数をつくればいい。
制約が4つあるので、4変数の関数になるはず。
ゴールを適当に $ax^2 + bx + cy + d$ という形になることをめざして、
$83^2a + 83b + 76c + d = 74$
$85^2a + 85b + 73c + d = 97$
$83^2a + 83b + 78c + d = 118$
$73^2a + 73b + 69c + d = 97$
これを $a$ $b$ $c$ $d$ について解いたら、こうなった。1
a=\frac{311}{60} \\
b=\frac{49578}{60} \\
c=\frac{1320}{60} \\
d=\frac{1876615}{60}
こたえあわせ
JJUG CCC 2017 Spring で寿司スポンサーをした際に出していた問題について解説エントリを公開いたしました。ゆらゆらするグラフと共に是非ご覧ください。ゆらゆらゆら… #line_sushi https://engineering.linecorp.com/ja/blog/detail/165
— LINE_DEV (@LINE_DEV) 2017年6月23日
この記事では時間の関係2で端折った「制約が4つあるので、4変数の関数になるはず。ゴールを適当に $ax^2 + bx + cy + d$ という形になることをめざして」という部分など、ていねいに解説されています。
……続き。
こんな感じでTwitterに書いたら、LINEからこんな連絡がきました!! お食事券をいただきました! LINEさんありがとう!!
Javaだ…… #jjug_ccc #line_sushi http://qiita.com/matobaa/items/c8a30d15c4a5227fc798
— matobaa (@matobaa) 2017年5月20日