Python

【コピペOKです】テンパズルをプログラムを使って解決する方法【Python】

【コピペOKです】テンパズルをプログラムを使って解決する方法【Python】
スポンサーリンク

こんにちは、さすを(@sasuwo0409)です。

先日、電車の中でこのような広告を見つけました。

図1:テンパズルを使ったエンジニア募集広告
図1:テンパズルを使ったエンジニア募集広告

四則演算のみを用いて下記の4つの数字で10を作ることはできますか。

1,3,3,7

また、任意の0~9の4つの数字で、上記同様の10を作る問いが与えられたとき、その解放を出力するプログラムを作ることはできますか。

エンジニアデザイナー募集

URBAN HACKS TOKYU CORPORATION

今回の記事では、この4つの数字を四則演算のみで10にする「テンパズル」をプログラム言語のPythonを使って解決していきたいと思います。

サンプルコードも載せているので、実際に試してみることも可能です。

それでは本文をどうぞ。

困っている人
困っている人

テンパズルを解決できるプログラムを作ってみたいな。

サンプルコードも欲しいし、分かりやすく解説もしてほしい。。

さすを
さすを

この悩みを解決します!

この記事を読むとわかること:

  • テンパズルを網羅できるプログラム
  • テンパズルの難問
  • テンパズルができない4つの数字一覧

筆者の情報:

  • 現役システムエンジニア 兼 ブロガー
  • 過去に6,000万のPython案件を受注
  • 最近ハマっていることは機械学習

※0円のサンプルテキストという近道

独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストと解説動画をもらえるので、これを使ってお得にPythonの基礎を学ぶのもオススメです。

スポンサーリンク

【コピペOKです】テンパズルをプログラムを使って解決する方法【Python】

【コピペOKです】テンパズルをプログラムを使って解決する方法【Python】

今回はGoogle Colaboratory上でプログラムを動かしていきます。

Google Colaboratoryの使い方については「【3分で解決!】Google Colaboratoryの使い方【無料ですぐにPythonを使えます】」で解説しているので、参考にしてみてください。

テンパズルを解決するプログラム

Pythonを使ったテンパズルを解決するプログラムはこちらです。

import itertools
import sys

def is_make10(num):

    #入力した4つの数字の順番の組み合わせ
    nums = [x for x in itertools.permutations(num)]

    #符号の組み合わせ
    opers = set([y for z in itertools.combinations_with_replacement("+-*/",3)
      for y in itertools.permutations(z,3)])

    #計算式パターンのモデル
    models = ["({a}{x}{b}){y}({c}{z}{d})",
             "(({a}{x}{b}){y}{c}){z}{d}",
             "{a}{x}({b}{y}({c}{z}{d}))",
             "({a}{x}({b}{y}{c})){z}{d}",
             "{a}{x}(({b}{y}{c}){z}{d})"]

    #テンパズルを作れるか調査
    for num in nums:
      for oper in opers:
        for model in models:
          try:
            tmp = model.format(a = num[0], b = num[1],
                                 c = num[2],d = num[3],
                                 x = oper[0],y = oper[1],
                                 z = oper[2])
            if eval(tmp) == 10:
              list_box.append(tmp)

           #0で割った時のエラー回避
          except ZeroDivisionError:
            continue
            

#テンパズルを作れた計算式を格納する配列
list_box = []

try:
  print('4つの整数(0以上)を入力してください!')
  print('1つ目の整数(0以上)')
  num_1 = int(input())
  if num_1 < 0 or num_1 > 9:
    print("0から9の整数を入力してください。")
    sys.exit()
  print('2つ目の整数(0以上)')
  num_2 = int(input())
  if num_2 < 0 or num_2 > 9:
    print("0から9の整数を入力してください。")
    sys.exit()
  print('3つ目の整数(0以上)')
  num_3 = int(input())
  if num_3 < 0 or num_3 > 9:
    print("0から9の整数を入力してください。")
    sys.exit()
  print('4つ目の整数(0以上)')
  num_4 = int(input())
  if num_4 < 0 or num_4 > 9:
    print("0から9の整数を入力してください。")
    sys.exit()

