自动化拯救世界


63

您是Desmond Hume。在过去的三年中,您和您的伴侣Kelvin一直是计算机的奴隶,该计算机要求每108分钟输入非常特定的顺序以拯救世界。

4 8 15 16 23 42

您的伴侣在40天前死亡(由于不幸的事故涉及Kelvin的头和一块大石头),因此您没有人可以交谈。没有人为您输入数字。没有人打破单调。起初还算不错,但是您再也无法应付沉默了。而且,如果您不得不再听一次“制作属于自己的音乐”,那您将大叫。

您决定需要离开。逃离。您决定建造一艘筏并驶离该岛。但是随后您意识到了一个坏消息:您被困在这里。您需要继续拯救世界。

但是随后您意识到了一个好消息:您是一名程序员!您可以自动拯救世界!兴奋的是,您跑到计算机上,并使用可信赖的python技能,快速编写了一个脚本来为您输入数字。

import time

while True:
    print "4 8 15 16 23 42"
    time.sleep(60 * 107)

快速,简单,可靠,简短易用。一个好的python脚本应该具备的一切。但是,当您尝试对其进行测试时,您会得到一个错误。

Bad command or file name.

strange,奇怪。哦,让我们尝试一下c ++。

#include <iostream>
#include <unistd.h> 

int main()
{
    while (true)
    {
        std::cout << "4 8 15 16 23 42" << std::endl;
        sleep(60 * 107);
    }
}

没有!也找不到C ++。您尝试各种您能想到的语言。Javascript,Ruby,Perl,PHP,C#。没有。这台计算机是在当今所有流行语言之前制造的。

挑战

您必须编写一个程序,该程序将:

1)准确打印以下内容:“ 4 8 15 16 23 42”(不带引号)

2)等待104至108分钟。(根据《迷失的维基》

3)永远重复一次。(或者直到您意识到这都是精心设计的骗局,并且由于懒惰的写作而使您陷入奇怪的困境,并提出您没有答案的问题。谢谢JJ Abrams!)

但是有一个陷阱:您必须使用天鹅站中的计算机实际上可以运行的语言。假如说

A)计算机在建造时是最新的,

B)没有更新计算机软件,并且

C)没有可用的互联网连接(意味着您无法下载Golfscript ...),

