TryItOnquineチャレンジ


48

この投稿とチャットに関するその後の議論に基づいています-また、TIOのDennisに感謝します!)

挑戦

PowerShellなど、TryItOnlineサイトで現在使用可能な言語を選択します。ときにそのようなことを任意の入力を取らない、そのページで、その言語で書くコード、実行ボタンをクリックすると、そのページの出力がまったく同じ「プレーンURL」フィールドにあるものとするときの保存/ストア代わりにボタンをクリックします。

架空の例として、aaaこれがPowerShellでこれを解決するためのコードであったとします。その後、クリックした結果実行しaaa上のコードとしてhttps://tio.run/#powershellSHOULD出力https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA時にも「プレーンURL」フィールドで、保存/ストアボタンをクリックします。

得点

結果のURLは、この課題へのご提出です。勝者は、バイト単位で測定された最短URLです。上記の例では、URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA44バイトのチャレンジへの送信です。このチャレンジの残りを実行する最短のURLがチャレンジに勝ち、ブラウニーポイント(ポイントは交換不可)を獲得します。可能な限り明確な最小の長さが存在する場合、2つの提出の長さが同じである場合、以前の提出が優先されます。

URL生成

これがリポジトリ内のURL生成アルゴリズムの始まりです。メインコード領域の取得方法、余分な要素の追加、文字列の収縮とBase64の変換、および##先頭への追加などを確認できます。ここでは詳しく説明しません。課題の一部は、URLがどのように生成されるかを解析して理解し、前述のアルゴリズムの潜在的な癖を悪用することです。

ルール/説明

  • 実際のコードは入力を受け取らず、出力としてquine-URLのみを生成する必要があります。
    -移入する必要がある唯一のテキストフィールドは、URLにクリックこの手段があるCodeHeaderFooterまたは対応する「コンパイラフラグ」フィールド。InputそしてArgumentsフィールドが禁止されており、未使用/空のままにしなければなりません。[ 実行 ]ボタンをクリックすると、Outputフィールドのみが変更されます。このチャレンジではDebug、すべての状況でフィールドが無視されます。
  • 通常のクインルールは、可能な範囲でコードに適用されます(たとえば、コードはを介して独自のソースコードを読み取ることができません.code.tio)。
  • 提出物にコードがどのように機能するかの説明を含めてください。
  • GitプルリクエストをTIOリポジトリに送信して「トリック」URLまたはショートカットなどを作成することにより、「チート」クインを送信することは許可されていません。
  • 同様に、特定の言語を更新して「トリック」URLを生成するプル要求を送信することは許可されていません。
  • Dennisのサーバーに親切にして、このチャレンジのために悪用したりエクスプロイトを試みたりしないでください。

14
最後のルールは重要です!すでに多数のDDoS攻撃が行われています。
エリックアウトゴルファー

「PR」とは何ですか?
アダム

1
架空の例:私の提出がある場合https://tio.run/##a+a、その出力プログラムにリンクされhttps://tio.run/##a+a、それもによって生成されたリンクタフ有効でsaveStateあったであろうhttps://tio.run/##a@a
TwiNight

1
@TwiNightいい質問です。これは興味深い状況ですが、ここの規則には適合しないため、有効な提出にはなりません。
AdmBorkBork

1
TIOv2がこれを投稿するまで待っていましたか?
mbomb007

回答:


15

Python 2、URLの長さ= 170バイト

https://tio.run/##K6gsycjPM/r/v9hWqQDCjqlISwPhYlvVIuvM3IL8ohKFpMTiVDMT64KizLwS9YySkoJiK339ksx8vaLSPH1lZXVtiAK9JDOT1Lzk/JRUDY1iVdViTT0YT70qJzNJXVMz2shK1yRWE2aHEkUW4Db//38A
s="python2\xff\xffs=%r;import base64;print'https://tio.run/##'+base64.b64encode((s%%s).encode(('zlib'))[2:-4])\xff\xff";import base64;print'https://tio.run/##'+base64.b64encode((s%s).encode(('zlib'))[2:-4])

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

これは、3つの偶然の一致に依存しています。

  1. デフォルトのzlibレベル6は、この文字列に対してzlibレベル9と同じ結果をもたらし、私が除去したヘッダーを法とします。
  2. 圧縮された長さは3で割り切れるため、base64は=パディング文字を生成しません。
  3. base64出力には+文字は含まれません。

15

バッシュ174の 166 165 157バイト

https://tio.run/##S0oszvj/v6QosUBBV1dBvaAoM68kTSGjpKSg2EpfvyQzP0avqDRPX1lZRQMqp6RaHFORlgbCSgpJQO0KSgkg/QlKNelVmQU1JYmZOQq6ydqGhjVA2VQzEwXdckNjS011BdcIz5D//wE