except ValueError:
    print("エラー:数字以外や小数を入力しないでください。")
    sys.exit()

num = str(num_1) + str(num_2) + str(num_3) + str(num_4)

print("あなたが選んだ4つの数字は["+ str(num_1)+ "," + str(num_2)+ "," + str(num_3)+ "," + str(num_4) + "]です。")

is_make10(num)

if len(list_box) == 0:
  print("あなたが選んだ4つの数字では10を作ることはできません。")

else:
  print("テンパズルの候補を表示します。")
  print(set(list_box))

print("処理が完了しました。")
さすを
さすを

実行結果はこちらです!

#実行結果
4つの整数(0以上)を入力してください!
1つ目の整数(0以上)
0
2つ目の整数(0以上)
9
3つ目の整数(0以上)
1
4つ目の整数(0以上)
8
-------------------------------------実行結果-------------------------------------
あなたが選んだ4つの数字は[0,9,1,8]です。
テンパズルの候補を表示します。
{'(1-(8*0))+9', '(9+1)-(0/8)', '(1+9)-(0*8)', '(9+(8*0))+1', '9+(1+(0*8))', '(9+1)+(8*0)', '(1+(0/8))+9', '1+((0/8)+9)', '9+((0*8)+1)', '1-((8*0)-9)', '(1-(0*8))+9', '((0/8)+9)+1', '(0*8)+(1+9)', '((8*0)+9)+1', '9+(1-(0*8))', '(9+1)+(0*8)', '(9+(0*8))+1', '9-((0*8)-1)', '(0/8)+(1+9)', '(1+9)+(8*0)', '((8*0)+1)+9', '9-((8*0)-1)', '9-((0/8)-1)', '(9+1)+(0/8)', '(9+1)-(8*0)', '9+(1-(8*0))', '(0*8)+(9+1)', '(9-(0*8))+1', '(1+(8*0))+9', '1+(9+(0*8))', '1-((0*8)-9)', '(1+(0*8))+9', '(8*0)+(1+9)', '9+((8*0)+1)', '1+(9-(8*0))', '(1+9)+(0*8)', '1+((8*0)+9)', '9+(1+(0/8))', '1+((0*8)+9)', '(1-(0/8))+9', '(1+9)+(0/8)', '1-((0/8)-9)', '9+((0/8)+1)', '9+(1-(0/8))', '(9-(8*0))+1', '1+(9-(0/8))', '(8*0)+(9+1)', '((0*8)+9)+1', '(9-(0/8))+1', '9+(1+(8*0))', '(0/8)+(9+1)', '1+(9+(0/8))', '(1+9)-(0/8)', '(1+9)-(8*0)', '((0/8)+1)+9', '1+(9-(0*8))', '(9+(0/8))+1', '((0*8)+1)+9', '1+(9+(8*0))', '(9+1)-(0*8)'}
処理が完了しました。

車のナンバープレートでよくやってたテンパズル(4つの数字を四則演算を使って10にするやつ)を解決するプログラムを作ってみた😎

(1,1,5,8で10を作れたら、あなたのひらめき力はかなりすごい…🤫)

#Python #テンパズル

さすを
さすを

どんな問題を出されても、これですぐに解くことができます!

テンパズルをする上で難問と言われる4つの数字

テンパズルの難問を5つ紹介します。

どれも一筋縄ではいかないものなので、ぜひチャレンジしてみてください。

  • 1158
  • 1199
  • 1337
  • 3478
  • 9999
さすを
さすを

ぜひ友達に出してみてください!

イッヌ
イッヌ

答えは別記事の一番下に貼ってあるから知りたい人はチェックだワン!

>>テンパズルをする上で難問と言われる4つの数字の答え

テンパズルが不可能な4つの数字一覧

テンパズルをすることができない4つの数字を載せておきます。

ちょっとしたいじわるとして、友達や家族に出すのも良いかもしれませんね。

#テンパズルで10を作ることができない数字一覧