并对“天鹅站”的建设日期做出最好的猜测,(再次,《失落的维基》。

这意味着您必须使用在1977年12月31日或之前首次发布的语言。


一些规则说明:

  • 包括库是可以的,但是要遵循相同的规则(库必须在1977年前)。

  • 您不必担心操作系统的兼容性。

  • 如果您使用system或等效的语言,则必须证明您使用的所有系统命令在1978年之前就已可用。维基百科文章可能是证明这一点的最佳方法。

  • 只要程序最终以交替打印和休眠的方式结束,启动程序就没有关系。(打印睡眠打印睡眠...和睡眠打印睡眠打印...都是可以接受的。)

这是Code-Golf,所以最短答案以字节为单位。


每个输出的末尾都需要换行吗?
Mego

3
@Mego是的,否则实际上不会输入数字。
DJMcMayhem

Answers:


11

APL28 24 25 24 字节

1977年,这在STSC的APL * PLUS和IPSA的SharpAPL中起作用,尽管现代的APL具有大量的新功能,但今天它仍然适用于所有主要的APL:

+\4 4 7 1 7 19
→×⎕DL 6360

第一行打印显示的数字的累积总和,这些数字是必需的数字。第二行d Ë AYS6360秒(106分钟),然后取的该正负号(1,很明显),并进入到该行(即以前的,数打印一个)。

但是,从1966年开始的APL \ 360(IBM System / 360的APL )实际上击败了它一个字节(在免费的IBM / 370仿真器上测试):

+\4 4 7 1 7 19
5⌶19E5
→1

睡眠工字钢(“ IBM ” - ?得到它)开在等待时间的jiffies1 / 300 第二的,所以我们等待19×10周5的jiffies = 105分钟,33 1 / 3秒。


从现在开始,我将以千吉菲和兆吉菲给出所有时间测量。
帕维尔

+\⎕A⍳'EEHBHT'(if ⎕IO=0
ngn

@ngn APL * PLUS没有⎕A
亚当

@Adám +\4 4 7 1 7 19呢?
ngn

@亚当平^
NGN

26

MUMPS-30个字符,大约1966年(1977年首次采用ANSI标准)

我第一次尝试打高尔夫球,现在就开始!

f  w "4 8 15 16 23 42" h 6420

MUMPS仍然是EHR软件的一种流行语言,它是由波士顿麻萨诸塞州总医院创建的。最知名的实现是威斯康星州维罗纳的Epic Systems。


6
很好!如果您想进入地狱的特定圈子,MUMPS实际上是代码高尔夫的理想之选

2
如果这个世界危在旦夕,我可能会在开头加上“ U 0”……
psr

5
@psr,更重要的是:拯救世界或打高尔夫吗?
Andrew Robinson

2
@psr您能向以前从未听说过MUMPS的人讲这个笑话吗?不是我,只是-假设。万一没有听说过MUMPS的人偶然发现了这一点。;)
DJMcMayhem

3
@DJMcMayhem-写入语句(“ W”)写入当前输出设备(无论您是否喜欢该想法,当前设备是全局值)。当前设备可能将成为标准输出。但是U 0会将其设置为标准输出(通常,但是,进入该目录对于任何人都不再是有趣的了)。
psr

20

TECO,53个字节

TECO(文本[以前为磁带]编辑器和校正器)是起源于1962年的文本编辑器。它还可用于运行独立程序。它是PDP,VAXen等的最新编辑器。

根据TECO手册,该^H命令给出了一天中的时间。确保检查您的操作系统和电源,因为时间单位可能会因您的机器而异:

OS/8:      ^H = 0
RT-11:     ^H = (seconds since midnight)/2
RSTS/E:    ^H = minutes until midnight
RSX-11:    ^H = (seconds since midnight)/2
VAX/VMS:   ^H = (seconds since midnight)/2
TOPS-10:   ^H = 60ths of a second since midnight
(or 50ths of a second where 50 Hz power is used)

以下程序适用于以秒/ 2为单位测量一天中的时间的系统:

I4 8 15 16 23 42
$<HT^HUA<^H-QAUDQD"L43200%D'QD-3180;>>

请注意,^H$应以醒目,分别控制-H和ESCAPE输入。

程序中的数字可以针对以下机器进行调整:

   (number)        43200     3180
RSTS/E              1440      106
TOPS-10 60 Hz    5184000   381600
TOPS-10 50 Hz    4320000   318000
OS/8             goodbye, world...

20

Bourne Shell,47个 45字节

while echo 4 8 15 16 23 42;do sleep 6420;done

2
击败我。我试图寻找当时可以使用的证据sleep-您找到了吗?zh.wikipedia.org/wiki/…–
数字创伤

您可以sleep用作while条件。节省2个字节
ThinkChaos 2015年

@plg 输出数字序列之前将进入睡眠状态,这似乎是不允许的(它必须在运行程序后立即打印序列,然后进入睡眠状态)。
门把手

5
因此,您可以在最后一次手动输入数字后立即启动程序。;)
罗杰(Roger

1
Unix 6确实包含了sleep命令(请参阅man.cat-v.org/unix-6th/1/sleep)。
Matteo Italia 2015年


13

FORTRAN 66(108 98字节)

      PROGRAM D 
2     WRITE (*,*) '4 8 15 16 23 42'
      CALL SLEEP(6420)
      GOTO 2
      END

可以肯定的是,该计算机具有FORTRAN编译器,因为它在该时代的科学和工程领域处于主导地位。同名的那年我出生了18年,但是在大学数学课程期间,我们学习了FORTRAN。一场有趣的讲座,我们学习了如何在打孔卡上编程。在这里正确格式化它不是那么容易,在每个命令之前应该有6个空格,我只能找到对Fortran 77的睡眠功能的引用,但是它应该已经在Fortran IV和66中存在。

PS:我们可以使用标签1代替标签42来删除一个字节。

PPS:如果有问题的计算机使用打孔卡进行程序输入,那么您将很不走运,字节也不再重要了:D。


@proudhaskeller没有,左7列被保留,所以你只能在第4行的末尾保存一个字节
frodoskywalker

1
确实,我只保留一个字节,这就是为什么我没有更改它;)
Bersaelor 2015年

