console.error(`Unable to load nonexistent manifest entry ‘islands/voting-prompt’. Check that your file path is correct.`)

\begingroup

一名 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

  • 1
    \begingroup
    这个问题很有趣,但不清楚提交时需要什么语言,或者如果没有特定的语言要求,如果语言不支持语法该怎么办day = "Monday" x = day.length print(x)。因此,我投票关闭,因为需要详细信息/清晰度。
    \endgroup


    – 

  • \begingroup
    我尝试对在这种情况下该怎么做进行更清晰的说明,基本上就是说大多数 esolang – 以及任何不支持基于=– 的变量赋值的语言 – 都应该避免遇到这种挑战。
    \endgroup


    – 

  • \begingroup
    假设一种语言确实支持=基于变量的赋值,但语法不同。这有效吗?
    \endgroup


    – 

  • \begingroup
    由于想法是按原样使用提供的代码,并编写额外的东西来使提供的代码工作,我会说不,但由于我允许使用分号,我想非=赋值也可能是一个例外。应该这样做吗?
    \endgroup


    – 

  • 3
    \begingroup
    这将允许使用更多语言,但这样就存在一个问题,即确定某些东西是否被视为等同。
    \endgroup


    – 


13 个解决方案
13

\begingroup

,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


    – 


\begingroup

,60字节

day.length="24 hours"
day = "Monday"
x = day.length
print(x)

.只是 R 中变量名的一部分。

\endgroup

1

  • \begingroup
    做得好,我真的没想到有人能打败我的 Uiua 分数!
    \endgroup


    – 


\begingroup

,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

\begingroup

,71 字节

print=_=>console.log("24 hours")
day = "Monday"
x = day.length
print(x)

\endgroup

1

  • \begingroup
    啊哈哈,我期待原型的改变,但期待print命令,哈哈
    \endgroup


    – 

\begingroup

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 小时”作为数组,一举两得xprint定义为弹出三个堆栈值并打印一个字符串。

如果您愿意,."24 hours"可以在程序开始时将该部分移动到其自己的行,但这种方式短一个字节并且据我所知是完全允许的。

\endgroup

\begingroup

,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


    – 

\begingroup

126124字节

use MONKEY-TYPING;augment class Str {method length {"24 hours"}};my \day:=my \x:=$;
day = "Monday";
x = day.length;
print(x)

\endgroup

\begingroup

,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


    – 

\begingroup

,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


    – 

\begingroup

,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

\begingroup

,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


    – 

\begingroup

Google 表格,77 字节

=let(print,lambda(_,"24 hours"),_,
day = "Monday"&
x = day.length,
print(x)
)

\endgroup

\begingroup

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


    –