#line_sushi をほどく

  • 4
    いいね
  • 0
    コメント

JJUG CCC 2017 TOKYO で LINE からこんな問題を出されました:

aaa.jpg

#line_sushi
 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);

追いかけてみる

#line_sushi
 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 ]
という変換をする関数をつくればいい。

image.png

制約が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}

こたえあわせ

この記事では時間の関係2で端折った「制約が4つあるので、4変数の関数になるはず。ゴールを適当に $ax^2 + bx + cy + d$ という形になることをめざして」という部分など、ていねいに解説されています。

……続き。

こんな感じでTwitterに書いたら、LINEからこんな連絡がきました!! お食事券をいただきました! LINEさんありがとう!!

linesushi.png



  1. 計算してないよ! 

  2. 応募の締め切りは当日0時までだったのです