じゃんぬねっと日誌

ネタと雑記と時々プログラミング

目次

Blog 利用状況

ニュース

ニセくさい(笑) サイトです。

スポンサードリンク

運営サイト

  • C# と VB.NET の入門サイト

Blog Item

フィードメーター - じゃんぬねっと日誌

書庫

4 つの数字から四則演算のみで 10 を作る方法 [テンパズル]

とうの昔の話ですが、@IT 会議室のスレッドに、このような問題がありました。私は知りませんでしたが、電車の切符の数字で、この遊びをされている世代もいらっしゃるとか...

論理的思考力テスト (atmarkit.co.jp) からの引用

有名な四則演算とカッコで 10 を作る問題です。

2 つの数を組み合わせて 2 桁の数にしたり、累乗、階乗は反則ですよ。順番を変えるのは OK です。

問題例 : 1, 2, 3, 3
解答例 : (3 - 1) x (2 + 3)

レベル 1 : 9, 9, 9, 9
レベル 2 : 1, 1, 9, 9
レベル 3 : 1,1,5,8

答えは、リンク先のスレッド内にあるのでここでは書きませんが、それにしても、この問題は以下の定義を書いておかないといけませんね。

  • 各数字を必ず 1 回ずつ使用すること
  • 四則演算以外は使用禁止 (よって、累乗・階乗は使用禁止)
  • 2 つの数字をつなげて 2 桁にするのは禁止
  • 単項のマイナス演算は禁止

プログラマならではの解き方として、プログラムを組んでしまうという方法があります。これ、Stack クラスを使うと勉強になるかもしれません。そんなわけで、ヒマな方は Stack で解くプログラムを作ってみてください。

関連リンク

投稿日時 : 2006年9月19日 9:36

コメントを追加

# re: 4 つの数字から四則演算のみで 10 を作る方法 2006/09/19 18:31 藤代千尋

mixi の中の Excel コミュでもありました。(^^)
ループで検証するコードは書きましたが、スタックは面倒なので止めておきました。「テンパズル」として有名みたいですね。

# re: 4 つの数字から四則演算のみで 10 を作る方法 [テンパズル] 2006/09/19 18:39 じゃんぬ

>藤代千尋さん
「テンパズル」というのですね。
名前までは知りませんでした。

# re: 4 つの数字から四則演算のみで 10 を作る方法 [テンパズル] 2006/09/19 21:48 うじはら

使っていい型は int 限定にすると、いい練習問題になりそうですね。

# re: 4 つの数字から四則演算のみで 10 を作る方法 [テンパズル] 2006/09/22 13:08 明智重蔵

Oracleで解いてみました

declare
result pls_Integer;
SQL1 varchar2(2000);
begin
for rec in
(with NumList as
(select 1 as Val from dual
union all select 1 from dual
union all select 5 from dual
union all select 8 from dual),
CalcList as
(select '+' as Val from dual
union select '-' from dual
union select '*' from dual
union select '/' from dual)
select a.Val as a,b.Val as b,c.Val as c,d.Val as d,e.Val as e,f.Val as f,g.Val as g
from NumList a,NumList b,NumList c,NumList d,CalcList e,CalcList f,CalcList g) Loop
SQL1 := 'select ' || rec.a || rec.e || rec.b || rec.f || rec.c || rec.g || rec.d || ' from dual';
execute immediate SQL1 into result;
if result = 10 then
DBMS_Output.Put_Line(SQL1);
end if;
end Loop;
end;
/


括弧のパターンは

1 ABCD
2 (AB)(CD)
3 A(BC)D
4 (ABC)D
5 A(BCD)

ですが1のみ対応

こうゆうのはperlが向いてますね
evalなんてのがあるから

# re: 4 つの数字から四則演算のみで 10 を作る方法 [テンパズル] 2006/09/22 13:40 明智重蔵

すみません
修正です

.net版は、誰か作ってください(笑)

