ゼリーでのゴルフのヒント


46

Jellyは、当社独自のDennisによる暗黙のゴルフ指向プログラミング言語です。独自のコードページと強力なチェーンシステムを使用してプログラムを簡潔に表現することで、PythやCJamのような他のゴルフ言語を破り、より頻繁にここに答えが現れます。

ゼリーでゴルフをするための便利なヒントを集めましょう。(いつものように、回答ごとに1つのヒントをお願いします!)


13
ジェリーは、長期的には役に立つコンテンツを生成するにはまだ流動的であるが、答えるのに最適な人物はおそらくデニスだろうかと思う。
マーティンエンダー

2
言語にどんな変化が起こっても意味をなすはずのヒントはすでにたくさんあると思います。Pythでのゴルフのヒントにも同じ問題があると思いますが、これまでのところ、時間のテストにはかなり順調に合格しています。通常、回答は言語の変更により適用されなくなった場合は更新されますが、多少の遅延は伴います。
リン

3
これがいいヒントです。@ Dennisの見習いになります。その後、あなたは本当にゼリーをゴルフするのが得意です。
コナーオブライエン

12
@Lynnあなたが私たち自身のデニスを言う方法が大好きです私たちはすべて1つの大きな家族のようです:D。

JellyのGitHubで実際にJellyコードページの文字を入力する方法に関するこのスレッドは、おそらく1 つか2つの価値があります:github.com/DennisMitchell/jelly/issues/6これらのビットを自信を持って書き上げることはできません。
ヨルダン

回答:


25

文字列圧縮

より最適化された/自動の文字列コンプレッサーを探しているなら、これを試してください。

オンラインでお試しください!

圧縮された文字列はのよう“...»になります。ここで、ドットはベース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バイトを追加します。)


15
それは便利です!私はこれらを手で圧縮することに少しうんざり
デニス

1
@DennisこれはJelly自体に含めることができるので、毎回ここからコピーする必要はありませんか?
PurkkaKoodari

@ Pietu1998アトムまたは他の何かとして?
デニス

@Dennisリポジトリ内のユーティリティスクリプトとして。
-PurkkaKoodari

1
おそらくゼリーに何かが必要です。
電卓

19

これは、Jelly wikiチュートリアルとなったものの一部です。

チェーン

(これは、暗黙のプログラミングの一種です。)

Jellyはチェーンをどのように評価しますか?前に説明したように、考慮すべき3つのケースがあります。このチェーンがniladicallymonadically、またはdyadicallyに呼び出されたかどうかです


1.ニラディックチェーン

これらは最も簡単なものです。などのniladで始まる niladicチェーンを評価するに、そのniladでα f g hモナドチェーンf g hを評価しますα。(注意:チェーン全体が空の場合、代わりに0が返されます。niladでα ない場合、代わりにuse α=0を置き換えます。)

たとえば、はで½評価されるだけ4です2


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 = (ω+ω²)×ωます。
  • これでチェーンは空になり(ω+ω²)×ω、最終結果も空になりました。

3.二項鎖

これらは基本的にモナド連鎖に似ていますが、今回は、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((λ+ρ)×(λ÷ρ))ます。
  • チェーンは空になったので、完了です。

2
それで、これはゴルフのヒントよりもゼリーのチュートリアルになっていますか?;)
マーティンエンダー

5
そうだと思います。言語を理解するのが非常に難しい場合、「これはどのように機能しますか?!」が良いヒントだと思います^^私は最終的に、非自明なトリックとバイトを節約する方法に進むつもりです。これが適切でない場合は、GitHubまたは(デニスが気に入ったら)Jellyレポに移動できます。
リン

16

特別な場合の数値

Jellyの数値パーサーの特殊なケースを次に示します。

  • - に評価する -1
  • . に評価する 0.5
  • ȷ評価された1000ȷ科学的表記法のためで、例えば2ȷ6です2000000
  • ıに評価します1jıは、複素数の場合、例えば2ı3です2+3j

また、のようなもの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

