F-Script 版 Reverse ゲーム

2009年 8月 改訂

記事一覧

      基 礎
  1. F-Script で Cocoa 探検 [原文]
  2. F-Script を20分で学び、Core Image で遊んでみよう [原文]
  3. F-Script で Cocoa スクリプティング [原文]
  4. F-Script で Cocoa クラスを創る [原文]
  5. F-Script で Mac の様々なアプリケーションを操作する [原文]
  6. Cocoa アプリケーションに F-Script を埋め込む [原文]
  7. F-Script で Mac OS X のフレームワーク群にアクセスする [原文]
      その他
  1. Cocoa と F-Script で Google Chart API をいじってみよう [原文]
  2. F-Script 版 Reverse ゲーム [原文]

Paul Bissex が、様々な言語で、Reverse ゲームを どのように実装できるか について 書いて いる。

Reverse ゲームは、ある数の並びを、左から右に数値の順番になる様に並べ替えるゲームだ。 並べ替えるには、コンピュータに、(左から数えて) 何個の数の並びを反転 (reverse) せよ と指示する。 例えば、もし現在の並びが 2 3 4 5 1 6 7 8 9 だとすると、4個の数を反転 (reverse) すれば、その結果は 5 4 3 2 1 6 7 8 9 になるだろう。 さあ、5個の数を反転 (reverse) すれば、あなたの勝ちだ。

ここに F-Script で書いたバージョンがある。

numbers := (9 random:9) + 1.
steps := -1.

flip := [:flipCount| 
    numbers at:flipCount iota put:(numbers at:flipCount iota) reverse.
    steps := steps + 1.
    (numbers isEqual: 9 iota + 1) ifTrue:['Done! That took you ' ++ steps printString ++ ' steps.']
                                  ifFalse:[numbers]
].

flip value:0.

このプログラムを実行すると、F-Scriptは、最初の数のリストを表示する。 F-Script の精神に則り、このゲームとの遣り取りは F-Script 自身を使って行おう。 反転させる要素の個数を引数にして、flip ブロックを評価することでプレイするのだ。 ゲームはこんな具合に終了する:

...
{3, 1, 2, 4, 5, 6, 7, 8, 9}

> flip value:3

{2, 1, 3, 4, 5, 6, 7, 8, 9}

> flip value:2

'Done! That took you 9 steps.'

これで対話的にプレイするのも良いが、ゲームの実装が手元にあるのだから、ゲームを自動実行する(しかも勝てる)プログラムを書いて楽しむこともできる。 以下に示すのは、そんなプログラムの一つ だ。 ゲームが完了すると、ゲームの各段階の詳細と勝つまでに要したステップ数を表示する。

sorted := numbers at:numbers sort.
unsortedCount := numbers count.
journal := {numbers copy}.

[numbers isEqual:sorted] whileFalse:
[
    maxIndex := numbers indexOfObject:(numbers at:unsortedCount iota) \ #max: .
    maxIndex + 1 = unsortedCount ifFalse:
    [
        maxIndex = 0 ifFalse:[flip value:maxIndex + 1. journal addObject:numbers copy].
        result := flip value:unsortedCount.
        journal addObject:numbers copy.
    ].
    unsortedCount := unsortedCount - 1.
].

journal printString ++ '\n' ++ result.

このプログラムは、以下の手続きに基づいている。


Copyright © 2006-2009 Philippe Mougin
Translation-ja © 2012 Hideo Haga [日本語版]