回答:
05AB1EのGitHubページのWikiの一部ではなかったので(そうするべきだと思います)、ここで追加するつもりです。
05AB1Eには、知っているすべての単語を含む次のwords.ex辞書ファイルがあります。しかし、この辞書の単語にどのようにアクセスしますか?単語"testing"
を例に取りましょう:
"testing"
辞書ファイルの行1453にあります。最初の2行は単語ではないので、0のインデックス
が付いた単語が必要なので、3を引きます1450
。
“
†で圧縮文字列を開いて開始します。次に、info.txtファイルの 2列目を確認します。(つまり€
、00; ‚
01;など)
この場合、(14)と(50)を"testing"
意味します。î
»
したがって、圧縮文字列"testing"
は次のとおり“
です。オンラインで試してください。ほとんどすべての05AB1Eのコードと同様に“
、文字列にアクセスしない場合、末尾はオプションなので、この場合も機能しません。
注意するべき事柄:
info.txtファイルにインデックスのない文字はすべてそのまま使用できます。これはs
、単数形の単語の代わりに複数形を出力したり、句読点など,.?!
を使用したりする場合に便利です。
ÿ
(文字列補間)は、文字列内のスタックから値を挿入する場合にも使用できます。
注:info.txtファイルにインデックスのないゆるい文字はすべて、以下の圧縮タイプの単語としてカウントされます。
†使用できる圧縮文字列にはさまざまな種類があります。
'
:単一の圧縮された単語をそのまま使用します(末尾は'
不要です)- 'î»
: "testing"„
:スペース区切りで2つの圧縮された単語を使用します(末尾は„
不要です)- „î»î»
: "testing testing"…
:スペース区切りで3つの圧縮された単語を使用します(末尾は…
不要です)- …î»î»î»
: "testing testing testing"“
:スペース区切り文字付きの圧縮文字列を取得します- “î»î»“
: "testing testing"’
:圧縮された文字列を暗黙のスペースなしでそのまま使用します- ’î»î»’
: "testingtesting"”
:スペースデリミタを使用してタイトルケースの圧縮文字列を取得します- ”î»î»”
: "テストのテスト"‘
:圧縮文字列をスペース区切りで完全に大文字にします- ‘î»î»‘
: "TESTING TESTING"これは、スペースで区切られた単語の入力に基づいて圧縮文字列を取得する便利なプログラムです。
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
このプログラムは:
lAð«Ã#
)、または単語が1つだけ入力された場合は単語をリストにラップする(¸˜
)vyU
)"€...ï"Dâvy
)から圧縮された各単語に対する内部ループがあり、05AB1Eプログラムとして実行しようとします("“ÿ“".V
)XlQiy?1#
good bye world
したがって、入力の場合、出力はになります“‚¿Þ¡‚ï“
。オンラインでお試しください。
注:このジェネレータが機能するには、辞書に単語が存在するかどうかを確認する必要があり、特殊文字や複数の単語は無視されます。辞書でまったく同じ単語のみが検索されます。
ここでは…Ÿ™‚ï!
、文字列「hello world!」に使用する例を示します。そして’‚¿Þ¡ ÿ ‚ï!’
、文字列「さよならのYの世界!」のために。info.txtファイルにインデックスがないため、スペースと感嘆符がそのまま使用されていることに注意してください。さらにÿ
、スタックの最上部にある「残酷」を挿入するために使用します。これは、残念ながら辞書の一部ではありませんでした(ただし、以下のセクションの方法を使用して圧縮されました)。
words.ex辞書ファイルは非常に大きい(正確には10,000語)が、その一部ではない単語、または単なる意味不明な文字列が必要になる場合があります。これらを圧縮する方法はありますか?
確かに.•
、圧縮されたbase-255アルファベットベースの文字列であるを使用することにより、あります。注:このメソッドは、小文字のアルファベットとスペースの文字にのみ使用できます。
次に、単語/文字列を圧縮されたbase-255アルファベットベースの文字列に変換する便利なプログラムを示します。
vAyk})> 27β 255B ".•ÿ•"
上記のこのプログラムが行うことは:
vAyk})>
:入力の個々の文字の1インデックス付きアルファベットインデックスを取得します。スペースはインデックス0になります27β
:これらのインデックスを基数27から単一の数値に変換します255B
:05AB1E独自のコードページを使用して、この数値をBase-255に変換します".•ÿ•"
:この圧縮文字列の前に先頭.•
と末尾を配置し•
ますここでは、@ Kaldoが.•zíΘ•
「goose」という単語を圧縮するために使用する回答例を示します。
非常に大きな数を何かに使用したいとしますが、実際にはPow-Calculationsで取得することはできません。たとえば18238098189071058293
、何らかの理由で大きな整数にアクセスしたいとします。
この場合、先頭と末尾の両方を使用•
して、形式の数値を圧縮できます[1-9][0-9]+
。
上記の例番号はになり•15Y₁Ò'Θpc•
ます。オンラインでお試しください。繰り返しますが、圧縮された辞書文字列の場合と同様に、オプションで末尾•
を削除できます。
必要に応じて、整数が十分に小さいため、2つの圧縮文字のみを使用するŽ
必要がある場合は、代わりに使用できます。たとえば、整数13562
はになりますが•rl•
、2文字しか使用しないため、Žrl
代わりに。
また、範囲内の数値は、05AB1Eのコードページからの追加文字に加えて、[101, 355]
2バイトで圧縮できますƵ
。したがって、たとえば、Ƶ–
整数に使用できます250
。ここで利用可能なすべての数字の概要。これらの文字はBase-255からBase-10に変換され、101が追加されます(範囲内の数字[0,100]
はすでに1または2バイトであるため)。
これらはどのよう15Y₁Ò'Θpc
にrl
作成されますか?非常に簡単で、05AB1E独自のコードページを使用して、数値がBase-255に変換されます。あなたはそれがその後、使用なるために圧縮番号を取得するには、以下のプログラムを使用することができますのでƵ.
、Ž..
または•...•
圧縮された整数のサイズに応じて:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
ここで、@ Emigna•3Èñ•
が整数に使用する答えの例を示します246060
。
単一の数値ではなく、整数のリスト全体を圧縮したい場合があります。たとえば[5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]
、何らかの理由でリストが必要だとしましょう。この場合、代わりに以下を使用でき•4βŸ{©£MG]q‡dZΘp•94в
ます。オンラインで試してください。
ここで、この圧縮された数値と変換先のBaseの両方を生成する便利なプログラム:
Z>© β 255B ®s"•ÿ•ÿв"
上記のこのプログラムが行うことは:
Z>
:入力リストの最大数+ 1を取得します(©
:およびレジスタに保存します)β
:入力リストをベースmax+1
から単一の数値に変換します255B
:この単一の番号を圧縮します(上記のセクションで行ったように)®s"•ÿ•ÿв"
:結果を次の形式で返します:先頭•
、圧縮番号•
、最大、末尾в
ここで、•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
リストを圧縮するために使用する回答例を示します[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
。
PS:•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô
すべての数字は正確に2桁であるため、この回答では等バイト(57)の代替です。場合によっては(特に小さなリスト)、これはより短い代替手段になる可能性があります。
整数圧縮と整数リスト圧縮:
これら2つを使用すると、どちらの方法でも使用できます。圧縮されたリストが短い場合、圧縮された整数である場合、完全に異なる代替が短い場合があります。したがって、上記のジェネレーターに完全に依存するのではなく、常に独自の判断とゴルフスキルを使用して、ゴルフをさらに進めることができます。ここにいくつかの例があります:
•A–•60в
7バイト(圧縮整数リストジェネレーターにより生成)•H|•2ô
または•H|•2ä
ハードコーディングされた44 59‚
ものはすべて6バイトですŽH|2ô
またはŽH|2ä
両方とも5バイト„,;Ç
4バイトが最適なオプションです(文字のコードポイント「、」および「;」)10101001100101001
(私のこの答えで使用されます):
•a½₄Ƶ6®í•
9バイトです(圧縮されたラージ整数ジェネレーターによって生成されます)•1∊}•2вJ
8バイト(結合を追加した圧縮整数リストジェネレーターで生成)•1∊}•b
、6バイトが最適なオプションになります(圧縮された整数リスト、暗黙的に結合するの代わりにtoバイナリを使用2в
)[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
(私のこの答えで使用されます):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
57バイト(圧縮整数リストジェネレーターにより生成)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂+Öηôî®À8†6 /ðÎ6ùøΓ°ÓĆ; ˆ©Ā•2ô`も57バイト(圧縮整数、サイズ2の部分に分割)です。•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+
ただし、各値が26低いリストを圧縮することにより2バイト短くなり、その後に `₂+ `で追加します。後でシングルバイト値を追加するこのトリックは、圧縮リストにバイトを保存するためにかなり頻繁に使用できます。05AB1Eがリリースされた当時、暗黙の入力はまったく新しくて派手でした。最近では、他の競合する言語(Jelly、MATL、Pythなど)を追跡するために必要なようです。
たとえば、2つの数字を追加する場合は、次のようにしますII+
。
I # Input_1.
I # Input_2.
+ # Add them up.
しかし、使用して暗黙の入力を、我々はすなわち、わずか1バイトまでに短縮することができます+
:
+ # Take two numbers implicitly and add them up.
これは、スタックの長さが演算子のアリティより小さい場合にのみ発生します。最後の例は3+
です。スタックの要素は1つだけ+
ですが、演算子のアリティは2です。
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
£
b
string の最初の文字を取得するためのコマンドですa
。
例: "hello_world"5£
->
"hello"
ただしb
、インデックスのリストの場合は、代わりに文字列をこれらのサイズの(最大)の部分に分割します。
例: "hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
05AB1Eでは少し隠されています。すべての定義済み変数のリストは次のとおりです。
¾
0をプッシュ =>それは取得するほどニーモニックではない
¾
0として初期化されたカウンター変数をプッシュします。0のみをプッシュしたい場合、0はもちろんより自然ですが、プッシュしたい場合は5,0,7
、5¾7
よりも2バイト短くなり5 0 7
ます。
print(3 / 4)
Python 2で私に与えます0
。
M
押し-Inf
ます。
Λ
または.Λ
)それはドキュメントの一部ではなく、@ Adnanは現在少し忙しくて書くことができないので、今のところここにヒントとして追加する許可を求めました。
Canvas関数(Λ
または.Λ
)を使用して、画面にASCII線を描画できます。次の3つの必須パラメーターがあります。
[0,7]
、方向の数字があり、1つまたは複数を使用できます。特定の文字を必要とする特別なオプションもあります(これについては後で詳しく説明します)。方向桁[0,7]
は、次の方向にマップされます。
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
いくつかの例05AB1Eは、Canvasが使用される場所に答えます。
最後のものと同様のことをしてみましょう。Λ
次の3つのパラメーターでCanvas 関数を使用すると仮定します。
[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
これにより、次の出力が得られます。
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
それでは、どのように機能しますか?さて、ここに上記のこれらの入力の手順があります:
3
文字(!@#
)を上向きに描画します(方向0
)3-1
文字(!@
)を右(方向)に向けて描く2
)に5-1
文字(#!@#
)を描く(方向4
)5-1
文字(!@#!
)を左(方向)に描画します6
)に7-1
文字(@#!@#!
)を上向きに描画します(方向0
)7-1
文字(@#!@#!
)を右(方向)に向けて描く2
)に9-1
文字(@#!@#!@#
)を描く(方向4
)9-1
文字(!@#!@#!@
)を左(方向6
)に向けて描く-1
線が重なるのであります。したがって、最初の2つのステップは次のとおりです。
#
@
!
そして
!@
組み合わせは次のとおりです。
#!@
@
!
いくつかの小さなメモ:
[0,7]
基本的に特定の方向シーケンスに変換されるいくつかの特定のオプションが利用可能です。
+
('+
インライン)はpattern 04402662
に変換され+
、指定された長さの腕を持つ-cross を作成します。実際にご覧ください。×
('×
インライン)はpattern 15513773
に変換されX
、指定された長さの腕を持つ-cross を作成します。実際にご覧ください。8
描画を開始した場所の原点に戻ります。アクションでそれを見て、違いなしで違いを見てください8
。Λ
すぐに出力さ.Λ
れ、スタックにプッシュされる文字列が生成されます。この文字列は、再利用、変更、および必要な処理を行うことができます。いくつかの例:
ループと条件は、プログラムの終わりに閉じ括弧を自動的に受け取るので、ループ/条件外の何かが必要な場合にのみコードに追加する必要があります。
たとえば、最初のn
素数のリストを作成するこの(改変されていない)プログラムは、閉じ括弧を必要としません。
[¹¾Q#NpiNˆ¼
ただし、結果のリストに対して何らかの操作を実行する場合、たとえばデルタを取得する場合は、最初にループを閉じる必要があります。
[¹¾Q#NpiNˆ¼]¯¥
途中で学んだ小さなゴルフのヒントでこれを拡大します。(個人的に05AB1Eを開始したばかりです。)
D
(duplicate)およびÐ
(triplicate)と組み合わせてs
(swap)およびŠ
(triple-swap a,b,c
to c,a,b
)は通常、©
(save in duplicate)および®
(triplicate)ループ内で(global_variableに)および(push global_variable)ます。これは、私のこの答えでバイト保存、同様に2つの鉱山のこの答えを。½
(1の場合、counter_variableを1 増やす)は、暗黙的に行われるためµ
(counter_variable!= a、do ...)の終わりには必要ありません(私の答えでこのバイトを保存します))。.B
暗黙的に改行で分割します。これは、空のアイテムを保持しながら(分割)の代替を探していたときに私の答えに役立ちました¡
(注:要素の分割後に末尾のスペースが含まれている場合、リンクされた回答のソリューションは機能しません)-うまくいけば組み込みスプリットに追加されますが、将来は空の行を保持します。SÖ
(入力整数のどの桁が入力整数を均等に分割できるか)には、数字の数字自体が含まれます0
(ゼロ除算エラーの代わりに)。たとえば、1053
結果は[1,1053,0,1]
(1053は1と3で割り切れ、5で割り切れず、0に対してゼロ除算エラーが発生します)。05AB1Eでのみ真実であり、他のすべてが偽であるため、これはリストの力を利用することで私のこの答えでかなり役に立ちました1
。SÖP
真実になります(1
したがって)になるのは、入力整数が各桁で均等に割り切れることを意味します。û
(与えられた文字列を回文化する)を見た後、is_palindromeビルトインがないことに驚いた。しかし、後でそれを達成するために必要なのは2バイトだけであることに気付きました。ÂQ
(Â
これは、分岐、短縮DR
コピーの略Q
で、スタックの上位2つの値が等しいかどうかを確認するためです)。Ds*
(重複、スワップ、乗算して論理ANDとして機能する)vs }ʒ
(最初のフィルターを閉じて、再度フィルターする)の線に沿って何かが必要になるためです。たとえば、このチャレンジでは、少なくとも1つを含み、0
合計がに等しい4桁の数字をすべてリストする必要があり9
ます。範囲を使用すると[1000,10000]
、4桁の長さがカバーされますが、さらに2つのフィルターが残ります。最初は₄4°ŸʒD0åsSO9Q*
(14バイト)を使用しましたが、2つのフィルターを使用することで1バイトを節約できます₄4°Ÿʒ0å}ʒSO9Q
(13バイト)。(後にゴルフに行きました。)₄4°ŸεW°ö9Q
@Grimyによって(10バイト)に0
をフィラーとして圧縮する場合は、を使用できます0ζ
。ただし、これに関する1つの問題は、フィラー0
が文字列"0"
になるため、後で文字列と整数が混在してソートしようとすると、ほとんどの場合、希望する結果が得られないことです。圧縮された内部リストのソート方法の例を次に示します0ζ€{
。これはï
、zipの後に明示的なキャストをint()に追加してからソートすることで修正できます0ζï€{
。ただし、zipフィラーで¾
as定数0
を使用すると、zip中に文字列ではなく整数のままになります。だから、¾ζ€{
ここでバイトを保存します。このヒントは @ Mr.Xcoder、私のこの回答に 1バイトを保存します。€SO
。ただし1ö
、より短いのは、自動的にベクトル化されるを使用することです。このヒントは、ここで1バイト(およびここで2バイト)を節約するために@Grimyによって提供されました。2‹
。ただし、!
(階乗)を使用しても0
and に対して1(真)しか得られず1
、他のすべての値はより高い値になります(したがって、05AB1Eでのみ1
真実であるため偽です)。このヒントは、ここでバイトを保存するために@Grimyによって提供されました。05AB1Eの一部の演算子は、配列で自動的にベクトル化されることに注意してください。たとえば5L3+
、次の擬似コードに逆アセンブルするコード:
[1, 2, 3, 4, 5] + 3
になるだろう:
[4, 5, 6, 7, 8]
自動的にベクトル化されない場合は、€
演算子を使用することもできます。単一の文字コマンドを受け取り、各要素に対してその(単項)演算子を実行します。各要素を分割する例は次のコードです(ここで試してみてください):
€S
通常のS
演算子は配列内の各要素を分割し、単一の配列にフラット化します(ここで試してください)。
ñ
、n
(インデックス)の値を前に使用してリストをマージします。tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
以下のコードは、カスタムベース変換を使用してASCIIアートを05AB1Eに変換するのに役立ちます。
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
これは、以下によって達成されます。
0-9A-Za-z
すべての文字が置き換えられるまで、入力の文字をその順序でマッピングします。各文字は独自のマッピング文字を取得します。•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
。また“
、文字列引用符を圧縮することもできます"
。Åв
この文字列を使用するカスタムベースとして文字列を使用して生成された整数をベースにコンバート。そしてJ
暗黙的に出力され、単一の文字列に一緒にすべてのこれらの文字に参加します。
ASCIIアートに適した、最大62個の一意の文字を含むパターンを受け入れます。
固有の文字の量が少ないほど、圧縮率は高くなります。
XNORデジタルタイミング図を描画するための出力例(214バイト、9つの一意の文字):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
だろう:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(106/214)* 100 =元のASCIIアート文字列のサイズの49.53%。
これは、05AB1E(レガシー)でのそのチャレンジの実際の送信と同じバイト数です。
注:コードは絶対にゴルフではありません。ASCIIアートを最も効率的な圧縮に変換するために素早く書かれているため、非常にくて長いです。
|» # Take multi-line input
© # Store it in the register to reuse later
ÐÙS # Only leave unique characters (as list)
DŠ¢ø # Map it with the count for each of those characters
Σθ}R # Sort it based on that count (highest to lowest)
€н # Remove the count again, so the sorted characters remain
¬®sÅ?i # If the input starts with the most occurring character:
D2£RDŠKsì} # Swap the first two characters in the list
J© # Join everything together, and store it in the register to reuse later
žLR‡ # Map each character to [0-9A-Za-z]
®gö # Get the amount of unique characters, and convert it to that Base
₅B # And then convert that to Base-255
®s # Push the string and swap so the compressed integer is at the top again
"•ÿ•“ÿ“ÅвJ" # Insert it in the correct output format
# `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•" # (after which the result is output implicitly with trailing newline)
<str><compr_int><int>вèJ
、あなたの代わりに<compr_int><int>BžLR<str>‡
、また、文字列引用符の“
代わりに使用する"
ため"
、入力の一部にすることができます。
誰もが同意するものではありませんが、機能します。
次の2つのプログラムを検討してください。
4 5+
"4""5"+
それらは両方とも9になります。これは、すべての値が最初に評価されるためです(ast.literal_eval
)です。そのため、intではすべての文字列操作演算子を実行でき、stringではすべてのint操作演算子を実行できます。
たとえば12345û
、数値を回文化して12345
、になり123454321
ます。その後、この数値に対して通常の計算を行うことができます。
12345û50000-
これは、123404321になります。
05AB1Eには、次の通常のループと反復子があります。
F
、0 .. n-1を反復処理します。G
、1 .. n-1を反復処理します。ƒ
、0 .. nを反復処理します。v
、各要素s [0]、s [1]、..、s [n]を反復処理します。ʒ
、これは厳密にはループではなく、フィルターによるコマンドです。各要素をループするという意図しない動作のため、このコマンドを悪用します。これらのループを使用して、次の非表示ループを導出できます。
gF
、使用可能v
なN
-indexを含むを使用できます。vy -> ʒ
交換は少しトリッキーです。
y
これらの種類のループでは、呼び出しはできません。[
、µ
とε
も通常のループ/反復の一部?
y
これらのいくつかを使用して呼び出すことが可能になりました。