3
啊,强制性空格给我留下了怀旧的眼泪:D
Yves Klett

你可以通过替换剃去一个字节60*10780**2了。
2015年

好的,但是那也可以只使用6420。–
Bersaelor


10

Altair基础版

当然,Desmond和Kelvin可能只是出于娱乐目的而拥有Altair 8800(或仿真器)。Altair Basic(来自一个名叫Bill Gates的家伙,是一个由两个人创办的小公司,名叫Micro-Soft)在1975年发行了。

Desmond需要微调一下以确保内部FOR循环持续一分钟。那时,每个人都知道忙循环是错误的,但是每个人都使用了它们!

1 REM ADJUST "D" AS REQUIRED
2 LET D = 1000
3 PRINT "4 8 15 16 23 42"
4 FOR A = 0 TO 105 * 60
5 REM THIS LOOP SHOULD LAST ONE MINUTE +/- 0.05 SECONDS
6 FOR B = 0 TO D
7 LET C = ATN(0.25)
8 NEXT
9 NEXT
10 GOTO 3

作为替代方案,Desmond可以安装88-RTC板(由组件组装!:http ://www.classiccmp.org/altair32/pdf/88-virtc.pdf ),并通过中断访问正在运行的实时时钟电源线或内部晶体。

他将需要编写一个中断例程来处理时钟输入,这反过来又可以更新端口,例如每59秒钟接地一次,然后升高。

Altair Basic具有WAIT功能,因此代码将简化为以下内容(我找不到端口列表,因此我选择了125,希望它不会被使用。):

1 PRINT "4 8 15 16 23 42"
2 FOR A = 0 TO 105 * 60
3 WAIT 125,0
4 WAIT 125,255
5 NEXT
6 GOTO 1

这实际上是一个有趣的小问题,可以追溯到一些真正的基本计算机。那些老朋友(包括我)必须有耐心!


2
啊,忙碌的循环... +1
Geobits'1

4
嗯,戴斯蒙德,牵牛星...有没有一种叫做“埃齐奥”的语言?
Kroltan

10

Unix系统的PDP-11汇编程序6-73 68 74个字符

谈到70年代,必须对Unix及其起源的硬件表示敬意!

s:mov $1,r0
sys write;m;18
mov $6240.,r0
sys 43
br s
m:<4 8 15 16 23 42;>

您可以在这里轻松地运行它(但是首先您必须重新发现使用ed插入文本的乐趣-在我的特定情况下,我什至不得不发现如何在其中实际编辑文本:))。

组装成108个字节。

# cat mini.as
s:mov $1,r0
sys write;m;18
mov $6240.,r0
sys 43
br s
m:<4 8 15 16 23 42;>
# as mini.as
# ls -l a.out mini.as
-rwxrwxrwx  1 root      108 Oct 10 12:36 a.out
-rw-rw-rw-  1 root       74 Oct 10 12:36 mini.as
# od -h a.out
0000000 0107 0022 0000 0000 0018 0000 0000 0000
0000020 15c0 0001 8904 0012 0010 15c0 0004 8923
0000040 01f7 2034 2038 3531 3120 2036 3332 3420
0000060 3b32 0000 0000 0000 0002 0000 0000 0000
0000100 0000
0000120 0000 0000 0073 0000 0000 0000 0002 0000
0000140 006d 0000 0000 0000 0002 0012
0000154 
# ./a.out
4 8 15 16 23 42;

1
删除\ n减少2个字符,他没有说它必须放在单独的行中。:)
安德鲁·罗宾逊

@AndrewRobinson:似乎有点不公平,后面的所有输出都将4和42混为一谈了……我可以改为用分号更改\ n(两个字符)。另外,这msg很浪费,我可以继续使用m(削掉其他4个字节)。
Matteo Italia