13

最適化された文字列コンプレッサー

オンラインでお試しください!

Lynnの投稿では、これらの圧縮された文字列を正確に生成するコンプレッサーとともに、圧縮された文字列が正確にどのようなものであるかについて詳しく説明しています。しかし、Jellyのプログラムをいじくり回しながら、可能な限り短い文字列を実現するために、スペースの正しい配置.dictionaryなどを組み合わせ.stringて使用するのは面倒です。

したがって、ユーザーの入力を受け付けるLynnのスクリプトの拡張機能を作成し、ユーザーが作業を行わなくても圧縮できる最短の方法を見つけることにしました。スクリプトは非常に長いため、コード自体ではなく、TIOリンクに追加しました。

プログラムが機能する方法は、3つの異なる方法を使用して圧縮し、最短の方法を決定することです。

  1. 方法1は、入力の各バイトを一度にエンコードするだけで、他のバイトに比べて最も長い結果を生成する傾向があります。入力が非常に短い場合でも、かなり長い選択肢を作成できます。たとえば、test圧縮できる最短の方法はですが“¡ḌY»、このメソッドは“¡⁷ƑKʂ»(2バイト長い)を返します。一般的なルールとして、これは文字列が4文字未満の場合にのみ機能します

  2. 2番目の方法は、文字列を単語と句読点に分割します。2つは異なる方法でコンプレッサーに追加されるためです。辞書の一部である単語は.dictionary、Lynnのコードのメソッドで追加されます。Lynnのコードは、単にコードポイントによって追加された場合よりも圧縮します。ただし、残念ながら、句読点は辞書の一部ではないため、コードポイントごとに追加する必要があります。

    句読点にはスペースが含まれます。これは、メソッド番号3が重要な役割を果たしますが、最初にメソッド2の評価をHello, World!行います。文字ごとに圧縮すると、最終的な文字列“ŒCdẉa÷¹ṂȤƓ(Ẋ)»(長さ15バイト)になり“Hello, World!ます。これは、結局のところ、Hello、World !:を出力するより簡単な方法よりも長くなります。次に、方法2を見てみましょう。これにより、“Ọƥ⁷Ƭė3⁶»9バイトの圧縮文字列が生成され、古い文字列よりも大幅に改善されます。ただし、最短のHello、World!Jellyのプログラムは8バイトなので、何かを改善できます

  3. ここに方法3があり、さらに短くなります。予想どおり、Hello、Worldの出力はもちろん、“3ḅaė;œ»最短のプログラムです。では、方法3は何をしますか、方法2はしませんか?方法3は、孤立したスペースをリーディングスペースに結合します。リーディングスペースには、Jelly解凍プログラムにフラグがあります。コンプレッサーとデコンプレッサーの両方のコードで、次のようなコードを見ることができます。if flag_space: word = ' ' + word先頭のスペースがa)サポートされ、b)バイトを節約していることを示しています。したがって、方法2の文字列スプリッターは、isの直後にスペース自体が文字列に結合され、先頭の文字列が作成されるように適合されます。これは、Hello, World!として解析されることを意味します。これは、["Hello", ",", " World", "!"]圧縮時に6バイトのみです(区切り文字を含めると8バイト)。これは、私が追加した「拡張子」を除いて、ほとんどの場合、最短の圧縮方法です。

これはプログラムの大部分ですが、さらにデータを圧縮するのに役立つオプションがいくつかあります。

  • プログラムは、Jellyが使用するDennisのsss解凍プログラムを使用して、各圧縮バージョンが正しいかどうかを確認します(ソースに直接移動します)
  • 最初のコマンドライン引数を作成すると、さまざまな圧縮文字列をすべて表示できます--debug。これは、最短の圧縮文字列を単に表示するのではなく、3つすべてを「This is the shortest」コピーとともに表示します
  • プログラムは「非単語」を処理します

非単語

