TryItOnquine挑战


48

(基于这篇文章以及随后的聊天讨论 -同样,非常感谢Dennis的TIO!)

挑战

选择TryItOnline网站上当前可用的语言,例如PowerShell。在该页面上以该语言编写代码,不需要任何输入,因此,当单击“ 运行”按钮时,该页面上的输出与“ 保存/存储 ”时“纯URL”字段中的输出完全相同。而是单击按钮。

举一个虚拟的例子,假设这aaa是PowerShell中解决此问题的代码。然后,单击Run with aaaas the code on的结果https://tio.run/#powershell应输出https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA,当单击Save / Store按钮时,它也是“ Plain URL”字段。

计分

结果URL是您提交这一挑战。获胜者是最短的URL,以字节为单位。对于上面的示例,URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA是挑战的提交,为44个字节。满足其余挑战要求的最短URL会赢得挑战,并获得布朗尼积分(不可兑换的积分)。鉴于存在明显的最小可能长度,如果两个提交的长度相等,则以较早的提交为准。

URL生成

是存储库中URL生成算法的开始。您可以看到如何使用主代码区域,如何附加任何额外的元素,对字符串进行放气,然后对Base64进行转换,然后对其进行##前缀等。在此,我将不做详细介绍;挑战的一部分是解析并了解如何生成URL,以利用所述算法中的任何潜在怪癖。

规则/说明

  • 实际的代码不应输入任何内容,而只能产生quine-URL作为输出。
    -这意味着,应该点击进入网址时,系统都将填充仅文本字段的CodeHeaderFooter或相应的“编译器标志”领域; 在InputArguments领域都被禁止,必须保持为空/不用。单击运行按钮应仅更改该Output字段。对于此挑战,Debug在所有情况下都将忽略该字段。
  • 通常的规则适用于代码(例如,代码无法通过读取其自身的源代码.code.tio)。
  • 请在您的提交中说明代码的工作方式。
  • 不允许通过将Git提取请求提交到TIO储存库以创建“技巧” URL或快捷方式等来提交“骗人的”奎因。
  • 类似地,不允许提交拉取请求以更新特定语言以产生“技巧” URL。
  • 请对Dennis的服务器好,不要为了挑战而滥用它们或尝试利用漏洞。

14
请记住,最后一条规则很重要!已经发生了许多DDoS攻击。
暴民埃里克(Erik the Outgolfer)'17

什么是“ 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'7

Answers:


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

在线尝试!

这取决于三个巧合:

  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设法摆脱了它,但是它花费了三个字节。烦人的是,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‽的挑战中超越了丹尼斯吗?
Toast Engineer'Aug

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或其他方法尝试过,那也将是纯粹的反复试验。
魔术章鱼缸

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.