Rubik's Cube

Rubik's Cube

図書館から、『四角六面キューブとわたし』なんて言う、 ルービック・キューブの開発者の回顧録を借りてきた。そこに面白いURLが紹介されてたので、載せておく。 God's Number is 20 いわゆる何手で解けるかの限界数。

日本では、 Rubik's Cube (Japan) が、公式販売権をもっている。特許が切れているので、らしい物が沢山販売されているみたい。 こちらに、一般的な解説が出てた。 ルービックキューブ 百科事典は有り難いなあ。

有名な物なんで、Debianとかでも遊べるみたい。

gnubik/stable 2.4.3-3+b1 i386
  3D Rubik's cube game

kubrick/stable 4:20.12.1-1 i386
  game based on Rubik's Cube

pybik/stable 3.0-3.1 all
  Rubik's cube game

pybik-bin/stable 3.0-3.1 i386
  Rubik's cube game - architecture dependent files

rubiks/stable 20070912-5 i386
  Small collection of Rubik's cube solvers

play

gnubik rubiksと2つのアプリを入れてみた。

gnupikはGUIなアプリ。ちゃんと画面が出て来た。キューブの所にカーソルを置くと、矢印になるので、クリックすれば回転出来る。暇潰しにはもってこい。しかも無料で楽しめる。

もう一方のrubiksの方は、CUIなアプリ。

rubiks_cubex    rubiks_dikcube  rubiks_optimal

このように3ヶで構成されてる。

sakae@deb:~$ rubiks_cubex
500 ERROR: solver failed for the following reason:
510 ERROR: non-protocol input entered.
101 version 1.30.505 by Eric Dietz (root@wrongway.org)
400 syntax:
rubiks_cubex <cube-layout>[<center-rotations>]
rubiks_cubex random[-centers]
example command-lines:
  cubex 212212212333333333626626626555555555141141141464464464
  cubex 111111111222333222555222555444555444333444333666666666100003
  cubex random
notes:
  - hint: try using the random parameter to get a feel for how to input cubes.
  - read readme.txt (included with this distribution) for protocol details.
  - use a terminal with scrollback feature to use this program! (or pipe it)
401 end of notes.
501 terminating unsuccessfully.

何だか、WEBサーバーと通信してるみたいだな。まあいい、指示に従ってみるか。

sakae@deb:~$ rubiks_cubex random
200 cube solved ok.
101 version 1.30.505 by Eric Dietz (root@wrongway.org)
202 101 moves 7 groups 15 23 31 6 10 16 0
220 starting diagram:
        2 1 3     2      0
        3 1 3   2 0 2 3
        3 6 2     2
 6 4 4  6 5 5  1 2 2  1 2 3
 5 3 3  6 2 4  1 5 5  4 4 1
 1 6 6  5 6 6  2 2 1  4 3 4
        4 4 5
        2 6 5
        3 1 5
221 diagram end.
210 sending solution:
DR, BA, RU, RU, DL, LD, BA, DR, DR, LU, BC, LD, LD, UL, UL, BA, DR, BC, DL, BA, RD, BA, RU, BC, LD, BC, LU, BA, DL, BA, DR, LU, BC, LD, BA, LU, BC, LD, UR, BA, UL, BA, RU, BC, RD, BA, RD, BA, RU, BA, DR, BC, DL, BC, LD, BC, LU, BC, DL, BA, DR, BC, UL, BC, UR, BC, LU, BA, LD, DL, BC, RD, BA, RU, DR, BC, LU, BC, BC, LD, BA, LU, BA, LD, BA, UR, BA, DR, BC, UL, BA, DL, BC, UR, BA, DR, BC, UL, BA, DL, BC,
211 completed solution.
203 cmd: rubiks_cubex 213313362644533166655624566122155221123441434445265315
201 terminating successfully.

色の表現は1から6で表す。抵抗のカラーコードならぬ、キューブのカラーコード。そしてキューブを展開した配置図。これを解決しなさい。サーバーに解決を依頼。サーバーからの解決作がステータスコード210で示されている。

誇らしげにステータス211で、解決済みって報告。それから、与えられた問題はステータス203で示されている。何だか、懐しい感じがするぞ。manもそれぞれ付いているので、読んでおくと吉。

gnubikのマニュアルを参照。

IMPLEMENTATION
       The code for gnubik is written in C and Scheme. It uses the Mesa/OpenGL
       graphics library, and the Gtk+ library and Guile.  As such,  it  should
       be easy to generate a version for any system complying with these stan‐
       dards.

さすがGNUを名乗るだけある。大事な部分はguile/schemeとな。

sakae@deb:/usr/share/gnubik/scripts$ wc *
   61   217  1910 debug.scm
  310  1426 10986 flubrd.scm
  423  1878 17261 mellor-solve.scm
   48   288  2116 rand.scm
  842  3809 32273 total