1
您可以使用br代替来保存字母和说明词,不是jmp吗?另外,写操作还需要r0中的文件描述符-您显然在第一个循环中恰好有1(或2)个文件描述符,但是您正在用睡眠时间来粉碎它。
Random832

@ Random832:糟糕,它在我测试时可能有效,因为我使用1或2作为睡眠时间来快速尝试它是否有效。正确地解决了这个问题br,这要归功于它和其他一些技巧(主要是在空白处切入并尽可能使用八进制),即使添加了第一个,我们也可以达到74个字符mov
Matteo Italia

8

LOGO,61个字节(可能)或48个字节(可能不是)

不幸的是,我还没有找到BBN 的在线LOGO系统:初步手册(1967)或MIT徽标组(1960s +)的任何参考。LCSI的Apple Logo太新了(〜1980)。但是,根据在线书籍,以下内容可能在当时有些变化。请注意,等待60等待1秒,而不是60。

TO a
LABEL "l
PRINT [4 8 15 16 23 42]
WAIT 381600
GO "l
END
a

我们可以通过尾部调用优化来做得更好,尽管这可能当时还不可用。

TO a
PRINT [4 8 15 16 23 42]
WAIT 381600
a
END
a

3
当时绝对可以提供TCO。(是的,我从经验中知道。)TCO是Lisp(然后是Scheme)的规范。直到最近,它才被视为异国情调。
rici 2015年

7

CBM BASIC 1.0,52 38个字符,标记化,以45 31个字节

1?"4 8 15 16 23 42":fOa=1to185^3:nE:rU

CBM BASIC 1.0是在1977年10月随Commodore PET一起引入的。命令通常以大写和CBM图形字符显示,但是为了方便起见,我在这里以小写+大写形式列出了它们(我的和你的!!-) )。还请注意,^实际上会显示为↑。解密后,列出LIST此内容将导致:

1 PRINT "4 8 15 16 23 42":FOR A=1 TO 185^3:NEXT:RUN

PET的6502以1MHz运行,因此大约需要105分钟才能完成。

编辑:意识到嵌套循环不是真正必要,并且我会错误地计算令牌。仍然不足以赢得胜利(并且太迟了,无法启动),但至少它更好。


7

Pascal- 107 95字节

PROGRAM S;USES CRT;BEGIN WHILE TRUE DO BEGIN WRITELN('4 8 15 16 23 42');DELAY(6300000);END;END.

非高尔夫版本:

PROGRAM S;
USES CRT;
BEGIN
    WHILE TRUE DO
    BEGIN
        WRITELN('4 8 15 16 23 42');
        DELAY(6300000); { 105 minutes * 60 seconds * 1000 milisseconds }
    END;
END.

4

四十个字节

尽管FORTH-79是最早的标准化版本,但该语言于1968年开始开发,可在IBM 1130上使用。在1977年问世之前,该语言也已在其他系统上使用。我可能会做一些进一步的研究,以确保所有这些单词都可用,但是我可以肯定的是,这已经足够基本了。当然,这些都是FORTH-79提供的。

永远循环,在字符串打印之间等待6420000毫秒。不打印换行符。

: F 0 1 DO 6420000 MS ." 4 8 15 16 23 42" LOOP ; F

4

Smalltalk,95(如果允许漏洞,则为68)

自1972年以来一直存在

|i|[i:=0.[i<5] whileTrue: [(Delay forSeconds: 6480) wait.Transcript show: '4 8 15 16 23 42'.]]fork

没有经验,可以在Wikipedia上查看:P
在线查找它如何循环和延迟,语法应该是正确的,但是找不到运行它的方法。

可能的漏洞

它应该每108分钟打印一次序列,但没有说明必须是108分钟。
这可能会使代码更短

|i|[i:=0.[i<5] whileTrue: [Transcript show: '4 8 15 16 23 42'.]]fork

代码将无间隔地打印序列,因此可以保证也将在108分钟后打印。


9
但是问题确实在说Wait some time between 104 and 108 minutes,所以我认为漏洞是不可能的。
matsjoyce 2015年

