メニエスの名のもとに

プログラミング関係を中心としたぐだぐだブログ

androidアプリ「ミニナンプレ6×6」をリリースしました

android 用アプリ「ミニナンプレ6×6」をリリースしました。 ミニナンプレ6x6その0 - Google Play の Android アプリ無料 ミニナンプレ6x6その1 - Google Play の Android アプリ100円先に入力するマスを指定して、その後数字を入力します。指定したマスはス…

ナンプレ(数独)問題作成プログラム その20 analyze

酔っ払ってプログラムを書いた。 一度作った問題を convert によって変換して何度も使うようにするという考えであった。ところが、convert すると solve で求める解法が違ってしまうので、convertで変わらないような解法の情報を求めようとしていたのであっ…

無関係なプロジェクトを閉じる

android 開発で、eclipse を起動する度にエラーが大量に出たり、たくさんあるソースのうち一個だけ java.lang.Object が見つからないとかでソースが全部エラーになったりと、わけのわからない状態になっていた。 泥沼の中で溺れるように試行錯誤していたのだ…

ナンプレ(数独)問題作成プログラム その19 analysis

バグではなくて仕様です convert のバグと思われた事、convert すると使用する解法アルゴリズムが変わるという事は、バグというよりも仕様でした。前回の結果では、Locked Candidate の数が変わっていたわけですが、その原因はブロックの位置が変わることに…

ナンプレ練習お試し版にバグ

今度は、ナンプレ練習お試し版にバグがあった。しかも、スマートフォンの場合に起動しないという致命的なバグ。製品版が売れないと思っていたけど、お試し版にバグがあったら、そりゃあ製品版は売れないよなぁ。 クラッシュレポートをちゃんと見たらすぐに分…

ナンプレ(数独)問題作成プログラム その18 convert

ケチケチ作戦 digging hole をやった結果からも分かるように、難しいナンプレの問題はなかなか生成できないのである。貴重な存在なのである。そこで、もし見つかったなら、それを大切にしたいと思うわけだ。貴重なものは大切にしよう。 そういうわけで、問題…

白票とランダム投票と部分ランダム投票

白票を投じることと、白票を投じるように他人に勧めること 日本の選挙制度では白票を投じることは無意味だが、白票を投じるように他人に勧めることは無意味ではない。多くの人が白票を投じるならば有利になる政党があるからである。だからこそ、白票を投じる…

ナンプレ(数独)問題作成プログラム その17 digging hole

作ったけど機能してない digging_hole_recursion 関数を作ったけど、機能していない。つまり、穴を増やせていない。可能性としては、(1)バグ、(2)この関数で穴を増やせる確率が低い、たくさん生成すれば穴を増やせる場合もある、(3)対称性を捨てないといけな…

ナンプレ(数独)問題作成プログラム その16 digging hole

debug バグはdigging_hole 関数の中の次の行にありました。 int r = solve(&work, &info); 本来は work ではなく array を指定するべきだった。これは workという変数名が悪いので save に変更しました。さらにそれだけでなく、このままだと前回解いた後の状…

ナンプレ(数独)問題作成プログラム その15 digging hole

digging hole まず、完成形の盤面を用意する prepare_array /** * ナンプレ盤面の完成形を得る。 * ランダムに数字をセットし、再帰的に解く * @param array ナンプレ盤面(出力) * @return 1: 作成できた * @return それ以外: 作成できなかった */ static …

ナンプレ(数独)問題作成プログラム その14 疑似乱数

疑似乱数 これから digging hole アルゴリズムでナンプレの問題を作りたいわけだが、そのために疑似乱数を使う。だいたい何でもいいんだけど、比較的新しい(のでお気に入りの)xsadd を使ってみる。小さいし、速いし、MITライセンスだし。 元のソースはXORS…

ぜんそく

数年ぶりの喘息。といっても大したことはない。実は軽い喘息発作が起きていることは気づいていたが、そこから階段を六階分登ってしまい、途中からそこそこの発作に発展したのだった。仕事は休もうかと思ったのだが、結局ちまちまとリファクタリングなんぞを…

ナンプレ(数独)問題作成プログラム その13

前回のプログラムを実行出来るように solve.c の main を変更する。 たいした変更じゃないのでMSaito/NumPl · GitHubを見て。 で、実行すると、 ./solve -r " 6 31 9 9 427 7 1 6 7 8 5 2 5 143 9 8 24 61 " quiet = 0 recursion = 1 argc = 1 ??6?31?9? ??9…

ナンプレ(数独)問題作成プログラム その12

バグ修正 前回のバグはつまらないところにありました。バグってのはたいていつまらないところにあるもんです。 if ((mask & multiple) != multiple) { continue; } これ、multiple の中に mask が含まれるかという判定をしていたのです。 もう集合演算はビッ…

ナンプレ(数独)問題作成プログラム その11

solve.c /** 候補を減らす関数タイプ */ typedef int (*solver_t)(numpl_array *); /** 関数の数 */ static const int max_solvers = 5; /** 関数 */ static solver_t solvers[] = { kill_single, kill_hidden_single, kill_locked_candidate, kill_tuple, k…

ナンプレ(数独)問題作成プログラム その11

doxygen 一度Javaをやった人間は javadoc のようなドキュメントがないとなんとなく不安になる。Doxygen: Main Pageはjavadocのようなことをいくつかの言語を対象にやってくれるソフトである。 これまでのアルゴリズムを使って問題を解くプログラム solve.c …

1時間程度では無理だった。

数独問題作成プログラム、これまでに作った解法を試すために問題を解くプログラムを作ろうと思ったが、既にあるプログラムが錯綜しているために1時間程度では整理できなかった。この際、コメントも入れるので、プログラムを上げるのは明日以降にする。 スパ…

ナンプレ(数独)問題作成プログラム その10

念のため このブログはナンプレ練習 - Google Play の Android アプリ,ナンプレ練習お試し版 - Google Play の Android アプリの問題作成プログラムについて説明しています。 これまでのプログラムはMSaito/NumPl · GitHubにあります。 X-Wing, Sword Fish, …

すっかり忘れていた。

このブログのことを今日はすっかり忘れていた。頭から抜け落ちていた。そして、今からプログラムの説明を書く気にもならない。まあ、そんな日もある。

ナンプレ(数独)問題作成プログラム その9

tuple (二国同盟、三国同盟、裏二国同盟、……) ひとつの行(縦、横、ブロック)に注目する。その行内に、二つの数字だけで二カ所のマスを埋めていたり、三つの数字だけで三カ所のマスを埋めていたりしたら、それ以外のマスには、その数字は入らない。 図の例…

ナンプレ(数独)問題作成プログラム その8

Locked Candidate Locked Candidate というのは列または行とブロックの共通部分を見て、片方にしかない数字があればもう片方から消せるというもの。日本語分かりにくい。(いや、俺の説明がわかりにくい) この図でいうと、行とブロックに共通部分がある。5…

ナンプレ(数独)問題作成プログラム その7

昨日のプログラムには間違いがあった。 昨日の記事も修正したけどMSaito/NumPl · GitHubの方がたぶん正しい。 矛盾のチェック 昨日の記事でも言っていた矛盾のチェックは、行単位ではない方がいいという件。 static int check_array(sudoku_array * array) {…

ナンプレ(数独)問題作成プログラム その6

わかってたまるかポインター ナンプレの問題を解くために rows, cols, blocks という配列を constants.c に定義したのだが、これらの配列をまとめて扱いたい時がある。そのために all_lines[] = { rows, cols, blocks}; というように定義したい。どう書いた…

ナンプレ(数独)問題作成プログラム その5

バグ修正した 「ナンプレ練習」アプリのバグ修正した。まあまあ簡単だった。ほとんど同じメソッドが複数あるという美しくないプログラムである。ただし、そのことを除けばソースはきれいになった。if 文で分けていた条件がなくなって、代わりに別のメソッド…

ナンプレ(数独)問題作成プログラム バグ2

またしてもバグ 昨日のバグを修正して、検証しようとしていたら、別の問題に遭遇。もうやる気なくなってきたよ。 このスクリーンショットがその問題。紫色の1468がNaked Quadruple になっている。1468だけで四カ所を占有しているので、それ以外の場所の1468…

ナンプレ(数独)問題作成プログラム その5

他所様のホッテントリに便乗して誘導 突発的にC言語でプログラミングが書きたくなる病 | blog.smarteducation.jp がはてぶのホッテントリ?っていうのに入っていたのでブコメでここに誘導するというセコい手を使う。何度もやると怒られるだろうな。いや、内…

日曜くらいブログを休みたい

一日空けたからって、ペナルティはないだろうけど、でも連続日数が表示されているとなにかメリットがあるのではないという気がしてくる。連続でメリットがあるというのは、1日あけるとペナルティがあるというのと同じことだ。 まあぐだぐだ文章を書く方がプ…

ナンプレ(数独)問題作成プログラム その4

SIMD Within A Register の実際のプログラムは、16ビットにしてそれ以外は前回の説明の通りにプログラムすると static inline uint16_t ones16(uint16_t x) { x = (x & UINT16_C(0x5555)) + ((x >> 1) & UINT16_C(0x5555)); x = (x & UINT16_C(0x3333)) + ((…

難しいナンプレの問題点

自分の作った ナンプレ練習お試し版 - Google Play の Android アプリ をやっていて思ったんだけど、いやお試し版の方じゃないけど、難しいナンプレの問題というのは、複雑な相互関係が成立していて、最後に解けるときは連鎖的に解けていくわけだが、その最…

ナンプレ(数独)問題作成プログラム その3

マスに数字の候補がいくつ入っているか求める 特に知りたいのはマスに入っている数字の候補が1つだけの場合だが、数字の候補の数を数えれば分かる。そして、フラグを持つのを止めたので、出来るだけ高速に計算したい。 そういう時に使われるのが、SIMD With…