ガジェット通信

見たことのないものを見に行こう

【謎解きプログラム】送料無料の条件は?【比較と論理演算】解答と解説

DATE:
  • ガジェット通信を≫

【謎解きプログラム】送料無料の条件は?【比較と論理演算】

本問題は、「解像度に対応せよ!」というテーマで、プログラムにちなんだ謎を解くというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内に謎が解けない場合は、このPCのデータは消失する。

 謎は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

説明

送料無料の式を構築せよ!

画面には、送料無料となる「条件の文章」が提示されています。

その後に、「演算子」と「変数」が提示されます。これらを組み合わせて、「条件の文章」を満たす式を構築します。

問題1

条件の文章
  価格の合計が1000円以上で、重量の合計が10kg未満の荷物は、送料無料。
演算子
  A & B …… 論理積。ABともに真なら真。それ以外は偽。
  A | B …… 論理和。AB一方でも真なら真。ともに偽なら偽。
  A > B …… 比較。AがBより大きいなら真。
  A >= B …… 比較。AがB以上なら真。
  A < B …… 比較。AがBより小さいなら真。
  A = 1000) & (weight 1000) | (weight = 1000)、かつ(&)、重量の合計(weight)が10kg未満(= 1000) & (weight = 1000) & (weight < 10)』が答えになります。

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード
// 変数の初期化
var f = [‘(price 10)’,
‘(price > 1000) | (weight = 1000) & (weight < 10)'];
var fTest = function(f, i, j) {
var price = i, weight = j;
f = f.replace(/&/g, '&&').replace(/|/g, '||');
return eval(f) ? 'OK!' : 'X';
};
var sz = 10;
var fP0 = function(i) {return 995 + i};
var fP1 = function(i) {return 5 + i};
var frmt = function(s) {
return (new Array(5).join(' ') + s).substr(-4);
};
var s = " p\w";

// テーブルの出力
var outTbl = function(f, sz, fP0, fP1) {
var res = '【' + f + '】nn';
var table = [[s]];
for (var i = 0; i < sz; i ++) {
table[i + 1] = [];
var p0 = table[i + 1][0] = fP0(i);
for (var j = 0; j < sz; j ++) {
var p1 = table[0][j + 1] = fP1(j);
table[i + 1][j + 1] = fTest(f, p0, p1);
}
}
res += table.map(function(x) {
return x.map(frmt).join(', ');
}).join('n');
console.log(res + 'nn');
};
for (var i = 0; i 1000) | (weight = 1000) & (weight < 10)】
pw,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000, OK!, OK!, OK!, OK!, OK!,
X,
X,
X,
X,
X
1001, OK!, OK!, OK!, OK!, OK!,
X,
X,
X,
X,
X
1002, OK!, OK!, OK!, OK!, OK!,
X,
X,
X,
X,
X
1003, OK!, OK!, OK!, OK!, OK!,
X,
X,
X,
X,
X
1004, OK!, OK!, OK!, OK!, OK!,
X,
X,
X,
X,
X

問題2

条件の文章
  価格の合計が1000円以上で、商品Aを購入している場合は、送料無料。
演算子
  A & B …… 論理積。ABともに真なら真。それ以外は偽。
  A | B …… 論理和。AB一方でも真なら真。ともに偽なら偽。
  A > B …… 比較。AがBより大きいなら真。
  A >= B …… 比較。AがB以上なら真。
  A 0)
(price > 1000) & (itemA >= 0)
(price >= 1000) & (itemA > 0)
(price >= 1000) & (itemA >= 0)

「商品Aを購入している」という条件は、「商品Aの購入個数が1個以上」、つまり「商品Aの購入個数が0個より大きい」と言い換えることが可能です。

その上で、文章を式に置き換えていくと、以下のようになります。

価格の合計(price)が1000円以上(>= 1000)、かつ(&)、商品Aを購入している場合(itemA > 0)を求める式を組み立てます。

この条件を、丸括弧付きの式で書くと、以下になります。

(price >= 1000) & (itemA > 0)

そのため、3番目の選択肢の『(price >= 1000) & (itemA > 0)』が答えになります。

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード
// 変数の初期化
var f = [‘(price > 1000) & (itemA > 0)’,
‘(price > 1000) & (itemA >= 0)’,
‘(price >= 1000) & (itemA > 0)’,
‘(price >= 1000) & (itemA >= 0)’];
var fTest = function(f, i, j) {
var price = i, itemA = j;
f = f.replace(/&/g, ‘&&’).replace(/|/g, ‘||’);
return eval(f) ? ‘OK!’ : ‘X';
};
var sz = 10;
var fP0 = function(i) {return 995 + i};
var fP1 = function(i) {return 0 + i};
var frmt = function(s) {
return (new Array(5).join(‘ ‘) + s).substr(-4);
};
var s = ” p\A”;

// テーブルの出力
var outTbl = function(f, sz, fP0, fP1) {
var res = ‘【’ + f + ‘】nn';
var table = [[s]];
for (var i = 0; i < sz; i ++) {
table[i + 1] = [];
var p0 = table[i + 1][0] = fP0(i);
for (var j = 0; j < sz; j ++) {
var p1 = table[0][j + 1] = fP1(j);
table[i + 1][j + 1] = fTest(f, p0, p1);
}
}
res += table.map(function(x) {
return x.map(frmt).join(', ');
}).join('n');
console.log(res + 'nn');
};
for (var i = 0; i 1000) & (itemA > 0)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1001,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

【(price > 1000) & (itemA >= 0)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1001, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

【(price >= 1000) & (itemA > 0)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1001,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

【(price >= 1000) & (itemA >= 0)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1001, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

問題3

条件の文章
  価格の合計が1000円以上か、商品Aを購入している場合は、送料無料。
演算子
  A & B …… 論理積。ABともに真なら真。それ以外は偽。
  A | B …… 論理和。AB一方でも真なら真。ともに偽なら偽。
  A > B …… 比較。AがBより大きいなら真。
  A >= B …… 比較。AがB以上なら真。
  A 1)
(price >= 1000) | (itemA >= 1)
(price >= 1000) & (itemA > 1)
(price >= 1000) & (itemA >= 1)

「商品Aを購入している」という条件は、「商品Aの購入個数が1個以上」と言い換えることが可能です。

その上で、文章を式に置き換えていくと、以下のようになります。

価格の合計(price)が1000円以上(>= 1000)、あるいは(|)、商品Aを購入している場合(itemA >= 1)を求める式を組み立てます。

この条件を、丸括弧付きの式で書くと、以下になります。

(price >= 1000) | (itemA >= 1)

そのため、2番目の選択肢の『(price >= 1000) | (itemA >= 1)』が答えになります。

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード
// 変数の初期化
var f = [‘(price >= 1000) | (itemA > 1)’,
‘(price >= 1000) | (itemA >= 1)’,
‘(price >= 1000) & (itemA > 1)’,
‘(price >= 1000) & (itemA >= 1)’];
var fTest = function(f, i, j) {
var price = i, itemA = j;
f = f.replace(/&/g, ‘&&’).replace(/|/g, ‘||’);
return eval(f) ? ‘OK!’ : ‘X';
};
var sz = 10;
var fP0 = function(i) {return 995 + i};
var fP1 = function(i) {return 0 + i};
var frmt = function(s) {
return (new Array(5).join(‘ ‘) + s).substr(-4);
};
var s = ” p\A”;

// テーブルの出力
var outTbl = function(f, sz, fP0, fP1) {
var res = ‘【’ + f + ‘】nn';
var table = [[s]];
for (var i = 0; i < sz; i ++) {
table[i + 1] = [];
var p0 = table[i + 1][0] = fP0(i);
for (var j = 0; j < sz; j ++) {
var p1 = table[0][j + 1] = fP1(j);
table[i + 1][j + 1] = fTest(f, p0, p1);
}
}
res += table.map(function(x) {
return x.map(frmt).join(', ');
}).join('n');
console.log(res + 'nn');
};
for (var i = 0; i = 1000) | (itemA > 1)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
996,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
997,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
998,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
999,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1000, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1001, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

【(price >= 1000) | (itemA >= 1)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
996,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
997,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
998,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
999,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1000, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1001, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

【(price >= 1000) & (itemA > 1)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1001,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004,
X,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

【(price >= 1000) & (itemA >= 1)】
pA,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
995,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
996,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
997,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
998,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
999,
X,
X,
X,
X,
X,
X,
X,
X,
X,
X
1000,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1001,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1002,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1003,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!
1004,
X, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!, OK!

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。