2015年6月11日木曜日

「Leapfrogs !」

「Leapfrogs」というゲーム(というかパズル ?)があります。

# ゲームの目的

一本の木の上に、右を向いたカエル(A)と左を向いたカエル(B)が4匹ずつ、並んでいます。カエルA, B の間には、カエル1匹が入るだけの狭い空間(_)があります。

    BBBB_AAAA

カエルA, B は、お互いに「向こう側」に行きたがっているのですが、細長い木の上なので、身動きが取れません。そこで、カエルをつついて移動させ、つぎの状態に持っていくのが、このゲームの目的です。

    AAAA_BBBB

1本の木の上なので、カエルをつつく事で、

  • のそのそと、となりのコマに移動できます
  • 一匹分のスペースをジャンプして、移動できます
どのカエルをつついて動かすか、その指示を与えるには、カエルの場所にある番号を指定します。

    123456789            ←場所 (インデクス)
    BBBB_AAAA        ←カエルの配置状態 (ステージ)

最初は、3, 4, 6, 7 のカエルのみが移動できます。例えば、ここで3のカエルをつついて移動させると、3に居たカエルは4のカエルをジャンプで飛び越し、5へ移動します。

    123456789            ←場所 (インデクス)
    BB_BBAAAA        ←カエルの配置状態 (ステージ)

こうしてカエルをつついて移動させ、最終的に

    123456789            ←場所 (インデクス)
    AAAA_BBBB        ←カエルの配置状態 (ステージ)

の状態に持って行きます。
慣れてきましたら、カエルを移動させる回数を出来るだけ少ない手順で行う方法を探求してみるのが面白いでしょう。
簡単なパズル・プログラムなので、高機能電卓でも十分楽しめるプログラムが作成できると思います。

この記事では、久しぶりにHP35Sで動くプログラムを作成しました。


# 使い方

HP35S では、文字列の加工が出来ないので、苦肉の策として16進数表示を使ってみました。空白の表示は「C」となっています。
  1.  [XEQ] L [ENTER] で起動
  2. C = 1 の様に、試行回数を表示
  3. つぎの書式でステージを表示

    123456789h    ←インデクス
    BBBBCAAAAh    ←「カエル」表示
  4. 移動対象のカエルをインデクスにて指定し、[R/S] を押して入力します
  5. 「上がり」状態になれば「CLEAR !」と表示され、最後に操作回数を表示して、プログラムは終了します
  6. 上がりでなければ、2. へ戻り、繰り返しになります
#  変数

C        試行回数
I, J    配列変数操作インデクス
M        移動するカエルの位置
S        空白の位置

Reg(1)...R(9)        ステージ状態


# プログラム

L001    LBL L
L002    DEC
L003    1
L004    STO I
L005    4
L006    STO(I)
L007    1
L008    STO+ I
L009    4
L010    STO(I)
L011    1
L012    STO+ I
L013    4
L014    STO(I)
L015    1
L016    STO+ I
L017    4
L018    STO(I)
L019    1
L020    STO+ I
L021    3
L022    STO(I)
L023    1
L024    STO+ I
L025    5
L026    STO(I)
L027    1
L028    STO+ I
L029    5
L030    STO(I)
L031    1
L032    STO+ I
L033    5
L034    STO(I)
L035    1
L036    STO+ I
L037    5
L038    STO(I)
L039    1
L040    STO C
L041    5
L042    STO S
L043    VIEW C
L044    PSE
L045    1.009
L046    STO I
L047    0
L048    16
L049    *
L050    RCL(I)
L051    +
L052    ISG I
L053    GTO L048
L054    1
L055    +
L056    +/-
L057    ENTER
L058    ENTER
L059    AAAACBBBBh
L060    x=y?
L061    GTO L092      ; 上がり判定
L062    R↓
L063    123456789h
L064    x<>y
L065    HEX
L066    STOP          ; 入力部分
L067    DEC
L068    STO M         ; 
L069    RCL S
L070    -
L071    ABS
L072    2
L073    xL074    GTO    L089      ; 入力が範囲外か ?
L075    RCL M
L076    RCL S
L077    x=y?
L078    GTO L089      ; 空き位置の指定 ?
L079    RCL M
L080    STO I
L081    RCL S
L082    STO J
L083    RCL(I)
L084    STO(I)
L085    3
L086    STO(I)
L087    RCL M
L088    STO S
L089    1
L090    STO+ C
L091    GTO L043
L092    1
L093    STO- C
L094    SF 10
L095    CLEAR !
L096    PSE
L097    CLEAR !
L098    PSE
L099    CLEAR !
L100    PSE
L101    CF 10
L102    VIEW C
L103    RCL C
L104    RTN