declare
result number;
SQL1 varchar2(2000);
begin
for rec in
(with NumList as
(select 1 as Val from dual
union all select 1 from dual
union all select 5 from dual
union all select 8 from dual),
CalcList as
(select '+' as Val from dual
union select '-' from dual
union select '*' from dual
union select '/' from dual)
select a.Val as a,b.Val as b,c.Val as c,d.Val as d,e.Val as e,f.Val as f,g.Val as g
from NumList a,NumList b,NumList c,NumList d,CalcList e,CalcList f,CalcList g
where decode(a.Val,1,1,0)+
decode(b.Val,1,1,0)+
decode(c.Val,1,1,0)+
decode(d.Val,1,1,0) = 2
and 5 in (a.Val,b.Val,c.Val,d.Val)
and 8 in (a.Val,b.Val,c.Val,d.Val)
) Loop
begin
SQL1 := 'select ' || rec.a || rec.e || rec.b || rec.f || rec.c || rec.g || rec.d || ' from dual';
execute immediate SQL1 into result;
if result = 10 then
DBMS_Output.Put_Line(SQL1);
end if;
exception
when others then
null;
end;
begin
SQL1 := 'select (' || rec.a || rec.e || rec.b || ')' || rec.f || '(' || rec.c || rec.g || rec.d || ') from dual';
execute immediate SQL1 into result;
if result = 10 then
DBMS_Output.Put_Line(SQL1);
end if;
exception
when others then
null;
end;
begin
SQL1 := 'select ' || rec.a || rec.e || '(' || rec.b || rec.f || rec.c || ')' || rec.g || rec.d || ' from dual';
execute immediate SQL1 into result;
if result = 10 then
DBMS_Output.Put_Line(SQL1);
end if;
exception
when others then
null;
end;
begin
SQL1 := 'select (' || rec.a || rec.e || rec.b || rec.f || rec.c || ')' || rec.g || rec.d || ' from dual';
execute immediate SQL1 into result;
if result = 10 then
DBMS_Output.Put_Line(SQL1);
end if;
exception
when others then
null;
end;
begin
SQL1 := 'select ' || rec.a || rec.e || '(' || rec.b || rec.f || rec.c || rec.g || rec.d || ') from dual';
execute immediate SQL1 into result;
if result = 10 then
DBMS_Output.Put_Line(SQL1);
end if;
exception
when others then
null;
end;
end Loop;
end;
/

# re: 4 つの数字から四則演算のみで 10 を作る方法 [テンパズル] 2006/11/24 11:07 けん

.net版作りました。といってもほぼべた書きですが・・・

'演算子
Enum Enzanshi
Plus = 1 '+
Minus = 2 '-
Times = 3 '×
Par = 4 '÷
End Enum

'計算ボタンクリック時
Private Sub btnClac_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClac.Click

Dim Pattern As Integer '計算式パターン
Dim Enzan1 As Enzanshi '演算子1
Dim Enzan2 As Enzanshi '演算子2
Dim Enzan3 As Enzanshi '演算子3

Dim BeforeValue(4) As Integer
Dim AfterValue(4) As Integer

BeforeValue(1) = CInt(txtValue1.Text)
BeforeValue(2) = CInt(txtValue2.Text)
BeforeValue(3) = CInt(txtValue3.Text)
BeforeValue(4) = CInt(txtValue4.Text)

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer

Dim AnsTemp1 As Double '答え(一時保存)
Dim AnsTemp2 As Double '答え(一時保存)
Dim Ans As Double '答え

'一つめの数値
For i = 1 To 4
AfterValue(1) = BeforeValue(i)
'二つめの数値
For j = 1 To 4
If i <> j Then
AfterValue(2) = BeforeValue(j)
End If
'三つめの数値
For k = 1 To 4
If i <> j And i <> k And j <> k Then
AfterValue(3) = BeforeValue(k)
'四つめの数値
For l = 1 To 4
If i <> j And i <> k And i <> l And j <> k And j <> l And k <> l Then
AfterValue(4) = BeforeValue(l)

