2D言語でのゴルフのヒント


18

2次元プログラミング言語でゴルフをするための一般的なヒントは何ですか?コードゴルフの問題に適用でき、2Dプログラミング言語に固有のヒントを探していますが、特定の言語に固有のヒントはありません(「コメントの削除」や「M操作の使用」などの回答は答えではありません)。

回答ごとに1つのヒントを投稿してください。


この質問はメタにあるべきではありませんか?
ミスターリスター

2
何を:ここに関連するメタの質問がありますされ、2Dプログラムのサイズは?対象エリア?凸包の面積?長方形が含まれる軸の領域?すべては、何らかの形式のASCIIサイズよりも優れた尺度である可能性があります。
MSalters

@MrLister Tipsの質問は、メインサイトのトピックにあります。ご覧になると、すでにtipsタグの下にたくさんの質問があることがわかります。
小麦ウィザード

@MSalters他のすべてのプログラミング言語の長さがバイト単位で測定されるように。一部の言語デザイナーは、HexagonyやCubixなど、2D言語をさまざまな方法で配置することを許可しています。
小麦ウィザード

回答:


19

水平方向の隙間を避ける

多くの場合、コードは、プログラムの左側に空白の大きなギャップを残します。

abc
  d
  e

これは、左揃えで回避できる場合に4バイトを追加します。

cde
b
a

空白の大きなギャップを使用する必要がある場合、それらを水平ではなく垂直にするようにしてください。

########
#      #
#      #
#      #

####
#
#
#
#
#
#
####

11

可能な場合は1つのディメンションを使用します

通常、簡単なプログラムは1行で記述できます。たとえば、古典的なcatプログラムは次のようになります。

>iv
^o<

しかし、ラッピング動作を悪用してこれを行うことができます。

io

または、そのようなラッピング動作のない言語では:

> ?oi<

(想定?はポップしません。)非ラッピング言語の場合、多くの場合、明示的なループの方が適しています。

ジャンプコマンド付き

ジャンプおよび条件付きジャンプコマンドを使用する2D言語では、プログラムは次のようになります。

abc >de?v;
    ^hgf<

これも可能性があります。

abc de?!;hgf04&

!トランポリンであり&、位置にジャンプする場合)


あなたの3番目の例はioiioiioi他のことをしませんか?
ASCIIのみ

@ASCIIのみ おっとっと。
コナーオブライエン

1
おそらく、あまり一般的でないコマンドのいくつかが何をするのかを述べるべきです。例えば、私は何をするのかわかりio;ません、そして私が知っているのはそれ?がポップしないことだけです。これらは魚のコマンドであるように見えますが、私はそれらが非常に標準的であるとは思いません。
小麦ウィザード

2
条件付きスキップコマンドのない一部の2D言語(ラビリンスなど)では、ゼロ除算でプログラムを条件付きで終了することにより、ループする単一行プログラムを記述することもできます。
マーティンエンダー

10

キャリッジリターンがバイトすぎる

作成できる2Dが少ないほど、優れています。キャリッジリターンは別のノーオペレーションです。@ATacoと@ASCIIのみのヒントを無視せずに、Yディメンションをできるだけ小さくしてください。

この

###
####
########

よりも良い

###
###
###
##
#
#
#
#

キャリッジリターンは常にバイトとは限りません。\n(ラインフィード)は、POSIXシステムの左揃えテキストで通常使用される改行コードですが、WindowsおよびMac OS(pre-macOS)は\n(ラインフィード)と\r(キャリッジリターン)の組み合わせを使用します。
wizzwizz4

9

DRY(自分自身を繰り返さないでください)

通常、関数を使用した抽象化はCode Golfでは長くなりますが、2D言語では本当に役立ちます。同じスニペットを再利用できるようにコードを修正し、2つの異なる実行ブランチでコードを入力/終了します。


8

インターリーブパス

通常、2D言語には、方向コマンドに従って移動するIPがあります。スペースは無駄なバイトであるため、プログラムを可能な限り頻繁に左に移動し、不必要なパディングスペースの必要性を節約するために、プログラムを再配置するほうがほとんど常に効率的です。


2

ミラーを使用する

ミラーは、2つのパスで同時に使用されることがあります(各パスはミラーの片側で跳ね返ります)。これは役に立たないように思えるかもしれませんが、プログラムを再配置したり、方向が変わった場合に多くのミラーがある場合、それらをより少ないミラーに置き換えることができます。


2

イディオムを覚える

以下に、言語の性質に応じて特定のことを行う「イディオム」をいくつか示します。

擬似線形コード

動的なコード生成が必要な場合、擬似線形コードモデルを使用すると便利です。

v
\"line 1"
\"line 2"
.
.
\"line N"

彼らが通常行うことを想定\してv意味する。

無限ループ

ほとんどすべての2D言語で><は、無限の壊れないループです。何らかの理由でこれを行う必要がある場合、これはどのように見えても最高です。

>v
^<

実際、コードを1ライナーにする場合は、^またはvをそのまま使用できます。

i?vo;

これによりv、IPが自身に送信され、ラップアラウンドされます。方向コマンドが一連の(相対)no-opsを指す場合でも、このアプローチを使用できる可能性があります。

クインフレームワーク

通常、文字列/引用フレームワークを持つ言語は、次のようなクインを持つことができます。

<quote><generate "><output stack><terminate>

> <>の場合、これは次のようになります。

":1-r>o<#

これを除き、終了としてエラーで終了します。それは恐らく最短の> <>クイン、あるいは少なくとも私が見つけた最短のものです。


これは実際には1つのヒントとは思えません。
小麦ウィザード

@WheatWizard私はそれらを一緒に保ちました。なぜなら、それらを分割することは私にとってあまり意味がなく、すべての一般的なプログラムレイアウトのイディオムでしたからです。
コナーオブライエン

なぜあなたは<> <>クインを持っているのですか?
ジョーキング

@JoKingわからないけど笑
コナー・オブライエン

また、"間違った側になってしまいます。それ以外のヒントは良いです、私は私の一般的なフレームワークを私の答えの多くで使用しました
ジョーキング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.