メニエスの名のもとに

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

2014-11-01から1ヶ月間の記事一覧

ナンプレ(数独)問題作成プログラム その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…

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

プログラミング言語を決める プログラムを書き始める前には、どのプログラミング言語で記述するかを決定する必要がある。しかし、この世には星の数ほどプログラミング言語があるし、今この瞬間にも新しいプログラミング言語が誕生しているかも知れない。 既…

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

数独の難易度を決めるのは難易度が高い 少し数独をやると、易しい問題では物足りなくなって難しい問題を解きたくなる。また、プログラマーの場合は、自分が解くのではなく、数独を解くプログラムを作りたくなってくる。そうすると、数独の解き方のページを探…

アイコン作るの面倒くさい

プログラマーなのに、アイコンを作らされることが多い。はてなブログもそうだけど、なにかというと自分のアイコンを設定しろと言われる。まあ、デフォルトさんでもいいんだけど、設定できるとなると設定したくなる。困ったものである。まあ、格好いいアイコ…

ブログ始めました。

メニエスというのは英語で書くとmaniethですが、英単語としては存在しないことになっています。。存在しない英単語なら他人のIDと衝突する可能性が低いはずです。いろいろなところでIDを取得する必要が発生しますが その時に衝突しないというのは優れた名前…