フォースでのゴルフのコツ


10

Forth(およびそのクローン)でゴルフをするための一般的なヒントはありますか?Forthに少なくともいくらか特有の一般的なコードゴルフ問題に適用できるアイデアを探しています(たとえば、「コメントの削除」は回答ではありません)。

回答:


3

すべてのコストで明示的なループを回避する

Forthには、2つのループ構造、x y do... loop、およびあまり知られていない[begin]... [until] x yxあります。ここで、およびyは、それぞれ制限とインデックス、または注意すべき条件の値です。

これらは非常に遅く、非常に冗長(ハハ)で全体的にかなり膨らんでいるので、必要な場合にのみ使用してください。

代わりに、適切な関数型言語(実際にはForthです)のように、明示的なループよりも再帰性を優先する必要があります。これは、ループが短くなる傾向があり、言語をより効果的に使用するためです。


3

ジャンクを残します

プログラムはスタックセーフである必要はありません。

代わりに、バイトを節約できる場合、スタックに余分なジャンクを残すことができます。Forthでは、「戻り値」がスタックの上に何かを残しています。再帰を使用している場合やスタックの深さが重要でない限り、スタックのどのジャンクより下にあるかは関係ありません。


2

フォース持つ多く PPCGで発見するアルゴリズムの種類を作り上げるために有用であるその多くの単語、組み込みクールなのを。

これの悪いが説明的な例は、インクリメント(1+)とデクリメント(1-)の単語です。1 +スタックの先頭をインクリメントするために、上書きで1バイトを保存します。

Additonally、ここのような近代的なディストリビューションに見られる多くの便利なリストは、(おそらくすべてではない)の言葉ですgforth


1

スタックを見る

コードを書くときは、各コマンドでスタックで何が起こるかに注意してください。私は通常、次のようにそれを引き出します:

6       6
7       7 6
* DUP   42 42

あなたはこのように行くとして、あなたはあなたのようなスタック操作を利用することができたときに、それが簡単に認識するかもしれませんROT-ROT2DUP2OVER、等...


1

さまざまなダブルセルの単語を使用してみてください

これには、ダブルセル演算ビット単位数値比較スタック操作ワードが含まれます。ダブルセル整数リテラルもカウントされます。

  • 整数リテラル(たとえば1.)にピリオドを追加すると、ダブルセルリテラルが得られます。数値が小さい場合は、1バイトだけのコストでゼロを追加することを意味します。
  • m+= 0 d+〜= under+(正確にはありません。オーバーフローが発生する可能性があるためです。)
  • d2*およびd2/抽出するために使用することができた/ワードから1ビットを押します。
  • a b c d d= = a c = b d = and
  • a b c d d<> = a c <> b d <> or
  • 2つの数値を一度にコピーする単語(例:)2dup2over2tuckローカル変数に勝つ可能性が高くなります。

0

(gforth固有)個別の浮動小数点スタックを利用する

gforthには、浮動小数点数用の個別のスタックがあります。整数のみを処理している場合でも、明示的なスタック操作を回避するか、メインスタックでは使用できないFP固有の操作を使用することにより、一部の作業とストレージをFPスタックにオフロードすると、コード全体が短くなる可能性があります。FPスタックに戻ることも完全に有効なオプションです(タスクがブール値を返す場合を除く)。

  • FP-関連オペレーション(演算、スタック操作)は、通常、(各バイトつ以上の費用fのようプレフィックスf+fdup等)。FP数リテラルは、一の以上のバイト(接尾コストeのように、1e)が、いくつかの数字は、ネクタイや偶数バイト(例えば保存することができます1e3代わりに1000)を。
  • FPスタックで欠落している操作がいくつか1+あり1-ます。おそらく最も痛い存在です。
  • FPスタックの固有の操作には、f**(累乗)、falog(10の累乗)fsqrt、およびさまざまなexp、log、三角法に関連するものが含まれます。
  • s>f(シングルからフロート)、f>s(フロートからシングル)、d>f(ダブルからフロート)、f>d(フロートからダブル)を使用して、メインスタックとFPスタックの間で数値を移動できます。時々、「ダブル」バリエーションは、追加のゼロを生成または消費するために使用される場合があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.