@matsjoyce,这就是为什么我发布了一个带计时器而没有带:)的原因
Teun Pronk,2015年

3
尽管您的漏洞无法解决挑战,但我想知道Desmond是否能够摆脱困境。我敢肯定,除非它在104-108分钟之间,否则计算机什么也不做,因此它只会忽略输入的额外“ 4 8 15 16 23 23 42”。但是,我确信沃尔特会对某人发送给他的所有电话号码感到非常困惑。= D
DJMcMayhem

3

SAS,82 75 69

data;
file stdout;
a:;
put "4 8 15 16 23 42";
a=sleep(6300,1);
goto a;
run;

这不是一种典型的高尔夫语言,但是我认为它可以应对这一挑战,前提file stdout是这种挑战在1977年的SAS中有效。

改进之处:

  • data _null_;-> data;保存7个字符(现在生成一个空数据集并打印到stdout)。
  • 用goto代替do-while循环-保存6个字符

3

汤普森·壳,1971年(1973年为睡眠命令)

43字节

: x
echo 4 8 15 16 23 42
sleep 6480
goto x

由于Bourne shell(尽管存在于1977年)在1979年的v7之前尚未在Unix的发行版本中使用。原始的Unix shell没有任何奇特的循环控制命令。(如果要结束循环,则可以使用该if命令跳过转到。)


exec $0节省一点钱goto吗?
尼尔

2

C,50个字节

比其他C解决方案短,因此不是重复的。我实际上是在写下Digital Trauma(几乎)对另一个C解决方案的相同评论之前写的。

main(){for(;;sleep(6240))puts("4 8 15 16 23 42");}

我认为这是对其他解决方案的微不足道的修改/改进,因此是一种欺骗。在撰写本文之前,您是否看过评论是无关紧要的。
Mego

1

COBOL,240个字节

是的,领先的空白很重要。像这样编译运行cobc -x save.cob; ./save。(该-x选项生成一个可执行文件,而不是共享库,因此我认为不需要计算它。)

       IDENTIFICATION DIVISION.
       PROGRAM-ID.S.
       PROCEDURE DIVISION.
           PERFORM UNTIL 1<>1
              DISPLAY"4 8 15 16 23 42"
              CALL"C$SLEEP"USING BY CONTENT 6402
           END-PERFORM.
           GOBACK.

如果我们很无聊,可以--free为自由格式代码添加编译选项,然后添加158 + 6 = 164字节,但这不太可能在77年以前奏效。

IDENTIFICATION DIVISION.
PROGRAM-ID.S.
PROCEDURE DIVISION.
PERFORM UNTIL 1<>1
DISPLAY"4 8 15 16 23 42"
CALL"C$SLEEP"USING BY CONTENT 6402
END-PERFORM.
GOBACK.

1

ALGOL 60/68 / W,74 47 50字节

运行这个完整的程序a68g save.a68,使用algol68g

ALGOL没有内置的睡眠方式,但是我们可以运行 /bin/sleep

DO print("4 8 15 16 23 42");system("sleep 6380")OD

旧答案:

ALGOL没有内置的睡眠功能,因此我们ping肯定会滥用当时肯定在Unix上的74 69个字节(从此处开始)。

DO print("4 8 15 16 23 42");system("ping 1.0 -c1 -w6240>/dev/null")OD

1
真聪明!您可以说程序正在“睡眠”。:P
DJMcMayhem

@DrGreenEg​​gsandIronMan哈!

@DrGreenEg​​gsandIronMan哪里可以行,哪里system不行?您还可以,system("ping ...")但挑战是我不能system在C中使用bash命令。ALGOL是做印刷的,但我没有其他办法比ping(8)sleep(1)睡觉。

好吧,当我写挑战时,我用谷歌搜索,发现bash在89年问世,所以我以为“使用bash就是作弊!”。我认为更大的问题是从那时起是否system("sleep")可以在OS上运行。我将编辑帖子。
DJMcMayhem

1
我不认为NCP可以使用。直到80年代初,Internet才过渡到TCP / IP,ICMP回声请求的第一次提及似乎出现在1981年4月的
RFC777中。– ninjalj
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.