これにより、次のBashプログラムがエンコードされます。

trap -- 'printf https://tio\.run/##$(printf "%s\xff\xff" bash "`trap`"|gzip|tail -c+11|base64 -w139)' EXIT

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

@ jimmy23013に感謝します。元のアプローチから8バイトをゴルフで、別のバイトを節約したアプローチで、そしてそのアプローチで8バイトをゴルフでゴルフしてくれてありがとう!



1
@ jimmy23013 base64 | tr -d \\nターミナルに入力した回数を数えられません...ありがとう!
デニス

tio.run/##S0oszvj/…残念ながら、+があり、これを削除する方法がわかりません。
-jimmy23013

@ jimmy23013なんとかそれを取り除くことができましたが、3バイトかかりました。厄介なことに、tio.run / ## S0oszvj /…はその+を取り除きますが、別の場所に別のものを導入します。
デニス

3
@SteveBennett正当な理由があったと思う。私はそれをよく覚えていません。
デニス

12

Pyth、URL長= 134バイト

https://tio.run/##K6gsyfj/X68syy/ZS6lYmyujpKSg2EpfvyQzX6@oNE9fWZnLwae4OLrI3dA9NITLQZ9LM8vZxqSkRC@qOJqrAKiby9vZyNTUmwtiBpefl7e3ppnJ//8A

コード:

.vjNcJ"s+
https://tio.run/##
@Lss[rG1GUT
@/
)jC<4tt.Zs[
pyth
KC255K
.vjNcJ
NJKK)64

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

Pythのzlibビルトイン(.Z)およびbase64のインライン実装を使用します。

使い方

外側のステージ:

.vjNcJ"…
      "…    take this 75-byte string
     J      assign it to J
    c       split on whitespace
  jN        join on N = '"'
.v          evaluate as Pyth code

ストリング内の空白Jを二重引用符に置き換えて得られる内部ステージ:

s+"https://tio.run/##"@Lss[rG1GUT"@/")jC<4tt.Zs["pyth"KC255K".vjNcJ"NJKK)64
                                               [                             begin a list:
                                                "pyth"                         string,
                                                       C255                    character 255
                                                      K                        assign that to K,
                                                           K                   K again,
                                                            ".vjNcJ"           string,
                                                                    N          '"',
                                                                     J         J (the 75-byte string),
                                                                      K        K again,
                                                                       K       K again
                                                                        )    end list
                                              s  concatenate
                                            .Z   compress with zlib
                                           t     remove first character
                                          t      remove first character
                                        <4       remove last 4 characters
                                       C         convert from base 256
                                      j                                  64
                                                 convert to base 64 digits
                      @L                         map d ↦ the following indexed at d:
                          [                        begin a list:
                            G                        alphabet ("abcdefghijklmnopqrstuvwxyz")
                           r 1                       uppercase,
                              G                      alphabet again,
                               UT                    unary range of length T = 10: [0, …, 9],
                                 "@/"                string,
                                     )             end list
                         s                         concatenate
                        s                          concatenate (we now have the base64 alphabet)
 +"https://tio.run/##"                           prepend string
s                                                concatenate

(「入力」フィールドが許可されていないか、118バイトの解決策があります。)


1
TIO‽中心に構築された課題にちょうどデニスoutgolfあなたをしました...でした
トーストエンジニア

4

PowerShell、274バイト

https://tio.run/##TY/rCsIwDIVfZaiYFV2HooIbgu8xBrYzboXSljYq3p59VkHZjxAOJydf4uwVfehQ676fphO5e1TK8pPSWBfF1StCobW8EYYUJMyrphO@qmtw/xzMluv1t37maJoePpsm8sVGP5eV7V25JDslsozmgOJRHAcQ3t6BldARuVDkOcVBfzb5eAwRYM0FPcUQWSkCblaBvDJtPLxaLDmPnTf2bCjbsppxj06LBlPYwRxgoGdR74E9vw9mnQ2UZObF@v4N

次のスニペットのおかげです。

&($b={[io.file]::writeallbytes('b',[char[]]'powershell'+255+255+[char[]]"&(`$b={$b})"+255+255);gzip -f b;$b=[io.file]::readallbytes('b.gz');'https://tio.run/##'+[convert]::tobase64string($b[12..($b.count-9)]).replace('=','').replace('+','@')|write-host -n})

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


聖なるキリスト、この答えにどのようにたどり着いたか説明できますか?私がJavaなどで試してみても、それは純粋な試行錯誤になるでしょう。
魔法のタコUr

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.