Orcantus

Guide

Color Sort(筒を注いで色分け)の解き方 — 初級編: 筒の見方と、詰まらない注ぎ方の基本

Orcantus Puzzlesの「Color Sort」は、容量が固定された筒(既定4層)に色つきの単位が積まれており、筒の一番上に連なる同じ色のかたまりを、空の筒か同じ色が一番上にある筒へ注いで、最終的に色ごとに1本の筒へまとめる水ソート(Water Sort)型のパズルです。この記事は、実際にプレイしてクリアするための解き方ガイドの初級編です。全3回構成で、初級編(この記事)は盤面の見方・使える操作の実際の挙動・「常に今すぐ安全と分かる注ぎ」だけで最後まで解ける基本を扱います。中級編(その2)は「一見同じに見える注ぎでも、片方だけが手詰まりへ向かう」場面、上級編(その3)は色数の多い盤面で、その判断がさらに深い場所で必要になる場面を扱います。

Note

この記事でいう「初級・中級・上級」は、この解説記事を3段階に分けた読み物としての順番です。Color Sort本体のスタート画面には「初級・中級・上級・超上級」という4段階の選択肢があり(colorsort/index.htmlの実際の表記: 初級 7本(空2)・4層/中級 10本(空2)・5層/上級 15本(空3)・5層/超上級 14本(空2)・5層)、これはcolorsort/app.jsのLEVEL_PRESETS(色数・容量・同色を分ける数・空き筒数の組み合わせ)そのものです。この記事の初級・中級・上級は、あくまでこの記事が選んだ実例の解きやすさを指し、アプリ側の4段階とは対応しません(初級編の実例はアプリの「初級」と同じパラメータ(5色・4層・空2)ですが、中級編・上級編の実例はアプリの難度名とは異なる組み合わせを使います)。

結論。Color Sortでは、注ぎ先の一番上の色が注ぎ元の一番上の色と一致する注ぎは、その場では常に安全(盤面を壊さない)。 この記事の実例(5色・4層・7本、うち空筒2本)は、「同じ色が一番上に重なっている筒同士を見つけたら、迷わずまとめる」だけを繰り返すと、途中で一度も後戻りせずに最後まで解けるケースで、実際に15手すべてを実行し、隠れていた「?」も含めて完成(クリア判定)まで到達することを確認しました。

盤面の見方: 筒・色・容量、そして下2層の「?」

Color Sortの筒は、容量ぶんの色つき単位を積んだ縦長のスロットです。この記事の実例は容量4層・5色・空の筒2本、合計7本の盤面(Color Sort本体の「初級」設定と同じパラメータ)です。画面には各筒が縦に並び、下から積まれた色が見えますが、既定では各筒の一番下から2層ぶんが「?」として隠されています。隠れた色は、注ぎ出してその位置が筒の一番上に来ると初めて表示されます(colorsort/index.htmlの遊び方説明: 「下の方は色が隠れていますが、注ぎ出すと見えます」)。

隠すかどうかは表示だけの仕組みで、生成される問題そのもの・注ぎの合法性には一切影響しません。「全色表示(隠れた色もすべて見る)」というチェックボックスをオンにすると、隠さずに同じ問題を比較しながら遊べます。この記事の実例では、colorsort/engine.jsを直接呼び出して隠れているはずの色もあらかじめ確認したうえで手順を説明します(実際のプレイでは、これから示す色は注ぎが進むにつれて少しずつ「?」から確定色に変わっていきます)。

画面下には次の情報が常に表示されます。

使える操作(合法手)

回転や筒の追加・削除はありません。「全色分かれている」だけでは完成にならず、隠れていた「?」がすべて一度は露出していることも必要です(colorsort/engine.jsのisClearedはisSolvedとisFullyRevealedの両方をANDで判定)。

実例: 5色・4層・7本(空2)の盤面を、常に安全な注ぎだけで解く

numColors=5・容量4・空筒2・シード"notes-colorsort-easy-16"で生成した盤面です(E.generate({ numColors: 5, capacity: 4, duplicateColors: 0, emptyTubes: 2, seed: 'notes-colorsort-easy-16' })、5回目の試行でこの条件を満たしました)。色をA〜Eの記号で表します(Color Sort本体のパレットで色ごとに割り当てられている記号と同じです)。下から積まれた順(左が下・右が上)で、括弧内は既定で隠れる下2層です。

筒 内容(下→上)
1 (A, C), C, E
2 (B, D), B, A
3 (D, B), E, E
4 (E, A), A, D
5 (D, C), C, B
6 空
7 空