表現力豊かなのは、Mesa/OpenGL Gtk+ それとも scheme ?

try make

arch linuxにも入れておこうと思ったら、そんなパッケージは無かった。一般向けではないのか。ならば、自炊するかな。頭にGUNって付いているって亊はGNU軍団だな。

ソースを頂きに行ったら、2003/11/21初の2.0があった。最新の2.4.3版が2011/04/09。もう枯れているんだね。迷わず最新を頂く。

[sakae@arch gnubik-2.4]$ ./configure
  :
checking for OpenGL Utility library... -lGLU
checking for varargs GLU tesselator callback function type... no
checking for GUILE... no
checking for library containing scm_c_string_length... no
configure: error: "Guile 1.8.0 or later is required"

最初はグーじゃなくて、エラーは当たり前。Guile 3.X系は新し過ぎると思うので、2.2系を入れた。それでもエラーですよ。エラーログ嫁。

configure:9304: gcc -o conftest -g -O2   conftest.c -lguile   >&5
/usr/bin/ld: cannot find -lguile: No such file or directory
collect2: error: ld returned 1 exit status
configure:9304: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNUbik"
  :

libguileが見付からないと言ってる。

[sakae@arch ~]$ locate lib/libguile
/usr/lib/libguile-2.2.so
/usr/lib/libguile-2.2.so.1
/usr/lib/libguile-2.2.so.1.4.2

ちゃんと有るんだけどな。エラーログを少し遡って見てくと