['0000', '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009',
 '0011', '0012', '0013', '0014', '0015', '0016', '0017', '0018', '0022', '0023',
 '0024', '0026', '0027', '0029', '0033', '0034', '0035', '0036', '0038', '0039',
 '0044', '0045', '0047', '0048', '0049', '0056', '0057', '0058', '0059', '0066',
 '0067', '0068', '0069', '0077', '0078', '0079', '0088', '0089', '0099', '0111',
 '0112', '0113', '0114', '0116', '0117', '0122', '0123', '0134', '0144', '0148',
 '0157', '0158', '0166', '0167', '0168', '0177', '0178', '0188', '0222', '0233',
 '0236', '0269', '0277', '0279', '0299', '0333', '0335', '0336', '0338', '0344',
 '0345', '0348', '0359', '0366', '0369', '0388', '0389', '0399', '0444', '0445',
 '0447', '0448', '0457', '0478', '0479', '0489', '0499', '0566', '0567', '0577',
 '0588', '0589', '0599', '0666', '0667', '0668', '0677', '0678', '0689', '0699',
 '0777', '0778', '0788', '0799', '0888', '1111', '1112', '1113', '1122', '1159',
 '1169', '1177', '1178', '1179', '1188', '1399', '1444', '1499', '1666', '1667',
 '1677', '1699', '1777', '2257', '3444', '3669', '3779', '3999', '4444', '4459',
 '4477', '4558', '4899', '4999', '5668', '5788', '5799', '5899', '6666', '6667',
 '6677', '6777', '6778', '6888', '6899', '6999', '7777', '7788', '7789', '7799',
 '7888', '7999', '8899']

これらの値を出すために使用したプログラムはこちらです。実際の目で確かめたい人は、ぜひ利用してみてください。

import itertools

def is_make10(target):
    nums = [x for x in itertools.permutations(target)]
    opers = set([y for z in itertools.combinations_with_replacement("+-*/",3)
         for y in itertools.permutations(z,3)])
    models = ["({a}{x}{b}){y}({c}{z}{d})",
             "(({a}{x}{b}){y}{c}){z}{d}",
             "{a}{x}({b}{y}({c}{z}{d}))",
             "({a}{x}({b}{y}{c})){z}{d}",
             "{a}{x}(({b}{y}{c}){z}{d})"]

    for num in nums:
        for oper in opers:
            for model in models:
                try:
                    tmp = model.format(a = num[0], b = num[1],
                                       c = num[2],d = num[3],
                                       x = oper[0],y = oper[1],
                                       z = oper[2])
                    if eval(tmp) == 10:
                        return True
                except ZeroDivisionError:
                    continue
    else:
        return False

ans = ["".join(z)
       for z in itertools.combinations_with_replacement("0123456789",4)
       if is_make10(z) == False]
print(ans)

参考:テンパズルに決着を

エンジニアの需要は高まり続けている

エンジニアの需要は高まり続けている

働き方の自由度と給与が高くて人気なエンジニアですが、需要はまだまだ高まりつつあります。

そして、エンジニアになるためのハードルは決して高くなく、正しい学習と、ある程度の知識があれば、誰でもなることができます。

以下におすすめできるエンジニア転職・就職サイト、学習サイトを載せておきます。間違いなくエンジニアへの近道になるので、少しでもエンジニアに興味があれば、チェックしていただけたらと思います。

転職・就職サイト、学習サイトに一度登録してしまえば、あとはメールを確認しつつ、興味ある案件に応募するだけです。どのサイトも登録は5分程度で終わりますので、是非この機会に行動してみましょう。

最後に:正解を出せる仕組みを作るのもまたおもしろい

最後に:正解を出せる仕組みを作るのもまたおもしろい

Pythonを使って、テンパズルを解決するプログラムを作ってきました。

自分の頭で考えて正解を導くことも大切ですが、「正解を導く仕組み」を作ることも、違った楽しさがあるのでおすすめです。

すこし堅苦しいことを言ってしまいましたが、要は「楽して正解するのもいいよね」ということです。

というわけで、これからも機械に働いてもらえるようコツコツとプログラムを書いていこうと思います。

この記事が少しでもあなたの役に立っていたらうれしいです!

それでは!


コメント

タイトルとURLをコピーしました