Created
June 1, 2015 01:31
-
-
Save kuronekomichael/db21247974a0c136c158 to your computer and use it in GitHub Desktop.
1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に Five programming problems every Software Engineer should be able to solve in less than 1 hour http://www.softantenna.com/wp/software/5-programming-problems/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://www.softantenna.com/wp/software/5-programming-problems/ | |
var assert = require('assert'); | |
//(1) forループ、whileループ、および再帰を使用して、リスト内の数字の合計を計算する3つの関数を記述せよ。 | |
(function() { | |
function forSum(inputs) { | |
var sum = 0; | |
for (var i = 0; i < inputs.length; i++) { | |
sum += inputs[i]; | |
} | |
return sum; | |
} | |
function whileSum(inputs) { | |
var i = 0; | |
var sum = 0; | |
while (i < inputs.length) { | |
sum += inputs[i]; | |
i++; | |
} | |
return sum; | |
} | |
function RecursiveSum(inputs, value) { | |
if (!value) value = 0; | |
value += inputs.pop(); | |
if (inputs.length === 0) { | |
return value; | |
} else { | |
return RecursiveSum(inputs, value); | |
} | |
} | |
assert.equal(forSum([12, 1, 5, 5, 1, 5, 2]), 31); | |
assert.equal(whileSum([12, 1, 5, 5, 1, 5, 2]), 31); | |
assert.equal(RecursiveSum([12, 1, 5, 5, 1, 5, 2]), 31); | |
})(); | |
// 8:00 | |
//(2) 交互に要素を取ることで、2つのリストを結合する関数を記述せよ。 | |
// 例えば [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]を返す。 | |
(function() { | |
function combine(list1, list2) { | |
var ret = []; | |
var i = 0; | |
while (i < list1.length && i < list2.length) { | |
if (i < list1.length) { | |
ret.push(list1[i]); | |
} | |
if (i < list2.length) { | |
ret.push(list2[i]); | |
} | |
i++; | |
} | |
return ret; | |
} | |
var list1 = ['a', 'b', 'c']; | |
var list2 = [1, 2, 3]; | |
assert.deepEqual(combine(list1, list2), ['a', 1, 'b', 2, 'c', 3]); | |
})(); | |
// 12:00 | |
//(3) 最初の100個のフィボナッチ数のリストを計算する関数を記述せよ。 | |
// 定義では、フィボナッチ数列の最初の2つの数字は0と1で、次の数は前の2つの合計となる。 | |
// 例えば最初の10個のフィボナッチ数列は、0, 1, 1, 2, 3, 5, 8, 13, 21, 34となる。 | |
(function() { | |
function getFibonacciNumbers() { | |
var ret = [0, 1]; | |
while (ret.length !== 100) { | |
ret.push(ret[ret.length - 2] + ret[ret.length - 1]); | |
} | |
return ret; | |
} | |
//console.log(getFibonacciNumbers()); | |
})(); | |
// 16:00 | |
//(4) 正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述せよ。 | |
//例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる(解答例)。 | |
(function() { | |
var input = [50, 5, 51, 2, 1, 9]; | |
function list2maxium(input) { | |
var sorted = input.sort(function(a, b) { | |
// 最上位の桁が最も大きいものが最優先 | |
var aStr = '' + a; | |
var bStr = '' + b; | |
var A = parseInt(aStr.charAt(0), 10); | |
var B = parseInt(bStr.charAt(0), 10); | |
if (A > B) return -1; | |
if (A < B) return 1; | |
// 最上位の桁が同じ場合は、桁数が少ないものが優先(9と90ならば、9が優先。990 <=> 909) | |
if (aStr.length < bStr.length) return -1; | |
if (aStr.length > bStr.length) return 1; | |
// 最上位の桁も同じ∧桁数も同じ場合は、数字が大きいものが優先(91と92ならば、92が優先。 9192 <=> 9291) | |
if (a > b) return -1; | |
if (a < b) return 1; | |
return 0; | |
}); | |
return parseInt(sorted.reduce(function(sum, value) { | |
return sum + value; | |
}, ''), 10); | |
} | |
assert.equal(list2maxium(input), 95515021); | |
})(); | |
// 30:00 | |
//(5) 1,2,…,9の数をこの順序で、”+”、”-“、またはななにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。例えば、1 + 2 + 34 – 5 + 67 – 8 + 9 = 100となる(解答例) | |
(function() { | |
var ret = []; | |
var input = [1, 2, 3, 4, 5, 6, 7, 8, 9]; | |
// @param valueList [ [1, '+', 2], [12, '-'], [123] ] | |
// @aram newValue 4 | |
function makePattern(valuesList, newValue) { | |
var patterns = []; | |
valuesList.forEach(function(list) { | |
var newList = list.concat(); | |
//(a) +をつけるパターン | |
var plusPattern = list.concat(); | |
plusPattern.push('+'); | |
plusPattern.push(newValue); | |
patterns.push(plusPattern); | |
//(b) -をつけるパターン | |
var minusPattern = list.concat(); | |
minusPattern.push('-'); | |
minusPattern.push(newValue); | |
patterns.push(minusPattern); | |
//(c) 数字を結合するパターン | |
var combine = list.concat(); | |
var value = combine.pop(); | |
combine.push(parseInt(value + '' + newValue, 10)); | |
patterns.push(combine); | |
}); | |
return patterns; | |
} | |
function calc(list) { | |
var code = ''; | |
return list.reduce(function(ret, value, index) { | |
if (value === '+' || value === '-') { | |
code = value; | |
return ret; | |
} else { | |
if (code === '+') { | |
ret += value; | |
} | |
if (code === '-') { | |
ret -= value; | |
} | |
if (code === '' && index === 0) { | |
ret = value; | |
} | |
code = ''; | |
return ret; | |
} | |
}, 0); | |
} | |
assert.equal(calc([1, '+', 2, '-', 34]), -31); | |
var patterns = [[input.shift()]]; | |
assert.deepEqual(makePattern(patterns, 2), [ | |
[1, '+', 2], | |
[1, '-', 2], | |
[12] | |
]); | |
input.forEach(function(newValue) { | |
patterns = makePattern(patterns, newValue); | |
}); | |
ret = patterns.filter(function(list) { | |
//console.log(ret, list); | |
return (calc(list) === 100); | |
}).map(function(list) { | |
return list.join(' '); | |
}); | |
var expected = [ | |
'1 + 2 + 3 - 4 + 5 + 6 + 78 + 9', | |
'1 + 2 + 34 - 5 + 67 - 8 + 9', | |
'1 + 23 - 4 + 5 + 6 + 78 - 9', | |
'1 + 23 - 4 + 56 + 7 + 8 + 9', | |
'12 + 3 + 4 + 5 - 6 - 7 + 89', | |
'12 + 3 - 4 + 5 + 67 + 8 + 9', | |
'12 - 3 - 4 + 5 - 6 + 7 + 89', | |
'123 + 4 - 5 + 67 - 89', | |
'123 + 45 - 67 + 8 - 9', | |
'123 - 4 - 5 - 6 - 7 + 8 - 9', | |
'123 - 45 - 67 + 89', | |
]; | |
assert.deepEqual(ret, expected); | |
})(); | |
console.log('done.'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment