コードゴルフに完全に夢中になった今、おそらくいくつかのゴルフ言語を習得しようとしています。
JavaScriptでほぼ独占的にプレイしていることを考えると、Japtはそもそも論理的な言語のようです。次の機会にドキュメントに飛び込みますが、その間、以下の回答にJaptに関するヒントを投稿してください。
私は一般的にJaptとゴルフ言語の初心者なので、可能であれば、ヒントをJavaScriptに「翻訳」できれば、それが物事を理解するのに役立つ大きな助けになります。
コードゴルフに完全に夢中になった今、おそらくいくつかのゴルフ言語を習得しようとしています。
JavaScriptでほぼ独占的にプレイしていることを考えると、Japtはそもそも論理的な言語のようです。次の機会にドキュメントに飛び込みますが、その間、以下の回答にJaptに関するヒントを投稿してください。
私は一般的にJaptとゴルフ言語の初心者なので、可能であれば、ヒントをJavaScriptに「翻訳」できれば、それが物事を理解するのに役立つ大きな助けになります。
回答:
ご存知かもしれませんが、JaptはJavaScriptの短縮された拡張バージョンです。Japtを作成したのは、やなどの長いプロパティ名String.fromCharCode(x)
とMath.floor(x)
、範囲の作成などの作業の退屈さにうんざりしていたためです。JavaScriptからJaptに移行する際に知っておく必要がある最低限の条件は次のとおりです。
U
、V
、W
、X
、Y
、およびZ
、完全な配列はに格納されますN
ます。最後の式の結果は自動的に出力されます。a
- z
(およびà
- ÿ
)を追加します。あなたはこれらの文字のいずれかを使用すると、JAPTは埋め.
と(
、Uc
JaptのU.c(
JavaScriptの場合は、のタイプに応じてceil、charCodeAt、またはconcatを意味しU
ます。これは、Japtのパワーのほとんどが由来する場所です。これらのメソッドの完全なリストは、Japtドキュメントの「_____ functions」セクションにあります(インタープリター))ます。)
、を)
表し))
ます。これは、私がJaptを最初に設計したときに、できるだけ多くのバイトを節約したかったためです。(私見Us w n
よりは良く見えますがUs)w)n)
。)ABC{...}
ここではABC
、変数の任意の文字列です。関数はJSの場合とほぼ同じように機能し、主な違いは最後の式が自動的に返されることです(return
ES6のかっこを使用したり、空想したりする必要はありません)。'
は、単一の文字列(つまり'a
、と同じ"a"
)#
を示し、次の文字コードを取得して、その番号(#e
と同じ101
)になります。$
トランスピレーションプロセス中、ドル記号の間はすべて同じままです。for
たとえば、Japtにはループがないため、これを使用してループを実装できますが、他のメソッド(m
文字列や配列、o
数値など)を使用することをお勧めします。""
、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
Um_c s16
か?
¡Xc s16
?
更新:このティップで紹介したツールは、書き直され、改善され、Japtインタープリターに統合されました。最良の結果を得るには、以下にリンクされている圧縮機よりもその圧縮機を使用することをお勧めします。時間があればこのヒントを再確認し、新しいコンプレッサーを念頭に置いて書き直します。
コードに文字列の配列がある場合、それを圧縮する最も明白な方法は、各文字列をOc
個別に実行することです。このヒントの目的のために、["lollipop","marshmallow","nougat","oreo"]
最初は42バイトの重さの配列を使用します。各文字列を実行すると、次のことOc
がわかります。
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
これで33バイトになり、かなりの節約になります。
しかし、私たちはもっとうまくやることができます。配列を改行で区切られた文字列に結合すると、角かっこ、コンマ、および無関係なバックティックを取り除き、改行で分割して配列を取得できます。これをサンプルの配列に適用すると、次のようになります。
`lo¥ipop
Ú\hÚaow
Í
eo`·
現在26バイトまで。
しかし、私たちはもっとうまくやることができます!改行の代わりに小文字を使用して文字列を区切ることができます。改行は圧縮に含まれる場合があります。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バイトになりました
しかし、私たちはさらに良くすることができます!配列内の文字列の順序が問題にならない場合は、さらに短い組み合わせで、異なる区切り文字と組み合わせた異なる並べ替えがある可能性があります。ただし、それぞれの可能性を試すことは、はるかに退屈です。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バイトを保存できる場合があります。
q<letter>(<space>)
コストを考慮することを忘れないでください·
。ただし、区切り文字によっては、Unicodeショートカットのいずれかを使用してバイトを戻すことができる場合があります(たとえばqÊ
、と同じql<space>
です)。Japt(現在)は、文字列の圧縮にshocoライブラリを使用しています。一連Oc
の小文字が含まれている限り、を使用して任意の文字列を圧縮できます。
Oc"Hello, World!"
これは出力します HÁM, WŽld!
(Ž
技術的には印刷できない文字です)。これをバックティックでラップすることで解凍できます:
`HÁM, WŽld!`
または、Od
関数を使用して任意の文字列を圧縮解除できます。これは通常は便利ではありませんが、目的があります ...
HÁM, WŽld!
か、それはバッククォートで囲まれる必要がありますか?私は後者を推測しています。
Japtでは、を使用し#
、その後に文字を続けて文字コードを作成できます。これは、長い数字を短くするときに便利です。
@ETHproductionsが述べたように、これは、UTF-8に切り替えない限り、100〜255の範囲の3桁の実行でのみ機能します。
123
に短縮することができます #{
101
に短縮することができます #e
これらを連結することもできます:
123101
に短縮することができます #{#e
String.fromCharCode(123)
JavaScriptまたは123d
Japtで使用して、適切なキャラクターを見つけることができます。
String.fromCharCode(123)
戻り値 {
String.fromCharCode()
は、バイトカウントを増やすことができる(多くの!)厄介な長いJSメソッドの1つです。おそらく、これらは整数と見なされますか?つまり、123
ソリューションで整数が必要な場合は、#{
バイトを保存するために使用できます。
String.fromCharCode(123)
JavaScript で動作することを言及する必要がありますが123d
、同じ結果を得るためにJaptで行うことができます;-)また、これは範囲内の3桁の実行でのみ動作します100
- 255
(UTF-8に切り替えたくない場合)
[]
Japtには、空の配列の定数がありますA
。ただし、それにアクセスするには、;
プログラムにセミコロンを追加して、Japtの代替定数を使用する必要A
があります10
。そうでない場合はになります。だから、使用して;A
、実際には、以上の節約0バイトを提供しています[]
が、されますあなたを救うあなたが変数(例えば、にあなたの配列を割り当てる必要がある場合バイトA=[]
)。
ただし、プログラムが入力を受け取らない場合(だけ)、入力の配列であるN
変数を使用して、1バイトだけで空の配列にアクセスできます-入力なしでは、空になります。ここで試してみてください。
これには、プログラムでデフォルトの定数値を使用できるという追加の利点もあり、場合によっては、および;A
のショートカットのおかげでプログラムが入力を受け取っている場合でも、使用するバイト数を節約できます。s1
s2
N
良いアイデアを使用することを考えていませんでした。
Japtでは、ラップして生のJavaScriptを実行できます。 $...$
。
例えば、 $alert("hello world")$
これは、Japtのオートクロージング$
と)
。
$alert("hello world")$
に短縮することができます $alert("hello world"
JavaScriptを圧縮することもできます Ox
。
あなたが使用したいというJavaScript関数がある場合、たとえばscreen.width
、あなたは文字列を圧縮することができます"screen.width"
使用してOc
、その後、 `... Ox`の間に結果を挿入します
Japtの後に他の何かが続かない場合は、引用符を閉じる必要がないことに注意してください。
あたりとして、最新のメタコンセンサス(2017年12月)、コマンドラインフラグはもはやバイトにカウントされません。Japtには、入出力の特別な処理のための多くのフラグがあるため、これは本当に素晴らしいニュースです。
Japtで使用可能なすべてのフラグを、評価の順に以下に説明します。同じグループ内のフラグは互いに排他的です。異なるグループ内のフラグのようなもので、その結果、組み合わせて使用することができることに注意してください。この :)
mdefæ
プログラム全体が最初の引数(U
)にマッピングされます。
さらに引数が存在する場合は、そのまま渡されます(つまり、ペアごとにマッピングされません)。それ以外の場合、2番目の引数はインデックスで、3番目は配列と同様に配列全体U.m
です。U
が数値の場合、範囲に変換されます。文字列の場合、文字の配列に変換され、結果が結合されます。
-m
:上記を適用し、他には何も適用しません。-d
:true
何らかの結果が真実かどうかを返します。false
そうでなけれ。-e
:true
すべての結果が真実である場合に戻ります。false
そうでなけれ。-f
:の要素の配列を返します U
結果が真実ある。-æ
:-f
最初の要素を適用して返します。gh
指定されたインデックスの要素を取得します。
-g
:最初の要素(インデックス0)を取ります。-gX
:インデックスの要素を取得します X
(正の整数も可能)。-h
:最後の要素を取ります。!¡
結果をブール値に変換します。
-!
:ブール値を適用しない。-¡
:2回ではなくブール値を適用します(真実性を返します)。N
結果を数値に変換します。単項プラスが使用されます。
PRSQ
ある種の文字列に変換します。
-P
:配列をで結合し""
ます。-R
:配列をで結合し"\n"
ます。-S
:配列をで結合し" "
ます。-Q
:適用JSON.stringify
(配列だけでなく、任意のオブジェクト)。例。x
関数x
を出力に適用します。(文字通りx
、「単一の小文字アルファベット関数」ではありません。)
以下のような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バイト短くすることができます。どれがわかりますか?
®c s16
6バイト-クッキーを獲得できますか?!
®c sG
か?
csG
。
変数はA
- S
JAPTに表現するために、複数のバイトを取る共通の値にプリセットされています。
A
- G
は10
- 16
です。H
is 32
、I
is 64
、J
is -1
、L
is 100
です。K
として定義されnew Date()
、さまざまな方法で操作できます。M
とO
は、さまざまな便利な機能を持つオブジェクトです。詳細については、ドキュメントをご覧ください。P
空の文字列、Q
引用符R
、改行です。S
スペースです。T
はに設定されているため0
、必要に応じてアキュムレータとして使用できます。プログラムの最初の文字がセミコロンの;
場合、A-L
次のようにリセットされます。
A
空の配列です []
です。B
は "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
。C
は "abcdefghijklmnopqrstuvwxyz"
。D
は "QWERTYUIOP\nASDFGHJKL\nZXCVBNM"
。E
で"[a-z]"
、そしてF
あります"[A-Za-z]"
(これらを正規表現機能として追加する前に便利です)G
is 36
、H
is 65
、およびI
is 91
(アルファベットの範囲に有用)。J
単一のコンマです。L
、単一の期間。今日では唯一A
、B
、C
、およびD
このリストからは本当に便利です。最大256個の2バイト変数を許可するより優れたシステムを追加することを計画しています。これらの変数は、これらの値などに事前設定されます。
あなたが最も可能性が高い、すでに知っている@
し、_
ためのショートカットです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!²
。
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つのアレイは、変数に代入するV
とW
、代わりにU
&V
:
Aõ
Vm²
[do something with the arrays]
JaptコードはトランスコンパイルされたJSとして実行されるため、JS演算子と組み込みメソッドを十分に理解すると、Japtコードの一部をゴルフするのに役立ちます。
U
評価しV.m
ます。(改行があるU
と、最初の行の暗黙的な割り当てがアクティブになります。)[]Vm@...
...
関数の引数に渡されるパラメーターを詳しく調べます。
Array.prototype.map
Array.a/b/m/x/y/í
、Number.o/õ
、String.m/y/í
Array.prototype.reduce
Array.r/å
、String.å
; の場合å
、4番目の引数は渡されません。Array.prototype.some
Array.d
Array.prototype.every
Array.e
文字列メソッドの場合、g
フラグ付きまたはフラグなしで文字列または正規表現を渡す場合の動作の違いを知っておくと便利です。
String.prototype.match
String.f/o
String.prototype.search
String.â
String.prototype.replace
String.e/k/r
e/r
第二引数として関数を渡すと、OKで、関数のパラメータを理解することを強く奨励されます。それほど難しくないほとんどの課題については、組み込み関数を適用するシーケンスとして、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)はほとんど使用されないため。
このため、良いタスク例を思いつくことはできないと思うので、このヒントが使用された唯一の解決策を参照し、いくつかの一般的なアイデアの概要を説明します。
{
で行を開始する@
か_
、ジョブを実行します。または、(T=@...})
より複雑な行の中に関数の割り当てを埋め込むなどのこともできます。V
の関数であり、我々は呼び出したいV(U)
JSに。VU
それは単にを意味するため、動作しませんV,U
。V(U
どちらでもありません。それV,(U)
です。関数メソッドでさえあまり役に立ちません。私たちが見つけた最良の方法は次のとおりです。
[U]xV
(map and sum)結果が数値の場合UmV
if U
が単一の文字でありV
、文字列を返す、または$V($U
または[U]mV g
一般的に。UmV
。を満たす最初の整数を見つけるにはV
、を使用しますVa
。ETHの自動機能に関する一般的なヒントのフォローアップとして、このヒントでは、それらを使用して達成できるバイト節約のトリックのいくつかの具体例を紹介します。
[3,1,4,2]
変数に割り当てられた配列があり、U
そこから最大数を取得したいとします。我々は可能性の配列をソートしてから最後の要素をポップすることにより、4バイトでそれを実行します。
Un o
それの欠点は、元の配列を変更したことです。U
今で[1,2,3]
は常に望ましいことではない可能性があります。幸いなことに、配列を変更せずに1バイト短くする方法があります。
Urw
そこで実行したことは、w
メソッドを使用して配列を縮小します。このメソッドは、整数で使用すると、整数とメソッドの引数のうち大きい方を返します(例:を2w5
返します5
)。上記のように同等ですUrÈwY
かUrXY{XwY}
。ただし、配列内のすべての整数が負の場合、このヒントは機能しないことに注意してください。
í
í
は、zip
2つの配列または文字列をペアリング(またはs)し、オプションで関数を介して各ペアをマッピングする便利なビルトインです。ただし、現在、不均一な配列または文字列を指定した場合、いくつかの小さな問題があります。
undefined
ます。これにより、たとえば、2つの不均等な文字列を比較し、各ペアからより高いコードポイントを持つcharを取得することが難しくなります。それU
がより長いものになるとわかっていても、この単純なタスクを解決するのにまだ多くのバイトがかかります:
UíUç hV @[XY]n o
代わりにできることは、入力を2つの文字列の配列として受け取り、配列を転置してy
から、各行を正しい結果にマッピングすることです。
Uy m_q n o
これには、短い文字列に常にスペースを埋め込むという利点があり、両方の文字列全体を簡単に調べることができます。
更新: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
構造的な文字で、私は意味{}
、()
、$
でも、"
と`
。通常、これらの文字は、プログラムの最後(例えばUmX{Xc +"; "} -> UmX{Xc +";
)で発生する場合はいつでも削除できます。
さらに、次の場所に表示される場合は、括弧またはスペースを削除できます。
;
(またはプログラムの最後)まで。{
(ひいては、@
)、または[
、左の]
若しくは}
。また、引数を区切るためにコンマが必要になることはほとんどありません。AB
たとえば、を記述した場合、Japtはあなたが意味することA
とB
別個に知っていることを知っています。のような2つの数値リテラルを区切るのに本当に必要なのはコンマだけUs2,5
です。
最後に、あるかどうU
プログラムの開始時または後{
や;
、メソッド呼び出し(小文字または関連Unicodeのショートカット)、または任意のバイナリ演算子を除く続く+
と-
(*
、&
、==
、など)、あなたが削除することができますU
保存しますバイトとJaptが挿入します。
U
プログラムの開始時でなくても省略できる他のインスタンスをいくつか見つけました。
{
orの後でも動作し;
ます。あなたが知っている他のものはありますか?(この機能をコーディングしてからしばらく経ちました:P)
配列の最後の要素を変更する必要がある場合があるため、ここで簡単な方法を説明します。アレイで作業します[2,4,8,32]
入力変数に割り当てられますU
を操作し、最後の整数(32
)を2で除算します。
これを実現する明白な方法は、この9バイトのソリューション( Demo)を使用することです。
UhJUgJ /2
hnx
インデックスの要素n
をx
ます。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