05AB1Eでのゴルフのヒント


回答:


20

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#] '“,

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

このプログラムは:

  1. 入力を小文字にし、アルファベット以外の文字(スペースを除く)を削除し、スペースで単語を分割する(lAð«Ã#)、または単語が1つだけ入力された場合は単語をリストにラップする(¸˜
  2. 各単語をループします(vyU
  3. 次に、辞書("€...ï"Dâvy)から圧縮された各単語に対する内部ループがあり、05AB1Eプログラムとして実行しようとします("“ÿ“".V
  4. そして、それが現在の単語と等しい場合、それを出力し、内側のループを壊します 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₁Ò'Θpcrl作成されますか?非常に簡単で、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つを使用すると、どちらの方法でも使用できます。圧縮されたリストが短い場合、圧縮された整数である場合、完全に異なる代替が短い場合があります。したがって、上記のジェネレーターに完全に依存するのではなく、常に独自の判断とゴルフスキルを使用して、ゴルフをさらに進めることができます。ここにいくつかの例があります:

[44, 59]@Emignaのこの回答で使用):

  • •A–•60в 7バイト(圧縮整数リストジェネレーターにより生成)
  • •H|•2ôまたは•H|•2äハードコーディングされた44 59‚ものはすべて6バイトです
  • ŽH|2ôまたはŽH|2ä両方とも5バイト
  • ただし、この場合、„,;Ç4バイトが最適なオプションです(文字のコードポイント「、」および「;」)

[2,4,6,0]@Emignaのこの回答で使用):

  • •3ā•7в 6バイト(圧縮整数リストジェネレーターにより生成)
  • Ž3ā7в 5バイトです
  • ただし、この場合、Ž9¦S4バイトが最適なオプションです(数字のリストに圧縮された整数2460)

10101001100101001私のこの答えで使用されます):

  • •a½₄Ƶ6®í• 9バイトです(圧縮されたラージ整数ジェネレーターによって生成されます)
  • •1∊}•2вJ 8バイト(結合を追加した圧縮整数リストジェネレーターで生成)
  • ただし、この場合•1∊}•b、6バイトが最適なオプションになります(圧縮された整数リスト、暗黙的に結合するの代わりにtoバイナリを使用

[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]私のこの答えで使用されます):


12

暗黙的な入力

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.

ここでテストしてください


8

部分文字列

£bstring の最初の文字を取得するためのコマンドですa
例: "hello_world"5£ -> "hello"

ただしb、インデックスのリストの場合は、代わりに文字列をこれらのサイズの(最大)の部分に分割します。
例: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']


8

事前定義された変数

05AB1Eでは少し隠されています。すべての定義済み変数のリストは次のとおりです。

  • ¾0このコマンドの前にcounter_variableが変更されていない場合にプッシュします。
  • X1このコマンドの前に変数Xが変更されていない場合にプッシュしUます。
  • Y2このコマンドの前に変数Yが変更されていない場合にプッシュしVます。
  • ®-1このコマンドの前にレジスタが変更されていない場合にプッシュし©ます。
  • ¯[]このコマンドの前にglobal_arrayに何も追加されない場合、(空の配列)をプッシュします。
  • ¸[""]入力がない場合は空のスタックをプッシュします。(これを見つけてくれてありがとう@Emigna。)

24
¾0をプッシュ =>それは取得するほどニーモニックではない
致命的

6
@Fatalize:0は0もプッシュします。¾0として初期化されたカウンター変数をプッシュします。0のみをプッシュしたい場合、0はもちろんより自然ですが、プッシュしたい場合は5,0,75¾7よりも2バイト短くなり5 0 7ます。
エミグナ

7
私の時代に戻って、¾意味し.75、私はかつてその事実でPythを打ち負かしました。これらの目新しいゴルフ言語は...ニーモニックについての手掛かりを持っていない
ETHproductions

31
皆さんが何について話しているのかわかりません:p。print(3 / 4)Python 2で私に与えます0
アドナン

2
開始時にをM押し-Infます。
mbomb007

7

キャンバスの使用(Λまたは

それはドキュメントの一部ではなく、@ Adnanは現在少し忙しくて書くことができないので、今のところここにヒントとして追加する許可を求めました。

Canvas関数(Λまたは)を使用して、画面にASCII線を描画できます。次の3つの必須パラメーターがあります。

  • a長さ:線のサイズ。これは、単一の整数、または整数のリストにすることができます
  • b文字列:表示する文字。これは、単一の文字、文字列、文字のリスト、または文字列のリストです(最後の3つのケースでは、ラップアラウンドを含むそれらすべてを1つずつ使用します)
  • c方向:文字線が描画される方向。一般に[0,7]、方向の数字があり、1つまたは複数を使用できます。特定の文字を必要とする特別なオプションもあります(これについては後で詳しく説明します)。

方向桁[0,7]は、次の方向にマップされます。

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

いくつかの例05AB1Eは、Canvasが使用される場所に答えます。

最後のものと同様のことをしてみましょう。Λ次の3つのパラメーターでCanvas 関数を使用すると仮定します。

  • A[3,3,5,5,7,7,9,9]
  • b!@#
  • c[0,2,4,6]

これにより、次の出力が得られます。

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

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

それでは、どのように機能しますか?さて、ここに上記のこれらの入力の手順があります:

  1. 3文字(!@#)を上向きに描画します(方向0
  2. 3-1文字(!@)を右(方向)に向けて描く2)に
  3. 下向きに5-1文字(#!@#)を描く(方向4
  4. 5-1文字(!@#!)を左(方向)に描画します6)に
  5. 7-1文字(@#!@#!)を上向きに描画します(方向0
  6. 7-1文字(@#!@#!)を右(方向)に向けて描く2)に
  7. 下向きに9-1文字(@#!@#!@#)を描く(方向4
  8. 9-1文字(!@#!@#!@)を左(方向6)に向けて描く

-1線が重なるのであります。したがって、最初の2つのステップは次のとおりです。

#
@
!

そして

 !@

組み合わせは次のとおりです。

#!@
@
!

いくつかの小さなメモ:


1
05AB1Eにキャンバスがあることすら知りませんでした!
MilkyWay90

どう...これをどうやって見つけたの?ソースコード?
マジックタコop

1
@MagicOctopusUrn @Adnanのこの回答からの大部分(PS:彼の最新の回答も十分に説明されています)。以下のために+×8私は確かに、ソースコードで見てきました。
ケビンクルーッセン

5

ポップまたはゲット

他のスタックベースの言語と同様に、05AB1Eの関数は通常、スタックから入力をポップ(消費)し、出力をスタックにプッシュします。

ただし、一部の関数は、スタックから入力を消費せずに取得します。例は、入力リストから最初の要素を生成するhead関数¬です。次のサンプルプログラムを参照してください¬+。これにより、入力リストの最初の番号がそのリストの各番号に追加されます。

どの関数がポップされ、どの関数が取得されるかを知るには、関数情報ファイルの対応する列を参照してください。


@NeilA。ありがとう!リンクの更新
ルイスメンドー

3

条件とループ

ループと条件は、プログラムの終わりに閉じ括弧を自動的に受け取るので、ループ/条件外の何かが必要な場合にのみコードに追加する必要があります。

たとえば、最初のn素数のリストを作成するこの(改変されていない)プログラムは、閉じ括弧を必要としません。 [¹¾Q#NpiNˆ¼

ただし、結果のリストに対して何らかの操作を実行する場合、たとえばデルタを取得する場合は、最初にループを閉じる必要があります。 [¹¾Q#NpiNˆ¼]¯¥


3

小さな05AB1Eゴルフのヒント

途中で学んだ小さなゴルフのヒントでこれを拡大します。(個人的に05AB1Eを開始したばかりです。)

  • D(duplicate)およびÐ(triplicate)と組み合わせてs(swap)およびŠ(triple-swap a,b,cto c,a,b)は通常、©(save in duplicate)および®triplicate)ループ内で(global_variableに)および(push global_variable)ます。これは、私のこの答えでバイト保存、同様に2つの鉱山のこの答えを
  • ½(1の場合、counter_variableを1 増やす)は、暗黙的に行われるためµcounter_variable!= a、do ...)の終わりには必要ありません(私の答えでこのバイトを保存します))。
  • .B暗黙的に改行で分割します。これは、空のアイテムを保持しながら(分割)の代替を探していたときに私の答えに役立ちました¡(注:要素の分割後に末尾のスペースが含まれている場合、リンクされた回答のソリューションは機能しません)-うまくいけば組み込みスプリットに追加されますが、将来は空の行を保持します。
  • (入力整数のどの桁が入力整数を均等に分割できるか)には、数字の数字自体が含まれます0(ゼロ除算エラーの代わりに)。たとえば、1053結果は[1,1053,0,1](1053は1と3で割り切れ、5で割り切れず、0に対してゼロ除算エラーが発生します)。05AB1Eでのみ真実であり、他のすべてが偽であるため、これはリストの力を利用することで私のこの答えでかなり役に立ちました1SÖP真実になります(1したがって)になるのは、入力整数が各桁で均等に割り切れることを意味します。
  • û(与えられた文字列を回文化する)を見た後、is_palindromeビルトインがないことに驚いた。しかし、後でそれを達成するために必要なのは2バイトだけであることに気付きました。ÂQÂこれは、分岐、短縮DRコピーの略Qで、スタックの上位2つの値が等しいかどうかを確認するためです)。
  • 複数の項目でリストをフィルター処理する場合、通常、すべてを1つにまとめるよりも、複数のルーズフィルターを使用する方が安価です。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をフィラーとして圧縮する場合は、を使用できます。ただし、これに関する1つの問題は、フィラー0が文字列"0"になるため、後で文字列と整数が混在してソートしようとすると、ほとんどの場合、希望する結果が得られないことです。圧縮された内部リストのソート方法の例を次に示します0ζ€{。これはï、zipの後に明示的なキャストをint()に追加してからソートすることで修正できます0ζï€{。ただし、zipフィラーで¾as定数0を使用すると、zip中に文字列ではなく整数のままになります。だから、¾ζ€{ここでバイトを保存します。このヒントは @ Mr.Xcoder、私のこの回答に 1バイトを保存します。
  • リスト内の複数の数字の桁を合計する場合は、を使用できます€SO。ただし、より短いのは、自動的にベクトル化されるを使用することです。このヒントは、ここ1バイト(およびここ2バイト)を節約するために@Grimyによって提供されました。
  • 負でない整数のみを処理していて、フィルター内で0か1かを確認する場合は、もちろん明白なを使用できます2‹。ただし、!(階乗)を使用しても0and に対して1(真)しか得られず1、他のすべての値はより高い値になります(したがって、05AB1Eでのみ1真実であるため偽です)。このヒントは、ここでバイト保存するために@Grimyによって提供されまし

2

自動ベクトル化

05AB1Eの一部の演算子は、配列で自動的にベクトル化されることに注意してください。たとえば5L3+、次の擬似コードに逆アセンブルするコード:

[1, 2, 3, 4, 5] + 3

になるだろう:

[4, 5, 6, 7, 8]

自動的にベクトル化されない場合は、演算子を使用することもできます。単一の文字コマンドを受け取り、各要素に対してその(単項)演算子を実行します。各要素を分割する例は次のコードです(ここで試してみてください):

€S

通常のS演算子は配列内の各要素を分割し、単一の配列にフラット化しますここで試してください)。


配列のn番目の要素にどのように割り当てますか?
アンドリューサビニク

@AndrewSavinykh今のところ、そのための組み込みはありませんが、それは私が実装したいものです。
アドナン

@Adnan私はそれを行う方法を見つけました。n番目のインデックスにも割り当てる値を持つ別のリストを作成します。次にñn(インデックス)の値を前に使用してリストをマージします。tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007それは可能ですが、唯一の問題は、マージコマンドが引数として文字列のみを受け取る(そしてリストを文字列に変換する)ため、後で配列を変更できないことです。
アドナン

2

入力の順序

入力する順序はコードに大きな影響を与える可能性があり、多くの場合s、スタックのトップをスタックの次に高いものと交換するために使用している場合、問題について正しく考えていません。入力を並べ替えて、入力を事前にスワップするか、以前にスタックに追加するか、どこかで複製することによって、スワップの必要性を取り除くことができるかどうかを確認してください。最も明白なI&Oは、最も成功しない05AB1E回答です。


2

05AB1Eアスキーアートゴルフ

以下のコードは、カスタムベース変換を使用してASCIIアートを05AB1Eに変換するのに役立ちます。

|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"

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

これは、以下によって達成されます。

  1. ASCII図面の一意の文字をリストします。
  2. 降順で文字列内に出現する回数(最も出現頻度の高い文字から最も出現頻度の低い文字)で並べ替えます。
  3. ASCII描画が最も出現する文字で始まる場合は、最初の2つの項目を逆にします(圧縮整数の先頭の0を防ぐため)。
  4. 0-9A-Za-zすべての文字が置き換えられるまで、入力の文字をその順序でマッピングします。各文字は独自のマッピング文字を取得します。
  5. (一意の文字の量に基づいて)置き換える必要がある最高のベースを使用して、ベースを圧縮します。
  6. base 05に再度変換します(05AB1E圧縮の場合)。
  7. 次の形式ですべてをフォーマットします•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ

また、文字列引用符を圧縮することもできます"Åвこの文字列を使用するカスタムベースとして文字列を使用して生成された整数をベースにコンバート。そしてJ暗黙的に出力され、単一の文字列に一緒にすべてのこれらの文字に参加します。

ASCIIアートに適した、最大62個の一意の文字を含むパターンを受け入れます。
固有の文字の量が少ないほど、圧縮率は高くなります。


XNORデジタルタイミング図描画するための出力例(214バイト、9つの一意の文字):

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

だろう:

05AB1E、106 バイト

•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)

1
ところで、05AB1Eがコードページを変更したため、最大ベースは214から255に変更されます。
アドナン

1
おそらく答えに追加する(またはジェネレーターを変更する)ものがありますが、ASCIIアートで10個未満の異なる文字が使用されている場合は、2バイトでゴルフをすることができます。すなわち、あなたのジェネレータはこれを22バイト与えますが、代わりにこの20バイトにすることができます。
ケビンクルーイッセン

@KevinCruijssenアイデアは私が伝えようとしていたものであり、ジェネレータが良いものであると本当に主張していない:P。正直に言って、まだosabieで実行されているとは思えません。ずっと前に書きました!
魔法のタコUr

@MagicOctopusUrn Elixirリライトで実行されるかどうかはわかりませんが、レガシーバージョンでも動作することは確かです。上記のAdnanのコメントで言及されたように、私は1年前にBase-214をBase-255にすでに半分に編集しました。それとは別に、それはうまく機能し、私はそれを数回使用しました(さらに毎回それをゴルフしましたが;))。文字列と数値の両方の生成は素晴らしいです!
ケビンクルーイッセン

これが改善されたバージョンです。(非常にく、速く書かれていますが、動作します)。これにより、例は113ではなく108バイトになります。改善点は次のとおりです。整数は可能な限り小さい。使用して<str><compr_int><int>вèJ、あなたの代わりに<compr_int><int>BžLR<str>‡、また、文字列引用符の代わりに使用する"ため"、入力の一部にすることができます。
ケビンCruijssen

1

文字列と整数は等しい型です

誰もが同意するものではありませんが、機能します。

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

4 5+
"4""5"+

それらは両方とも9になります。これは、すべての値が最初に評価されるためです(ast.literal_eval)です。そのため、intではすべての文字列操作演算子を実行でき、stringではすべてのint操作演算子を実行できます。

たとえば12345û、数値を回文化して12345、になり123454321ます。その後、この数値に対して通常の計算を行うことができます。

12345û50000-

これは、123404321になります。


0

非表示のループとイテレーター

05AB1Eには、次の通常のループと反復子があります。

  • F0 .. n-1を反復処理します
  • G1 .. n-1を反復処理します
  • ƒ0 .. nを反復処理します
  • v、各要素s [0]、s [1]、..、s [n]を反復処理します
  • ʒ、これは厳密にはループではなく、フィルターによるコマンドです。各要素をループするという意図しない動作のため、このコマンドを悪用します。

これらのループを使用して、次の非表示ループを導出できます

  • の代わりに gF、使用可能vN-indexを含むを使用できます。
  • vy -> ʒ交換は少しトリッキーです。
    • 結果をすぐに印刷する必要があります。これにより、自動印刷がスタックの最上部を印刷するのを抑制します。
    • コードスニペットは、新しい一時スタックで実行されます。これは、スタック依存スニペットを使用できないことを意味します。
    • yこれらの種類のループでは、呼び出しはできません。

私は、これは一年前に投稿されますが、ではありませんされています知っている[µεも通常のループ/反復の一部?
ケビンCruijssen

また、yこれらのいくつかを使用して呼び出すことが可能になりました。
魔法のタコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.