Japtでのゴルフのヒント


18

コードゴルフに完全に夢中になった今、おそらくいくつかのゴルフ言語を習得しようとしています。

JavaScriptでほぼ独占的にプレイしていることを考えると、Japtそもそも論理的な言語のようです。次の機会にドキュメントに飛び込みますが、その間、以下の回答にJaptに関するヒントを投稿してください。

私は一般的にJaptとゴルフ言語の初心者なので、可能であれば、ヒントをJavaScriptに「翻訳」できれば、それが物事を理解するのに役立つ大きな助けになります。


これを投稿してくれてありがとう。ある時点でJaptを再設計したいので、これを行うことを保留していましたが、それはすぐには起こらず、おそらくとにかく多くのヒントを台無しにしないでしょう。自分へのヒント:チュートリアルを書く:P
ETHproductions

Japtチャットルームを訪問することを忘れないでください:)
オリバー

回答:


11

JavaScriptからJaptへの移行

ご存知かもしれませんが、JaptはJavaScriptの短縮された拡張バージョンです。Japtを作成したのは、やなどの長いプロパティ名String.fromCharCode(x)Math.floor(x)、範囲の作成などの作業の退屈さにうんざりしていたためです。JavaScriptからJaptに移行する際に知っておく必要がある最低限の条件は次のとおりです。

  • Japtは、翻訳された言語です。JaptコードはJavaScriptにトランスコンパイルされ、JSとして実行されます。(私はあなたがコンパイルされたと言うことができると思いますが、トランスパイルはよりヒップに聞こえます。
  • デフォルトでは、すべてのエントリは完全なプログラムです。入力が暗黙のうちに解析され、そして最初の6つの入力変数に入れUVWXY、およびZ、完全な配列はに格納されますNます。最後の式の結果は自動的に出力されます。
  • すべての大文字は変数であり、トランスパイルしても同じままです。ほとんどのプリセット値は、Japtドキュメント(「インタープリター」)の「変数」セクションにあります。
  • 小文字はすべてプロトタイプ関数またはメソッドです。Japtは、数値、文字列、配列のメソッドa- z(およびà- ÿ)を追加します。あなたはこれらの文字のいずれかを使用すると、JAPTは埋め.(UcJaptのU.c(JavaScriptの場合は、のタイプに応じてceil、charCodeAt、またはconcatを意味しUます。これは、Japtのパワーのほとんどが由来する場所です。これらのメソッドの完全なリストは、Japtドキュメントの「_____ functions」セクションにあります(インタープリター))ます。
  • スペースはを表し)、を)表し))ます。これは、私がJaptを最初に設計したときに、できるだけ多くのバイトを節約したかったためです。(私見Us w nよりは良く見えますがUs)w)n)。)
  • 関数はとして示されます。ABC{...}ここではABC、変数の任意の文字列です。関数はJSの場合とほぼ同じように機能し、主な違いは最後の式が自動的に返されることです(returnES6のかっこを使用したり、空想したりする必要はありません)。
  • 'は、単一の文字列(つまり'a、と同じ"a"#を示し、次の文字コードを取得して、その番号(#eと同じ101)になります。
  • $トランスピレーションプロセス中、ドル記号の間はすべて同じままです。forたとえば、Japtにはループがないため、これを使用してループを実装できますが、他のメソッド(m文字列や配列、o数値など)を使用することをお勧めします。
  • 一般的にJSで使用されるほとんどの他の文字- 、""0-9(+=など- transpiledとき(ほとんどの部分は、とにかく)同じまま。

基本的なJaptコードを作成するために知っておく必要があるのはそれだけです。Japtで最大のゴルフ力を達成するには、より多くの知識が必要ですが、それは他の回答でも確認できます。


基本的な例を次に示します。ASCII文字列を取得し、それぞれを16進文字コードに置き換えたいとします。JavaScriptでこれを行う方法は次のとおりです。

U.split("").map(x=>x.charCodeAt(0).toString(16)).join("")

Japtに変換します。.split("")JSにと等価であるq""だけで、さらに短いJAPTで、またはq.join("")またq、違いは、オブジェクトが文字列ではなく配列であることです。.map(is m.charCodeAt(is c、および.toString(is sです。したがって、Japtコードは次のようになります。

Uq mX{Xc0 s16} q 

ただし、Japtでは、m配列と同様に文字列でも機能するため、両方qのs を削除できます。

UmX{Xc0 s16}

オンラインでテストしてください!「JSコード」ボックスに表示されているように、これは次のものに直接変換されます。

U.m(function(X){return X.c(0).s(16)})

Japtの使用方法を学習するにつれて、JavaScriptの相互変換にますます集中しなくなり、Japtを独自の言語としてコーディングできるようになります。JavaScriptの部分を完全に省いた説明を次に示します。

UmX{Xc0 s16}
               // Implicit: U = input string
UmX{       }   // Take U, and replace each character X with the result of this function:
    Xc0        //   Take the char-code at index 0 in X (the first and only one).
        s16    //   Convert this to a hexadecimal string.
               // Implicit: output result of last expression

別のステップを示すことをお勧めします:ユニコードショートカット。この場合、2Bを一緒に保存できます。また、最後に特定のものを除外できることを追加することもできます。それは別のバイトを節約します。
ルーク

優れた入門書、ありがとう、ETH。いくつかの簡単な課題に着手するのに十分だと思います。
シャギー

これをこれまでにREADMEから収集したものと組み合わせて、上記の例をさらに短縮できることは正しいでしょうUm_c s16か?
シャギー

または、さらに短く:¡Xc s16
シャギー

1
@Shaggy正解です!男、あなたはこれをすばやく理解しました;-)おそらく他の答えとして、基本的なJaptゴルフのヒント(Unicodeショートカットなど)を追加します。
ETHproductions

8

文字列配列の圧縮

更新:このティップで紹介したツールは、書き直され、改善され、Japtインタープリターに統合されました。最良の結果を得るには、以下にリンクされている圧縮機よりもその圧縮機を使用することをお勧めします。時間があればこのヒントを再確認し、新しいコンプレッサーを念頭に置いて書き直します。

前書き

コードに文字列の配列がある場合、それを圧縮する最も明白な方法は、各文字列をOc個別に実行することです。このヒントの目的のために、["lollipop","marshmallow","nougat","oreo"]最初は42バイトの重さの配列を使用します。各文字列を実行すると、次のことOcがわかります。

[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]

これで33バイトになり、かなりの節約になります。


ステップ1

しかし、私たちはもっとうまくやることができます。配列を改行で区切られた文字列に結合すると、角かっこ、コンマ、および無関係なバックティックを取り除き、改行で分割して配列を取得できます。これをサンプルの配列に適用すると、次のようになります。

`lo¥ipop
Ú\hÚaow
Í
eo`·

現在26バイトまで。


ステップ2

しかし、私たちはもっとうまくやることができます!改行の代わりに小文字を使用して文字列を区切ることができます。改行は圧縮に含まれる場合があります。zはどの文字列にも使用されていないため、ドロップインして、どのように処理するかを見てみましょう。

`lo¥ipopzÚ\hÚaowzÍzeo`qz

ああ、ナッツ-そこに改善はありません。バイトカウントが1つ増えました。使用できる別の文字があるかもしれませんが、文字列によっては、試してみる必要のあるものがかなりありますb,c,d,f,j,k,q,v,x,y,z。この例では11:です。それぞれを試してみるのは非常に退屈です。この便利なツールの出番です。改行で区切られた文字列をフィードすると、どの文字も含まれていない各文字で文字列を区切って出力しようとします:

  • 最短の圧縮文字列、
  • 使用する区切り文字、および
  • その長さ。

サンプル文字列を実行するとb、最良の結果が得られます。

`lo¥ipáæqrÚaowbÍÞo`qb

そして、あなたはそれを持っています、私たちはわずか24バイトになりました


ステップ3

しかし、私たちはさらに良くすることができます!配列内の文字列の順序が問題にならない場合は、さらに短い組み合わせで、異なる区切り文字と組み合わせた異なる並べ替えがある可能性があります。ただし、それぞれの可能性を試すことは、はるかに退屈です。4つの文字列では、24種類の組み合わせを試すことができます。264になる11の可能な文字のそれぞれで!そこで、このツールが役立ちます。繰り返しますが、改行で区切られた文字列をフィードすると、すべての順列とすべての区切り文字のすべての組み合わせが試行され、出力されます:

  • 最短圧縮文字列内の文字列の順序、
  • 圧縮された文字列、
  • 使用する区切り文字、および
  • その長さ。

サンプル文字列を実行"nougat","oreo","lollipop","marshmallow"するbと、区切り文字としてwith を使用すると最良の結果が得られ、最終バイト数はわずか23になります。

`ÍÞo½o¥ipáæqrÚaow`qb


おまけのヒント:整数配列の圧縮

最初にそれぞれをより高いベースに変換することにより、整数の配列に同じ原理を適用できます。このサンプルを使用して、36バイト配列:

[588181,156859,595676,475330,680474]

最初に32バイト文字列の配列に変換してから最初の圧縮プログラムで実行することで、29バイトまで減らすことができます。

`huclt4p5r5ÛÊg62tkogq`qt mnH

または、2番目のプログラムを使用して27バイトまで低くします。

`4p5Ïcl5ÛÊg62tkogq`qt mnH

整数変換を既に配列で実行しているメソッドに移動することで、さらに1バイトまたは2バイトを保存できる場合があります。


ノート

  1. 1バイトまたは2バイトの余分なバイトq<letter>(<space>)コストを考慮することを忘れないでください·。ただし、区切り文字によっては、Unicodeショートカットのいずれかを使用してバイトを戻すことができる場合があります(たとえば、と同じql<space>です)。
  2. 最後のツールを使用する際の注意事項:文字列が多いほど、順列が多くなり、プログラムの実行が遅くなりますが、最終的には無駄になります。上記で詳しく説明したように、4つのサンプル文字列と11の可能な文字を使用すると、264の可能な組み合わせがあり、同じ11文字で文字列の数を1増やすだけで、すでに1320の組み合わせを試すことができます。(必要に応じて、このツールを使用し組み合わせの数をカウントできます)。

クレジット

  • このヒントにあるツールを作成するためのインスピレーションについては、オリバー。
  • 校正のためのETHproduction。

6

文字列の圧縮

Japt(現在)は、文字列の圧縮にshocoライブラリを使用しています。一連Ocの小文字が含まれている限り、を使用して任意の文字列を圧縮できます。

Oc"Hello, World!"

これは出力します HÁM, WŽld!Ž技術的には印刷できない文字です)。これをバックティックでラップすることで解凍できます:

`HÁM, WŽld!`

オンラインでテストしてください!

または、Od関数を使用して任意の文字列を圧縮解除できます。これは通常は便利ではありませんが、目的があります ...


ですから、「Hello、World!」に答えていたら 挑戦、私はちょうど使用するHÁM, WŽld!か、それはバッククォートで囲まれる必要がありますか?私は後者を推測しています。
シャギー

2
@Shaggy質問に答えるときは、すべてのコードを含める必要があるので、それは `HÁM、WŽld!このケースで
マルタインVissers

6

文字コードによる数字の短縮

Japtでは、を使用し#、その後に文字を続けて文字コードを作成できます。これは、長い数字を短くするときに便利です。

@ETHproductionsが述べたように、これは、UTF-8に切り替えない限り、100〜255の範囲の3桁の実行でのみ機能します。

例:

123 に短縮することができます #{

101 に短縮することができます #e

これらを連結することもできます:

123101 に短縮することができます #{#e

String.fromCharCode(123)JavaScriptまたは123dJaptで使用して、適切なキャラクターを見つけることができます。

String.fromCharCode(123) 戻り値 {


ありがとう、@ obarakon、ボールを転がすための素晴らしいヒント。String.fromCharCode()は、バイトカウントを増やすことができる(多くの!)厄介な長いJSメソッドの1つです。おそらく、これらは整数と見なされますか?つまり、123ソリューションで整数が必要な場合は、#{バイトを保存するために使用できます。
シャギー

1
はい、これらは整数です。-Q入力ウィンドウにフラグを追加すると、出力タイプをよりよく表示できます文字列配列などを囲む引用符
Oliver

1
String.fromCharCode(123)JavaScript で動作することを言及する必要がありますが123d、同じ結果を得るためにJaptで行うことができます;-)また、これは範囲内の3桁の実行でのみ動作します100- 255(UTF-8に切り替えたくない場合)
ETHproductions

@ETHproductions良い電話、更新されました!
オリバー

5

クイックヒント:空の配列 []

Japtには、空の配列の定数がありますA。ただし、それにアクセスするには、;プログラムにセミコロンを追加して、Japtの代替定数を使用する必要Aがあります10。そうでない場合はになります。だから、使用して;A、実際には、以上の節約0バイトを提供しています[]が、されますあなたを救うあなたが変数(例えば、にあなたの配列を割り当てる必要がある場合バイトA=[])。

ただし、プログラムが入力を受け取らない場合(だけ)、入力の配列であるN変数を使用して、1バイトだけで空の配列にアクセスできます-入力なしでは、空になります。ここで試してみてください

これには、プログラムでデフォルトの定数値を使用できるという追加の利点もあり、場合によっては、および;Aのショートカットのおかげでプログラムが入力を受け取っている場合でも、使用するバイト数を節約できます。s1s2


2
うわー、私はN良いアイデアを使用することを考えていませんでした。
ETHproductions

2
いいね、@ Shaggy!
オリバー

4

JavaScriptの評価

Japtでは、ラップして生のJavaScriptを実行できます。 $...$

例えば、 $alert("hello world")$

これは、Japtのオートクロージング$)

$alert("hello world")$ に短縮することができます $alert("hello world"

JavaScriptの圧縮

JavaScriptを圧縮することもできます Ox

あなたが使用したいというJavaScript関数がある場合、たとえばscreen.width、あなたは文字列を圧縮することができます"screen.width"使用してOc、その後、 `... Ox`の間に結果を挿入します

Japtの後に他の何かが続かない場合は、引用符を閉じる必要がないことに注意してください。


@Shaggy Ox文字列を評価する必要があります。それ以外の場合は、テキストを出力するだけです"screen.width"
オリバー

4

旗を知る

あたりとして、最新のメタコンセンサス(2017年12月)、コマンドラインフラグはもはやバイトにカウントされません。Japtには、入出力の特別な処理のための多くのフラグがあるため、これは本当に素晴らしいニュースです。

Japtで使用可能なすべてのフラグを、評価の順に以下に説明します。同じグループ内のフラグは互いに排他的です。異なるグループ内のフラグのようなもので、その結果、組み合わせて使用することができることに注意してください。この :)

mdefæ

プログラム全体が最初の引数(U)にマッピングされます。

さらに引数が存在する場合は、そのまま渡されます(つまりペアごとにマッピングされません)。それ以外の場合、2番目の引数はインデックスで、3番目は配列と同様に配列全体U.mです。Uが数値の場合、範囲に変換されます。文字列の場合、文字の配列に変換され、結果が結合されます。

  • -m:上記を適用し、他には何も適用しません。
  • -dtrue何らかの結果が真実かどうかを返します。falseそうでなけれ。
  • -etrueすべての結果が真実である場合に戻ります。falseそうでなけれ。
  • -f:の要素の配列を返します U結果が真実ある。
  • -f最初の要素を適用して返します。

gh

指定されたインデックスの要素を取得します。

  • -g:最初の要素(インデックス0)を取ります。
  • -gX:インデックスの要素を取得します X(正の整数も可能)。
  • -h:最後の要素を取ります。

結果をブール値に変換します。

  • -!:ブール値を適用しない。
  • :2回ではなくブール値を適用します(真実性を返します)。

N

結果を数値に変換します。単項プラスが使用されます。

PRSQ

ある種の文字列に変換します。

  • -P:配列をで結合し""ます。
  • -R:配列をで結合し"\n"ます。
  • -S:配列をで結合し" "ます。
  • -Q:適用JSON.stringify(配列だけでなく、任意のオブジェクト)。

x

関数xを出力に適用します。(文字通りx、「単一の小文字アルファベット関数」ではありません。)

  • 配列:合計。
  • 文字列:両端からトリムします。
  • 数値:整数に丸めます。

2
ただし、フラグの使用はJapt提出としてカウントされず、Japt-with-those-specific-flags-language submissionとしてカウントされることに注意してください。
Nit

3

Unicodeショートカット

以下のような1つだけのASCII文字に保存することができませんJAPTで多くの一般的な構造、ありますqS p2 mX{、などだから、これを回避するには、JAPTは範囲内の文字である「Unicodeのショートカット」を、持っています\xA1- \xDE¡- Þ)これらの一般的な構造に拡張されます。これらの完全なリストは、インタープリターのドキュメントにあります。

また、機能の構築を支援する@ためのXYZ{、およびの_略ですZ{Z。それでは、別の答えからサンプルプログラムをゴルフしましょう:

UmX{Xc0 s16}

第一に、私たちは置き換えることができX{X_、私たちを与えます、:

Um_c0 s16}

次にm_®別のバイトを保存して置き換えることができます。

U®c0 s16}

それとも置き換えることができX{@、私たちを与えます、:

Um@Xc0 s16}

これにより、¡ショートカットを使用して2バイトを保存できます。

¡Xc0 s16}

これらの2つのパスの一方は、もう一方よりも1バイト短くすることができます。どれがわかりますか?


1
®c s166バイト-クッキーを獲得できますか?!
シャギー

@Shaggyよく見るともう1バイト節約できます...;)
ETHproductions

そうでしょう®c sGか?
シャギー

1
うん!私はあなたが行くことができる限り低いと思います。よくやった!:-)
ETHproductions

2
これらを振り返ってみると、数か月のうちにJaptの進行が見られました。これは、で実現できますcsG
シャギー

3

プリセット変数を活用する

変数はA- SJAPTに表現するために、複数のバイトを取る共通の値にプリセットされています。

  • A- G10- 16です。
  • His 32Iis 64Jis -1Lis 100です。
  • Kとして定義されnew Date()、さまざまな方法で操作できます。
  • MOは、さまざまな便利な機能を持つオブジェクトです。詳細については、ドキュメントをご覧ください。
  • P空の文字列、Q引用符R、改行です。Sスペースです。
  • Tはに設定されているため0、必要に応じてアキュムレータとして使用できます。

プログラムの最初の文字がセミコロンの;場合、A-L次のようにリセットされます。

  • A 空の配列です []です。
  • B"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  • C"abcdefghijklmnopqrstuvwxyz"
  • D"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"
  • E"[a-z]"、そしてFあります"[A-Za-z]"(これらを正規表現機能として追加する前に便利です)
  • Gis 36His 65、およびIis 91(アルファベットの範囲に有用)。
  • J単一のコンマです。L、単一の期間。

今日では唯一ABC、およびDこのリストからは本当に便利です。最大256個の2バイト変数を許可するより優れたシステムを追加することを計画しています。これらの変数は、これらの値などに事前設定されます。


3

自動機能を使用する

あなたが最も可能性が高い、すでに知っている@し、_ためのショートカットですXYZ{し、Z{Zでカバー(それぞれ、Unicodeのショートカット回答で説明されています)。ただし、関数をさらに短くすることもできます。

文字の配列があり、各文字をその文字コードにマップするとします。次のいずれかでこれを行うことができます。

mX{Xc} 
m_c} 

しかし、より良い方法があります。メソッドまたは演算子が別のメソッドまたはaの後の最初の項目(である場合、文字列に変換されます。したがって、これらの2行は同等です。

r'a'b  // Replace all "a"s with "b"s; transpiles to .r("a","b")
ra'b   // Does the same thing, 1 byte less; transpiles to the same thing

しかし、それは私たちの機能にどのように役立ちますか?さて、関数を受け入れるほとんどのメソッドは、メソッドまたは演算子を表す文字列が与えられると、それを関数として解釈します。つまり、これも実行できます。

m_c}  // Map each item to its char code
m'c   // Does the same thing, 1 byte less
mc    // Also does the same thing, 2 bytes less

これらを「自動機能」と呼びます。いくつかの異なる種類があります。

  • m@Xc}mc
  • m@Xc1}mc1
  • m@X+1}m+1
  • m@1+X}m!+1
  • m@2pX}m!p2

うまくいけば、あなたはアイデアを得ます。引数を交換するには、メソッドまたは演算子の前にを付けるだけ!です。


ここで、自動機能を使用すると、ショートカットを使用することでさらに節約できることに注意する価値がありますか?例えば、m@2pXÃm!p2<space>m!²
シャギー

わあ!私はマップで文字列を使用することを考えていませんでした、それが可能であることさえ知りませんでした。これにより、今後数バイトの節約になるでしょう。
RedClover

@Soakuさん、あなたがJaptで回答してきたことを何とかして見逃しました。これまで使用して楽しんできたことを願っています。質問、提案がある場合、または単に話したい場合は、お気軽にJaptチャットルームに参加してください(Githubは通常最初の2つでも機能します;))
ETHproductions

3

暗黙的な変数の割り当て

Japtで新しい行を開始するたびに、前の行の結果が入力変数(U- Z)の1つに自動的に割り当てられ、最初の行はU、2番目Vなどです。

例を見てみましょう。2つの配列を作成して、1から10までの数字を含み、もう1つにそれらの正方形が含まれるようにします。これを行う長い道のりは次のようになります。

U=Aõ V=Um² [do something with the arrays]

ただし、自動変数割り当てを使用すると、次のように短縮できます。

Aõ
Um²
[do something with the arrays]

そこに4バイトを保存しました。1-10の配列が割り当てられているので、しかし、この例では、我々は1より多くのバイトを保存することができますUし、U特定のシナリオでは省略することができます

Aõ
m²
[do something with the arrays]

注意

このヒントで注意することの1つは、後でプログラムで必要になる可能性のある入力変数を上書きしないことです。これは、先頭に1つ以上の空行を残すことで回避できます。次の例では、2つのアレイは、変数に代入するVW、代わりにUV


Aõ
Vm²
[do something with the arrays]

3

Javascriptを知っている

JaptコードはトランスコンパイルされたJSとして実行されるため、JS演算子と組み込みメソッドを十分に理解すると、Japtコードの一部をゴルフするのに役立ちます。

関連するJSのヒント

[]Vm@...
...
  • 短絡
  • 数字で分割する
    • これは、数字ではなく文字列を受け入れる任意のメソッドに一般化できます。そこで渡された数値は暗黙的に文字列にキャストされ、しばしばバイトを節約します(例:0over '0)。

関連するJS組み込み関数

関数の引数に渡されるパラメーターを詳しく調べます。

文字列メソッドの場合、gフラグ付きまたはフラグなしで文字列または正規表現を渡す場合の動作の違いを知っておくと便利です。

  • String.prototype.match
    • 関連するJaptメソッド: String.f/o
  • String.prototype.search
    • 関連するJaptメソッド: String.â
  • String.prototype.replace
    • 関連するJaptメソッド: String.e/k/r
    • 以下のためにe/r第二引数として関数を渡すと、OKで、関数のパラメータを理解することを強く奨励されます。

3

必要に応じて複数行を使用する

それほど難しくないほとんどの課題については、組み込み関数を適用するシーケンスとして、Japtの1行だけでソリューションを表現できます。しかし、より複雑なものでは、ループ構造、再帰、または大量のコードを再利用する必要があります。これが複数行プログラミングの出番です。

閉じ括弧を削除する

タスク:数値の配列を指定して、各要素をインデックスの2乗とペアにし、合計でソートします。

[5,1,17,9,3] => [[5,0],[1,1],[17,4],[9,9],[3,16]] => [[1,1],[5,0],[9,9],[3,16],[17,4]]

1行のソリューションはですがíUm@Yp2})ñx})2バイトかかります(1バイトのショートカットはありません)。})末尾ñxを次の行に移動するだけで削除できるため、コードは次のようになります。

íUm@Yp2
ñx

変換されたJSは次のようになります。

U = U.í(U.m(function(X, Y, Z) { return Y.p(2) })); U.ñ("x")

これは、1行のソリューションと同じことを行い、中間結果をに戻すことを明確に見ることができUます。

暗黙的な引数を使用した再帰

再帰関数ßUVWXYZ、指定されていない場合、すべて暗黙パラメータとして使用します。U明らかにメインの入力ですが、VWXYZ必要な他の値を追跡するためにどれでも使用できます。たとえば、次のようなことができます。

(modify input and implicit assign to U)
(modify V and implicit assign to V)
(test something and call ß without arguments; U and V are passed automatically)

あるいは、必要なのが一時変数だけである場合(T=...)、変数としてのようなインライン割り当てを使用できますT(0)はほとんど使用されないため。

長い関数を再利用する

このため、良いタスク例を思いつくことはできないと思うので、このヒントが使用された唯一の解決策を参照しいくつかの一般的なアイデアの概要を説明します。

  • 関数を再利用するには、変数に保存する必要があります。function-opener {で行を開始する@_、ジョブを実行します。または、(T=@...})より複雑な行の中に関数の割り当てを埋め込むなどのこともできます。
  • ストアド関数を呼び出すことは実際には簡単ではありません。仮定Vの関数であり、我々は呼び出したいV(U)JSに。VUそれは単にを意味するため、動作しませんV,UV(Uどちらでもありません。それV,(U)です。関数メソッドでさえあまり役に立ちません。私たちが見つけた最良の方法は次のとおりです。
    • [U]xV (map and sum)結果が数値の場合
    • UmVif Uが単一の文字でありV、文字列を返す、または
    • $V($Uまたは[U]mV g一般的に。
  • ただし、それを使用したマッピングまたはループはかなり簡単です。配列にマッピングするには、を使用しますUmV。を満たす最初の整数を見つけるにはV、を使用しますVa

2

自動機能で楽しい

ETHの自動機能に関する一般的なヒントのフォローアップとして、このヒントでは、それらを使用して達成できるバイト節約のトリックのいくつかの具体例を紹介します。


配列の最大の整数を取得します。

[3,1,4,2]変数に割り当てられた配列があり、Uそこから最大数を取得したいとします。我々は可能性の配列をソートしてから最後の要素をポップすることにより、4バイトでそれを実行します。

Un o

それの欠点は、元の配列を変更したことです。U今で[1,2,3]は常に望ましいことではない可能性があります。幸いなことに、配列を変更せずに1バイト短くする方法があります。

Urw

そこで実行したことは、wメソッドを使用して配列を縮小します。このメソッドは、整数で使用すると、整数とメソッドの引数のうち大きい方を返します(例:を2w5返します5)。上記のように同等ですUrÈwYUrXY{XwY}。ただし、配列内のすべての整数が負の場合、このヒントは機能しないことに注意してください。


1
サイドノート:配列の最小値と最大値を取得する関数を追加する予定ですが、おそらくv2のみです。
-ETHproductions

2

ときではない使用しますí

íは、zip2つの配列または文字列をペアリング(またはs)し、オプションで関数を介して各ペアをマッピングする便利なビルトインです。ただし、現在、不均一な配列または文字列を指定した場合、いくつかの小さな問題があります。

  • 最初の配列に2番目の配列よりも多くの項目がある場合、2番目の配列に存在しない項目はとして与えられundefinedます。
  • 2番目の配列に最初の配列よりも多くの項目がある場合、最初の配列の最後で処理を停止します。

これにより、たとえば、2つの不均等な文字列を比較し、各ペアからより高いコードポイントを持つcharを取得することが難しくなります。それUがより長いものになるとわかっていても、この単純なタスクを解決するのにまだ多くのバイトがかかります:

UíUç hV @[XY]n o

代わりにできることは、入力を2つの文字列の配列として受け取り、配列を転置しyから、各行を正しい結果にマッピングすることです。

Uy m_q n o

これには、短い文字列に常にスペースを埋め込むという利点があり、両方の文字列全体を簡単に調べることができます。

実際の例:12


2

ASCII範囲を生成する

更新:JaptにASCII範囲の定数が追加されました。の代替値、Eでアクセス可能;。Japtの定数の詳細については、このヒントを参照してください。

Japtには(まだ)ASCII範囲が組み込まれていませんが、わずか5バイトで文字の配列を生成できます。

95odH

それを試してみてください


使い方

95o[0,95)各要素が自動関数 dを介して渡される範囲を作成します。自動関数は、数値で使用すると、そのコードポイントの文字を返します。dこの場合、メソッドに引数として数値を渡しますHは32のJapt定数)を渡すと、変換される前に元の数値に追加されます。

JavaScriptの同等のソリューションは次のとおりです。

[...Array(95)].map((_,x)=>String.fromCharCode(x+32))

ランダムなキャラクター

ASCIIの範囲内のランダムな文字を取得するには、使用ö範囲から乱数を返す代わりに[0,X)Xそれは上で実行されている番号です。

95ö dH

または、複数のランダムな文字の配列を取得するには、必要な文字数をの引数として渡しますö。以下は10文字を返します。

95öA mdH

1

不要な構造文字を削除する

構造的な文字で、私は意味{}()$でも、"`。通常、これらの文字は、プログラムの最後(例えばUmX{Xc +"; "} -> UmX{Xc +"; )で発生する場合はいつでも削除できます。

さらに、次の場所に表示される場合は、括弧またはスペースを削除できます。

  • セミコロン;(またはプログラムの最後)まで。
  • 右側に{(ひいては、@)、または[、左の]若しくは}

また、引数を区切るためにコンマが必要になることはほとんどありません。ABたとえば、を記述した場合、Japtはあなたが意味することAB別個に知っていることを知っています。のような2つの数値リテラルを区切るのに本当に必要なのはコンマだけUs2,5です。

最後に、あるかどうUプログラムの開始時または後{;、メソッド呼び出し(小文字または関連Unicodeのショートカット)、または任意のバイナリ演算子を除く続く+-*&==、など)、あなたが削除することができますU保存しますバイトとJaptが挿入します。


Uプログラムの開始時でなくても省略できる他のインスタンスをいくつか見つけました。
シャギー

@Shaggyそうそう、それは{orの後でも動作し;ます。あなたが知っている他のものはありますか?(この機能をコーディングしてからしばらく経ちました:P)
-ETHproductions

それらを私の頭上から考えることはできません。明日コンピューターに戻ったらまたチェックします。
シャギー

1

配列の最後の要素を変更する

配列の最後の要素を変更する必要がある場合があるため、ここで簡単な方法を説明します。アレイで作業します[2,4,8,32]入力変数に割り当てられますUを操作し、最後の整数(32)を2で除算します。

これを実現する明白な方法は、この9バイトのソリューション( Demo)を使用することです。

UhJUgJ /2
  • hnxインデックスの要素nxます。
  • gn インデックスの要素を返します n
  • J はJapt定数です -1。これは、Japtの負のインデックスのサポートのおかげで、配列の最後の要素を操作できるようにします。配列のサイズがわからない場合に便利です。
  • そして/2、単に2で除算されます。

したがって、上記-1では、配列のindexの要素を-1、配列のindexの要素を2で割った値に設定しますU[3]=U[3]/2。あなたがそのようにそれを書くとき、それはそれについて行くにはあまりにも長すぎる方法のようです。幸いなことに、そこにある短い方の方法は、配列から最後の要素をポップし、変更して、配列に戻すことができます。これらの各操作を個別に実行すると、9バイト以上かかりますが、7バイトで一度にすべて実行でき、2バイトの節約になります(デモ

UpUo /2

JSに変換すると、次と同等です:

U.push(U.pop()/2)&&U
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.