Jellyは、当社独自のDennisによる暗黙のゴルフ指向プログラミング言語です。独自のコードページと強力なチェーンシステムを使用してプログラムを簡潔に表現することで、PythやCJamのような他のゴルフ言語を破り、より頻繁にここに答えが現れます。
ゼリーでゴルフをするための便利なヒントを集めましょう。(いつものように、回答ごとに1つのヒントをお願いします!)
Jellyは、当社独自のDennisによる暗黙のゴルフ指向プログラミング言語です。独自のコードページと強力なチェーンシステムを使用してプログラムを簡潔に表現することで、PythやCJamのような他のゴルフ言語を破り、より頻繁にここに答えが現れます。
ゼリーでゴルフをするための便利なヒントを集めましょう。(いつものように、回答ごとに1つのヒントをお願いします!)
回答:
より最適化された/自動の文字列コンプレッサーを探しているなら、これを試してください。
圧縮された文字列はのよう“...»
になります。ここで、ドットはベース250エンコードデータのチャンクです。圧縮解除アルゴリズムは少し複雑です。チャンクは「混合ベース」整数として解釈され、divmod
この整数のさまざまな部分を切り離し、それらから文字列を構築します。
Jelly文字列を圧縮するための小さなPython 3インターフェイスを作成しました。
import dictionary
code_page = '''¡¢£¤¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƊƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻạḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż«»‘’“”'''
class Compress(list):
def character(self, c):
if c in '\n\x7f¶':
o = 95
elif ' ' <= c <= '~':
o = ord(c)-32
else:
raise ValueError(c + " is neither printable ASCII nor a linefeed.")
self += [lambda z: 3*z+0, lambda z: 96*z+o]; return self
def string(self, s):
for c in s: self.character(c)
return self
def dictionary(self, w):
ts = bool(self)
if w[:1] == ' ': w = w[1:]; ts = not ts
dct = dictionary.short if len(w) < 6 else dictionary.long
W, sc = (w, 0) if w in dct else (w[:1].swapcase() + w[1:], 1)
if W not in dct: raise ValueError(w + " isn't in the dictionary.")
f = ts or sc; j = (2 if sc else 1) if ts else 0; i = dct.index(W)
self += [lambda z: 3*z+2, lambda z: 3*z+j] if f else [lambda z: 3*z+1]
self += [lambda z: 2*z+int(len(w) < 6), lambda z: len(dct)*z+i]
return self
def go(self):
compressed = []; z = 0
for f in self[::-1]: z = f(z)
while z:
c = z % 250
if c == 0: c = 250
z = (z - c) // 250
compressed.append(code_page[c - 1])
return '“{0}»'.format(''.join(compressed[::-1]))
コンプレッサーは次のように使用します。
print(Compress()
.dictionary('public')
.dictionary(' static')
.dictionary(' boolean')
.string(' is')
.dictionary('Power')
.string('Of')
.dictionary('Ten')
.string('(')
.dictionary('long')
.dictionary(' input')
.string(') {\n ')
.dictionary(' return')
.string('\n ')
.dictionary(' input')
.string(' ==')
.go())
Compress
文字列ビルダーです:
.string(s)
生の印刷可能なASCII文字を文字列に挿入します。
(各文字のコストは約0.827圧縮バイトです。)
.dictionary(w)
Jellyの組み込み辞書で文字列を検索します。必要に応じて、単一のスペースで文字列を開始できます。これが通常の文字列追加動作から逸脱する必要がある場合、または辞書の単語の大文字化を反転する必要がある場合、それに応じてフラグを追加します。
(コストはショートワードで約1.997バイト、ロングワードで2.433バイトです。フラグがある場合は、0.199バイトを追加します。)
これは、Jelly wikiチュートリアルとなったものの一部です。
(これは、暗黙のプログラミングの一種です。)
Jellyはチェーンをどのように評価しますか?前に説明したように、考慮すべき3つのケースがあります。このチェーンがniladically、monadically、またはdyadicallyに呼び出されたかどうかです。
これらは最も簡単なものです。などのniladで始まる niladicチェーンを評価するには、そのniladでα f g h
モナドチェーンf g h
を評価しますα
。(注意:チェーン全体が空の場合、代わりに0が返されます。niladでα
ない場合は、代わりにuse α=0
を置き換えます。)
たとえば、4½
はで½
評価されるだけ4
です2
。
考慮すべきリンクがなくなるまで、モナドチェーンは左から右に分解されます。また、ω
ここでいくつかの引数が渡されます。次の2つの質問に答えてください。
私たちのチェーンniladで始まる場合α
、およびは、(のような、ゼロまたはそれ以上のモナドが続いている½
)、ダイアド-niladペア(のような+2
)、およびnilad-ダイアドのペア(のような4*
):我々は評価することから始めα
、その後、チェーンの残りの部分を考えます。
それ以外の場合、このチェーンに渡された引数から開始し、チェーンω
全体を検討します。
V
現在の値を呼び出しましょう。最初は、上記の値ですが、チェーンを通過すると更新されます。
+
、×
、÷
。次に、上から下に向かって、次のパターンが照合されます。
┌───────────┬─────────┐
│ old chain │ new V │
╞═══════════╪═════════╡
│ + × 1 ... │ (V+ω)×1 │ *
│ + f ... │ V+f(ω) │
│ + 1 ... │ V+1 │
│ 1 + ... │ 1+V │
│ + ... │ V+ω │
│ f ... │ f(V) │
└───────────┴─────────┘
(* Only if `...` consists of monads, dyad-nilad pairs, and nilad-dyad pairs.)
これをチェーンで試してみましょう
+²×
。
+
ニラドではないので、から始めV = ω
ます。- 次に、
+²
2番目のパターンに一致して切り取り、getしV = ω+ω²
ます。- 次に、
×
5番目のパターンに一致して切り取り、を取得しV = (ω+ω²)×ω
ます。- これでチェーンは空になり
(ω+ω²)×ω
、最終結果も空になりました。
これらは基本的にモナド連鎖に似ていますが、今回は、2つの引数λ
(左)とρ
(右)があります。
以下のような3つのダイアドとの連鎖が始まるならば+ × %
、我々はで開始しλ+ρ
、チェーンを考慮し× % ...
、次。
それ以外の場合、から開始しλ
、チェーン全体を検討します。
今回は、パターンは
┌───────────┬─────────┐
│ old chain │ new V │
╞═══════════╪═════════╡
│ + × 1 ... │ (V+ρ)×1 │ *
│ + × ... │ V+(λ×ρ) │
│ + 1 ... │ V+1 │
│ 1 + ... │ 1+V │
│ + ... │ V+ρ │
│ f ... │ f(V) │
└───────────┴─────────┘
(* Only if `...` consists of monads, dyad-nilad pairs, and nilad-dyad pairs.)
これをチェーンで試してみましょう
+×÷½
。
- チェーンは3つのダイアドで始まるため、で開始し
V = λ+ρ
、を破棄し+
ます。- 次に、
×÷
2番目のパターンに一致して切り取り、getしV = (λ+ρ)×(λ÷ρ)
ます。- 次に、
½
6番目のパターンに一致して切り取り、を取得しV = sqrt((λ+ρ)×(λ÷ρ))
ます。- チェーンは空になったので、完了です。
Jellyの数値パーサーの特殊なケースを次に示します。
-
に評価する -1
.
に評価する 0.5
ȷ
評価された1000
(ȷ
科学的表記法のためで、例えば2ȷ6
です2000000
)ı
に評価します1j
(ı
は、複素数の場合、例えば2ı3
です2+3j
)また、のようなもの4ı
が4+1j
でなく、実際にあることに注意する価値があり4
ます。
これらを組み合わせて一致させることができます。例:
-.
である-0.5
と-ȷ
され-1000
-ı
で-1+1j
、ı-
ある-1j
と-ı-
され-1-1j
.ȷ
は 500.0
.ı
で0.5+1j
、ı.
ある0.5j
と.ı.
され0.5+0.5j
ȷı
で1000+1j
、ıȷ
ある1000j
とȷıȷ
され1000+1000j
注ȷ-
です0.1
が、任意のバイトを超える保存することがありません.1
。次に、次のものもあります。これは、10(⁵
)の組み込み変数を使用して対応するバイト数で既に実行できますが、まれに組み込みが使用できない場合や、使用する必要があるときに保存するのに役立ちます¤
:
ȷ.
でsqrt(10) ~ 3.162277
、.ȷ.
あるsqrt(10)/2 ~ 1.5811
とȷ-.
され1/sqrt(10) ~ 0.31162
Lynnの投稿では、これらの圧縮された文字列を正確に生成するコンプレッサーとともに、圧縮された文字列が正確にどのようなものであるかについて詳しく説明しています。しかし、Jellyのプログラムをいじくり回しながら、可能な限り短い文字列を実現するために、スペースの正しい配置.dictionary
などを組み合わせ.string
て使用するのは面倒です。
したがって、ユーザーの入力を受け付けるLynnのスクリプトの拡張機能を作成し、ユーザーが作業を行わなくても圧縮できる最短の方法を見つけることにしました。スクリプトは非常に長いため、コード自体ではなく、TIOリンクに追加しました。
プログラムが機能する方法は、3つの異なる方法を使用して圧縮し、最短の方法を決定することです。
方法1は、入力の各バイトを一度にエンコードするだけで、他のバイトに比べて最も長い結果を生成する傾向があります。入力が非常に短い場合でも、かなり長い選択肢を作成できます。たとえば、test
圧縮できる最短の方法はですが“¡ḌY»
、このメソッドは“¡⁷ƑKʂ»
(2バイト長い)を返します。一般的なルールとして、これは文字列が4文字未満の場合にのみ機能します
2番目の方法は、文字列を単語と句読点に分割します。2つは異なる方法でコンプレッサーに追加されるためです。辞書の一部である単語は.dictionary
、Lynnのコードのメソッドで追加されます。Lynnのコードは、単にコードポイントによって追加された場合よりも圧縮します。ただし、残念ながら、句読点は辞書の一部ではないため、コードポイントごとに追加する必要があります。
句読点にはスペースが含まれます。これは、メソッド番号3が重要な役割を果たしますが、最初にメソッド2の評価をHello, World!
行います。文字ごとに圧縮すると、最終的な文字列“ŒCdẉa÷¹ṂȤƓ(Ẋ)»
(長さ15バイト)になり“Hello, World!
ます。これは、結局のところ、Hello、World !:を出力するより簡単な方法よりも長くなります。次に、方法2を見てみましょう。これにより、“Ọƥ⁷Ƭė3⁶»
9バイトの圧縮文字列が生成され、古い文字列よりも大幅に改善されます。ただし、最短のHello、World!Jellyのプログラムは8バイトなので、何かを改善できます
ここに方法3があり、さらに短くなります。予想どおり、Hello、Worldの出力はもちろん、“3ḅaė;œ»
最短のプログラムです。では、方法3は何をしますか、方法2はしませんか?方法3は、孤立したスペースをリーディングスペースに結合します。リーディングスペースには、Jelly解凍プログラムにフラグがあります。コンプレッサーとデコンプレッサーの両方のコードで、次のようなコードを見ることができます。if flag_space: word = ' ' + word
先頭のスペースがa)サポートされ、b)バイトを節約していることを示しています。したがって、方法2の文字列スプリッターは、isの直後にスペース自体が文字列に結合され、先頭の文字列が作成されるように適合されます。これは、Hello, World!
として解析されることを意味します。これは、["Hello", ",", " World", "!"]
圧縮時に6バイトのみです(区切り文字を含めると8バイト)。これは、私が追加した「拡張子」を除いて、ほとんどの場合、最短の圧縮方法です。
これはプログラムの大部分ですが、さらにデータを圧縮するのに役立つオプションがいくつかあります。
--debug
。これは、最短の圧縮文字列を単に表示するのではなく、3つすべてを「This is the shortest」コピーとともに表示しますこのメッセージを見た後、Lynnのコンプレッサーの作業を開始し、それをクラックし、それを圧縮する最短の方法が見つからなかったことに不満を感じました(レコードの場合は29または32バイトです)。しかし、私の改善点をテストしてknowns
いると、Jellyの辞書にないような単語が見つかりました。したがって、これらの「非単語」を可能な限り短いJellyコードで圧縮する方法を見つけることに着手しました。
trim
文字列の少なくとも1つの部分が単語であるポイントとして文字列を分割する関数()を作成しました。例えば、knowns
に分割されることになる["known", "s"]
と、プログラムが辞書の追加(を介して第1のワード追加有する.dictionary
)とを介してワードの第二の部分.string
の呼び出しを。ただし、これには2つのエッジケースが残ります。単語が含まれていない文字列(などajdl
)と、末尾に単語がある非単語(、など)abctest
はtrim
関数によって分割されません。
文字列に単語が含まれていない単語を見つける方法はないため、これらを処理する最も簡単で最短の方法は、.string
呼び出しによって文字ごとに単語を追加することです。でajdl
追加され.string('ajdl')
ます。一方、認識された単語で終わる非単語は、基本的にトリマーを実装しますが、逆に、逆方向に適用.dictionary
し.string
、逆にフォワードトリマーに適用します。
結局のところ、文字列を最初または最後からトリミングすることは、もちろん、各文字をコンプレッサーに追加するよりも短いabctest this string
です。
Original : abctest this string
Optimised : “¡J+v(p⁸ụƘ$,»
Seperate spaces : “Ç⁴ṭḍµḄ7oeṂdḷp»
No trimmer : “¤ɦ?Ɓ¢#fḲOạ⁾¶ɼȥƬ»
All characters : “µẓþ"Y7_ḣṗḢ))9Þ⁴⁺Ẉ²)ɱ»
Non-compressed : “abctest this string
Shortest : “¡J+v(p⁸ụƘ$,»
=====
最適な出力(トリマーを使用)と使用しない出力の違いは、なんと(Jellyの場合)4バイトです。最後に、文字列自体が圧縮されたバージョンよりも短い場合がありますが、これは現在では考慮されています。
もちろん、これに対する多くの功績は、オリジナルのコンプレッサーを作成したリンにあります
上付きの3〜9(³⁴⁵⁶⁷⁸⁹
)を使用して、通常使用される値をゴルフできますが、これはコマンドライン引数の量に依存し、リンクの場合はリンクの引数に依存します。
³
100を返し、入力がない場合にのみ機能します。⁴
16を返し、最大で1つの入力がある場合にのみ機能します。⁵
10を返し、最大で2つの入力がある場合にのみ機能します。⁶
最大3つの入力がある場合、スペースを返します。⁷
最大4つの入力がある場合、新しい行を返します。ただし、入力が5つある場合、運が悪い。
最近、この言語の新しいバージョンは値³
を100に下げ、値または(リンクの場合)引数を返すいくつかの新しいアトムを導入しました。
⁸
左の引数が渡されたリンクを除くすべての場所で空のリストを返します。⁹
正しい引数が渡されたリンクを除くすべての場所で256を返します。リンクにいて、両側からの引数が渡されている場合は、運が悪いです。
文字列を弾力化するプログラムを書くで最初にこれを利用した功績はAdnanに与えられます。
Jellyはいつか文字演算を取得することになっていますが、それが起こるまで、Pythonはほとんどの算術演算子をオーバーロードし、Jellyは型チェックを行わないという事実を利用できます。
例えば
“abcd”Ḥ
現時点では有用なことを行うことは想定されていませんが、Ḥ
(unhalve)は
lambda z: z * 2
算術アトムは深さ0でベクトル化します(つまり、数値または文字で動作します)。上記のJellyコードは、
['aa', 'bb', 'cc', 'dd']
これにより実際のPython文字列が生成されることに注意してください(Jelly型にはないはずです)。したがって、これはすべての状況で使用できるわけではありません。
同様に、+/
同じ注意事項で文字列を連結するのに役立ちます。
S
文字列を連結するのに役立つことはありません。文字列に追加しようと0
します。
+/
しかし動作します。
+/
。
最近、私は尋ねた エリックOutgolferを追加するために最適化された文字列の圧縮機にJHTの参照ページを、彼らは言ったことを
申し訳ありませんが、それコンプレッサーが完全に実施されていないようです
、それは言う“ugtestslug”
ために、最短であるugtestslug
一方で、“#ṀȮụḄPƇ»
また仕事をしていません
そこで、最適な文字列コンプレッサーを実装することにしました。
シンプルなアプローチですが、可能な限り最小の値(したがって、バイト数)を見つけることを保証します
入力をからstdin
、出力をに取得しstdout
ます。元のコンプレッサーと同じように、¶
または
(リテラル改行文字)を改行として入力できます。
多くの句読点(たとえば、input ¶-----¶
)で実行しようとすると、圧縮されていない文字列が出力されます。
もちろん、これに対する多くの功績は、オリジナルのコンプレッサーを作成したリンにあります。
これは、Jelly wikiチュートリアルとなったものの一部です。
Jellyは暗黙のプログラミング言語です。つまり、関連する引数について明示的に話すことなく、既存のリンクをチェーンに構成することでリンク(関数)を定義します。引数がこの構成を「流れる」方法は、リンクが配置されるパターンによって定義されます。この例はすぐに示されますが、最初にいくつかの概念を紹介する必要があります。
リンクのアリティは非常に重要な概念です。すべての原子(組み込み+
など½
)には固定アリティがあります。リンクは、アリティに応じて3つのカテゴリに分類されます。
Niladsは引数を取りません(アリティ0)。いくつかのI / Oおよびステートフルコマンドを除き、それらは主に定数値を表します。たとえば、リテラル
3
はniladです。モナドは1つの引数を取ります(アリティ1)。(ここでは関数型プログラミングモナドとは関係ありません。)たとえば、
½
(平方根)はモナドです。ダイアドは2つの引数(アリティ2)を取ります:左引数と右引数。たとえば
+
、ダイアドです。(形容詞を使用して、リンクはniladic、monadic、またはdyadicであると言います。)
それでは、プログラムを書くときに定義するリンクのアリティは何ですか?デフォルトでは、それらは可変引数です。つまり、使用する引数の数を指定するのは呼び出し側次第であり、メインリンクの場合、プログラムに渡される引数の数に依存します。
例として、(加算)と(平方根)の+½
チェーンです。このチェーンの要素のそれぞれのアリティは2と1なので、これを2,1-chainと呼びます。インタープリターには、アリティに基づいてチェーンを分解するための特定のルールがあります。これらのルールは、入力が与えられると、この新しいリンクがを計算することを指示します。(あなたが読むことができるよう、「...プラスその平方根。」)+
½
n
n + sqrt(n)
+½
ゼリープログラミングは、本質的にこれらのルールをよく学び、暗黙のうちに仕事を成し遂げる巧妙なチェーンを構成する技術です。
replace(str, old, new)
)。
string (operator) (list)
どこに(list)
あるのでしょうかold, new
。それは理にかなっています、ゼリーは組み込みのpair
オペレーターを持っています。ただし、このスキームでは、オペレーターにとっては2バイトになります。
½
平方根ですか?なんで½
、半分じゃないの?なぜ√
平方根ではないの ですか?:(
H
はすでに半分であるため、明らかに:P
これは、Jelly wikiチュートリアルとなったものの一部です。
Jellyプログラムの各行はリンク定義です。リンクは基本的に機能です。一番下の行は「main
」を表します。コマンドラインで渡された引数を使用して評価されるのはリンクです。
最後のリンクを除くすべてのリンクは関数定義です。アクターを使用してそれらを参照できます。例えば、ç
ある「バイナリ演算子(ダイアド)としてこれ以上のリンクは、」。引数の合計の二乗を計算する次のプログラム例について考えてみましょう。
+
ç²
これは、擬似コードのようなものです:
define f:
the built-in link +
define main:
apply the dyad f
square the result
これは、Jelly wikiチュートリアルとなったものの一部です。
他のリンクのチェーンを作成してリンクを定義すると書いたときのことを覚えていますか?本当のことを全部言っているわけではありません。実際には、2層のプロセスです。リンクはチェーンのチェーンであり、デフォルトでは、外側のチェーンは単にユニットの長さを持ちます。
このプログラムを検討してください。
C+H
それは補数とhalfです。入力値n
を取り、計算し(1-n)+(n/2)
ます。エキサイティングではありません、私は知っています。しかし、構造は本当に次のようなものです。
私たちが書いたリンク自体は、実際には単一のチェーンを含むチェーンです。
(1-n)+(1-n)(n/2)
代わりに計算したいとします。ダイアディックチェーン+×
は機能します。チェーンルールにより、が計算されますλ+(λ×ρ)
。これは、必要なものによく似ています。ただし、プログラムで単純に置き換える+
こと+×
はできませんC+×H
。1,2,2,1-チェーン– 補数であり、次に(引数)を追加し、次に半分で乗算 –計算し((1-n)+n)×(n/2)
ます。
私たちは、ゼリーを扱いたい+×
ユニットとして、及びサブチェーンの1,2,1-チェーンを作るC
、+×
とH
。マルチチェーンリンクにより、まさにそれが可能になります!それらを構築するには、チェーンセパレータ を使用しøµð
ます。上の画像では、それぞれアリティ0、1、2の新しい青い長方形が導入されます。この場合、次のように記述することにより、チェーンを思いどおりにグループ化できますCð+×µH
。
これらをさらにネストする方法はありません。代わりに、複数のリンクを定義する必要があります。
暗黙の言語の利点の1つは、通常、変数参照を使用せずに逃げることができることです。ただし、これは、チェーン内のリンクに適切なアリティがある場合にのみ機能します。
たとえば、2D配列内のすべての配列の合計を取得する簡単な方法は次のとおりです。
S€
これは、配列のすべての要素に合計アトムをマッピングします。
今、あなたは原子からなるモナド連鎖を持っていると言います
*
これは、各マップXに2次元アレイのX Xは。たとえば、A = [[1、2]、[3、1]、[2、3]]の場合、チェーンを呼び出すと[[1、4]、[27、1]、[4、27]]が生成されます。
次に、各ペアの合計を取得します。残念ながら、
*S€
フックの*
ように動作しなくなるため(A自体を正しい引数として使用)、フォークとして、つまりAに最初に適用され、結果がの正しい引数になるため、機能しません。S€
*
これを修正するのは簡単です:
*¹S€
*⁸S€
両方の農産物所望の結果は:*¹
であるフォーク¹
恒等関数であり、*⁸
あるの上にあり、⁸
鎖の左引数(への参照であるA)。
ただし、バイトを保存する方法があります!頂上ḅ1
(単項から整数への変換)は、各列の和を計算するA Aが、とは異なりS€
、ḅ
あるダイアディックリンク。
チェーン
*ḅ1
(必要に応じて)[5、28、31]を返します。ḅ
ダイアディックなので*
、フォークではなくフック
ḅ1
」?
文字列圧縮は、テキストを英語で作成する場合に役立ちますが、他の種類のデータを圧縮する必要がある場合、かなり効果的ではありません。そのため、ほとんどの場合、プログラムに大きな固定定数を保存する場合は、整数として保存するのが最善です。
Jellyには定数として独自のコードページがあるため、整数の圧縮アルゴリズムはJelly自体で最も簡単に表現できます。
ḃ250ịØJ”“;;”’ṄV
(上記のプログラムには、整数が圧縮解除される値を表示するチェックも含まれています。)
整数を整数として使用するだけでなく、それを使用して文字列を作成し、その文字列に対してベース変換を行ってから、文字のアルファベットにインデックスを付けることもできます。ṃ
原子は、このプロセスを自動化し、そしてそれは単一バイトで(アルファベット以外に解凍される)解凍のプロセス全体を記述することができるので、かなり有用です。
ここに、私がこの投稿から作成した要点を示します。これは、HTMLテーブルの書式設定が少し優れています。
外積クイックþ
はダイアドにアタッチでき、ダイアドは左右の引数内の各要素ペアに作用します。略記です€Ð€
。たとえば、コードがある場合、[1,2]+€Ð€[0,10]
それを短くすることができ、[1,2]+þ[0,10]
両方が生成され[[1,2],[11,12]]
ます。þ
(のような+þ
)が適用されたダイアドを外部製品ダイアドと呼びます。
整数が外積ダイアドの引数の1つである場合、Jellyは最初にその数値の範囲を取得し、その結果を引数として使用します。これを知って、上記の例はさらに短縮できます2+þ[0,10]
。これは、外積ダイアドの左右の引数の両方に当てはまります。
一部の外積ダイアドは、整数に単項で作用する場合、ゴルフ(特にASCIIアートの課題)に役立つ可能性のある特定の整数行列を生成しますが、それ以外の場合は多くのバイトを必要とします。たとえば=þ
、整数に適用するn
と、n×n
単位行列が生成されます。オンラインでお試しください=þ
!
以下は、ダイアドの表と、外積ダイアドに変換され、整数に対して単項に作用したときに生成されるマトリックスのタイプです。同じ行にリストされているダイアドは、同じ行列を生成します。私は次のように表には含まれていないダイアドあり&
、|
、%
、w
、ẇ
そしてḍ
それはまた、整数行列を作るが、そのパターンは、単純なようではありませんし、おそらく少ない状況で有用であろうが。オンラインでお試しくださいwþ
!
+ ------------------------------------------------- ---- + | ダイアド| 結果の行列| 例| + ------------------------------------------------- ---- + | =⁼| | 1 0 0 | | ċ| アイデンティティ行列| 0 1 0 | | | | 0 0 1 | + ------------------------------------------------- ---- + | | 対角線より上の要素は1、|です。0 1 1 | | <| 他のすべての要素は0 | 0 0 1 | | | | 0 0 0 | + ------------------------------------------------- ---- + | | 対角線の下の要素は1、|です。0 0 0 | | > | 他のすべての要素は0 | 1 0 0 | | | | 1 1 0 | + ------------------------------------------------- ---- + | | 対角要素は0、|です。0 1 1 | | n⁻| 対角要素のオフは1 | 1 0 1 | | | | 1 1 0 | + ------------------------------------------------- ---- + | ȧ| | 1 1 1 | | ṛị| 各要素の行インデックス| 2 2 2 | | | | 3 3 3 | + ------------------------------------------------- ---- + | oḷ| | 1 2 3 | | ȯ| 各要素の列インデックス| 1 2 3 | | | | 1 2 3 | + ------------------------------------------------- ---- + | | 主対角線は0、上部| 0 1 2 | | _ | 対角線は1、2 ...、より低い| -1 0 1 | | | 対角線は-1、-2 ...です。-2 -1 0 | + ------------------------------------------------- ---- + | | 主対角線は0、低い| 0 -1 -2 | | _ @ | 対角線は1、2 ...、上部| 1 0 -1 | | | 対角線は-1、-2 ...です。2 1 0 | + ------------------------------------------------- ---- + | | 主対角線は0、上部| 0 1 2 | | ạ| 下の対角線は1、|です。1 0 1 | | | 2、3 ... | 2 1 0 | + ------------------------------------------------- ---- + | | | 2 3 4 | | + | 行インデックスと列インデックス| 3 4 5 | | | | 4 5 6 | + ------------------------------------------------- ---- + | | 行の最小値| 1 1 1 | | «| および列インデックス| 1 2 2 | | | | 1 2 3 | + ------------------------------------------------- ---- + | | 行の最大数| 1 2 3 | | »| および列インデックス| 2 2 3 | | | | 3 3 3 | + ------------------------------------------------- ---- +
あなたは、多くの使用しようとする非ベクトル化listコマンドのリテラル n
やリテラルのリストを z
、listコマンドは、最初のいくつかの並べ替えのリストに変換し、そのリスト上のコマンドを実行します。
これらのコマンドiterable
は、jelly.pyの関数の呼び出しを使用して表示されます。
def iterable(argument, make_copy = False, make_digits = False, make_range = False):
the_type = type(argument)
if the_type == list:
return copy.deepcopy(argument) if make_copy else argument
if the_type != str and make_digits:
return to_base(argument, 10)
if the_type != str and make_range:
return list(range(1, int(argument) + 1))
return [argument]
以下に、これらのリストコマンドの機能の不完全なリストを示します。
リストにラップ
iterable
引数をリストにラップし、関数によって処理される引数を返すための最も単純なreturn from 。これは、引数がまだリストではなく、文字列であり、iterable
引数が他のメソッドを呼び出さない場合に発生します。
-------------------------------------------------------------------------------
| Command | Description | Process | Effect |
-------------------------------------------------------------------------------
| F | Flattens a list | 4953F -> [4953]F -> [4953] | Same as W |
-------------------------------------------------------------------------------
| G | Format a list | 4953G -> [4953]G -> [4953] | Same as W |
| | as a grid | | |
-------------------------------------------------------------------------------
| I | Increments | 4953I -> [4953]I -> <nothing> | Empty list |
-------------------------------------------------------------------------------
| S | Sums a list | 4953S -> [4953]S -> 4953 | Same as ¹ |
-------------------------------------------------------------------------------
| Ṭ | Boolean array, | 4Ṭ -> [4]Ṭ -> [0, 0, 0, 1] | n-1 zeroes, |
| | 1s at indices | | 1 at end |
-------------------------------------------------------------------------------
| Ụ | Sort indices by | 4Ụ -> [4]Ụ -> [1] | Yields [1] |
| | by their values | | |
-------------------------------------------------------------------------------
| Ė | Enumerate list | 4Ė -> [4]Ė -> [[1, 4]] | Yields [[1, n]] |
-------------------------------------------------------------------------------
| Ġ | Group indices | 4Ġ -> [4]Ġ -> [[1]] | Yields [[1]] |
| | by values | | |
-------------------------------------------------------------------------------
| Œr | Run-length | 4Œr -> [4]Œr -> [[4, 1]] | Yields [[n, 1]] |
| | encode a list | | |
-------------------------------------------------------------------------------
10を基数に変換
ここの関数iterable
は、数値をその数字のリストに変換するために呼び出しD
、それらの数字で実行します。
-------------------------------------------------------------------------
| Command | Description | Process | Effect |
-------------------------------------------------------------------------
| Q | Unique elements | 299Q -> [2, 9, 9]Q -> [2, 9] | Unique |
| | ordered by | | digits |
| | appearance | | of n |
-------------------------------------------------------------------------
| Ṛ | Non-vectorized | 4953Ṣ -> [4, 9, 5, 3]Ṛ | Reverses D |
| | reverse | -> [3, 5, 4, 9] | |
-------------------------------------------------------------------------
| Ṣ | Sort a list | 4953Ṣ -> [4, 9, 5, 3]Ṣ | Sorts D |
| | | -> [3, 4, 5, 9] | |
-------------------------------------------------------------------------
範囲付きリストに変換
ここでの関数は、数値を範囲に変換してから、その範囲R = [1 ... n]
で実行します。
-----------------------------------------------------------------------------------------
| Command | Description | Process | Effect |
-----------------------------------------------------------------------------------------
| X | Random element | 4R -> [1 ... 4]X -> 2 | Random element |
| | | | of R |
| | | | |
-----------------------------------------------------------------------------------------
| Ḋ | Dequeue from list | 4R -> [1 ... 4]Ḋ -> [2, 3, 4] | Range [2 ... n] |
-----------------------------------------------------------------------------------------
| Ṗ | Pop from list | 4Ṗ -> [1 ... 4]Ṗ -> [1, 2, 3] | Range [1 ... n-1] |
-----------------------------------------------------------------------------------------
| Ẇ | Sublists of list | 4Ẇ -> [1 ... 4]Ẇ | All sublists of R |
| | | -> [[1], [2], [3], [4], [1, 2], | |
| | | [2, 3], [3, 4], [1, 2, 3], | |
| | | [2, 3, 4], [1, 2, 3, 4]] | |
-----------------------------------------------------------------------------------------
| Ẋ | Shuffle list | 4Ẋ -> [1 ... 4]Ẋ -> [2, 1, 3, 4] | Shuffles R |
-----------------------------------------------------------------------------------------
| Œ! | All permutations | 3Œ! -> [1, 2, 3]Œ! | All permutations |
| | of a list | -> [[1, 2, 3], [1, 3, 2], | of R |
| | | [2, 1, 3], [2, 3, 1], | |
| | | [3, 1, 2], [3, 2, 1]] | |
-----------------------------------------------------------------------------------------
| ŒḄ | Non-vectorized | 4ŒḄ -> [1 ... 4]ŒḄ | Bounces R |
| | bounce, | -> [1, 2, 3, 4, 3, 2, 1] | |
| | z[:-1] + z[::-1] | | |
-----------------------------------------------------------------------------------------
| Œc | Unordered pairs | 4Œc -> [1 ... 4]Œc | Unordered pairs |
| | of a list | -> [[1, 2], [1, 3], [1, 4], [2, 3], | of R |
| | | [2, 4], [3, 4]] | |
-----------------------------------------------------------------------------------------
| Œċ | Unordered pairs | 4Œċ -> [1 ... 4]Œċ | Unordered pairs |
| | with replacement | -> [[1, 1], [1, 2], [1, 3], [1, 4], | with replacement |
| | of a list | [2, 2], [2, 3], [2, 4], [3, 3], | of R |
| | | [3, 4], [4, 4]] | |
-----------------------------------------------------------------------------------------
| ŒP | Powerset of | 3ŒP -> [1 ... 3] | Powerset of R |
| | a list | -> ['', [1], [2], [3], [1, 2], | |
| | | [1, 3], [2, 3], [1, 2, 3]] | |
-----------------------------------------------------------------------------------------
| Œp | Cartesian | 4,2Œp -> [[1 ... 4], [1 ... 2]]Œp | Cartesian product |
| | product of z's | -> [[1, 1], [1, 2], [2, 1], [2, 2], | of [1 ... z[i]] |
| | items | [3, 1], [3, 2], [4, 1], [4, 2]] | for i in z |
-----------------------------------------------------------------------------------------
Jellyは、コマンドライン引数から入力を取得するために最適化されています。ただし、ダイアドではなくモナドの記述にも最適化されています。ダイアドでは、各ビルトインに非常に多くの意味があり、曖昧さをなくすために文字を費やす必要がありますが、モナドでは、同じことを言う多くの方法があります。
このように、あなたは一度だけ2つの入力のいずれかを使用し、問題は、それが簡単に暗黙のうちから読み取ることができないようなものである場合には⁴
(あなたが作るためにどちらかの必要性、つまり⁴
、明示的に、または他の上に文字を過ごす}
、@
など) 、Ɠ
コマンドラインに配置するのではなく、標準入力から読み込むことを検討してください。これにより、の配置を介して入力を必要な場所に正確に配置し、Ɠ
他のすべての暗黙的な入力が他の入力から取得されるようにします。これは1バイトを費やして1バイトを節約し、問題によっては、コードの順序を変更するための範囲を広げることで2番目のバイトを節約できます。
を使用して引数のプロパティをチェックするいくつかの非自明な方法がありますƑ
。以下にいくつかを示します。私はこのクイック(例の用途の多くを残しAƑ
、ŒuƑ
、3Ƒ
彼らはすでに彼らの行動を達成するための最も簡単な方法であるため)。
OƑ Is number?
ỌƑ Is character? (errors on negative numeric input)
ḂƑ Between 0 and 2? 0<=x<2 (python). <2aAƑƊ or of course ⁼Ḃ$ in Jelly.
ḞƑ Is integer?
UƑ Like `ŒḂ`, but checks if all sublists of depth 1 are palindromes.
ṠƑ Is one of -1, 0, 1? (e-r1¤$)
これを編集して、さらに興味深いケースを追加してください。
Jelly Languageでコードを簡単に構築できるように設計されたオンラインエディターJelly Ballsを試してみてください。
機能が含まれます: