Package: mines-esolang
MinesAn esoteric language inspired by Minesweeper.日本語はこちら（README_ja.md）。OverviewMines is a programming language in which programs are executed by operations that mimic the gameplay of Minesweeper.Program descriptionA Mines program consists of a field and an operation list in this order with a line break.Fieldis represented by a rectangular grid consisting of.and*.
Where.is a safe cell, and*is a mine cell.Operation listconsists of one or more operations separated by\n.An operationis represented by two integers separated by,or;, or!, or a blank line.
Blank lines immediately after the field and at the end of the file are also counted as operations.Two integersindicate the column and row numbers from the top left of the field, and the delimiter indicates the mouse button to click.
Where,is a left click and;is a right click.Column and row numbersmay be negative or point outside the range of the field.
These are converted into non-negative remainders divided by the width or height of the field, respectively.!indicates the flagging mode switch (see below).Half-width whitespaces and characters in\t\r\f\vappearing in the program are ignored.
Also, strings from # to the end of the line are ignored.
This means that the program can containcomments.The following is an example of a program with a 4x3 field and 5 operations, and the meaning of each operation..*.* #This is a comment.
...*
.**.
0,0
-1, -1 #Spaces are ignored.

10;-10
!OperationMeaning0,0Left click on the top left cell.-1,-1Right click on the bottom right cell (equal to3,2).do nothing.9;-10Right-click on the (9 % 4)th cell from the left and the (-10 % 3)th cell from the top (equal to1;2).!Switch the flagging mode.Program processingThe Mines interpreter has aoperation pointer(OP), which by default points to the top of the operation list.
The interpreter performs an operation pointed by OP on the field and then advances the OP by one.
After the bottom operation is performed, the OP returns to the top operation and continues operations.For each operation,an commandis selected and executed according to the result and the state of the cell in which the operation was performed.Ifgame overis occurred by an operation, the program does not terminate and the field returns to its initial state (no revealed cells and no flags) and the game resumes (the OP is not initialized).The interpreter hasa stackof signed integers for storage, which is manipulated by the commands.
The initial state of the stack is empty, and it can have an infinite number of values as long as the processing system allows.In addition, the interpreter managesthe flagging mode, which is initially off.
It is toggled between on and off by an operation of the flagging mode switch.
Game over does not initialize the flag mode.After each command is executed, if "each safe cell" or "each mine cell" is opened one or more times throughout the entire gameplay, the programterminates(this behavior is different from game clear on a regular minesweeper).Performance of operationsLeft clickbehaves just like it does in most minesweeper apps.Left click on an unopened cell will open it.
If you open a mine, it's game over.Left click on a revealed cell has no effect on the field, but some command may be executed.Right clickalso behaves like it does in many minesweeper apps.Right click on an unopened cell will put up a flag or remove it.Right click on a revealed cell will open all adjacent unopened cells if the number on the cell is equal to the number of flags standing around it.
If trying to open some mines, it's game over.
This operation is called "Chord" and in some apps, Chord is bound to a long press or other mouse button.If a cell opened by either click is empty, the surrounding cells are also opened recursively (the flags standing in the cell being opened are removed and opened).Flagging mode switchis a feature that most mobile minesweeper apps have, and it behaves just as well.
When the flagging mode is on, the left-click and right-click are treated swapped.
For example, left click on an unopened cell will put up a flag or remove it, and the command corresponding to it will be executed.Nothing happens with an operation ofblank line(the OP proceeds as usual).CommandsThe cell number "0" represents a blank cell and the number "9" represents a mine cell."Push", "pop", etc. all refer to operations on the stack.The first popped value in a command is "p0" and the next popped value is "p1".Command errorsWhen a command cannot be executed correctly because there are not enough values for pops in the stack or 0 division is attempted or so on, this is calleda command error.
If a command error is likely to occur during the execution, it is treated as if there was no command and the OP proceeds to the next.
Note that game over is not a command error.The conditions for the occurrence of a command error except for insufficient number of pops are shown in the following tables.Flagging mode switchCommand namePop countDescriptionerror conditionreverse0Reverse order of the elements in the entire stack.-Left click on an unopened cellFlag is standing on the cellCommand namePop countCell numberDescriptionerror conditionnoop0Any (because not revealed)Do nothing-Flag is not standing on the cellCommand namePop countCell numberDescriptionerror conditionpush(count)00Push the number of cells opened by this click (≧1)-push(n)01〜8Push the number written in the cell-reset(l)09Reset the field to its initial state and resume the game (stack and OP are not reset, this cell is regarded as opened)-Right click on an unopened cellCommand namePop countCell numberDescriptionerror conditionswap2Any (because not revealed)Push p0, then push p1-Left click on an revealed cellCommand namePop countCell numberDescriptionerror conditionpop10Pop-positive11Push 1 if p0 is positive, else push 0-dup12Push p0 twice-add23Push (p1 + p0)-sub24Push (p1 - p0)-mul25Push (p1 * p0)-div26Push (p1 / p0)0 divisionmod27Push (p1 % p0)0 divisionperform(l)28Perform an operation of "p1,p0"-Right click on an revealed cellTry to open one or more new cells (Chord)Command namePop countResultDescriptionerror conditionpush(sum)0SuccessPush the sum of the numbers written in the cells opened by this click-reset(r)Length of stackGame overReset the field and the stack to their initial states and resume the game (OP is not reset, the cells are not regarded as opened)-OtherwiseCommand namePop countCell numberDescriptionerror conditionpush(0)00Push 0-not11Push 1 if p0 is 0, else push 0-roll22Roll the values up to stack depth p1 p0 times (see "Roll Details" for details)The absolute value of p1 exceeds the length of the stackin(n)03Take one integer-parsed value from the beginning of the standard input and push itCan not parsein(c)04Take a single character from the standard input and push its Unicode valueEmpty inputout(n)15Output p0 to the standard output-out(c)16Output a single character whose Unicode value is p0 to the standard outputInvalid Unicode valueskip17Add p0 to the OP (loop if overflow occurs)-perform(r)28Perform an operation of "p1;p0"-Roll detailsIf the stack is1, 2, 3, 4with p0 and p1 popped, a single rotation of a value up to a depth of 3 embeds the top value underneath and the stack becomes1, 4, 2, 3.If the number of rotations is negative, for example, if the number of rotations is -1, the opposite manipulatation will be performed and it becomes1, 3, 4, 2.If the depth is negative, e.g. one rotation, the stack is manipulated from the bottom and becomes2, 3, 1, 4.Examples of implementationSeeexamples/。Installpip3 install mines-esolangMake sure it displays the version.mines -VHow to run the interpreterUsually do like this.$ mines examples/hello.minesYou can also run it directly from the source file.$ python3 mines/mines.py examples/hello.minesActivate the debug mode withd.
This outputs a table of numbers in each cell, the time taken to parse the code, and the time taken to run it.$ mines examples/hello.mines -dWhen the debug mode is active, the command, the stack and the field are output byc,sandfrespectively after each operation.
Also, you can perform step executions at the number of operations specified byl.$ mines examples/hello.mines -dcsfl 42To get input from a file, specify the file path withi.$ mines examples/cat.mines -i README.mdTo specify a direct input, usee.$ mines examples/add.mines -e "1 2"You can useechoorcatif you want.$ echo -n "meow" | mines examples/cat.minesAuthorDNEKRelated worksPietron- Cross-platform IDE for Piet (Piet is an esoteric language). The specification of Mines is affected by Piet.UnambiSweeper- logically solvable Minesweeper app. It supports Android and iOS.LicenseThis project is licensed under the MIT License - see theLICENSEfile for details.Minesマインスイーパーから着想を得た難解プログラミング言語。English is here（README.md）。概要Minesはプログラムがマインスイーパーのゲームプレイを模した操作によって実行されるプログラミング言語である。プログラム記述仕様Minesのプログラムは1つの盤面と1つの操作リストがこの順に改行区切りで記述されたものである。盤面は.と*からなる長方形のグリッドで表される。.は安全なマス、*は地雷のあるマスを表す。操作リストは\nで区切られた1つ以上の操作からなる。1つの操作は,または;で区切られた2つの整数、あるいは!、あるいは空行で表される。
盤面の直後及びファイル末尾に書かれた空行も操作として数えられる。2つの整数は盤面の左上からの列及び行番号を表し、区切り文字はクリックするマウスボタンを指定する。,は左クリック、;は右クリックを指す。列及び行番号は負数でも盤面の範囲外を指していても良い。
これらはそれぞれ盤面の幅ないし高さで割った非負剰余に変換される。!は旗立てモードの切り替えを表す（後述）。プログラム中に現れる半角空白及び\t\r\f\vの各文字は無視される。
また、#から行末までの文字列は無視される。
つまりプログラムはコメントを含むことができる。以下に、幅4高さ3の盤面と5つの操作を持つプログラムの例とそれぞれの操作の意味を示す。.*.* #This is a comment.
...*
.**.
0,0
-1, -1 #Spaces are ignored.

