解答と解説
Q1 : 101
let a0 for (let i = 2525 ; i > 0 ; i --) { if (2525 % i === 0 && 5252 % i === 0) { a0 = i break } }
最大公約数を求める有名な方法に「ユークリッドの互除法」があり、そちらを使えばより計算量少なく求めることができます。
function gcd(x, y) {let rwhile (y > 0) {r = x % yx = yy = r}return x}const a1 = gcd(2525, 5252)
Q2 : 2859870693
const TWO_POW_32 = Math.pow(2, 32)let arr = [a1]for (let i = 1 ; i <= 1000 ; i ++) {arr[i] = (arr[i - 1] * 2525 + 5252) % TWO_POW_32}const a2 = arr[1000]
Q3 : [2355222565, 3890716245, 434637493, 1285940997, 3265016661, 5746901]
const a3 = [...'dwango'].map(v => arr[v.charCodeAt(0)])
Q4 : 2110379477
const sortedArr = arr.sort((a, b) => a - b)const a4 = sortedArr[500]
問題 : 3322
const answerArr = a3.concat([a1, a2, a4])const answer = ((answerArr.reduce((a, x) => a + x))% TWO_POW_32).toString().slice(0, 4)
蛇足
a1 = 2525.gcd(5252)puts "Q1 : #{a1}"
arr = [a1]1.upto(1000) { |idx| arr[idx] = (arr[idx - 1] * 2525 + 5252) % 2 ** 32 }a2 = arr[1000]puts "Q2 : #{a2}"
a3 = "dwango".each_byte.map { |idx| arr[idx] }puts "Q3 : #{a3}"a4 = arr.sort[500]puts "Q4 : #{a4}"
answer = (a3.concat([a1, a2, a4]).sum % 2 ** 32).to_s[0..3]puts "Answer : #{answer}"
まとめ
ドワンゴではエンジニアを積極的に採用しています。「解けた!」という方で、お仕事をお探しの方は、経験者採用の募集情報もぜひご覧ください!