Cryptarithm
指定した形の虫食い算の問題を生成するPythonモジュールです.作問や問題の検証に使ってください.
インストールと実行
-
Python3のインストール
-
公式サイトから最新バージョンをダウンロード・インストールしてください.python3.6以降ならたぶん動くとは思います.
-
コマンドプロンプトで,
~ % python -V ~ % pip -V
を実行し,python, pipがインストールされていることを確認してください.
-
-
cryptarithmのインストール
PyPIに登録するか迷いましたが,今のところはしてないので,次のコマンドでインストールしてください.
~ % pip install git+https://github.com/dragoemon1/cryptarithm
-
実行
とりあえず動かしたいという場合は,
create_division.py(割り算)create_multiplication.py(掛け算)
にサンプルプログラムがあるので,これをダウンロード・編集して実行してください.
~ % python create_division.py ~ % python create_multiplication.py
使い方
-
文字列
まず,生成したい問題の形の文字列を用意してください.例を見れば大体わかると思います.
#割り算の場合 STRING = ''' #### --------- 1##)####### #### ------------ #### ##3# ------------ #### #### ------------ #### #### ------------ 0 '''
#掛け算の場合 STRING = ''' ### #4# ------- #### SAKU MONN ------- #2#### '''
注意点
- 線を表す
-およびスペースは可読性のためのものなのであってもなくても動きます.改行と割り算の)(|でもよい)は数字の区切りを表すため必要です. *と#は空欄を表し,0~9の数字が入ることを表します (但し最高位は0でない).これらには同じ数字が入っても構いません.#と*には若干の違いがあります.問題生成の段階で,#は答えが一意に定まるように適当な数字に置き換わることがありますが,*は数字に置き換わることなく空欄のままとなります.*,#,-,スペースおよび0~9の数字以外の文字(アルファベトなど)はすべて空欄として処理されます.これらについては,同じ文字には同じ数字が,異なる文字には異なる数字が入るようになります.また,問題生成の段階でこれらは数字に置き換わることはありません.- 割り算の筆算について,商のどこかの位に
0を含むものには対応していません.
- 線を表す
-
問題の生成 関数
make_problem()に1で定義した文字列を渡すと,問題を次々に生成するプロンプトが起動します.#割り算の場合 from cryptarithm import make_problem make_problem(STRING, type="d")
#掛け算の場合 from cryptarithm import make_problem make_problem(STRING, type="m")
-
出力
make_problem()の出力の読み方です.- はじめに,元の
STRINGの答えとなりうるものが一覧として表示されます. - 次に,答えが一意に定まるような問題とその答えが1つ作成されます.
PROBLEMが問題,ANSWERが答え,FIXEDが問題生成の際に新たに埋めた#の個数を表します. - エンターキーを押すと次の問題が出力されます.
出力結果の例
ANSWER No.1 438 743 ------ 1314 1752 3066 ------ 325434 (中略) ANSWER No.7 438 749 ------ 3942 1752 3066 ------ 328062 There are 7 answers in the given case PROBLEM *** *4* ------ **** SAKU MONN ------ *2**1* ANSWER 438 745 ------ 2190 1752 3066 ------ 326310 U:2, K:5, A:7, S:1, N:6, O:0, M:3 FIXED:1 Press enter to create another case: - はじめに,元の
-
高度な設定
cryptarithm.make_problem()にはstring, typeの他に2つのパラメータがあります.-
key問題を生成するアルゴリズムに若干の違いがあり,生成される問題の特徴に違いが現れます.デフォルトは
key="disorder"です.key="disorder": なるべくランダムに問題が出力されます.空欄の数は不安定になります.とりあえずこれにしておいて,空欄が多い(FIXEDの値が小さい)ものを選ぶのが良いと思います.key="short": 空欄が多い問題が優先的に出力されます.その分問題の多様性が少なくなります.key="random": なるべくランダムで,どの追加情報を消しても答えが一意に定まらないよう空欄の数を極大化したものが出力されます.ただし,"short","disorder"に比べて生成に時間がかかります.
-
M最初に問題の答えとなりうるものを全列挙しますが,その個数の上限を表します.デフォルトは
M=100000に設定されています.なお,選択肢の個数がMを超えてしまって全列挙できなくても問題は出力されますが,その場合問題の生成に時間がかかります.
-
開発者向けのお話
問題を生成する関数make_problem()以外にも,いくつかのクラスや関数が定義されています.詳しいことは書いてないのでソースコードを見てください.
-
class Multiplication, class Division掛け算,割り算オブジェクトを表します.クラスメソッド
Multiplication.string2multiplication(), Division.string2division()を用いて文字列から変換できます.from cryptarithm import Multiplication STRING = ''' ### #4# ------- #### SAKU MONN ------- #2#### ''' mul = Multiplication.string2multiplication(STRING) print(mul.str()) #出力
copy()メソッドで複製,str()メソッドで文字列に変換できます. -
def solve_multiplication(), def solve_division()Multiplication, Divisionオブジェクトを渡すと,それらの答えを表すMultiplication, Divisionオブジェクトを列挙するイテレータを返します.渡したオブジェクトが書き換えられることがあるので,.copy()で複製したものを渡すことを推奨します.from cryptarithm import solve_multiplication for answer in solve_multiplication(mul.copy()): print(answer.str())
中身は動的計画法で数字を埋めていって,最後まで上手く行ったものを出力しているだけです.大したことはしていません.
-
class Box空欄を表すオブジェクトです.詳しい機能は気が向いたら書きます.
-
class Column数字を,
Boxオブジェクトと0~9のintからなるリストを使って表すオブジェクトです.詳しい機能は気が向いたら書きます.
Release files for cryptarithm 0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cryptarithm-0.1.tar.gz | 12.9 kB | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cryptarithm-0.1-py3.11.egg | Legacy Egg format | - | - | Details |
| cryptarithm-0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.4 kB
Release files / cryptarithm-0.1.tar.gz
| Download URL | cryptarithm-0.1.tar.gz |
|---|---|
| Size | 12.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
39383b39d09981d4e7ead3b147b2699443c7eb382a295c78993e9c7d1c9ddbbf
|
|
BLAKE2b-256 checksum How to use checksums |
727d9f846488091f4f8e731405280992ef15cecabe70211d5fb0a6b0e7da64f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.3
|
Release files / cryptarithm-0.1-py3.11.egg
| Download URL | cryptarithm-0.1-py3.11.egg |
|---|---|
| Size | 26.5 kB |
| Tags | Egg |
|
SHA-256 checksum How to use checksums |
d882604234b2716d4a2e94b642251e9ac1ae4352f4cc77fbf600e3238deaa8cd
|
|
BLAKE2b-256 checksum How to use checksums |
b4ec2c67ab94b5adc83eb3f07658b0795b6595ec375543eb8674877f5be537c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.3
|
Release files / cryptarithm-0.1-py3-none-any.whl
| Download URL | cryptarithm-0.1-py3-none-any.whl |
|---|---|
| Size | 10.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
950d08628a845df8e315a1666cd8f340dabdfb58612e140920330ed6e82b834d
|
|
BLAKE2b-256 checksum How to use checksums |
f85adebaafbe793d56cd3d270eb46c1837719d233169195f962142d5b06992a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.3
|