一名 GCSE 计算机科学专业的学生最近在考试中犯了一个可笑的错误,并将其发布在网上。现在,你必须让它发挥作用:
day = "Monday"
x = day.length
print(x)
他们说输出是:24 hours
。现在,我们都知道这是不正确的,但是为了验证这个随机学生,尝试打一个可以采用上述代码并返回 24 小时输出的程序。
细节
主要的限制是上面的代码必须完整地包含在你的程序中,并且必须输出字符串“24 小时”
此程序不需要输入,但它必须使用名为 的函数提供输出(输出到标准输出、屏幕或其他任何地方)print
。如果您的语言内置了此功能,请使用它。如果没有,则需要自己编写。结尾换行符可能包含也可能不包含,这取决于您。
如果您选择的语言不支持格式为 的变量声明(或赋值)语法name = value
,则它将无法用于此挑战。无论您使用哪种语言,都应该支持运行考试中提供的语法的代码。这排除了大多数没有基于=
赋值的变量的 esolang,例如 Brainfuck、Jelly 和其他语言。一些可用的语言可能包括 Swift、Python、Go 等。打印也是如此,尽管如前所述,您可以根据需要创建自己的打印函数。
规则
- 提供的代码段不能位于注释或无法访问的部分;它必须被执行。
- 所提供的代码段必须按原样使用,不得以任何方式篡改。
- 分号(或相当于您选择的语言的行尾)是对提供的代码段唯一允许的修改。
伪代码示例
modify class String {
let length = "24 hours"
}
day = "Monday"
x = day.length
print(x)
这是一个 Code Golf 挑战,因此仍然请尝试使用尽可能少的字节编写代码!
\endgroup
7
13 个解决方案
13
,68字节
class day:length="24 hours";\
day = "Monday"
x = day.length
print(x)
不确定反斜杠是否是作弊行为。
\endgroup
4
-
2\begingroup
我是一名 Python 程序员(实际上),但仍然不得不问:这到底是如何工作的?
\endgroup
– -
3\begingroup
@Neinstein:经常被遗忘的行为是由反斜杠转义“物理换行符”触发的。这使得第 2 行只是 中的另一个字段class day
。__dict__
非常聪明!(实用说明:大多数编码样式指南建议使用由打开的括号/圆括号提供的隐式行连接行为,因为这不太微妙且脆弱。)
\endgroup
–
-
3\begingroup
这绝对是对 Python 特性的创造性滥用,而不是作弊
\endgroup
– -
\begingroup
非常聪明的提交!我想你可以删除反斜杠和换行符,减少 2 个字节,同时保持嵌入代码完整,尽管视觉吸引力会降低。
\endgroup
–
|
,60字节
day.length="24 hours"
day = "Monday"
x = day.length
print(x)
.
只是 R 中变量名的一部分。
\endgroup
1
-
\begingroup
做得好,我真的没想到有人能打败我的 Uiua 分数!
\endgroup
–
|
,65 字节
print _^:=Print@"24 hours"
day = "Monday"
x = day.length
print(x)
我冒昧地概括了“这个程序……必须通过使用一个名为 print 的函数来提供其输出……”。严格来说,Mathematica 并没有真正的函数;相反,它有一组描述表达式转换的定义。在评估过程中,这些定义一直应用到没有更多此类定义适用为止。
print _^:=Print@"24 hours"
为符号添加定义print
:当它与任何东西相乘时,打印24 hours
。
day = "Monday"
分配"Monday"
给符号day
。
x = day.length
day
将和的点积赋给length
符号x
。没有内置规则来计算字符串和符号的点积。
print(x)
print
与相乘x
。
这可能违反规则的精神,但第 1 行可以简单地为print:=Print@"24 hours"
(-3 字节):遇到24 hours
时打印。print
\endgroup
|
,71 字节
print=_=>console.log("24 hours")
day = "Monday"
x = day.length
print(x)
\endgroup
1
-
\begingroup
啊哈哈,我期待原型的改变,但期待print
命令,哈哈
\endgroup
–
|
Uiua,61字节
print=ggg&p
day = "Monday"
x = day.length
print(x)."24 hours"
首先,让我们看看给定的程序在 Uiua 中说了什么:
day = "Monday" # Assign 'day' to the string.
x = day.length # Assign 'x' to a function which pushes the value
# of 'day' and pushes twice the length of an array.
print(x) # Call a function 'print' after calling the function 'x'.
x
必须以数组作为输入,因此我们将其放在堆栈上。x
有三个输出,但都是无用的,因此print
必须三个值并打印“24 小时”。我们通过使用“24 小时”作为数组,一举两得x
。print
定义为弹出三个堆栈值并打印一个字符串。
如果您愿意,."24 hours"
可以在程序开始时将该部分移动到其自己的行,但这种方式短一个字节并且据我所知是完全允许的。
\endgroup
|
,168 字节
#include<stdio.h>
struct A{A*length;void operator=(const char*s){}};void print(A*a){printf("24 hours");}int main(){A day,*x;
day = "Monday";
x = day.length;
print(x);
}
\endgroup
1
-
1\begingroup
\endgroup
–
|
,126124字节
use MONKEY-TYPING;augment class Str {method length {"24 hours"}};my \day:=my \x:=$;
day = "Monday";
x = day.length;
print(x)
\endgroup
|
,107 字节
function print{$args}class D{D([string]$a){}[int]$length=24}[D]`
$day = "Monday"
$x = $day.length
print($x)
我调整了代码以便能够使用 PowerShell 的语法运行:变量名必须以 开头$
,如果不行,请告诉我。
function print{$args} # Declare a print function that simply returns its arguments, which prints to std out by default
class D{ # Declare a class D
D([string]$a){} # Constructor to allow an implicit conversion from string to D
[int]$length=24} # Declare and set a public property `length` with value 24
[D]` # The back tick escapes the new line, making `$day` an object of class D
\endgroup
1
-
2\begingroup
正如我所说的那样,我认为添加$
PowerShell 的变量引用会使这个答案无效。
\endgroup
–
|
,67 字节
filter print{'24 hours'}
$day = "Monday"
$x = $day.length
print($x)
简单来说:“filter”与“function”基本相同(但具有自动管道处理功能,这不是这里的重点),但只有 6 个字符而不是 8 个字符。它将忽略任何参数并仅返回静态字符串“24 小时”。
\endgroup
2
-
2\begingroup
尽管我很喜欢 PowerShell,但我不认为这符合既定规则,因为您没有使用未更改的学生代码(您正在将其添加$
到变量引用中)。
\endgroup
– -
\begingroup
我会将其归类为与不同的赋值字符和分号作为行尾相同的类别。原始代码没有以任何相关方式改变。而且它肯定不是打高尔夫球,因为它在计数中添加了 4 个字符…
\endgroup
–
|
,68 字节
def print a;puts"24 hours"end
day = "Monday"
x = day.length
print(x)
作为参考,以前的解决方案:
,82 字节
String.class_eval{def length;"24 hours"end}
day = "Monday"
x = day.length
print(x)
\endgroup
|
,51字节
2I÷L
day = "Monday"
x = day.length
print(x)
χ hours
说明:ASCII 文本在 Charcoal 中只是一个文字字符串;在包含必要的换行符后,您将获得一个 40 个字符的字符串。我能找到的该字符串的最佳用途是将其长度除以 10 以4
在输出中得到;其余输出只是文字字符串。
其他替代方法是减去16
,或除以2
并加上4
,但它们的长度仍然相同。例如:
I×L
day = "Monday"
x = day.length
print(x)
·⁶ hours
\endgroup
1
-
\begingroup
等号是否被解释为赋值?如果不是,则这是无效的
\endgroup
–
|
Google 表格,77 字节
=let(print,lambda(_,"24 hours"),_,
day = "Monday"&
x = day.length,
print(x)
)
\endgroup
|
22,210 字节
class C {
public void print(){System.out.print("24 hours");}
void main() throws Exception {
String s = """
day = "Monday"
x = day.length
print(x)
""";
C.class.getMethod(s.substring(30,35)).invoke(new C());
}
}
必须使用--release 22
和--enable-preview
标志进行编译和运行
javac --release 22 --enable-preview C.java
java --enable-preview C
第一次在这里发帖,所以我不知道是否允许使用反射,我看不出有其他方法可以避免;
每行末尾的强制要求。从技术上讲,该print
函数仍然被调用。
\endgroup
1
-
\begingroup
嘿,规则中说“分号(或所选语言中相当于行尾的符号)是提供的代码段唯一允许的修改。”所以你不需要为此进行反射。此外,这目前违反了“提供的代码段不得位于注释或无法访问的部分中;必须执行”的规则,因为目前只有最后一行正在运行。
\endgroup
–
|
这个问题很有趣,但不清楚提交时需要什么语言,或者如果没有特定的语言要求,如果语言不支持语法该怎么办
day = "Monday" x = day.length print(x)
。因此,我投票关闭,因为需要详细信息/清晰度。\endgroup
–
我尝试对在这种情况下该怎么做进行更清晰的说明,基本上就是说大多数 esolang – 以及任何不支持基于
=
– 的变量赋值的语言 – 都应该避免遇到这种挑战。\endgroup
–
假设一种语言确实支持
=
基于变量的赋值,但语法不同。这有效吗?\endgroup
–
由于想法是按原样使用提供的代码,并编写额外的东西来使提供的代码工作,我会说不,但由于我允许使用分号,我想非
=
赋值也可能是一个例外。应该这样做吗?\endgroup
–
这将允许使用更多语言,但这样就存在一个问题,即确定某些东西是否被视为等同。
\endgroup
–
|