Package 'guile-2.0', required by 'virtual:world', not found
configure:9273: checking for library containing scm_c_string_length
configure:9304: gcc -o conftest -g -O2   conftest.c  >&5
/usr/bin/ld: /tmp/ccVcpgeR.o: in function `main':

あれれ、configureの中に、guileのバージョンが決めうちで2.0ってなってる。そんなの有りか? 文言では、1.8以上ならいいよってなってるけど。まあ、その時代には2.0が最新だったんだろうね。時代考証が必要っぽいな。

guile-2.2に書き換えたら、少し先に進んだ。けど、やはりエラー

checking for GUILE... yes
checking for library containing cos... -lm
checking for GTK... yes
checking for GDK_PIXBUF... yes
checking for GDK_GL_EXT... no
configure: error: Package requirements (gdkglext-1.0) were not met:

Package 'gdkglext-1.0', required by 'virtual:world', not found

今度は、gdkglextが無いとな。パッケージにも無い。まて、野生の勘でパッケージ名前を端折って検索。

[sakae@arch pkgconfig]$ pacman -Ss glext
extra/eglexternalplatform 1.1-2
    EGL External Platform interface
extra/gtkglext 1.2.0-13
    opengl extensions for gtk2

でてきたっぽい。入れたよ。

[sakae@arch ~]$ cd /usr/lib/pkgconfig/
[sakae@arch pkgconfig]$ ls -d gtk*
gtk+-2.0.pc           gtkglext-x11-1.0.pc     gtk+-x11-2.0.pc
gtk+-3.0.pc           gtk+-unix-print-2.0.pc  gtk+-x11-3.0.pc
gtk+-broadway-3.0.pc  gtk+-unix-print-3.0.pc
gtkglext-1.0.pc       gtk+-wayland-3.0.pc

こういうのもパッケージのヒントになるね。まあ、無事にインストール出来た。 動かすと多少エラーが出てくるけど、目を瞑っておこう。

src/cubeview.c:860 Error in display:  invalid enumerant
Cube geometry (version dimensionality size-of-dim-1 ...):
          (1 3 3 3 3)
1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
5 5 5 5 5 5 5 5 5
4 4 4 4 4 4 4 4 4
3 3 3 3 3 3 3 3 3
2 2 2 2 2 2 2 2 2

全面が揃った完成形。

853render_scene (GbkCubeview * cv, GLint jitter)
854{
855  projection_init (&cv->scene, jitter);
856
857  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
858
859  gbk_cubeview_model_view_init (cv);
860  ERR_CHECK ("Error in display");
861
862  drawCube (cv->cube, FALSE, cv);
863  ERR_CHECK ("Error in display");
864}

気になるエラー。まあ、良きに計らえでいいのかな。

from info

GNUの場合、一番詳しい説明はInfoなドキュメントにある。開いてみたよ。 上で出て来た、キューブのダンプの説明があった。

-- Procedure: gnubik-cube-state
    This will return a `scheme' object, which is in fact a cons cell
    whose first component is a list describing the geometry of the
    cube, and the second component is a vector of six vectors of nxn
    items, where n is the size of the cube.

    The geometry list consists of a version number, which will change
    if the definition of the cube object ever changes (scripts should
    check this to ensure compatibility or else things will surely
    break); the current version is 1 (one). The next item in the list
    is the dimensionality of the cube, which currently is always 3.
    The list then holds three more numbers describing the size of the
    cube in each direction. So a current 3x3x3 cube will have the
    geometry list `(1 3 3 3 3)'.

キューブ・カラーコード。

gnubik.color0: Red
gnubik.color1: Green
gnubik.color2: Blue
gnubik.color3: Cyan
gnubik.color4: Magenta
gnubik.color5: Yellow

マウスでグリグリすると思っていたら、キーボードを駆使して、キューブの見えかたってか、視点を変更出来るのね。これって、OpenGLの得意とする場面だな。

4.1 Using the keyboard to rotate the cube
=========================================

You can re-orientate the cube using the following keys.  The <Up> and
<Down> keys rotate the cube about the horizontal axis.  The <Left> and
<Right> keys rotate the cube about the vertical axis.  Holding down the
<Shift> key whilst pressing the <Left> or <Right> arrow keys rotates
the cube about the z axis.

群論

群論で解き明かす ルービックキューブの数理

ルービックキューブと群論の話をしました

群論とルービックキューブ 卒業研究でキューブをやるって、楽しいだろうね。

Rubic キューブと置換の乗算 by haskell 和田先生登場

ルービックキューブを解くプログラムを書いてみよう by python

これだけ分かるとNxNxNのルービックキューブは全部解ける Gold finger ?

Lispで調べるルービックキューブ

Rubik's Cube by ruby-gem

RubiksCube-TwophaseSolver by python

上記の2段階法による。テーブル作成に1時間かかった。下記は、example.pyを走らせた時に出て来るコンソール出力例。

Connected with 127.0.0.1:32980, 2022.07.01  06:43:06
RFUDULFUFLBRURDBRUDBUUFFRFDBLLRDURFBFRLLLLFBDBDUBBDLRD

RFUDULFUFLBRURDBRUDBUUFFRFDBLLRDURFBFRLLLLFBDBDUBBDLRD
U3 L1 F2 B3 L1 F2 U3 F2 L3 F1 R2 F2 L2 U1 R2 F2 R2 F2 U3 F2 (20f)

20手で、解決しましたって、あんたはキューブの神様か。

ctwm on debian

ctwmのマニュアルをボーと眺めていたんだ。こんなくだりが出てた。

Button1   = modlist : context : function
The modlist is any combination of the modifier  names  shift,  control,
lock,  meta,  mod1, mod2, mod3, mod4, or mod5 (which may be abbreviated
as s, c, l, m, m1, m2, m3, m4, m5, respectively) separated by a  verti‐
cal  bar (|).  Similarly, the context is any combination of window, ti‐
tle, icon, root, frame, workspace, iconmgr, their first letters  (icon‐
mgr abbreviation is m), or all, separated by a vertical bar.  The func‐
tion is any of the f.  keywords described below.  For example, the  de‐
fault startup file contains the following bindings:
Button1   =    : root         : f.menu "TwmWindows"
Button1   = m  : window | icon     : f.function "move-or-lower"
  :
"Left"         = m  : all          : f.backiconmgr
"Right"   = m | s   : all          : f.forwiconmgr

ボタンの代わりに、キーでもいいんだって主張。これをヒントに、前回の .ctwmrc に下記を追加したよ。

"Right"   =       : all : f.nextworkspace
"Left"    =       : all : f.prevworkspace

矢印キーで、仮想窓の切り換え。素直に矢印キーだけで切り換えするようにしたけど、アプリでこのキーを使いたい場合、コンフリクトしちゃう。そんな時は、シフトキーとかと併用するようにすればよい。

気分がよくなったので、debianのWMをicewmからctwmに衣替えしてみました。 普通に起動すると、debian流のctwmになりました。そんなのどこでやってるの? 答は、/etc/X11/ctwmの中にありました。

ctwmが供給してる、system.ctwmrcにフックをかけているようです。このファイルの最後に、 undivert(`/etc/X11/ctwm/menudefs.hook') が追加されてました。で、その中身は?

