查找非法字符串


81

面临的挑战是要找到一种字符串,这些字符串不能以您选择的编程语言出现在任何合法程序中。这包括注释,字符串或其他“不可执行”的部分。

挑战

  • 您的程序可能特定于语言的编译器/解释器/运行时环境的特定版本或实现。如果是这样,请详细说明。
  • 仅允许使用标准的编译器/解释器/运行时选项。您不能将一些奇怪的标志传递给编译器以获取特定的结果(例如,传递标志以将警告转换为错误)。
  • 如果您的编程语言需要特定的编码(例如UTF-8),则还必须正确编码您的字符串(即,不允许仅由于字符解码错误而失败的字符串)。
  • 您提交的文件中的每个人物都必须在法律程序中被允许;也就是说,您不能只使用总是被拒绝的字符。
  • 当给出的编译器/解释/运行时必须给出一个错误的任何包含您的字符串作为一个字符串的源代码。该错误不必在程序之间相同-嵌入字符串可能会导致语法错误,而另一嵌入可能会导致运行时错误。

计分

  • 每种语言的最短非法字符串将获胜。
  • 您应该解释为什么字符串是非法的(为什么它不能出现在合法程序的任何地方)。
  • 在评论中提出不正确的解决方案。更具体地说,您应该提供指向TIO或等效文件的链接,以证明包含所建议的子字符串的合法程序(即不产生任何错误的程序)。
  • 一些语言(例如Bash,Batch,Perl)允许在不影响有效性的情况下将任意二进制数据附加到程序中(例如__DATA__在Perl中使用)。对于这样的语言,你可以提交了可能出现的解决方案只有在这样的后段。确保在回答中记下这一点。(此“跟踪部分”的定义取决于语言,但通常表示解析器完全停止阅读脚本之后的任何文本)。

在Python中,我可能会提交