'パターン毎にループ
For Pattern = 1 To 4
'一つめの演算子
For Enzan1 = 1 To 4
'二つめの演算子
For Enzan2 = 1 To 4
'三つめの演算子
For Enzan3 = 1 To 4
'答えの初期化
Ans = 0
'計算式のパターン
Select Case Pattern
Case 1
'(A Enzan1 B) Enzan2 (C Enzan3 D)
AnsTemp1 = Enzan(AfterValue(1), AfterValue(2), Enzan1)
AnsTemp2 = Enzan(AfterValue(3), AfterValue(4), Enzan3)
Ans = Enzan(AnsTemp1, AnsTemp2, Enzan2)
Case 2
'A Enzan1 (B Enzan2 C) Enzan3 D
AnsTemp1 = Enzan(AfterValue(2), AfterValue(3), Enzan2)
If Enzan1 >= Enzan3 Then
AnsTemp2 = Enzan(AfterValue(1), AnsTemp1, Enzan1)
Ans = Enzan(AnsTemp2, AfterValue(4), Enzan3)
Else
AnsTemp2 = Enzan(AnsTemp1, AfterValue(4), Enzan3)
Ans = Enzan(AfterValue(1), AnsTemp2, Enzan1)
End If
Case 3
'(A Enzan1 B Enzan2 C) Enzan3 D
If Enzan1 >= Enzan2 Then
AnsTemp1 = Enzan(AfterValue(1), AfterValue(2), Enzan1)
AnsTemp2 = Enzan(AnsTemp1, AfterValue(3), Enzan2)
Else
AnsTemp1 = Enzan(AfterValue(2), AfterValue(3), Enzan2)
AnsTemp2 = Enzan(AnsTemp1, AfterValue(1), Enzan1)
End If
Ans = Enzan(AnsTemp2, AfterValue(4), Enzan3)
Case 4
'A Enzan1 (B Enzan2 C Enzan3 D)
If Enzan2 >= Enzan3 Then
AnsTemp1 = Enzan(AfterValue(2), AfterValue(3), Enzan2)
AnsTemp2 = Enzan(AnsTemp1, AfterValue(4), Enzan3)
Else
AnsTemp1 = Enzan(AfterValue(3), AfterValue(4), Enzan3)
AnsTemp2 = Enzan(AfterValue(2), AnsTemp1, Enzan2)
End If
Ans = Enzan(AfterValue(1), AnsTemp2, Enzan1)
End Select

'答えが10のとき処理終了
If Ans = 10 Then
'答えを出力
EnzanKekka(Pattern, AfterValue, Enzan1, Enzan2, Enzan3)
Exit Sub
End If

Next
Next
Next
Next

End If
Next
End If
Next
Next
Next


End Sub

Private Function Enzan(ByVal Atai1 As Double, ByVal Atai2 As Double, ByVal Enzanshi As Enzanshi) As Double
Select Case Enzanshi
Case Enzanshi.Plus
Return Atai1 + Atai2
Case Enzanshi.Minus
Return Atai1 - Atai2
Case Enzanshi.Times
Return Atai1 * Atai2
Case Enzanshi.Par
Return Atai1 / Atai2
End Select
End Function

Private Function ToEnzanshi(ByVal Enzan As Enzanshi) As String
Select Case Enzan
Case Enzanshi.Plus
Return "+"
Case Enzanshi.Minus
Return "-"
Case Enzanshi.Times
Return "*"
Case Enzanshi.Par
Return "/"
End Select
End Function


Private Sub EnzanKekka(ByVal Pattern As Integer, ByVal AfterValue() As Integer, _
ByVal Enzan1 As Enzanshi, ByVal Enzan2 As Enzanshi, ByVal Enzan3 As Enzanshi)
'1 ABCD()
'2 (AB)(CD)
'3 A(BC)D
'4 (ABC)D
'5 A(BCD)

txtAnswer.Text = ""

If Pattern = 1 Or Pattern = 3 Then
txtAnswer.Text &= "("
End If

txtAnswer.Text &= AfterValue(1)

txtAnswer.Text &= ToEnzanshi(Enzan1)

If Pattern = 2 Or Pattern = 4 Then
txtAnswer.Text &= "("
End If

txtAnswer.Text &= AfterValue(2)

If Pattern = 1 Then
txtAnswer.Text &= ")"
End If

txtAnswer.Text &= ToEnzanshi(Enzan2)

If Pattern = 1 Then
txtAnswer.Text &= "("
End If

txtAnswer.Text &= AfterValue(3)

If Pattern = 2 Or Pattern = 3 Then
txtAnswer.Text &= ")"
End If

txtAnswer.Text &= ToEnzanshi(Enzan3)

txtAnswer.Text &= AfterValue(4)

If Pattern = 1 Or Pattern = 4 Then
txtAnswer.Text &= ")"
End If

End Sub

タイトル  
名前  
URL
コメント