このプログラムでは両側に4匹ずつのカエルが配されています。この場合、最小の手数が24手になるとの事です。
詳しくは、次のサイト様で色々な解説がありますので、御参考下さい。

『カエル跳びゲーム』解答
http://math.a.la9.jp/akaeru.htm

かなり昔に、ポケコンでプログラムを作ったのですが、その時は「最小の手数が24手」というのが、どうにも判らんかったのでした。

10 件のコメント:

やす (Krtyski) さんのコメント...

akatuki様

ついに貯まったマグマの爆発ですね!

お疲れ様です。

カエル飛びゲームは、知りませんでした。これなら カシオのプロ殿にも実装できそうです。

・ゲーム終了の判定
 複数の方法が思いつきます。OK
・2匹のカエルを文字で表現...問題なし
・カエルの操作と動きの最善...これもOK

あとは、通勤電車でポチポチとプログラム作るだけ...かも

面白そうです。

hp35sのコードは、まるで暗号のようですね。
スタックを積極利用したアルゴリズムは、これまで一度も考えたことないのですが、こういう簡単なゲームだと挑戦できるかも知れません...って、やったことも無いのにお気楽なこと言っておりますが...

アセンブラの素養が殆ど無い私には、高級言語でないと大変なのは間違いないところではあります。



Sentaro さんのコメント...

akatuki様、こんばんは!

カエル跳びゲームは初めて知ったのですけど、一行表示のゲームはまさにプロ電やポケコンというところで懐かしすぎますね(^^)

動き方のルールとか見るとハノイの塔みたいな感じでしょうか。