このメッセージを見た後、Lynnのコンプレッサーの作業を開始し、それをクラックし、それを圧縮する最短の方法が見つからなかったことに不満を感じました(レコードの場合は29または32バイトです)。しかし、私の改善点をテストしてknownsいると、Jellyの辞書にないような単語が見つかりました。したがって、これらの「非単語」を可能な限り短いJellyコードで圧縮する方法を見つけることに着手しました。

trim文字列の少なくとも1つの部分が単語であるポイントとして文字列を分割する関数()を作成しました。例えば、knownsに分割されることになる["known", "s"]と、プログラムが辞書の追加(を介して第1のワード追加有する.dictionary)とを介してワードの第二の部分.stringの呼び出しを。ただし、これには2つのエッジケースが残ります。単語が含まれていない文字列(などajdl)と、末尾に単語がある非単語(、など)abctesttrim関数によって分割されません。

文字列に単語が含まれていない単語を見つける方法はないため、これらを処理する最も簡単で最短の方法は、.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バイトです。最後に、文字列自体が圧縮されたバージョンよりも短い場合がありますが、これは現在では考慮されています。

もちろん、これに対する多くの功績は、オリジナルのコンプレッサーを作成したリンにあります


codegolf.stackexchange.com/a/151721/39328があるので、これを削除する必要がありますか?
リトシアスト

@lirtosiast同じ議論により、この投稿を削除する必要があると言えます。それは害を及ぼさず、完全に有効な答えです。より良い答えがあるという理由だけで、それを削除する理由はありません。

10

上付きの3〜9(³⁴⁵⁶⁷⁸⁹)を使用して、通常使用される値をゴルフできますが、これはコマンドライン引数の量に依存し、リンクの場合はリンクの引数に依存します。

  • ³ 100を返し、入力がない場合にのみ機能します。
  • 16を返し、最大で1つの入力がある場合にのみ機能します。
  • 10を返し、最大で2つの入力がある場合にのみ機能します。
  • 最大3つの入力がある場合、スペースを返します。
  • 最大4つの入力がある場合、新しい行を返します。

ただし、入力が5つある場合、運が悪い。

最近、この言語の新しいバージョンは値³を100に下げ、値または(リンクの場合)引数を返すいくつかの新しいアトムを導入しました。

  • 左の引数が渡されたリンクを除くすべての場所で空のリストを返します。
  • 正しい引数が渡されたリンクを除くすべての場所で256を返します。

リンクにいて、両側からの引数が渡されている場合は、運が悪いです。


1
実際、未使用の入力にはデフォルト値が設定されています!こんな便利!
CalculatorFeline

9

悪用文字列のバグ

文字列を弾力化するプログラムを書くで最初にこれを利用した功績はAdnanに与えられます

Jellyはいつか文字演算を取得することになっていますが、それが起こるまで、Pythonはほとんどの算術演算子をオーバーロードし、Jellyは型チェックを行わないという事実を利用できます。

例えば

“abcd”Ḥ

現時点では有用なことを行うことは想定されていませんが、(unhalve)は

lambda z: z * 2

算術アトムは深さ0でベクトル化します(つまり、数値または文字で動作します)。上記のJellyコードは、

['aa', 'bb', 'cc', 'dd']

これにより実際のPython文字列が生成されることに注意してください(Jelly型にはないはずです)。したがって、これはすべての状況で使用できるわけではありません。

同様に、+/同じ注意事項で文字列を連結するのに役立ちます。


将来、文字演算が追加される場合、文字列および他の非数値型の型オーバーロードをそれらのアトムに追加しますか?
マイル

1
多かれ少なかれ。内部的には数値ですが、文字フラグを持つ数値型を作成する予定です。そのフラグは印刷にのみ影響します。どこでも整数の代わりに文字を使用できます。
デニス

1
S文字列を連結するのに役立つことはありません。文字列に追加しようと0します。
エリックアウトゴルファー

@EriktheOutgolfer右、厄介なベースケース。+/しかし動作します。
デニス

@Dennisええ、私は今のところチャレンジでほとんど勝ちました+/
エリックアウトゴルファー

8

