Java

#line_sushi をほどく

More than 1 year has passed since last update.

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

IMG_20171017_155553.jpg

ごちそうさまでした!!






  1. 計算してないよ! 



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