Each tile has a hidden value. Sort them by it. That's all. Choose two tiles. If left > right, they will be swaped.
Peter Norvig / 青木靖 訳 このエッセイでは、 あらゆる数独パズルを解くという問題に取り組む。制約伝播と探索という2つのアイデアを使うと、ごく簡単に解けるということがわかる(主要なアイデアはコードにして1ページたらずで、補足的なコードが2ページある)。 数独の記法と予備概念 最初に記法をいくつか決めておこう。数独パズルは81個のマス(square)からなる盤面を使う。数独ファンの多くはカラムを1-9で、行をA-Iでラベル付けしており、カラム、行、ボックスのような9個のマスの集まりをユニット(unit)と呼び、ユニットを共有するマスをピア(peer)と呼んでいる。パズルではマスのいくつかが空いており、他は数字が入っている。パズルの目的はこうだ。 それぞれのユニットのマスが1から9の数字の順列によって埋められるようにする。 つまり、1つのユニットに同じ数字が2度現れてはならず、そ
就活・インターンのための情報サイト。Webテスト・ES・志望理由・OB訪問・会社説明会・面接・TOEIC・英語の勉強など 【プログラミングのトピックとしての数独】 数独は9×9のマス目に1~9の数字を単純なルールに基づいて埋めていくパズルです。 http://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC 2005年頃から雑誌のパズル欄に登場して以来、世界的に有名になりました。最近では、数独のパズルだけを数百個収録した本も売っているくらいです。電車で数独を説いている人を見たことのある人も多いのではないでしょうか。 数独はプログラミングのトピックとしてとても興味深いです。ルール自体は誰でも1分で理解できる単純明快なものですが、 ・「問題を解くための戦略が複数種類存在する」 ・「解答が1通りになるような数独の問題を生成する時に許される『空白マス数の最大値』が問
「サイボウズ・アドベントカレンダー」の4日目です(これまでの記事一覧)。どうやら三日坊主は免れたようです(笑)。 (0) はじめに こんにちは。サイボウズ・ラボの川合秀実です。私は主にサイボウズ製品の高速化のお手伝いをしています。しかし先日、製品とは関係ないものを高速化したので、今日はそれを発表します。 サイボウズには社内勉強会がいくつかあって、その中にはC++の勉強会もあります。私はサイボウズの勉強会に参加するのが好きなので、このC++の勉強会に参加してみました。この勉強会では、「数独」というパズルを解くプログラムをC++で書いてみよう、というのが最初のテーマでした。参加者各自がプログラムを書き、翌週にお互いにレビューしあうということが行われました。 ここで私はやらかしてしまいました。ええ、そうです、高速化してしまったのです! 言うまでもないですが、誰もこんなことは望んでいません。そもそ
今月号の会誌「情報処理」(2010年8月号目次)の特集は「コンピュータ将棋の不遜な挑戦」というタイトルで、ここ数年のコンピュータ将棋の発展の技術的な解説。こうやって毎年のように情報がアップデートされると非常にありがたい。 見所は鶴岡さんによる「選手権優勝記--激指の技術的改良の解説--」とktanaka先生・kanekoさんによる「大規模クラスタシステムでの実行--GPS将棋の試み--」の2記事。特に鶴岡さんによる記事は、Bonanza のよい解説にもなっており、必読である。実は、激指は 評価関数というのは,局面の形勢判断をコンピュータで行うための関数で,任意の与えられた局面に対して,どちらがどれだけ有利なのかを数値化する関数である.[...] このようなパラメータの調整は非常に手間のかかる作業だが,かつては完全に手作業で行われており,将棋プログラム開発における作業の多くの割合を占めていた
2010/08/10 ルービックキューブはどんなポジションでも20回動かせば解決 Googleからコンピュータの空き時間として35CPU年を提供してもらい、ルービックキューブの全てのポジションにおける解法を調べたところ、どんなポジションでも20回動かせば解決できる事が分かったそうだ。神のアルゴリズム(ルービックキューブを解くアルゴリズム)が年々短くなってきているのが分かる。キューブの全てのポジションは43,252,003,274,489,856,000との事で、どうやってそれが分かったかというと、19,508,428,800ポジション毎の2,217,093,120セットに分類対称と集合(set covering)を使って解決すべきセットを55,882,296に抑えるそれぞれのポジションの最適解を見つけれなかったが、代わりに20以下の解決法だけを見つける約20秒で1つのセットを解決するプログ
問題を公開のあと、トラックバックやはてブでいろいろ回答や感想を見ました。 ちゃんとしたコードが書ける人が何人もいることがわかり(まあそういう人がレスポンスを出しているので当たり前か)、一安心です。本当に世間のレベルがあの求人サイトの応募者のレベルだったら、マジで日本のソフトウェア産業は滅びると思っていたからな... コメントの中で特に気になったものいくつかについて書いてみます。 ●「これは知識問題だ」という指摘 過去に似たことをやっていれば有利、というのは確かにそうです。 ただ、そういう予備知識がなくても普通に考えて実装するのに充分な時間として3時間という設定でした。というか、僕も今回の反応を見るまでA*というアルゴリズムは知らなかったよ! また、解答は単に正解が出力できるかではなく、「コードの質」も見てます。僕もこの世界は長いので、ある程度ボリュームのあるコードを見ればその人の実力はだい
出遅れた感があるけど、人材獲得作戦の試験問題をPythonで解いてみた。もちろん、調べたりググったりするの禁止で。というかググればコピペで終わりのような気がする。今回はゆるめの記事なので、メインのブログではなく、こちらに書いておく。 普通にダイクストラ法で書いたけど、何故か40分もかかった。途中でコードが気に入らなくて最初から書き直したり、ケアレスミスの修正をしたりしたからか。それにしてもすっきりしないコードだ。INFを100000で決め打ちしていたりとか、優先順位付きキューを用いていなかったりとか、周りに壁があること前提だとか。いろいろひどいなぁ。 これだけじゃ面白くないので、ダイクストラ法とA*アルゴリズムの違いを説明してみる。ダイクストラ法はスタート地点から順に隣接するノードの距離を足し合わせていき、常に最も距離の短いノードからそれに隣接するノードを調べていく方法で、A*は距離を足し
今流行の迷路問題をプログラミング言語 Go で解いてみました。 Go 歴はほとんどないので勉強がてらにやりました。ソースは gist:275032 です。 アルゴリズムはダイクストラの簡略化版です。マス目にたどり着くまでの距離 (1 マスが 1) をゴールにたどり着くまでどんどんメモっていって、ゴールに達したら逆向きに、ゴールから 1 ずつ距離を減らして行くことでルートを確定する、という単純なやり方です。 実装にかかった時間はちゃんと測ってませんが、 Go の勉強しながらだったので 4 時間くらいだと思います。これでは試験には落第ですね! 以下 Go 言語の感想とか。 Vector の使い方がよく分からない。 int と string は特別扱いでそれ用の構造体 (IntVector、 StringVector) およびメソッドがありますが、あとは Vector 構造体を使っておけってこと
当ブログでもお知らせしたコンピュータ将棋協会5月例会にて話題になり、コメント欄でも多くの結果が公表されたどうぶつしょうぎ。現在の結論は、後手(そらチーム?)の勝ちらしい、とのことです。 当ブログの5月例会の記事のコメント欄の内容をおさらいすると、当協会5月例会の時点ですでにGPS将棋の田中さんとうさぴょんの池さんによって解析が進められており、千日手らしい、との結論が出されていました。その後バグが発見されたことで千日手の結論が撤回され、後手勝ちに変わりました。田中先生はコンピュータの後退解析(retrograde analysis)により78手で後手勝ちの結論。 鈴木将棋の鈴木さんもコンピュータのdf-pn(depth-first proof-number search)による探索で後手勝ちと結論づけました。 後退解析とは、ゲームが終わった局面、すなわちライオンが詰んだ、もしくは相手の一段目
人間に勝つのは、はるか未来の話と思われてきたコンピューター囲碁の世界が、画期的なプログラムの登場で大変革期を迎えている。確率(勝率)を重視した「モンテカルロ法」の採用で棋力が急上昇。「将棋よりも先に、囲碁の名人がコンピューターに敗れるかも」と大胆な予想をするプログラマーもいる。 ●すでに「アマ三段以上」 06年にイタリアで開催されたコンピューター・オリンピアードで、モンテカルロ法を使ったフランスのプログラム「CrazyStone」が優勝(9路盤部門)し、コンピューター囲碁界に衝撃を与えた。19路盤でも「世界最強」の呼び声は高く、東京で開かれているコンピューター大会UEC杯で、07、08年に連続優勝。昨年は青葉かおり四段に7子局で完勝し、解説にあたった鄭銘●(●は王へんに皇)九段は「アマ三段以上はあるかも」と絶賛した。 従来のプログラムは「一間トビ」「ケイマ」などの「知識」を大量に覚えさ
解法その2 下段→上段→中段 まだ作ってません。ごめんなさい。 おまけ ここから先は完成したキューブを片手に御覧下さい。 いろんなパターンを作ってみよう!!! ホームへ戻る
ルービック(33)キューブの攻略法 キューブ王 海永 ここでの説明は簡潔にすぎるかとも思う。詳しい説明はwalk_walkにあります。 [名称] ルービックキューブの面に名前をつける。 South,East,North,West,Top,Bottom or S,E N,W,T,B 小立方体を分類し、分類名をつける。 3面見えるものを3面体。2面見えるものを2面体。1面見えるものを1面体or臍。 3面体に31,32,33,..と番号を付ける。2面体に21,22,23,..と番号を付ける。 [操作] 個別の面を90度右回転する操作を、面の名前と同じ名前で呼ぶ。 S,E,N,W,T,B SをしてEをすることをSEと書く。Sの逆(90度左回転)をS^と書く。 SやEで、2面体は別の2面体位置へ、3面体は別の3面体位置に移動する。2面体が3面体の位置へ行くことはない。 [1点干渉、2点干渉]
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く