最適なストリングコンプレッサー

最近、私は尋ねた エリックOutgolferを追加するために最適化された文字列の圧縮機JHTの参照ページを、彼らは言ったことを

申し訳ありませんが、それコンプレッサーが完全に実施されていないようです
、それは言う“ugtestslug”ために、最短であるugtestslug一方で、“#ṀȮụḄPƇ»また仕事をしていません

そこで、最適な文字列コンプレッサーを実装することにしました。

シンプルなアプローチですが、可能な限り最小の値(したがって、バイト数)を見つけることを保証します

入力をからstdin、出力をに取得しstdoutます。元のコンプレッサーと同じように、または (リテラル改行文字)を改行として入力できます。

多くの句読点(たとえば、input ¶-----¶)で実行しようとすると、圧縮されていない文字列が出力されます。

もちろん、これに対する多くの功績は、オリジナルのコンプレッサーを作成したリンにあります。


7

これは、Jelly wikiチュートリアルとなったものの一部です。

暗黙のプログラミング

Jellyは暗黙のプログラミング言語です。つまり、関連する引数について明示的に話すことなく、既存のリンクをチェーンに構成することでリンク(関数)を定義します。引数がこの構成を「流れる」方法は、リンクが配置されるパターンによって定義されます。この例はすぐに示されますが、最初にいくつかの概念を紹介する必要があります。

リンクのアリティは非常に重要な概念です。すべての原子(組み込み+など½)には固定アリティがあります。リンクは、アリティに応じて3つのカテゴリに分類されます。

  • Niladsは引数を取りません(アリティ0)。いくつかのI / Oおよびステートフルコマンドを除き、それらは主に定数値を表します。たとえば、リテラル3はniladです。

  • モナドは1つの引数を取ります(アリティ1)。(ここでは関数型プログラミングモナドとは関係ありません。)たとえば、½(平方根)はモナドです。

  • ダイアドは2つの引数(アリティ2)を取ります:左引数と右引数。たとえば+、ダイアドです。

(形容詞を使用して、リンクはniladicmonadic、またはdyadicであると言います。)

それでは、プログラムを書くときに定義するリンクのアリティは何ですか?デフォルトでは、それらは可変引数です。つまり、使用する引数の数を指定するのは呼び出し側次第であり、メインリンクの場合、プログラムに渡される引数の数に依存します。

