Skip to content

Instantly share code, notes, and snippets.

@kuronekomichael
Created June 1, 2015 01:31
Show Gist options
  • Save kuronekomichael/db21247974a0c136c158 to your computer and use it in GitHub Desktop.
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/
// 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