x
"""
'''

但这可以嵌入到较大的程序中

"""
x
"""
'''
y
'''

所以这是不允许的。


2
反例可以依靠STDIN的输入吗?
扎卡里

5
这会产生良好的CnR吗?
CalculatorFeline

2
我想现在为时已晚,但似乎这可能是警察和强盗的挑战。尝试制作有效的程序以及首先提出字符串的技巧很多。
user2390246

4
我对Perl的尝试表示哀悼。:)
Kaz

2
我非常确定,由于嵌套的注释,在不识字的Haskell中这是完全不可能的。
凌晨

Answers:


57

更改,2个字节




这是两个换行符。有效更改必须始终形成可打印ASCII字符的完美正方形,因此它不能连续包含两个换行符。

该错误始终是解析器错误,并且始终相同:

This shape is unpleasant.

附带退出代码1

在线尝试!


这也适用于2Col在线尝试!。但是2Col中断的原因是每一行都必须由2个字符组成,但是空行会破坏该字符。
Kritixi Lithos

2
+1是因为它自动成为赢家,因为1字节的解决方案是不允许的,因为“您不能只使用总是被拒绝的字符”。
扎卡里

1
@Cowsquack tfw我忘记了自己的语言
Skidsdev '17

1
@Skidsdev tfw我重新忘记了自己的语言,而忘记了我忘记了自己的语言
Skidsdev

@Zacharý0字节解决方案呢?
PyRulez '18

32

Java,4个字节

;\u;

在线尝试!

这是无效的Unicode转义序列,将在编译器中导致错误。

error: illegal unicode escape

不起作用-可能有一个字符串文字,例如"\\u;"
feersum

@feersum固定为一个字节为代价
Kritixi Lithos

21
@TheLethalCoder:Java \uXXXX在执行其他任何操作之前会对源代码进行预处理,以更改转义符,因此是的,即使在comments.za中也可以使用
。za

3
我觉得这是这个网站的历史最短的Java答案仍然..
魔术八达通瓮城

1
@MagicOctopusUrn实际上,有0个字节的Java答案(在当前meta中已不再相关,因为它输出到STDERR而不是STDOUT)。尽管两者都非常出色和巧妙。:)
Kevin Cruijssen

25

COBOL(GNU),8个字节


THEGAME

首先,进行换行,以防止您在注释行中加上我的字眼。

然后,从历史上看,COBOL程序是打印在代码表上的,编译器高度依赖80个字符的限制行,没有多行注释,而前6个字符是注释(通常用作可编辑的行号),您几乎可以在其中放置任何内容, 据我所知。我选择THEGAM了下一行的开头。

然后,任何一行中的第7个符号仅接受非常有限的字符列表:空格(无效),星号(注释该行的其余部分),连字符,斜线,可能还有其他字符,但肯定不是E

例如,GnuCobol给出的错误是:

error: invalid indicator 'E' at column 7

在线尝试!

另外,您只是输了比赛。


30
Also, you just lost the game.我差一点投票
斯蒂芬

24

JavaScript,7个字节


;*/\u)

注意领先的换行符。

  • \u) 是无效的Unicode转义序列,这就是为什么此字符串无效的原因
  • //由于开头是换行符,因此在开头添加a 仍然无法正常工作,而第二行不加注释
  • 添加a /*不会完全取消对字符串的注释,因为*/完成它的结束操作会导致字符串\u)暴露
  • 如@tsh所述,可以通过/在字符串后加上a来将底线变成正则表达式,因此,通过)在前面加上\u,我们可以确保regex文字始终是无效的
  • 如@asgallant所述,1||1(string)/可以避免评估正则表达式。第二行开头的分号通过在到达第二行1||1之前终止表达式来阻止这种情况的发生,因此用强制使用SyntaxError ;*

试试吧!


2
/* */\u0045 = 3似乎是有效的JavaScript代码。
tsh

2
3 */\u;/仍然有效。
tsh

3
有趣的是,从ES2018开始(直到今年年底才正式发布),由于这个原因,您可以将整个内容包装在反引号中。您可能可以解决此问题,尽管只需在后面插入反引号即可/(不是您需要修复它)。(此外,;它不会强制解析不良的正则表达式,而是会强制使用*。)
ETHproductions'Jul

1
@Leushenko但这与这里所显示的不符#if 0在线尝试!
Kritixi Lithos

3
在较新的JS版本中,带有模板字符串的String.raw可以使此操作不中断,因为无效的转义失败。将是:String.raw`code here`
iovoid

15

Python,10个字节(不是cpython)


?"""?'''?

注意领先的换行符。由于使用了换行符,因此无法将其注释掉,并且如果我正确考虑了这一点,则不能使用三引号引起来的字符串的组合。

据我所知,通过将0x1A字符添加到文件的开头,注释中的@feersum似乎已完全破坏了Windows上的任何cpython程序。似乎(?),这可能是由于操作系统处理此字符的方式所致,显然是由于某些旧的DOS标准而在通过stdin时转换为EOF。

实际上,这不是python的问题,而是操作系统的问题。如果您创建一个读取文件并compile在其上使用内置文件的python脚本,则它会产生抛出语法错误的更多预期行为。Pypy(可能仅在内部执行此操作)也会引发错误。

编辑:

由于@feersum努力寻找模糊的方式来破坏Python解释器,据我所知,此答案对于任何典型的cpython环境都是完全无效的!(适用于Windows和Linux的Python 2和3)我仍然相信这些破解对Pypy在任何平台(我测试过的唯一其他Python实现)上都不起作用。


1
@officialaimm考虑"""?'''"""
KSab'17

3
我用此子字符串制作了一个程序,该程序在我的计算机上运行。但是,我认为它不能在许多解释器/平台/版本上运行。您可以指定此答案针对的是哪个版本的Python解释器和OS?
feersum

1
Windows 7上的Python 3恰好正是我破解的地方。base64编码程序的
Pastebin

1
我也可以破解。只需在文件的开头放置一个0x1A字符,其余所有字符都将被忽略(这实际上也适用于Python 3)。
feersum

1
我知道这确实很老,但是在与Python Discord合作之后,我们发现了这个
漏洞

14

C(clang),16个字节

 */
#else
#else

在线尝试!

*/关闭任何/*评论,并且领先的空格可确保我们不只是开始一个。换行符将关闭所有//注释并中断任何字符串文字。然后,我们导致一个#else without #if#else after #else错误(无论#if 0内部可能有多少s)。



2
另外,由于C ++ 11原始字符串似乎可以工作,因此gcc无法解决。
feersum

@feersum Huh,TIL,GCC接受C代码中的代码。我可以指定-std=c99,但让我们尝试切换到clang。
Anders Kaseorg '17

3
我真的很惊讶gcc接受C ++ 11原始字符串。指定编译器版本或实现完全可以,因此,如果它在Clang中是非法的,那就是公平的游戏。
nneonneo

1
@ l4m2我无法解析您的问题(它们是谁,又是什么意思?),但是请注意,C ++原始字符串文字支持自定义的分隔符: R"foobar(...)foobar",并且仅右方括号后跟匹配的分隔符和报价将其关闭。
Anders Kaseorg '18

11

Pyth,6个字节

¡¡$¡"¡

¡是一个未实现的字符,这意味着如果Pyth解析器对其进行评估,它将因PythParseError错误而出错。该代码确保这将在之一上发生¡

可以在Pyth程序中存在而不被解析的字节有以下三种方式:在字符串文字("."等效解析的字节)中,在Python文字($)中以及紧随在之后\

该代码阻止\对其进行评估而不会出错,因为这只会影响紧随其后的字节和第二个¡错误。

$将内的$代码直接嵌入到已编译的Python代码中。我对那里可能发生的情况不做任何假设。

如果程序在$上下文中到达此代码,则它将在处结束$,并且¡紧接其后将导致解析器错误。$不管Python代码可能在做什么,Pyth的Python文字总是在下一个结尾。

如果程序在"上下文中启动,"将使字符串结束,而最终¡将使解析器错误。


11

Ada-2个字节

我认为这应该工作:


_

那是换行符下划线。换行符终止注释,并且不允许在字符串中使用。下划线不能跟随空格;它曾经只允许在字母和数字之后使用,但是Unicode的引入使事情变得复杂。


2
欢迎光临本站!:)
DJMcMayhem

9

x86 32位机器代码,11个字节(以及面向未来的64位)

90 90 90 90 90 90 90 90 90 0f 0b

这是times 9 nop/ ud2。它基本上是一个NOP底座,因此它仍然以0或更多nops的速度运行,然后ud2引发异常,而不管有多少0x90字节作为前一个操作码的操作数被消耗了。其他单字节指令(如times 9 xchg eax, ecx)也可以使用。

x86 64位机器代码,10个字节(当前CPU)

在64位模式下存在一些1字节非法指令,直到将来的某些ISA扩展将它们重新用作前缀或仅在64位模式下为多字节操作码的一部分时才与32位模式下的含义分开。 0x0epush cs在32位模式,但在当前的CPU非法在64位(在Intel SKYLAKE微架构测试)。

0e 0e 0e 0e 0e 0e 0e 0e 0e 0e

可执行机器代码的规则解释

  • 字节不能跳过(例如“未解析”限制),因为CPU在实际尝试解码/执行(非推测性)之前不会引发异常。

  • 非法手段总是引发异常,例如非法指令异常。(实际程序可以使用裸机上的异常处理程序来捕获它,或者安装OS信号处理程序,但是我认为这抓住了挑战的精神。)


之所以起作用,是因为结尾较短的字节字符串ud2可能会作为imm32和/或另一条指令的寻址模式的一部分出现,或拆分为一对指令。最简单的方法是考虑可以在字符串前添加哪些内容以“消耗”字节作为指令的一部分,并留下不会出错的内容。

我认为一条指令最多可以消耗9个字节的任意内容:SIB字节,disp32和imm32。也就是说,该指令的前2个字节可以消耗8个NOP和一个ud2,但不能消耗9。

c7 84 4b 00 04 00 00 78 56 34 12        mov dword [rbx+rcx*2+0x400],0x12345678

不能击败9个点:

    db 0xc7, 0x84   ; opcode + mod/rm byte: consumes 9 bytes (SIB + disp32 + imm32)
    times 9 nop          ; 1-byte xchg eax, ecx or whatever works, too
    ud2
  ----
   b:   c7 84 90 90 90 90 90 90 90 90 90        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0x90909090
  16:   0f 0b                   ud2    

64位模式:

 c7 84 0e 0e 0e 0e 0e 0e 0e 0e 0e        mov    DWORD PTR [rsi+rcx*1+0xe0e0e0e],0xe0e0e0e
 0e                      (bad)  

但是8个NOP + ud2(或times 9 db 0x0e)的字节可以作为其他insns的一部分出现:

    db 0xc7, 0x84   ; defender's opcode + mod/rm that consumes 9 bytes

    times 8 nop          ; attacker code
    ud2

    times 10 nop    ;; defenders's padding to be consumed by the 0b opcode (2nd half of ud2)
----
  18:   c7 84 90 90 90 90 90 90 90 90 0f        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0xf909090
  23:   0b 90 90 90 90 90       or     edx,DWORD PTR [rax-0x6f6f6f70]
  29:   90                      nop
  2a:   90                      nop
  ...

这里的规则还不够清楚,让我无法考虑发布asm /机器码答案。例如,为什么不可以ud2呢?看来您是在说您将规则解释为禁止跳过字节,所以ud2单独运行就可以了,不是吗?哦……我猜你是在说问题是,它ud2可以作为有效指令的前缀出现吗?这个答案的第二部分让我很难理解。
Cody Gray

@CodyGray:正确,编码的2个字节ud2可以出现在imm32任何指令的中。我在考虑可以在这样的字符串之前放置哪些字节,以便“消耗” 0f 0b作为更早指令的一部分而不是解码为ud2。我对最终的呈现方式并不满意,但我想说明为什么仅8 nops不够用,以及9 nops + 发生了什么ud2
彼得·科德斯

@CodyGray:一个asm源程序将是一个完全不同的答案。那将不得不使汇编器使用的解析器出错,而不产生错误的机器代码。因此,类似%else/的方法%else可能会击败%if 0,通常可以保护任何无效文本不被解析。(来自CPP答案的想法)
彼得·科德斯

不太满意。您的解决方案可能只是在.data中。(尽管这使它变得不可能)
l4m2

@ l4m2:为了使问题交代/有趣,我不得不把它限制在代码多数民众赞成执行(而不是跳过)。请参阅我的答案中的规则解释要点。当然,那也将排除静态数据。因为那根本不是机器代码,而是数据。为了使机器码答案有意义,这个问题比大多数问题需要更多的适应性,因为没有编译/汇编阶段可以让解析器出错,我们只是在谈论内存中已经存在的字节。
彼得·科德斯

7

C#,16个字节


*/"
#endif<#@#>

起作用是因为:

  • // 由于新行,评论将不起作用
  • /* 由于该评论无效 */
  • 您不能仅在代码中包含常量
  • 添加#if false到开始不会因为工作#endif
  • "关闭所有字符串字面
  • <#@#>一种莫名的指令,以便为失败T4模板。
  • 新行会欺骗它,因此/一开始就不会欺骗*/

每个变体都会失败,并出现编译错误。


1
很奇怪,您决定在代码中包含T4模板。T4是否被视为独立的语言?
Arturo TorresSánchez17年

1
@ArturoTorresSánchez我不知道我从未听说过它们。当您包含T4模板时,有人评论说这不起作用,所以我添加了此修复程序。
TheLethalCoder


5

Litek Haskell,15个字节

修复nimi 删除的尝试


\end{code}
5
>

在线尝试!

nimi的原始尝试是最后两行,这是基于Literate Haskell不允许>样式有文化的代码位于有文化的注释行(5此处)的相邻行上的。它失败了,因为它可以以替代的(“ LaTeX”)素养编码风格嵌入注释中:

\begin{code}
{-
5
>
-}
\end{code}

但是,\begin{code}Literate Haskell 的样式既不会嵌套,也不会嵌套在{- -}多行注释中,因此,通过在的行\end{code}之前放置一行5,该解决方法会失败,并且我看不到另一种解决方法。


4

免费Pascal,18个字节


*)}{$else}{$else}

首先关闭所有可能的注释,然后处理条件编译。

如果我忘记了一些,请在这里评论。


3
@ user902383您的示例是否包含其摘要的开头换行符?
布赖恩J

@BrianJ不,我以为那只是格式化问题,我很不好
user902383

我认为Free Pascal不可能实现。只是把它们放在后面begin end.
jimmy23013

@ jimmy23013,但问题似乎end.允许生效后的代码。
tsh

4

Commodore 64 Basic,2个字节


B

(这是一个换行符,后跟字母“ B”)。

Commodore 64程序中的任何行都必须以行号或BASIC关键字开头,并且存储的程序仅允许使用行号。没有以“ B”(或“ H”,“ J”,“ K”,“ Q”,“ X”,“ Y”或“ Z”)开头的关键字。


如果我追加,=0那么这只是一个赋值语句……
尼尔(Neil)

1
@Neil,这将是有效的立即模式命令,但不是有效的程序。
标记

4

Brain-HackBrain-Flak的变体),3 2字节

感谢Wheat Wizard指出Brain-Hack不支持评论,为我节省了一个字节。

(}

在线尝试!


您如何在Brain-Flak中发表评论?我不知道该怎么做。
暴民埃里克'17

@EriktheOutgolfer # TIO
Riley

呵呵,无证的行为。
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer我一直以为它们记录在某个地方。我将考虑添加它们。
莱利

您不需要BrainHack或Craneflak中的换行符,Rain-Flak是三个具有行注释的版本中的唯一版本。尽管Craneflak会即时进行解析,因此不可能在Craneflak中解决此问题,但是任何解决方案都可以通过前置来击败(()){()}
精神分裂症O'Zaic,2017年


3

VBA,2字节

一个换行符后跟一个下划线- _在VBA中用作行继续符,并且由于行的直接左端或上方没有任何内容,再加上VBA缺少多行注释,因此这将始终引发编译时间误差Compile Error: Invalid character


_

您确实需要根据模式从新行开始...因此,添加新行。
Deduplicator

@Deduplicator它已经有一个新行,-紧随其后是什么,都没关系_,只是它的左边或上方没有有效的行
Taylor Scott

如果它是这样嵌入的myfunction( \n_ )呢?
Deduplicator

@Deduplicator行继续符必须与继续行在同一行,即Public Function Foo( ByVal bar as Integer, _ (新行)bas as long) as double-因此,是的,如果您调用所描述的函数,则会导致错误
Taylor Scott

好的,那样的话更像是myfunction( _ \n_ )。对困惑感到抱歉。换句话说,您应该使用两个换行符。
Deduplicator

3

SmileBASIC,2个字节


!

没有什么可以继续到行尾,因此您所需要的只是换行符,后跟一些不能作为语句开始的内容。!是逻辑上的not运算符,但是您不允许忽略表达式的结果,因此即使类似的东西也!10将是无效的(X=!10当然可以使用)

只要所有东西都在一行的结尾处结束,只要它在执行代码之前就对代码进行了解析,类似的事情就可以在任何语言下工作。

这里可以使用很多替代字符,因此我认为列出可能有效的字符会更有趣。

@是标签的开始,例如@DATA(可能(X)=1是由于某种原因而被允许的表达式的一部分;任何字母或_可以是变量名X=1,函数调用LOCATE 10,2或关键字WHILE 1; '是评论;并且?是的缩写PRINT


哦,由于某些原因,当我编辑帖子时,它被重复了……
12Me21'3

3

INTERCAL,12个字节

DOTRYAGAINDO

尝试在线破解它!

INTERCAL处理语法错误的方法有点特殊。本质上,除非程序尝试执行,否则无效语句实际上不会出错。实际上,注释的惯用语法是以开头PLEASE NOTE,它实际上只是开始一条语句,声明它不被执行,然后以letter开头E。如果您的代码DODO位于其中途,则可以DOABSTAINFROM(1)(1)在任何有效的语句之前加上前缀并将其添加到末尾,这样就DODODO可以了,如果可以,您可以将其绕行为(1)DON'TDODODOCOMEFROM(1)。即使INTERCAL缺少用于转义的字符串文字语法,也无法使用语法错误来创建非法字符串,甚至用尽所有可能的行号(1)DO(2)DO...(65535)DODODO,因为使用它们中的任何一个似乎都有很多重复的行号COME FROM

要制作非法字符串,我们实际上需要使用一个完全有效的语句:TRY AGAIN。即使它没有被执行,它也必须严格位于程序中的最后一条语句中。据我所知,非法字符串可以使用的最短的字节数是12 TRY AGAIN,因为它需要保证在它之后有一个语句(是否执行),DOTRYAGAIN普通代码也是如此,并且它需要确保整个语句的确是TRY AGAIN,因此TRYAGAINDO不起作用,因为它很容易转化为被忽略的常规语法错误:DON'TRYAGAINDOGIVEUPPLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK。不管你穿什么的两边DOTRYAGAINDO,你会出错,要么用ICL993I I GAVE UP LONG AGOICL079I PROGRAMMER IS INSUFFICIENTLY POLITEICL099I PROGRAMMER IS OVERLY POLITE


可能还有一些其他的编译时错误可能在之前触发ICL993I I GAVE UP LONG AGO
不相关的字符串

如果在使用每个行标签时也同时使用每个行标签,COME FROM则可能难以控制块周围的控制流,但是根本没有什么可以阻止您GIVING UP
不相关的字符串


2

Fortran,14个字节


end program
e

Fortran中没有多行注释或预处理器指令。


1
有什么好的方法可以在线测试吗?另外,哪个版本/ Fortran编译器?
罗伯特·本森

2

JavaScript(Node.js)9 8字节

`*/
\u`~

在线尝试!

我认为这应该足够非法。

先前的JS尝试其他答案

; * / \ u)

通过@牛嘎嘎

作为ES5的答案,这应该是正确的,但是在ES6中,用一对反引号将代码包装起来会破坏这一点。结果,有效的ES6答案必须包含引号。

`
`* /}'“`\ u!

通过@iovoid

这是涉及反引号的改进版本。但是/,在代码中断后,有一个代码破坏了它(它将变成模板文字,再乘以正则表达式,虽然没有用,但在语法上有效。)@Neil建议更改!)。从理论上讲这应该起作用,因为最后添加/不再起作用(由于正则表达式格式不正确)。

说明

`*/
\u`~

这本身是非法的,并且还会阻止所有单引号和双引号,因为如果没有\在行的末尾,则这些引号不能跨越行

//`*/
\u`~

/*`*/
\u`~

通过引入 非法的转义序列来阻止评论

``*/
\u`~

通过引入未终止的RegExp文字来阻止初始反引号

console.log`*/
\u`~

通过在两个反引号之间引入期望的运算符来阻止标记的模板文字


2

摇滚明星4 5字节

划掉4仍然是4 :(

)
"""

Rockstar是一种非常...罗y的语言。
虽然"可以用来定义一个字符串,例如Put "Hello" into myVar,据我所知,在引号之外没有3个引号的方式,并且紧密的括号也确保不会发生这种情况(Rockstar中的注释用括号括起来,例如这个)。

Rockstar还具有诗意的文字语法,其中标点符号被忽略,因此换行符确保3个引号是代码行的开头,该行应始终无效


怎么样(()"""),那不是空手吗?
ბიმო

@BMO第一个paren打开注释,第二个paren不做任何评论,因为它已被注释,第3个paren关闭注释,然后您""")被解析为代码,这是无效的
Skidsdev

嗯,嵌套注释不在规范中。无论如何,似乎不鼓励发表评论。但是您监督了诗意的字符串文字,它允许任何字符串,因此Goethe says )"""是有效的
ბიმო

@BMO好点,可以通过其间插入一个换行是固定的)"""
Skidsdev

2

Powershell,10 8 12 14 13 14 16字节

-2字节,感谢Mazzy,因为IsItGreyOrGray找到了一种更好的方式来破解
+4 -1字节

$#>
'@';
"@";
@=

我希望这行得通。'"防范报价,#>打破了块注释,新的生产线停止单行注释,既'@"@赶上琴弦的另一种风格,然后开始一个不正确的数组抛出一个语法错误。