例として、(加算)と(平方根)のチェーンです。このチェーンの要素のそれぞれのアリティは2と1なので、これを2,1-chainと呼びます。インタープリターには、アリティに基づいてチェーンを分解するための特定のルールがあります。これらのルールは、入力が与えられると、この新しいリンクがを計算することを指示します。(あなたが読むことができるよう、「...プラスその平方根。」+½nn + sqrt(n)

ゼリープログラミングは、本質的にこれらのルールをよく学び、暗黙のうちに仕事を成し遂げる巧妙なチェーンを構成する技術です。


トライアドはありますか?
コナーオブライエン

いや!デニスが文字列置換を実装する方法を知りたいのですが、これは少し本質的にトライアドイックです(replace(str, old, new))。
リン

私はJellyを知りませんが、Jのことは少し知っています。たぶん、バイナリリストはstring (operator) (list)どこに(list)あるのでしょうかold, new。それは理にかなっています、ゼリーは組み込みのpairオペレーターを持っています。ただし、このスキームでは、オペレーターにとっては2バイトになります。
コナーオブライエン

5
待って... ½平方根ですか?なんで½、半分じゃないの?なぜ平方根ではないの ですか?:(
チョイス

@Cyoce Hはすでに半分であるため、明らかに:P
ヴェン

6

これは、Jelly wikiチュートリアルとなったものの一部です。

プログラム構成

Jellyプログラムの各行はリンク定義です。リンクは基本的に機能です。一番下の行は「main」を表します。コマンドラインで渡された引数を使用して評価されるのはリンクです。

最後のリンクを除くすべてのリンクは関数定義です。アクターを使用してそれらを参照できます。例えば、çある「バイナリ演算子(ダイアド)としてこれ以上のリンクは、」。引数の合計の二乗を計算する次のプログラム例について考えてみましょう。

+
ç²

これは、擬似コードのようなものです:

define f:
    the built-in link +
define main:
    apply the dyad f
    square the result

6

これは、Jelly wikiチュートリアルとなったものの一部です。

マルチチェーンリンク

他のリンクのチェーンを作成してリンク定義すると書いたときのことを覚えていますか?本当のことを全部言っているわけではありません。実際には、2層のプロセスです。リンクはチェーンのチェーンであり、デフォルトでは、外側のチェーンは単にユニットの長さを持ちます。

このプログラムを検討してください。

C+H

それは補数とhalfです。入力値nを取り、計算し(1-n)+(n/2)ます。エキサイティングではありません、私は知っています。しかし、構造は本当に次のようなものです。

                                                    構造1

私たちが書いたリンク自体は、実際には単一のチェーンを含むチェーンです。

(1-n)+(1-n)(n/2)代わりに計算したいとします。ダイアディックチェーンは機能します。チェーンルールにより、が計算されますλ+(λ×ρ)。これは、必要なものによく似ています。ただし、プログラムで単純に置き換える+ことはできませんC+×H。1,2,2,1-チェーン– 補数であり、次に(引数)を追加し、次に半分で乗算 –計算し((1-n)+n)×(n/2)ます。

私たちは、ゼリーを扱いたいユニットとして、及びサブチェーンの1,2,1-チェーンを作るCHマルチチェーンリンクにより、まさにそれが可能になります!それらを構築するには、チェーンセパレータ を使用しøµðます。上の画像では、それぞれアリティ0、1、2の新しい青い長方形が導入されます。この場合、次のように記述することにより、チェーンを思いどおりにグループ化できますCð+×µH

                            ここに画像の説明を入力してください

これらをさらにネストする方法はありません。代わりに、複数のリンクを定義する必要があります。


好奇心からこれらのチャートをどのように作成しましたか?
コナーオブライエン

4
Paint.NETでそれらを手で描いた:)
リン

4
うわー!印象的!これは、これを行うツールのように、ハードJellyプログラムにとってはクールです。(HexagonyColorerまたはそれと呼ばれるものに類似)
コナーオブライエン

5

TMTOWTDIの場合は、チェーンに合ったものを選択してください。

暗黙の言語の利点の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」?
CalculatorFeline

上部はJの用語です。Jellyでは、最後の戻り値に直接作用するチェーンの一種であるため、チェーンの前のリンクので実行さます。
デニス

この言語を学ぼうとしない別の理由...:P
電卓

1
J / APLについても同じように感じましたが、しばらくすると他の言語と同じように自然に感じます。
デニス

4

整数圧縮

文字列圧縮は、テキストを英語で作成する場合に役立ちますが、他の種類のデータを圧縮する必要がある場合、かなり効果的ではありません。そのため、ほとんどの場合、プログラムに大きな固定定数を保存する場合は、整数として保存するのが最善です。

Jellyには定数として独自のコードページがあるため、整数の圧縮アルゴリズムはJelly自体で最も簡単に表現できます。

ḃ250ịØJ”“;;”’ṄV

オンラインでお試しください!

(上記のプログラムには、整数が圧縮解除される値を表示するチェックも含まれています。)

整数を整数として使用するだけでなく、それを使用して文字列を作成し、その文字列に対してベース変換を行ってから、文字のアルファベットにインデックスを付けることもできます。原子は、このプロセスを自動化し、そしてそれは単一バイトで(アルファベット以外に解凍される)解凍のプロセス全体を記述することができるので、かなり有用です。


4

外積を使用して有用な整数行列を作成する

ここに、私がこの投稿から作成した要点を示します。これは、HTMLテーブルの書式設定が少し優れています。

外積クイックþはダイアドにアタッチでき、ダイアドは左右の引数内の各要素ペアに作用します。略記です€Ð€。たとえば、コードがある場合、[1,2]+€Ð€[0,10]それを短くすることができ、[1,2]+þ[0,10] 両方が生成され[[1,2],[11,12]]ます。þ(のような)が適用されたダイアドを外部製品ダイアドと呼びます。

整数が外積ダイアドの引数の1つである場合、Jellyは最初にその数値の範囲を取得し、その結果を引数として使用します。これを知って、上記の例はさらに短縮できます2+þ[0,10]。これは、外積ダイアドの左右の引数の両方に当てはまります。

一部の外積ダイアドは、整数に単項で作用する場合、ゴルフ(特にASCIIアートの課題)に役立つ可能性のある特定の整数行列を生成しますが、それ以外の場合は多くのバイトを必要とします。たとえば、整数に適用するnと、n×n単位行列が生成されます。オンラインでお試しください

以下は、ダイアドの表と、外積ダイアドに変換され、整数に対して単項に作用したときに生成されるマトリックスのタイプです。同じ行にリストされているダイアドは、同じ行列を生成します。私は次のように表には含まれていないダイアドあり&|%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 |
+ ------------------------------------------------- ---- +

2

コマンドとリテラルを一覧表示する

あなたは、多くの使用しようとする非ベクトル化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        |
-----------------------------------------------------------------------------------------

それは完全に正確ではありません。はい、デキューおよびデカルト積がこれを行いますが、範囲を作成する代わりに合計がラップし、最初にベース10にソートおよび変換します。
デニス

2

正確に2つの入力がある場合に、標準入力から読み取ることが時々価値があります。

Jellyは、コマンドライン引数から入力を取得するために最適化されています。ただし、ダイアドではなくモナドの記述にも最適化されています。ダイアドでは、各ビルトインに非常に多くの意味があり、曖昧さをなくすために文字を費やす必要がありますが、モナドでは、同じことを言う多くの方法があります。

このように、あなたは一度だけ2つの入力のいずれかを使用し、問題は、それが簡単に暗黙のうちから読み取ることができないようなものである場合には(あなたが作るためにどちらかの必要性、つまり、明示的に、または他の上に文字を過ごす}@など) 、Ɠコマンドラインに配置するのではなく、標準入力から読み込むことを検討してください。これにより、の配置を介して入力を必要な場所に正確に配置し、Ɠ他のすべての暗黙的な入力が他の入力から取得されるようにします。これは1バイトを費やして1バイトを節約し、問題によっては、コードの順序を変更するための範囲を広げることで2番目のバイトを節約できます。


