つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

Processingで数独の解に光明を

数独

縦・横の各列と太線の正方形内に同じ数字が入らないように1~9までの数字を各セルに入れていくパズルゲーム

本当はナンプレと呼ぶほうがいいらしい.

デジタルでやりたい

数独を解くにあたり,基本は紙で解くことが多いと思うが,そうすると紙がもったいない&間違えたときの処理がいろいろと面倒くさい.あと終ったときにちゃんとあってるかどうかを確認するのに99+99+9*9のセル確認が必要なので面倒くさい.

ということでパソコン上でできたら紙も無駄にならないし,便利だなと考えた.

欲しい機能

  • 解くときには,確定したセルと同じグループに属するセルから数字を消していくので1~9であとどの数字が残っているかを表示したい
  • 紙でやると1~9を小さく書いて,丸をつけるとかだったので分かりにくい.よって,確定した数字は大きく表示したい.
  • 終了した時にあっているかどうかをシステム側で判断してほしい.

もっと自動化したい

上記の機能を実装したところ,確定したセルと同じグループのセルを判断して一個一個ポチポチ消していくのも面倒になってきた.ならば確定したセルと同じグループのセルからその数字を消して欲しい.というかそれなら消したときにセルが確定したならそのセルについても同様にやって欲しい.

っていうか全部自動化すればよくないか?

完成品

というわけで,問題を入力すると,それの解を求めてくれるプログラムをProcessingで作った.

pv github.com

問題を数字キーで入力して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演算で数独の解を求めるプログラムになっていた. でも思ったよりも劇的な効果は得られなかったというのが正直な感想.

最近個人的なブームがsatsugarあたりなのでJ4Satとかで書いたりしてみたい.

余談ですが,

Sudokuという名前のディレクトリにしているのでcd(省略可能) Sudokuするときにsudo<TAB><ENTER>(kが遠い)とやろうとするため,sudoが意図せず発動してました.

GitHubとかからJava ProjectをEclipseにimportするときのまとめ

前置き

EclipseJava Projectで.projectだとか.classpathだとかをignoreしてて,いざEclipseでcloneしたのを使おうとしたときに毎回調べてる気がするので忘れないようにメモ.

Eclipse: Mars.1 Release (4.5.1)

手順

0. File -> import

1. Git -> Projects from Git

f:id:turane_gaku:20160105202103p:plain

2. Clone URI

f:id:turane_gaku:20160105202130p:plain

3. (URIを入力)

f:id:turane_gaku:20160105202134p:plain

4. (Branchを選択)

f:id:turane_gaku:20160105202138p:plain

5_1. (Cloneするディレクトリを指定)

5_2. (ここでDirectoryをコピー)

f:id:turane_gaku:20160105202141p:plain

6. Import using the New Project wizard

f:id:turane_gaku:20160105202144p:plain

7. Java -> Java Project

f:id:turane_gaku:20160105202147p:plain

8_1. (Project nameを適当に付ける)

8_2. (Use default locationのチェックを外す)

8_3. (Locationに先程コピーしたDirectoryを貼りつけ)

f:id:turane_gaku:20160105202155p:plain

9. Finish

f:id:turane_gaku:20160105202154p:plain

その他

Localに既にcloneしてあるのを使うときは手順2Existing local repositoryを選択するとrepository選択画面ののち手順6に行く.

c++でto_stringが使えないときの対処法について

前置き

OSXで書いていたときは問題なく動いていたソースコードWindowsCygwinで動かそうとしたら,
'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が出ていたのでなんか波が来ている気がした.ゆえに今日のデイリーにおいて回した.


6:40?なんか見覚えないなと思ってあけてみれば,なんと大鳳を迎え入れることができた。
先日Bismarckを迎え入れたとき穏やかな気分だったが,今は嬉しい気分だ.もうなにも怖くない.

今後の抱負とか資材変移とか

大鳳は「めっちゃつよい」らしいので冬イベントに向けても育成を重ねていきたいと思う。
ただ、艦これへのモチベが低下しているのが問題だ.

f:id:turane_gaku:20151217003214p:plain

もうなにも怖くない

ので未改装用の大鳳もいれば楽になるのになと考え,残りの今日のデイリー分2回も回した.
f:id:turane_gaku:20151217003454p:plain
なんの成果も得られなかった.欲をかいたばかりにただいたずらに糧を減らし,5ケタ管理外にでてしまった.

Bismarck着任

大型建造

艦これでは大量の資材を消費する大型建造というシステムが存在する。
大型建造では、最低値ですら通常の建造の約100倍という資材を消費するが、通常建造では出にくい艦を容易に狙ったり(母数的な意味で)、ここでしか手に入らない艦を出すことができる。

Bismarck

話によると,雷撃戦に参加できる高速戦艦という立ち位置らしくBismarckは「めっちゃ強い」らしい。
かなり前からちょくちょく大型建造を行っていたのだが、出るのは航空戦艦ばかり(環境を一新したらログが消えさってしまった)であまり収穫はなかった。

デイリーで回してた.

最近ソフィーのアトリエにかかりきりになっていたおかげで艦これのデイリー任務さえ十分にやらない日々が続いていた。
とりあえず、出撃任務はおいておくとして母港でできることはやってしまおうと思い、全ての資材が自然回復量から溢れているのが目に入った。
また,先のイベントでPrinzを出して以来,彼女はいない誰かにむかって話しかける症候群を発祥していた.可哀想な娘だ…
ゆえに昨日今日のデイリーにおいて回した.


5時間?どうぜBIG7だろとか思っていたら,なんとBismarckを迎え入れることができた。
以前401を迎え入れたときもとても気分が高揚したものだが、今回はそれとは違い穏やかな気分だ。夕寝落ちからの寝起きだからだろうか。

今後の抱負とか資材変移とか

Bismarckは「めっちゃつよい」らしいので冬イベントに向けても育成を重ねていきたいと思う。
ただ、艦これへのモチベが低下しているのが問題だ.

f:id:turane_gaku:20151215213120p:plain

思ったこと

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を使って,お絵かきチャットソフトを作った.

p5pchat



下記の説明通りに作業を行うと簡単に通信を行うことができる.
github.com

続きを読む

ソフィーのアトリエのためのツールを作った.

前置き

ソフィーのアトリエを買いました.
social.gust.co.jp
そこで,プレイしてて思ったのが,錬成で現在の手持ちでは直接の経路がない欲しい特性のついた物質を作ろうとしたときに,楽をしたいなと.

作った

というわけで試しに物質Aから物質Bへの経路を出してくれるscriptを書いた.

github.com

今後

複数素材に対応したり,ちゃんと特性を見つつ,分類で遺伝できるかどうかとかチェックしたい.
あとはGUI化とか.
後は現状のゲーム進行でのものしかデータベースを作ってないので,そこも増やしていきたい.
wikiの情報が充実してないのには不便極まりなかった.
ゲーム進行している人がデータベースを改良してくれたりしてくれたりするとめっちゃ助かる.

また,今作は錬金のシステムが複雑なので,そちらについても最適な配置場所,配置順序を計算するものを作りたい.