この盤面はnodeLimitなしの探索でも一切の後戻りが要らないという性質を持ちます(E.solveをNode.js上で実行すると、探索したノード数(15)と実際の解の手数(15)が完全に一致し、探索が最初に試した候補が一度も外れませんでした)。つまり、各段階で「今すぐ注いでも損をしない」注ぎを選び続けるだけで、最後まで迷わず進めます。

手順

以下は実際にE.solveが返した15手を、E.pourGameで1手ずつ適用し、隠れた「?」の露出・完成判定まで含めて最後まで再現した結果です(実行して確認済み。「新たに露出した?」欄は、この注ぎによって初めて色が判明したidの色を示します)。

手 注ぎ 移る色・枚数 新たに露出した? 注ぎ後の筒の状態(下→上)
1 筒3→筒6 Eを2枚 筒3側でBが1個 1:ACCE 2:BDBA 3:DB 4:EAAD 5:DCCB 6:EE 7:(空)
2 筒1→筒6 Eを1枚 なし 1:ACC 2:BDBA 3:DB 4:EAAD 5:DCCB 6:EEE 7:(空)
3 筒1→筒7 Cを2枚 筒1側でAが2個 1:A 2:BDBA 3:DB 4:EAAD 5:DCCB 6:EEE 7:CC
4 筒2→筒1 Aを1枚 なし 1:AA 2:BDB 3:DB 4:EAAD 5:DCCB 6:EEE 7:CC
5 筒2→筒3 Bを1枚 筒2側でDが1個 1:AA 2:BD 3:DBB 4:EAAD 5:DCCB 6:EEE 7:CC
6 筒4→筒2 Dを1枚 なし 1:AA 2:BDD 3:DBB 4:EAA 5:DCCB 6:EEE 7:CC
7 筒4→筒1 Aを2枚 筒4側でE・Aが1個ずつ 1:AAAA(完成) 2:BDD 3:DBB 4:E 5:DCCB 6:EEE 7:CC
8 筒6→筒4 Eを3枚 なし 1:AAAA 2:BDD 3:DBB 4:EEEE(完成) 5:DCCB 6:(空) 7:CC
9 筒2→筒6 Dを2枚 筒2側でBが1個 1:AAAA 2:B 3:DBB 4:EEEE 5:DCCB 6:DD 7:CC
10 筒3→筒2 Bを2枚 筒3側でDが1個 1:AAAA 2:BBB 3:D 4:EEEE 5:DCCB 6:DD 7:CC
11 筒6→筒3 Dを2枚 なし 1:AAAA 2:BBB 3:DDD 4:EEEE 5:DCCB 6:(空) 7:CC
12 筒5→筒2 Bを1枚 なし 1:AAAA 2:BBBB(完成) 3:DDD 4:EEEE 5:DCC 6:(空) 7:CC
13 筒5→筒6 Cを2枚 筒5側でC・Dが1個ずつ 1:AAAA 2:BBBB 3:DDD 4:EEEE 5:D 6:CC 7:CC
14 筒3→筒5 Dを3枚 なし 1:AAAA 2:BBBB 3:(空) 4:EEEE 5:DDDD(完成) 6:CC 7:CC
15 筒6→筒7 Cを2枚 なし 1:AAAA 2:BBBB 3:(空) 4:EEEE 5:DDDD 6:(空) 7:CCCC(完成)

15手を終えた時点で、E.isSolved(全筒が色ごとに分かれている)・E.isFullyRevealed(隠れていた10個の「?」がすべて露出済み)・E.isCleared(両方を満たす)のすべてがtrueになることを確認しました。最終盤面は、筒1=A4枚・筒2=B4枚・筒3=空・筒4=E4枚・筒5=D4枚・筒6=空・筒7=C4枚です。

この盤面で「安全な注ぎ」がなぜ毎回1つに絞れたか

この盤面では、各手の時点で同じ色が一番上に重なっている筒の組が実際には複数存在する場面もありますが、そのどれを選んでも、最終的な色の集まり方自体は変わりません(同色を合流させる注ぎは、どちらを先にやっても色の行き先を変えないため)。これは次の中級編で扱う「一見同じに見えて、片方だけが手詰まりへ向かう」ケースとは異なります。この記事の実例で常に安全だったのは、たまたま色の配置がそうなっていたからであり、Color Sortの注ぎ全般が常に安全という意味ではありません(中級編・上級編で反例を示します)。

誤りやすい判断

読者の検証方法

この記事が確認していないこと

この結果が言っていないこと

  • 検証はcolorsort/engine.js・colorsort/app.js(いずれも記事執筆時点、生成結果のversion: 2で確認)を対象にしています。将来の版で表示・判定基準が変わる可能性があります。
  • 表中の「気づき」の説明は、筆者がE.pourGameの実行結果(tubes・everRevealedの変化)を読んで書き下したものです。Color Sort本体の画面上にはこのような手ごとの解説は表示されません。