{
  "SIMH Altair"    f.exec  "x-terminal-emulator  -T \"SIMH Altair\" -e sh -c \"/usr/bin/altair\" &"
  "SIMH Altair Z80"    f.exec  "x-terminal-emulator  -T \"SIMH Altair Z80\" -e sh -c \"/usr/bin/altairz80\" &"
  "SIMH DEC PDP1"    f.exec  "x-terminal-emulator  -T \"SIMH DEC PDP1\" -e sh -c \"/usr/bin/pdp1\" &"
  "SIMH DEC PDP10"    f.exec  "x-terminal-emulator  -T \"SIMH DEC PDP10\" -e sh -c \"/usr/bin/pdp10\" &"
  "SIMH DEC PDP11"    f.exec  "x-terminal-emulator  -T \"SIMH DEC PDP11\" -e sh -c \"/usr/bin/pdp11\" &"
 :

渋い設定があるなあ。皆さん、uv6狙いなんですかね。オイラーもこの間やったよ。

menu "/Debian/Applications/Programming"
{
  "Guile 2.2"    f.exec  "x-terminal-emulator  -T \"Guile 2.2\" -e sh -c \"/usr/bin/guile-2.2\" &"
  "Hugs"    f.exec  "x-terminal-emulator  -T \"Hugs\" -e sh -c \"/usr/bin/hugs\" &"
  "Tclsh8.6"    f.exec  "x-terminal-emulator  -T \"Tclsh8.6\" -e sh -c \"/usr/bin/tclsh8.6\" &"
  "TkWish8.6"    f.exec  "x-terminal-emulator -e /usr/bin/wish8.6 &"
}
menu "/Debian/Applications/Science/Mathematics"
{
  "Bc"    f.exec  "x-terminal-emulator  -T \"Bc\" -e sh -c \"/usr/bin/bc\" &"
  "Dc"    f.exec  "x-terminal-emulator  -T \"Dc\" -e sh -c \"/usr/bin/dc\" &"
  "Xcalc"    f.exec  "xcalc &"
}

これも中々、渋い選択だなあ。今でもhugsが使えるってのは、ポイント高いよ。重くなくて、ちょいと使うには後都合。

emacs color

emacsの色調査。ソースの好きな色の所で、 M-x describe-face すると、こんな風に返答がある。emacsはソースの文法を知ってるな。

Describe face (default ‘font-lock-variable-name-face’):

どんな色が割当てられているかは、 M-x list-faces-display で確認出来る。なかなかカラフル。

fixed-pitch-serif                   abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$
font-lock-builtin-face              abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$
font-lock-comment-delimiter-face    abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$
 :
font-lock-variable-name-face        abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$
font-lock-warning-face              abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$
fringe                              abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$

この他に、色の集合をテーマとして用意してる。GUIな感じがするぞ。 usr/share/emacs/27.1/etc/themes

で、elispではどうなってるか、強引に探してみる。

sakae@deb:/usr/share/emacs/27.1/lisp$ zgrep font-lock-func *gz
apropos.el.gz:  '((t (:inherit (font-lock-function-name-face button))))
bs.el.gz:   '("^..\\(.*Dired .*\\)$" 1 font-lock-function-name-face)
cus-theme.el.gz:  font-lock-doc-face font-lock-function-name-face
dired.el.gz:  '((t (:inherit font-lock-function-name-face)))
font-core.el.gz:(defvar font-lock-function 'font-lock-default-function
font-core.el.gz:is toggled via `font-lock-function'."
font-core.el.gz:  (funcall font-lock-function font-lock-mode)
font-lock.el.gz:(defvar font-lock-function-name-face    'font-lock-function-name-face
font-lock.el.gz:(defface font-lock-function-name-face
font-lock.el.gz:       (1 font-lock-function-name-face prepend)
 :

ソースなら、きっとプログラミング部門だろうって亊で、更に追求。このあたりが文法を知ってるという由縁になるんだな。

sakae@deb:/usr/share/emacs/27.1/lisp$ zgrep font-lock-func -l */*gz
 :
progmodes/cc-awk.el.gz
progmodes/cc-engine.el.gz
progmodes/cc-fonts.el.gz
progmodes/cc-langs.el.gz
progmodes/cc-mode.el.gz
 :
progmodes/python.el.gz
progmodes/ruby-mode.el.gz
progmodes/scheme.el.gz
progmodes/sh-script.el.gz
 :

個別に書き換えると、init.elに反映される。

(custom-set-faces
 '(font-lock-comment-face ((t (:foreground "red")))))
(add-hook 'font-lock-mode-hook
  '(lambda ()
    (set-face-foreground 'font-lock-comment-face "yellow")
    (set-face-foreground 'font-lock-string-face "green")
    (set-face-foreground 'font-lock-keyword-face "#66e6e6")
    (set-face-foreground 'font-lock-builtin-face "LightSteelBlue")
    (set-face-foreground 'font-lock-function-name-face "cyan")
    (set-face-foreground 'font-lock-variable-name-face "LightGoldenrod")
    (set-face-foreground 'font-lock-type-face "PaleGreen")
    (set-face-foreground 'font-lock-constant-face "Aquamarine")
    (set-face-foreground 'font-lock-warning-face "Pink")  ))

CUI用にフォーグランドだけを集中的に設定するなら、こういう方法も有る。


This year's Index

Home