2

を使用して引数のプロパティをチェックするいくつかの非自明な方法がありますƑ。以下にいくつかを示します。私はこのクイック(例の用途の多くを残しŒuƑ彼らはすでに彼らの行動を達成するための最も簡単な方法であるため)。

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¤$)

これを編集して、さらに興味深いケースを追加してください。


2

Jelly Languageでコードを簡単に構築できるように設計されたオンラインエディターJelly Ballsを試してみてください。

機能が含まれます:

  • タイプ別に整理されたすべてのアトムと構文文字を含むコマンドパレット
  • コード内のリテラルと2バイトアトムを認識するオンラインパーサー
  • JavascriptでWebページでJellyコードを実行するための簡易ブラウザー内Jellyインタープリター
  • コードをTIOまたは別のJelly Ballsセッションに転送するための直接リンク
  • 自動ヒント
  • モバイル機器向けに最適化

試してみてください:https : //jellyballs.github.io

ゼリーボール

  • 実行されたすべてのステップの引数と結果を示す詳細なトレースレポート

ゼリーボール

  • すべてのステップの説明を示すコードレポート

ゼリーボール

  • ゼリーの例を含むレシピページ

ゼリーボール

  • 256個のゼリー文字のインタラクティブコードページ

ゼリーボール



3
カスタムキーボードレイアウトなしでJellyを作成できるIDEへのリンクは、かなり役立つヒントだと思います。多くのゼリー初心者はこれに苦労しています。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.