10;-10
!操作意味0,0左上のマスを左クリック-1,-1右下のマスを左クリック（3,2と同等）何もしない9;-10左から(9 % 4)番目、上から(-10 % 3)番目のマスを右クリック（1;2と同等）!旗立てモードの切り替えプログラムの処理Minesのインタプリタは1つの操作ポインタ(OP)を持ち、初期状態では操作リストの一番上を指している。
インタプリタは盤面に対してOPの指す操作を行い、その後OPを1つ進める。
一番下の操作が行われると、OPは一番上の操作に戻り、操作を続行する。各操作が行われるごとに、その結果及びその操作が行われたマスの状態に応じて命令が選ばれ、実行される。ゲームオーバーとなる操作をした場合、プログラムは終了せず、盤面が初期状態（マスが空いておらず旗もない状態）に戻りゲームが再開される（OPは初期化されない）。インタプリタは記憶領域として符号付き整数のスタックを1つ持ち、これは命令によって操作される。
スタックの初期状態は空であり、処理系の許す限り無限に値を持ち得る。また、インタプリタは旗立てモードを管理しており、初期値はオフである。
旗立てモードの切り替えにより、オンまたはオフに切り替わる。
また、ゲームオーバーによって旗立てモードが初期化されることはない。各命令の実行後、もしも「それぞれの安全なマス」または「それぞれの地雷マス」が全ゲームプレイを通じて1回以上開かれたことがあれば、プログラムは終了する（この挙動は通常のマインスイーパーにおけるゲームクリアと異なる）。操作の振る舞い左クリックはほとんどのマインスイーパーアプリにおけるそれと同じように振る舞う。開かれていないマスに対する左クリックはそのマスを開ける。
もし地雷を開けばゲームオーバーとなる。開かれたマスに対する左クリックは盤面に影響を及ぼさないが、何らかの命令が実行され得る。右クリックも多くのマインスイーパーアプリにおけるそれと同じように振る舞う。開かれていないマスに対する右クリックは旗を立てるか取り除く。開かれたマスに対する右クリックは、もしマスに書かれた数字がその周囲に立っている旗の数と一致すれば、すべての開かれていない隣接するマスを開こうとする。
もし地雷を開こうとしていればゲームオーバーとなる。
この操作は「Chord」と呼ばれており、アプリによってはChordを長押しや他のマウスボタンに紐付けている場合がある。いずれのクリックにおいても開かれたマスが空白の場合、その周囲のマスも再帰的に開かれる（旗が立っていた場合旗が取り除かれ開けられる）。旗立てモードの切り替えはほとんどのモバイル向けマインスイーパーアプリに備わっている機能であり、それと同様に振る舞う。
旗立てモードがオンであるとき、左クリックと右クリックの扱いが入れ替わる。
例えば開かれていないマスに対する左クリックは旗を立てるか取り除き、それに応じた命令が実行される。空行の操作では何も起こらない（OPは通常通り進む）。命令マスの数字「0」は空白マス、「9」は地雷マスを表す。「プッシュ」「ポップ」などはすべてスタックに対する操作を指す。命令中で最初にポップした値を「p0」、次にポップした値を「p1」とする。コマンドエラーポップ回数分の値がスタックになかったり0除算をしようとするなどして命令を正しく実行できないことをコマンドエラーと呼ぶ。
命令の実行中にコマンドエラーが発生しそうな場合、命令はなかったことにされ、OPが次に進む。
なお、ゲームオーバーはコマンドエラーではない。ポップ回数が足りない場合以外のコマンドエラーの発生条件は以下の表に示す。旗立てモードの切り替え命令名ポップ回数内容エラー条件reverse0スタック全体の要素を逆順に並び替える-開いていないマスを左クリックマスに旗が立っている場合命令名ポップ回数マスの数字内容エラー条件noop0どれでも（判明しないので）何もしない-マスに旗が立っていない場合命令名ポップ回数マスの数字内容エラー条件push(count)00このクリックによって開かれたマスの個数（≧1）をプッシュ-push(n)01〜8マスに書かれた数字をプッシュ-reset(l)09盤面を初期状態に戻してゲームを再開（スタック及びOPはリセットされない、このマスは開かれたことになる）-開いていないマスを右クリック命令名ポップ回数マスの数字内容エラー条件swap2どれでも（判明しないので）p0をプッシュしてp1をプッシュ-開いているマスを左クリック命令名ポップ回数マスの数字内容エラー条件pop10ポップ-positive11p0が正であれば1、正でなければ0をプッシュ-dup12p0を2回プッシュ-add23(p1 + p0)をプッシュ-sub24(p1 - p0)をプッシュ-mul25(p1 * p0)をプッシュ-div26(p1 / p0)をプッシュ0除算mod27(p1 % p0)をプッシュ0除算perform(l)28操作「p1,p0」を行う-開いているマスを右クリック新たに1個以上のマスを開こうとした場合 (Chord)命令名ポップ回数結果内容エラー条件push(sum)0成功このクリックによって開かれたマスに書かれた数字の合計をプッシュ-reset(r)スタックの長さゲームオーバー盤面及びスタックを初期状態に戻してゲームを再開（OPはリセットされない、どのマスも開かれたことにはならない）-それ以外の場合命令名ポップ回数マスの数字内容エラー条件push(0)000をプッシュ-not11p0が0であれば1、0でなければ1をプッシュ-roll22スタックの深さp1までの値をp0回回転させる（詳しくは「rollの詳細」を参照）p1の絶対値がスタックの長さを超えるin(n)03標準入力の先頭から整数としてパースした値を1つ取りプッシュパースできないin(c)04標準入力から文字を1つ取りそのUnicode値をプッシュ入力が空out(n)15p0を標準出力に出力-out(c)16Unicode値がp0である文字を標準出力に出力p0が有効なUnicode値でないskip17OPにp0を加算する（オーバーフローした場合ループする）-perform(r)28操作「p1;p0」を行う-rollの詳細p0, p1をポップした状態でスタックが1, 2, 3, 4の場合、深さ3までの値を1回回転させると1, 4, 2, 3のようにトップの値が下に埋め込まれる。回転数が負の場合、例えば-1回転させると1, 3, 4, 2のように逆の操作が行われる。深さが負の場合、例えば1回転させると2, 3, 1, 4のようにスタックのボトムから操作される。実装例こちら (examples/) 。インストールpip3 install mines-esolangバージョンが表示されるか確認する。mines -Vインタプリタの実行方法通常はこのようにする。$ mines examples/hello.mines直接ソースファイルから実行することもできる。$ python3 mines/mines.py examples/hello.minesdでデバッグモードを有効にする。
各マスの数字表やコードのパース及び実行にかかった時間が出力される。$ mines examples/hello.mines -dデバッグモードが有効なとき、c,s,fでそれぞれ各操作実行後のコマンド、スタック、盤面を出力する。
また、lで指定した操作回数でステップ実行することができる。$ mines examples/hello.mines -dcsfl 42ファイルから入力を取る場合はiでファイルパスを指定する。$ mines examples/cat.mines -i README.md直接入力を指定する場合はeを使う。$ mines examples/add.mines -e "1 2"適宜echoやcatを利用しても良い。$ echo -n "meow" | mines examples/cat.mines作者DNEK関連する制作物Pietron- 難解プログラミング言語PietのIDE。Minesの仕様はPietの影響を受けています。UnambiSweeper- 最後まで論理的に解けるマインスイーパーアプリ。AndroidとiOSに対応しています。ライセンスこのプロジェクトにはMITライセンスが供与されています。
詳細はLICENSEファイルを参照してください。Change Log1.0.4Add workflow to upload package to PyPI.1.0.3Add English README and this CHANGELOG.Fix version processing to enable run programs directly from the source file.1.0.2Use Wheel as the package system to fixconsole_scriptregistration problem.1.0.0Initial release
MIT LicenseCopyright (c) 2020 DNEKPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.