逻辑是他们不能使用任何引号进入,也不能对它们进行注释,如果@"使用,它将创建一个here-string,之后不会有令牌,如果它们不理会它,它将尝试制作一个损坏的数组。这个说法想过得很辛苦,我不断在装甲中发现更多的漏洞。


1
或保护者+@=
疯狂的

1
@IsItGreyOrGray AAAAAAAAAAAw哎呀。
Veskah

2
看起来将#>更改为$#>可能会破坏它,因为“无法识别为cmdlet的名称...”这可能会以某种方式再次合法化,但是我没有办法。然而。:)
GreyOrGray

1
@IsItGreyOrGray Sonofagun。现在具有分号装甲?
Veskah

1
真好!我什么都没有 我尝试过的一切都失败了。
GreyOrGray

2

符文符文,3字节

许多可能的变化之一。

在线尝试!

符文(Runic)利用unicode结合字符中的“ M修改行为C”(其中C是命令)。因此,不允许两个修饰符修改同一命令,并且如果发现这种情况,解析器将抛出错误。

类似地,由于存在方向修改修饰符(并且在同一单元中都没有意义),某些重定向IP的命令无法以任何方式进行修改。

无法对字符串进行转义或文字化以使其有效。Tio链接包含一个;以绕过更高优先级的“ no Terminator”错误。


