切符パズル

アバター
a5ua
記事: 199
登録日時: 14年前

切符パズル

投稿記事 by a5ua » 14年前

4桁の数字の各桁の数字と四則演算を使って合計が10となるような式を作るパズルです。
(切符に4桁の数字が印刷されていたから、このような名称がついているらしいです。)

例:「1357」ならば、答えは「1+5+7-3」とか「(7-1)*5/3」などとなります。

このように、4つの数字が与えられたときに、切符パズルの答えを列挙するプログラムを作りました。
ソースコードを、一部だけ記載します。

【ticket_puzzle.h】

CODE:

#pragma once

namespace a5ua
{
	void ticket_puzzle(const int (&numbers)[4]);
	void ticket_puzzle(const char *numbers_str);
}
【main.cpp】

CODE:

#include 
#include "ticket_puzzle.h"

int main()
{
	const char *A[2] = {"3478", "****"};
	const int B[2][4] = {{1, 1, 5, 8}, {-1, 0, 1, 2}};

	a5ua::ticket_puzzle(A[0]); std::cout << "\n";
	a5ua::ticket_puzzle(A[1]); std::cout << "\n";
	a5ua::ticket_puzzle(B[0]); std::cout << "\n";
	a5ua::ticket_puzzle(B[1]); std::cout << "\n";

	return 0;
}
【実行結果】
変な入力に対しては、エラーとなります。
[codeplain]
(3-(7/4))*8
8*(3-(7/4))

invalid arguments

8/(1-(1/5))

invalid arguments
[/code]

考え方としては、
・4つの数字の並べ方は、4! = 24通り
・4つの演算子から、3つを選ぶ並べ方は、4^3 = 64通り
・括弧のつけ方が、以下の5通り(□には、{+, -, *, /}のいずれかが入ります)
 ・((a□b)□c)□d
 ・(a□(b□c))□d
 ・(a□b)□(c□d)
 ・a□((b□c)□d)
 ・a□(b□(c□d))

したがって、全部で、24*64*5 = 7680通りを調べています。
(本当はもっと効率よくできます。例えば、「A+B」と「B+A」は同じなど)

全体のソースコードをアップロードしておきます。
有理数計算が必要だったので、思ったより長くなってしまった。
プログラム作成環境はVisual C++ 2008 Express Editionです。
http://www1.axfc.net/uploader/Sc/so/165976.zip&key=mixC
最後に編集したユーザー a5ua on 2010年10月23日(土) 20:50 [ 編集 1 回目 ]

アバター
あーる@Reputeless
記事: 84
登録日時: 14年前

Re: 切符パズル

投稿記事 by あーる@Reputeless » 14年前

すごい、すごい Σ(゚Д゚
コードが読みやすく、とても熟達されているように感じます。

アバター
a5ua
記事: 199
登録日時: 14年前

Re: 切符パズル

投稿記事 by a5ua » 14年前

>あーる さん
コメントどうもありがとうございます。

普段、自分の書いたコードを他人に見せる機会というのは、あまり多くないので、
mixCのようなプログラミング関連のコミュニティは、お互いに成長できる良い場だと思っています。