HP35SのソースはHP50GのRPLを使うようになってから、以前よりは読めるようになってきました(^^;



やす様、こんにちは!

fx-5800Pへの移植はスムーズにいきそうですね(^^)

>カシオのプロ殿

プロ電よりもしっくりくるかも?(^^;

やす (Krtyski) さんのコメント...

sentaro様

>>カシオのプロ殿

>プロ電よりもしっくりくるかも?(^^;

うはは、2チャンみたいですね...

どうせfx-5800Pに移植するなら、広い画面を利用してカエルの移動に動きを付けてみようかと...

あと、2種類のカエルの数を自由に変えられるとか、バリエーション付けられそうです。

sentaro様のおかげで(せいで)hp50g への興味津々...Amazonのほしい物リストに入れてしまいました。今年いっぱいで生産中止だとどこかで見ました。なので、余計そそられます。

今日は、¥14,200 でした。

ところで、Amazonでは、hp50g に2種類あって、並行輸入品の方が高い価格設定になっています。これらは細かいオプションが違っているなんてこと、あります?

あと、カスタマーレビュ-を見ると、CDに日本語マニュアルが入っているとのコメントがあります。sentaro様のは日本語のpdfが入っていました?

akatuki さんのコメント...

やす (Krtyski) 様、いらっしゃい !

> ついに貯まったマグマの爆発ですね!

恐れ入ります !

> カエル飛びゲームは、知りませんでした。これなら カシオのプロ殿にも実装できそうです。
> ・ゲーム終了の判定
> 複数の方法が思いつきます。OK
> ・2匹のカエルを文字で表現...問題なし
> ・カエルの操作と動きの最善...これもOK
> あとは、通勤電車でポチポチとプログラム作るだけ...かも
> 面白そうです。

そうでしょう !
fx-5800pでやってみて欲しく思い、記事をアップしたのでした。

> hp35sのコードは、まるで暗号のようですね。

35Sは、いわゆる「電卓言語」ですから、少々読みにくいのです、ハイ。

> スタックを積極利用したアルゴリズムは、これまで一度も考えたことないのですが、こういう簡単なゲームだと挑戦できるかも知れません...って、やったことも無いのにお気楽なこと言っておりますが...

35sはスタックが4段しかなく、計算を展開して進める程度の事でありますから、気軽に作業できます。
ただ、再帰処理の様にスタックを積極的に使う、となると、4段スタックは少々手狭だったりしますネ。

> アセンブラの素養が殆ど無い私には、高級言語でないと大変なのは間違いないところではあります。

確かに、35sのコードってアセンブラっぽいですネ。
当方、アセンブラも最近は遠ざかっておりまして、なかなか大変だったりします。
しかし、35sのインストラクションはキー操作そのものなので、電卓を叩く要領でプログラミングであり、そこそこやりやすかったりするワケです。
fx-602Pとかと同じ様な感じですが、そこへRPNが追い打ちを掛ける、という ... 。

> どうせfx-5800Pに移植するなら、広い画面を利用してカエルの移動に動きを付けてみようかと...
> あと、2種類のカエルの数を自由に変えられるとか、バリエーション付けられそうです。

イイですね !

> sentaro様のおかげで(せいで)hp50g への興味津々...Amazonのほしい物リストに入れてしまいました。今年いっぱいで生産中止だとどこかで見ました。なので、余計そそられます。

生産終了ですか ? ウーン、マイッタなぁ。
ならば、ここはイッパーツ、ポチっと ... ? 結構遊べますヨ。当方、未だに全機能を試していない位ですから ... 。
先ずは、Debug4x に収録されているエミュレータで、少しいじるのも面白いかと思います。


Leapfrogsのプログラムは、大まかな所は作りやすいのですが、細かい所を工夫出来そうで、そこが面白いのだと思うのです。ちょっとした時間でもプログラムの改良が出来ますから「通勤プログラム」にはちょうどいい、かも。クロスワードパズルを解くような感じですネ。

Sentaro さんのコメント...

やす様、こんにちは!

>どうせfx-5800Pに移植するなら、広い画面を利用してカエルの移動に動きを付けてみようかと...
>あと、2種類のカエルの数を自由に変えられるとか、バリエーション付けられそうです。

速度的な問題はないと思われるのでアレンジは自由に出来そうですね。
fx-5800Pバージョン楽しみです(^^)


>sentaro様のおかげで(せいで)hp50g への興味津々...Amazonのほしい物リストに入れてしまいました。今年いっぱいで生産中止だとどこかで見ました。なので、余計そそられます。

ぉお!やす様もついにHP50G を!(笑)
いよいよ無くなるかと思うとなんか落ち着かないですよね(^^;

50Gに関しては私も今年になってから生産終了という噂を聞いていたたので今年が最後の新品入手チャンスと考えて、ほしい物リストで様子見をしていたらジュライさんが一気に値下げでど~んと在庫が出てきて、その在庫がみるみるうちにどんどん減っていくので慌てて買ってしまいました。今考えると慌てなくてもよかったのかもというのもありますけど、ジュライさんもあれから在庫出てきてないですし、今年で生産中止というのも間違いなさそうな感じですね。

HPの電卓はRPNに馴染めるかどうかが分かれ道だと思うのですけど、言語的にはUserRPLはFX-602Pの電卓言語を高級言語っぽく複雑にしたようなものと考えれば間違いありません。アセンブラよりは高級言語に近いのでCasioBasicを電卓言語っぽくしたとも言えなくもないと思います。
そこから先に進んでSysRPLとなってくると若干アセンブラっぽく難解になってきますけどそれでもまだ高級言語感は残ってて、Saturnのアセンブラ、そしてARMのアセンブラとなると完全にアセンブラですけど、言語的に段階を踏んで難解になってもその分、高速化の恩恵があったり出来ることが増えたりと、深く掘り下げても掘り下げても底の見えないマリアナ海溝並みの深さを感じるのが50Gです。さらにHPGCCも使えますからfx-9860GII以上に何でもありですね。
RPLに少しでも興味が沸いたらRPL電卓の集大成としてのHP50Gは買って損はない一品だと思いますけど、いまどきの電卓からすれば癖ありまくり機種なので(^^;
akatuki様もおっしゃってますようにDebug4x付属のエミュで一通り試せるので、まずはお試しをお勧めします(^^)


>今日は、¥14,200 でした。

私が買った時は\14800でしたけど、あれから在庫店がかなり増えたきたように思うのはやはり今年で最終という感じなのかもしれません。


>ところで、Amazonでは、hp50g に2種類あって、並行輸入品の方が高い価格設定になっています。これらは細かいオプションが違っているなんてこと、あります?

私の買ったのは本体には2014年製のシリアル付いてて添付CDは2009年版だったので、もし、2009年よりも古い在庫が残っていたとしたら分からないですけど、たぶん今在庫のあるのは全部2014年製か最終2015年製というところであればどれも同じかと思われます。


>あと、カスタマーレビュ-を見ると、CDに日本語マニュアルが入っているとのコメントがあります。sentaro様のは日本語のpdfが入っていました?

はい。
2009/9/21版のHP 50g_user's guide_Japanese.pdfというファイル名の日本語ユーザーズマニュアルが収録されていました。
ただ、この日本語版マニュアルは英語版のuser’s manualの翻訳版みたいで、グラフ電卓としての基本機能までのマニュアルで、プログラミング言語のところから先は英語版のuser’s guideとadvanced user’s reference manualを読む必要ありですね。

Sentaro さんのコメント...

もしかして、またまたスパム扱いに?(汗)

akatuki様、お手数おかけしますです。m(_ _)m

akatuki さんのコメント...

Sentaro 様、コメント多謝 !

早速、回復しておきました。

やす (Krtyski) さんのコメント...

akatuki様

>そうでしょう !
>fx-5800pでやってみて欲しく思い、記事をアップしたのでした。

あぁ、やっぱりそうでしたか...ボチボチやってみますね。
ついでに、ウチのブログのネタにもさせて頂こうかなぁ....

>生産終了ですか ? ウーン、マイッタなぁ。
>ならば、ここはイッパーツ、ポチっと ... ? 結構遊べますヨ。当方、未だに全機能を試していない位ですから >... 。
>先ずは、Debug4x に収録されているエミュレータで、少しいじるのも面白いかと思います。

さっそくダウンロードして、使ってみています。電卓の恰好をした謎の箱って感じですね。

先ずは、Tutorial を読みながら...結構時間がかかりそうです。
http://resources.thiel.edu/mathproject/CalculatorLessons/Default.htm

でも面白いですね...


やす (Krtyski) さんのコメント...

sentaro様

>ぉお!やす様もついにHP50G を!(笑)
>いよいよ無くなるかと思うとなんか落ち着かないですよね(^^;

そうなんです。歴史的な機種なので、物欲がふつふつと...

電卓の開発の歴史に関する日本語の読み物を色々と読んでいるのですが、電卓戦争とか技術立国日本って感じで、何故か1990年代で話が終わっているものばかり...日本と世界を一度に俯瞰したプログラム電卓の歴史は誰も書いていないように思うんです。

世界初のポケットサイズでバッテリーバックアップされた半導体メモリに記録するプログラム電卓は 1976年発売のhp25cで、私としてはこれがプロ電始まりと考えたいわけです。その僅か2年度に、Casio FX-502P が登場。Casioは凄い...となるわけです。で、未だに稼働する FX-502P を持っている自分の幸運さに拍手喝采!

そんなわけで、先ずは英語のソースを当たり始めていて、Wiki あたりを調べると結構色々あります。で、hp50g が歴史的な製品であるように思えてきています。

RPLだけでなく、UserRPL、SysRPL、それからgcc、本当におっしゃるように何でもあり。SysRPLよりは gccの方が私にはまだ手が届きそう??なので、それが救いなわけです(救いにならないかも...)。

Casio色にすっかりと染まってしまっているので、却って全てが新鮮です。

RPN 自体は、以前ボランティアで、Mindと言う開発言語(FORTHに似たもの)で、簡単なデータベースソフトを作ったことがあって、いわゆる逆ポーランド記法には多少の免疫ができています。

四則演算は、お二方にご紹介頂いたエミュレータでもまぁ使えます。hp50g は、スタックが一覧で見えるのが便利ですね。

但し、RPL と FORTHはまたまた違う感じがしています。きっと頭の使い方の基本は同じなのかも知れませんが、キーストロークの記録って感じと FORTHライクな言語の記述は、ギャップが大きいですね。

土曜は大抵仕事で、合間にブログ書いたりしていますが、日曜はまったりと Tutorialでも読みながら過ごしてみようと思っています。

お勧めのように、先ずはエミュレータで間合いを詰めてから、その先どうするのか、、考えてみようとは思います....まぁ、きっとぽちっlとしてしまうのでしょうが...

akatuki さんのコメント...

やす (Krtyski) 様、お晩です。

> あぁ、やっぱりそうでしたか...ボチボチやってみますね。
> ついでに、ウチのブログのネタにもさせて頂こうかなぁ....

どうぞどうぞ !
記事があってこそのblogですから、バンバンやって下さい !

> 但し、RPL と FORTHはまたまた違う感じがしています。きっと頭の使い方の基本は同じなのかも知れませんが、キーストロークの記録って感じと FORTHライクな言語の記述は、ギャップが大きいですね。

RPLにはLisp要素もチョッピリ入っているので、そこも面白かったりします。