2

TI基本(83 + / 84 + / SE,24500字节)

A

(24500次)

TI(-83 + / 84 + / SE)-Basic仅对到达的语句进行语法检查,因此即使End使用一行也可以跳过5000条语句Return。相反,它不能放入TI-83 + / 84 + / SE的RAM中,因此没有程序可以包含该字符串。这里的字符数要保守一些。

原始的TI-83具有27000字节的RAM,因此A在这种情况下需要27500 s。

TI-Basic(89 / Ti / 92 + / V200,3字节)

"

换行,报价,换行。换行符关闭所有注释(并且由于不允许AFAIK多行字符串常量,因此不允许在字符串中嵌入非法字符),另一行换行符则禁止关闭字符串,并且引号引起语法错误。

您可以使用2个字节

±

没有换行符,但是我不确定这是否有价值,因为±仅在字符串常量中有效。


完成,谢谢:)
bb94

2

Go,6个字节


*/```

尝试在线破解它!

重音符号(`)标记为原始字符串文字,在其中,除`以外的所有其他字符(包括换行符和反斜杠)均按字面意义解释为字符串的一部分。连续三个`是核心:相邻的字符串文字无效,并且`总是关闭`字符串,因此无法理解它们。我不得不再使用3个字节来进行反规避,换行符使我们不能放在单行注释或常规引号中,而* /则不能在多行注释中。


1

SILOS,4个字节

筒仓具有竞争力\ o /


x+

SILOS在两遍解释器/编译器上运行。在执行之前,“编译器”试图将源简化为描述源的数组。每一行都单独处理。x + a是一个赋值运算符,它将ea与x的值相加并将其存储到x中。但是,“编译器”将中断。因此,我们采用此字符串,并在确保其位于单独的行之前和之后添加新行并中断编译器。

在线尝试!



未定义的编译器行为@EriktheOutgolfer
Rohan Jhunjhunwala


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.