SlideShare a Scribd company logo
プログラマ脳を鍛える会
Q13 覆⾯算を満たすのは何通り︖
IQ: 80 ⽬標時間:20分
スケジュール
・問題紹介 5分
・解答時間 10分 
・ヒント 5分
・解答時間 10分
・解答者発表、解説 5分 
・解答時間 10分
・ヒント 5分
・解答時間 5分
・解答者発表、解説 5分
問題紹介
覆⾯算とは、⽂字で表された計算式で、同じ⽂字には同じ数字
が⼊り、違う⽂字には違う数字が⼊ります。また、最上位の⽂
字には0は⼊りません。
例
We × love = CodeIQ
W=7, e=4, l=3, o=8, v=0, C=2, d=1, I=9, Q=6
74×3804=281496
問題
以下の式を満たすような数字のあてはめ⽅は
何通りあるか求めてください。
READ+WRITE+TALK=SKILL
ヒント
アドバンスで処理速度や汎⽤性について考えるのでとりあえず
全探索で答えを出してみましょう。
各⽂字にどのように数字を割り当てるか、先頭の数字が0だっ
た場合の処理について考えてみましょう。
次のスライドに解答が載っています
解答
10通り
1632+41976+7380=50988
2543+72065+6491=81099
4905+24689+8017=37611
5094+75310+1962=82366
5096+35710+1982=42788
5180+65921+2843=73944
5270+85132+3764=94166
7092+37510+1986=46588
7092+47310+1986=56388
9728+19467+6205=35400
解答例(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;
}
解答例(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
解答例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
では、汎⽤性や処理速度を意識して
コードを書いてみましょう
個⼈的にjavascriptの⽅は処理速度について考えるのをお勧めします。javascriptの配列などに関する
メソッドを幾つか使⽤しているので、勉強という意味合いでチャレンジしてみるのも良いかもしれません。
ヒント
汎⽤性
処理速度
与えられた⽂字列を数に直して、式を判定するという流れです。
⽂字の先頭が0でない時の処理、与えられた式と数値をどのように
関連づけるかがポイントになると思います。
実際に⼿作業で解こうとした時を考えてみましょう。
⽂字がどのような値を取り得るか考えると思います。
次のスライドから解答例です
汎⽤性を考慮した解答例(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
実⾏速度を考慮した解答例(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
申し訳有りませんがjavascriptの解答例は
省略させていただきます。
お疲れ様でした。

More Related Content

Similar to Q13

(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Ouka Yuka
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
kyoto university
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
Yasuhiko Yamamoto
 
Material
MaterialMaterial
Material
_TUNE_
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
Takashi Minoda
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
Satoshi Yamada
 
Programming Haskell Chapter 11 切符番号選び
Programming Haskell Chapter 11 切符番号選びProgramming Haskell Chapter 11 切符番号選び
Programming Haskell Chapter 11 切符番号選び
dekosuke
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
fukuoka.ex
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】
Yukiko Kato
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
 
新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・RubyでやってみたTomoaki Ueda
 
プログラマ脳を鍛える会 Vol1
プログラマ脳を鍛える会 Vol1プログラマ脳を鍛える会 Vol1
プログラマ脳を鍛える会 Vol1
har hogefoo
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
Kenji Otsuka
 
プログラマ脳を鍛える会 Vol2α
プログラマ脳を鍛える会 Vol2αプログラマ脳を鍛える会 Vol2α
プログラマ脳を鍛える会 Vol2α
har hogefoo
 
普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby
Akito Sano
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
Satoshi Yamada
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
Yukiko Kato
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
Shinichi Kozake
 

Similar to Q13 (20)

(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
Python opt
Python optPython opt
Python opt
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
Material
MaterialMaterial
Material
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
Programming Haskell Chapter 11 切符番号選び
Programming Haskell Chapter 11 切符番号選びProgramming Haskell Chapter 11 切符番号選び
Programming Haskell Chapter 11 切符番号選び
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた
 
プログラマ脳を鍛える会 Vol1
プログラマ脳を鍛える会 Vol1プログラマ脳を鍛える会 Vol1
プログラマ脳を鍛える会 Vol1
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
 
プログラマ脳を鍛える会 Vol2α
プログラマ脳を鍛える会 Vol2αプログラマ脳を鍛える会 Vol2α
プログラマ脳を鍛える会 Vol2α
 
普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 

Q13