Processingで数独の解に光明を
数独
縦・横の各列と太線の正方形内に同じ数字が入らないように1~9までの数字を各セルに入れていくパズルゲーム
本当はナンプレと呼ぶほうがいいらしい.
デジタルでやりたい
数独を解くにあたり,基本は紙で解くことが多いと思うが,そうすると紙がもったいない&間違えたときの処理がいろいろと面倒くさい.あと終ったときにちゃんとあってるかどうかを確認するのに99+99+9*9のセル確認が必要なので面倒くさい.
ということでパソコン上でできたら紙も無駄にならないし,便利だなと考えた.
欲しい機能
- 解くときには,確定したセルと同じグループに属するセルから数字を消していくので1~9であとどの数字が残っているかを表示したい
- 紙でやると1~9を小さく書いて,丸をつけるとかだったので分かりにくい.よって,確定した数字は大きく表示したい.
- 終了した時にあっているかどうかをシステム側で判断してほしい.
もっと自動化したい
上記の機能を実装したところ,確定したセルと同じグループのセルを判断して一個一個ポチポチ消していくのも面倒になってきた.ならば確定したセルと同じグループのセルからその数字を消して欲しい.というかそれなら消したときにセルが確定したならそのセルについても同様にやって欲しい.
っていうか全部自動化すればよくないか?
完成品
というわけで,問題を入力すると,それの解を求めてくれるプログラムをProcessingで作った.
問題を数字キーで入力してENTERを押すと解を求めてくれる. 一応元来の目的の援助ツールとしても有用な作りにはなっていると思う.
仕組みとか
public class abstract Solve implements Runnable
- 解いているときに主Theadが止まってしまうと困るので
Runnable
に. - 解く手法は幾つかあるのでSolveをextendsしてつかえるようにabstract methodを作成
- これの子クラスとして消去や二国同盟だとかそれぞれを実装すれば完全分離できてかっこいい
111111111 -> 000000001
データ構造
各セルには9bitの変数を持たせる.1bitごとに1~9の整数が残っているかどうかを表わす. 初めは111111111からスタートして段々消していき,000000001などといった,1bitのみが立っている状態になったとき,確定セルといえる.
ex
111111111 = 全て 111111011 = 3ではない 000000011 = 1か2 000000010 = 1で確定
数字の削除
同じグループに属するセルからその数字を消すとき,bitを使うといい感じに書ける. 確定セルのbitの反転と&算をとると,綺麗にその数だけが消える. 既に消えていた場合には悪影響が全くない.
ex
111011011 = 3と6でない 100000000 = 9を消したい 011111111 = 9のbit反転 1,3式で&算 011011011 = 3,5,9でない 000000001 = 1で確定 011111111 = 9の反転 000000001 = &算をとっても影響しない
エラーがないか
同じグループに属するセルを全て足しあわせたものと,全てから算をとったものが,111111111になるとき,正しいと言える.
ex
000000001 000000010 000000100 ... 100000000 これらはorでも+でも111111111になる 000000001 000000001 000000100 ... 100000000 あやまって2が1になってしまった場合は111111111にならない
まとめ
数独を解くときの支援ツールを作ろうとしていたら,bit演算で数独の解を求めるプログラムになっていた. でも思ったよりも劇的な効果は得られなかったというのが正直な感想.
最近個人的なブームがsat
やsugar
あたりなのでJ4Satとかで書いたりしてみたい.
余談ですが,
Sudokuという名前のディレクトリにしているのでcd(省略可能) Sudoku
するときにsudo<TAB><ENTER>
(kが遠い)とやろうとするため,sudoが意図せず発動してました.
GitHubとかからJava ProjectをEclipseにimportするときのまとめ
前置き
EclipseのJava Projectで.project
だとか.classpath
だとかをignoreしてて,いざEclipseでcloneしたのを使おうとしたときに毎回調べてる気がするので忘れないようにメモ.
Eclipse: Mars.1 Release (4.5.1)
手順
0. File -> import
1. Git -> Projects from Git
2. Clone URI
3. (URIを入力)
4. (Branchを選択)
5_1. (Cloneするディレクトリを指定)
5_2. (ここでDirectoryをコピー)
6. Import using the New Project wizard
7. Java -> Java Project
8_1. (Project nameを適当に付ける)
8_2. (Use default locationのチェックを外す)
8_3. (Locationに先程コピーしたDirectoryを貼りつけ)
9. Finish
その他
Localに既にcloneしてあるのを使うときは手順2
でExisting local repositoryを選択するとrepository選択画面ののち手順6
に行く.
c++でto_stringが使えないときの対処法について
前置き
OSXで書いていたときは問題なく動いていたソースコードをWindowsのCygwinで動かそうとしたら,
'to_strin' was not declared in this scope
とかいうエラーでコンパイルに失敗した.
std::to_string()だし,ないってことはないんじゃない?と思ったけど,現に使えなかった.
というわけで,to_string()が使えなかったときの対処法について調べた.
対処
http://stackoverflow.com/questions/12975341/to-string-is-not-a-member-of-std-says-so-ghttp://stackoverflow.com/questions/12975341/to-string-is-not-a-member-of-std-says-so-g#answer-20861692
この回答をちょっと変更して使った.
template < typename T > std::string to_string( const T& n ) { std::ostringstream stm ; stm << n ; return stm.str() ; } }
これを適当なところに記入しておくだけであら不思議.プログラムの方を変えずにto_string()が使えるようになりました.
to_stringが複数定義されているとかにならないのかと思ったが,std::to_stringの引数はintとかfloatみたいに一個一個丁寧に書いてあるため,上手いことオーバーロードになっていて通るらしい.
大鳳着任
大型建造
艦これでは大量の資材を消費する大型建造というシステムが存在する。
大型建造では、最低値ですら通常の建造の約100倍という資材を消費するが、通常建造では出にくい艦を容易に狙ったり(母数的な意味で)、ここでしか手に入らない艦を出すことができる。
大鳳
話によると,中破でも攻撃可能空母な装甲空母である大鳳は火力も高く「めっちゃ強い」らしい。加えて,未改装の大鳳は搭載数が18 18 18 7というボーキ節約業界においては最強の立ち位置らしい.
ch.nicovideo.jp
上記の記事を読んだときくらいからちょくちょく大型建造を行っていたのだが、出るのはいずれもいずもマンばかり(環境を一新したらログが消えさってしまった)であまり収穫はなかった。
デイリーで回した.
引き続きソフィーのアトリエにかかりきりになっていたおかげで艦これのデイリー任務さえ十分にやらない日々が続いていた。
とりあえず、出撃任務はおいておくとして母港でできることはやってしまおうと思い、ボーキが自然回復量から溢れているのが目に入った。また先日,Bismarckが出ていたのでなんか波が来ている気がした.ゆえに今日のデイリーにおいて回した.
— つらね (@turane_gaku) 2015, 12月 16
6:40?なんか見覚えないなと思ってあけてみれば,なんと大鳳を迎え入れることができた。
— つらね (@turane_gaku) 2015, 12月 16
先日Bismarckを迎え入れたとき穏やかな気分だったが,今は嬉しい気分だ.もうなにも怖くない.
もうなにも怖くない
ので未改装用の大鳳もいれば楽になるのになと考え,残りの今日のデイリー分2回も回した.
なんの成果も得られなかった.欲をかいたばかりにただいたずらに糧を減らし,5ケタ管理外にでてしまった.
Bismarck着任
大型建造
艦これでは大量の資材を消費する大型建造というシステムが存在する。
大型建造では、最低値ですら通常の建造の約100倍という資材を消費するが、通常建造では出にくい艦を容易に狙ったり(母数的な意味で)、ここでしか手に入らない艦を出すことができる。
Bismarck
話によると,雷撃戦に参加できる高速戦艦という立ち位置らしくBismarckは「めっちゃ強い」らしい。
かなり前からちょくちょく大型建造を行っていたのだが、出るのは航空戦艦ばかり(環境を一新したらログが消えさってしまった)であまり収穫はなかった。
デイリーで回してた.
最近ソフィーのアトリエにかかりきりになっていたおかげで艦これのデイリー任務さえ十分にやらない日々が続いていた。
とりあえず、出撃任務はおいておくとして母港でできることはやってしまおうと思い、全ての資材が自然回復量から溢れているのが目に入った。
また,先のイベントでPrinzを出して以来,彼女はいない誰かにむかって話しかける症候群を発祥していた.可哀想な娘だ…
ゆえに昨日今日のデイリーにおいて回した.
ビスマルクを引いた. pic.twitter.com/FkUbCiqSh8
— つらね (@turane_gaku) 2015, 12月 15
5時間?どうぜBIG7だろとか思っていたら,なんとBismarckを迎え入れることができた。
以前401を迎え入れたときもとても気分が高揚したものだが、今回はそれとは違い穏やかな気分だ。夕寝落ちからの寝起きだからだろうか。
思ったこと
turanegaku.hateblo.jp
この記事は完全に上記の記事と同じノリで書いたのだが,大和を出したときも艦これ以外の他のゲームにうつつをぬかしていた.
これは果たして偶然か,それとも必然か.なかなか考えさせられるものがある.
p5pchat 〜p5.js でpaint chat〜
この記事はProcessing Advent Calendar 2015の15日目の記事です。
前置き
昔,幾つかお絵かきソフトを作った.
turanegaku.hateblo.jp
turanegaku.hateblo.jp
せっかくだから通信したいと考えたのだが,
processing.netのServerとClientを使うとなるとちょっと面倒くさい.
どうせならsocket.ioを使って楽々やりたいと考えた.
ということでp5.js, node.js, socket.ioを使って,お絵かきチャットソフトを作った.
ソフィーのアトリエのためのツールを作った.
前置き
ソフィーのアトリエを買いました.
social.gust.co.jp
そこで,プレイしてて思ったのが,錬成で現在の手持ちでは直接の経路がない欲しい特性のついた物質を作ろうとしたときに,楽をしたいなと.