8. 解答例(q13_normal.js)
function check(){
var r = numArray[0],
e = numArray[1],
a = numArray[2],
d = numArray[3],
w = numArray[4],
i = numArray[5],
t = numArray[6],
l = numArray[7],
k = numArray[8],
s = numArray[9];
if(r===0 || w===0 || t===0 || s===0){
return;
}
var read = r * 1000 + e * 100 + a * 10 + d;
var write = w * 10000 + r * 1000 + i * 100 + t * 10 + e;
var talk = t * 1000 + a * 100 + l * 10 + k;
var skill = s * 10000 + k * 1000 + i * 100 + l * 10 + l;
if((read+write+talk)==skill){
console.log("read+write+talk=skill:" + read + "+" + write + "+" + talk + "=" + skill);
count++;
}
}
assignmentLoop(array);
console.log(count);
var count = 0;
var numArray = new Array(10);
var array = [0,1,2,3,4,5,6,7,8,9];
function assignmentLoop(array1){
for(var in1 = 0; in1 < array1.length; in1++){
numArray[array1.length - 1] = array1[in1];
var array2 = removeNumFromArray(array1[in1], array1)
if(array2.length ===0){
check();
}else{
assignmentLoop(array2);
}
}
}
function removeNumFromArray(num, array){
var newArray = new Array(array.length - 1);
var index = 0;
for(var i = 0; i < array.length; i++){
if(array[i] == num){
continue;
}
newArray[index] = array[i];
index++;
}
return newArray;
}
9. 解答例(q13_normal.rb)
count = 0
(0..9).to_a.permutation do |r, e, a, d, w, i, t, l, k, s|
next if r == 0 or w == 0 or t == 0 or s == 0
read = r * 1000 + e * 100 + a * 10 + d
write = w * 10000 + r * 1000 + i * 100 + t * 10 +e
talk = t * 1000 + a * 100 + l * 10 + k
skill = s * 10000 + k * 1000 + i * 100 + l * 10 + l
if read + write + talk == skill then
count += 1
puts "#{read} + #{write} + #{talk} = #{skill}"
end
end
puts count
10. 解答例2(q13_normal2.js) javascriptにpermutationがないのが納得できなかったので
function check(numArray){
var r = numArray[0],
e = numArray[1],
a = numArray[2],
d = numArray[3],
w = numArray[4],
i = numArray[5],
t = numArray[6],
l = numArray[7],
k = numArray[8],
s = numArray[9];
if(r===0 || w===0 || t===0 || s===0){
return;
}
var read = r * 1000 + e * 100 + a * 10 + d;
var write = w * 10000 + r * 1000 + i * 100 + t * 10 + e;
var talk = t * 1000 + a * 100 + l * 10 + k;
var skill = s * 10000 + k * 1000 + i * 100 + l * 10 + l;
if((read+write+talk)==skill){
console.log("read+write+talk=skill:" + read + "+" + write + "+" + talk + "=" + skill)
count++;
}
}
var count = 0;
var numArray = new Array(10);
var dataArray = [0,1,2,3,4,5,6,7,8,9].permutation();
for(var i =0; i < dataArray.length; i++){
check(dataArray[i]);
}
console.log(count);
(function() {
var generatePermutation = function(perm, pre, post, n) {
var elem, i, rest, len;
if (n > 0)
for (i = 0, len = post.length; i < len; ++i) {
rest = post.slice(0);
elem = rest.splice(i, 1);
generatePermutation(perm, pre.concat(elem), rest, n - 1);
}
else
perm.push(pre);
};
/*
extend Array.prototype
e.g. [0, 1, 2].permutation(2)
=> [[0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1]]
*/
Array.prototype.permutation = function(n) {
if (n == null) n = this.length;
var perm = [];
generatePermutation(perm, [], this, n);
return perm;
};
})();
参考にさせていただいたサイト
http://qiita.com/higuma/items/5af4e62bdf4df42ce673
14. 汎⽤性を考慮した解答例(q13_advance1.rb)
expression = "READ+WRITE+TALK==SKILL"
nums= expression.split(/[^a-zA-Z]/)
chars = nums.join().split("").uniq
head = nums.map{|num| num[0]}
count = 0
(0..9).to_a.permutation(chars.size){|seq|
is_zero_first = false
if seq.include?(0) then
is_zero_first = head.include?(chars[seq.index(0)])
end
if !is_zero_first then
e = expression.tr(chars.join(), seq.join())
if eval(e) then
puts e
count += 1
end
end
}
puts count
15. 実⾏速度を考慮した解答例(q13_advance2.rb)
count = 0
(0..9).to_a.permutation(6){|e, a, d, t, k, l|
if ((a + t == 8) || (a + t == 9) || (a + t == 10)) &&
((a + e == 8) || (a + e == 9) || (a + e == 10)) &&
((d + e + k) % 10 == l) &&
(((a + t + l) * 10 + d + e + k) % 100 == l * 11) then
((0..9).to_a - [k, e, d, l, t, a]).permutation(4){|i, r, s, w|
if((r != 0) && (w != 0) && (t != 0)) &&
((s == w + 1) || (s == w + 2)) then
read = r * 1000 + e * 100 + a * 10 + d
write = w * 10000 + r * 1000 + i * 100 + t * 10 + e
talk = t * 1000 + a * 100 + l * 10 + k
skill = s * 10000 + k * 1000 + i * 100 + l * 10 + l
if read + write + talk == skill then
puts "#{read} + #{write} + #{talk} = #{skill}"
count += 1
end
end
}
end
}
puts count