首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在向后跑吗?

我在向后跑吗?
EN

Code Golf用户
提问于 2019-11-08 23:18:36
回答 49查看 6.1K关注 0票数 29

您的任务是编写一个程序、函数或片段,如果向前运行,输出一个值,如果向后运行,则输出另一个值。程序必须无错误地运行。

输出可以是相同数据类型的任意两个不同的值。例如,13truefalse,或者't''f'。在没有数据类型概念的语言中,如脑f*或文本,任何不同的值都是允许的。

这是一个代码高尔夫挑战,最短的答案每种语言获胜。请注意,允许使用代码片段(因此类似于1-2的内容是有效的,但不要期望任何上升)。

EN

回答 49

Code Golf用户

发布于 2019-11-09 10:15:19

Python3,没有注释或字符串文字,106个字节

代码语言:javascript
复制
x=quit
y=x.__class__
y.__add__=print
y.__pos__=x
x+x++x+x
x=__sop__.y
tnirp=__dda__.y
__ssalc__.x=y
tixe=x

我从来不喜欢注释和字符串文本如何让您在遇到这样的挑战时“关闭”大多数语言的语法,所以我想看看在不使用注释或字符串文本的情况下,我可以在多大程度上解决问题。这就是我想出来的。

由于我没有任何方法禁用括号的语法意义,所以不能使用函数调用操作符。这样做的任何尝试都会导致反向代码在第一个开始括号之前有一个结束括号,该括号在注释或字符串文字之外无效。我也不能使用def或容器文本(除了无括号的元组之外),而且我对语言特性的访问通常受到极大的限制。

我可以做的一件事是利用Python的操作符重载隐式调用函数。我定义任何类或函数的能力非常有限,但幸运的是,内置命名空间中有足够的工具供我使用。大多数内置程序不允许我执行我需要重新定义它们的操作符重载的属性赋值,但是(除非使用禁用site导入的标志运行),自动导入的site模块将quitexit对象添加到内置中。这些对象是非C类的实例,因此我可以重新分配它们的运算符重载。

__add__设置为print使我可以使用加法来打印内容,而将__pos__设置为quitexit可以让我在其余代码运行之前使用一元+操作符来中止程序。在不设置__pos__的情况下,我需要一堆额外的代码来确保代码的“向后”部分能够找到它所需的所有变量和属性,以避免失败。使用__pos__,我只需要确保“向后”代码在语法上仍然有效。

向前,代码打印

代码语言:javascript
复制
Use quit() or Ctrl-D (i.e. EOF) to exit

向后,代码打印

代码语言:javascript
复制
Use exit() or Ctrl-D (i.e. EOF) to exit

( Windows上的消息略有不同。对于与平台无关的输出,您可以用x+1++x++2+x替换中间行,向前运行时打印1,向后运行时打印2。)

我还试图通过定义自己的类来解决这个问题,而不是使用quit.__class__。我了解到了以下几点:

代码语言:javascript
复制
if.1j:adbmal=1j
class ton:adbmal
a=lambda:j1.fi
j1=a
a.__dict__=a.__globals__

class ton:adbmal是类名和类体的极少数组合之一,因此类语句在语法上向后有效。tressaledlabolgtropmiesiar也是有效的类名(具有不同的类主体,如not fi),但是ton是唯一一个反向名称可以作为表达式一部分的类名,具有最大的灵活性。

if.1j:adbmal=1jadbmal分配一个值,以使类体成功,同时仍然在语法上向后有效。

aj1的内容允许我使用j1.ton来引用我的ton类,它仍然是一个有效的反向表达式。

在这一点上,我被困住了。我想不出如何让我的类脱离j1.ton,进入一个更有用的变量。我不能在j1.ton上赋值属性,并且仍然有有效的语法向后,所以我不能设置操作符重载。我还想将builtins.__build_class__设置为我的类,这样我就可以使用class语句来构造实例,而不需要函数调用操作符,但是尝试将j1.ton放在赋值的右侧会产生无效的语法向后。

如果我能够将类命名为fitpecxe,我可以使用诸如b:j1.fi这样的技巧将类放入注释中,然后使用a.__dict__=__annotations__将类命名为a.b,但我无法找到任何方法来获得类语句和注释技巧。任何与类语句兼容的内容都与注释技巧不兼容。

(您可能会想,为什么我不使用builtins.__build_class__直接调用现有的函数,比如print。我想不出一种方法来做到这一点,而且输出是确定性的,我想要确定性的输出。)

票数 72
EN

Code Golf用户

发布于 2019-11-09 01:35:35

JavaScript,19字节

返回true,因为在结尾处有赋值,因为JS将其视为定义全局变量。第一部分是一个箭头函数,它被忽略。当向后运行时,eurt被设置为NaN (不是一个数字),而且由于NaN不大于true (或等于),所以它返回false

代码语言:javascript
复制
eurt=>true;NaN=true

在网上试试!

代码语言:javascript
复制
eurt=NaN;eurt>=true

在网上试试!

JavaScript,3字节

反向输出1-1的片段。非常简单。

代码语言:javascript
复制
2-1

在网上试试!

代码语言:javascript
复制
1-2

在网上试试!

JavaScript,7字节

滥用不等于运算符和非运算符,将输出false,或true反向。JavaScript使用NaN作为非a-号.

代码语言:javascript
复制
5==!NaN

在网上试试!

代码语言:javascript
复制
NaN!==5

在网上试试!

JavaScript,18字节

另一个无聊的解决方案,用注释代替减法。返回1,或反向返回2。我在这些文件中包含了print语句。

代码语言:javascript
复制
print(1)//)2(tnirp

在网上试试!

代码语言:javascript
复制
print(2)//)1(tnirp

在网上试试!

JavaScript,7字节

类似于前面的答案,但用赋值代替相等。使用atob变量,它是浏览器Javascript中的内置内容(解码base64)。因为TIO不包括浏览器构建,所以我定义它只是为了防止它出错。在控制台中按预期工作。返回true,或反向返回false

代码语言:javascript
复制
2!=atob

在网上试试!

代码语言:javascript
复制
bota=!2

在网上试试!

票数 15
EN

Code Golf用户

发布于 2019-11-09 03:23:10

J,3字节

代码语言:javascript
复制
1"_

在网上试试!

1或无穷远.

  • 1"_是常数1,转化为秩"无穷大_的动词。因此,总是返回1。
  • _"1是常数不定式_,转化为1级动词。因此,总是返回无穷大。
票数 8
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/195551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档