プログラマ脳を鍛える回
AtCoder Beginner Contest 006
1
スケジュール
問題回答A 10分
問題回答B 10分
問題回答C 20分
2
問題A
数字Nが与えられます。Nに3が含まれる、もしくは3で割り
切れる場合はYES、それ以外はNOと出⼒してください。
例 ⼊⼒ 出⼒
2
9
3
NO
YES
YES
3
次のスライドに解答例
4
問題A解答例
var test = '13';
function isIncluding3(num){
if(num.match(/3/)){
return true;
}else{
return false;
}
}
function isDivisible(num){
if(num % 3 == 0){
return true;
}else{
return false;
}
}
function check(num){
if(isIncluding3(num)){
return 'YES';
}else if(isDivisible(num)){
return 'YES';
}else{
return 'NO';
}
}
console.log(check(test));
5
問題B
フィボナッチ数列の仲間にトリボナッチ数列というものがあります。
この数列は3つ前までの数字を⾜したものです。
定義
トリボナッチ数列表
この数列の第n項、anを10007で割ったあまりを考えてください。
6
7
例
⼊⼒ 出⼒
7
1
100000
7
0
7927
ヒント
初めは純粋に任意のトリボナッチ数列を求めるプログラムを作成
しましょう。
以前取り組んだ問題のフィボナッチ数列が参考になると思います。
nが⼤きくなると桁あふれが起きてしまうと思います。
処理の⼿順を考えることで桁あふれを防ぐことができるので、考えてみて
ください。
8
次のスライドに解答例
9
問題B解答例
var test = 100000;
var count = test-3;
var a = b = 0;
var c = 1;
function tribonacci(){
if(count < 0){
return 0;
}
while(count > 0){
var d = (a+b+c)%10007;
a = b;
b = c;
c = d;
count--;
}
return c;
}
console.log(tribonacci());
//a,b,c 10007で割った合計がdになるので結局最後に10007で割るのと同じ 桁あふれを起こさないために使⽤
10
スフィンクスからの問題
スフィンクス「朝は四本⾜、昼は⼆本⾜、⼣は三本⾜。
この⽣き物は何か︖」
11
答え
⼈間
朝、昼、夜は⼈間の⼀⽣を1⽇に例えています。
夜が3本なのは⽼⼈を表していて、⽼⼈になると杖をつくので3本になるということで
す。
12
問題C
スフィンクス「この街には⼈間が N ⼈いる。⼈間は、⼤⼈、⽼⼈、⾚ちゃ
んの 3 通りだ。
この街にいる⼈間の、⾜の数の合計は M 本で、⼤⼈の⾜は 2 本、⽼⼈の
⾜は 3 本、⾚ちゃんの⾜は 4 本と仮定した場合、存在する⼈間の組み合わ
せとしてあり得るものを 1 つ答えよ。」
スフィンクスのなぞなぞの答えとなる「この街に存在する⼈間の組み合わ
せ」を1つ出⼒してください。
そのような組み合わせが存在しない場合はʼ-1 -1 -1ʼと出⼒してください
スフィンクスからなぞなぞを出されました。
13
例
⼊⼒ 出⼒
3 9
7 23
10 41
1 1 1
1 3 3
-1 -1 -1
14
次のスライドにあまり良くない解答例
15
16
var baby;
var adult;
var old;
var N = 7;
var M = 23;
function sphinx(){
//例にするために1にしているが0でも良いらしい
for(baby=1; baby<=N; baby++){
for(adult=1; adult<=(N-baby); adult++){
if(M == 2*adult+3*(N-(adult+baby))+4*baby){
old = N - (baby+adult);
return adult + " " + old + " " + baby;
}
}
}
return "-1 -1 -1";
}
console.log(sphinx());
あまり良くない解答例
17
for⽂などを使わずに答えを出すことができます。
ヒント
⼈間が最低何本の⾜を持っているか、合計の⾜の本数と
⼈間の⼈数の関係性を始めに考えてみると良いかも
しれません。
次のスライドに解答例
18
解答例
var babies;
var adults;
var olds;
var rest;
var N = 7;
var M = 23;
function sphinx(){
if (N * 2 > M || N * 4 < M) {
console.log("-1 -1 -1");
} else {
rest = M - N * 2;
babies = Math.floor(rest / 2);
olds = rest % 2;
adults = N - olds - babies;
console.log("%d %d %d", adults, olds, babies);
}
}
sphinx();
19
お疲れ様でした
20
AtCoder Beginner Contest 006(http://abc006.contest.atcoder.jp)を
参考にさせていただきました。

At corder006