世界を救う自動化


63

あなたはデズモンド・ヒュームです。過去3年間、あなたとあなたのパートナーであるケルビンは、世界を救うために108分ごとに非常に特定のシーケンスを入力する必要があるコンピューターの奴隷でした。

4 8 15 16 23 42

あなたのパートナーは40日前に亡くなりました(ケルビンの頭と大きな岩を巻き込んだ不幸な事故のため)、そしてあなたは誰とも話すことができません。番号を入力する人はいません。単調さを破る人はいません。最初はそれほど悪くはありませんでしたが、もう沈黙を処理することはできません。「Make Your Own Kind Of Music」をもう一度聴く必要がある場合は、悲鳴を上げるでしょう。

あなたは外に出る必要があると決めます。脱出する。あなたは、いかだを作り、島から出航することにします。しかし、あなたは悪いニュースに気付く:あなたはここで立ち往生している。あなたは世界を救い続ける必要があります。

しかし、あなたは良いニュースに気づきます:あなたはプログラマです!世界の節約を自動化できます!興奮して、コンピューターに走り込み、信頼できるpythonスキルを使用して、数字を入力するための簡単なスクリプトを作成します。

import time

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

すばやく、シンプルで、信頼性が高く、短く、簡単です。優れたpythonスクリプトに必要なすべてのもの。しかし、それをテストしようとすると、エラーが発生します。

Bad command or file name.

ええ、奇妙です。まあ、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分間待機します。(The Lost Wikiによると)

3)永遠に繰り返します。(または、これはすべて手の込んだ詐欺であり、怠zyな文章が原因でおかしな状況に陥り、答えが得られない質問をしていることに気付くまで。JJエイブラムスに感謝!)

ただし、注意点があります。白鳥ステーションのコンピューターが実際に実行できる言語を使用する必要があります。仮定して

A)コンピューターは建設時に最新のものでした。

B)コンピューターソフトウェアの更新がありません。

C)インターネットに接続できません(Golfscriptをダウンロードできないことを意味します...)、

The Swan Stationの建設日を最善の方法で推測します(再び、The Lost Wiki。

つまり、1977年12月31日以前に最初にリリースされた言語を使用する必要があります。


いくつかのルールの説明:

  • ライブラリを含めることは問題ありませんが、同じルールが適用されます(ライブラリは1977年より前でなければなりません)。

  • OSの互換性について心配する必要はありません。

  • を使用する場合system、または同等の言語を使用する場合、使用するシステムコマンドが1978年以前に使用可能であったこと証明する必要があります。これを証明するには、おそらくウィキペディアの記事が最善の方法です。

  • 印刷とスリープを交互に繰り返すパターンになっている限り、プログラムをいつ開始してもかまいません。(print-sleep-print-sleep ...およびsleep-print-sleep-print ...は両方とも許容されます。)

これはCode-Golfなので、バイト単位の最短回答が勝ちです。


各出力の最後に改行が必要ですか?
メゴ

3
@Megoはい、そうでなければ、数字は実際には入力されません。
DJMcMayhem

回答:


11

APL28 24 25 24 バイト

これは1977年にSTSCのAPL * PLUSおよびIPSAのSharpAPLで機能し、現代のAPLには多くの新機能がありますが、今日でもすべての主要なAPLで機能します:

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

最初の行は、必要な数値である表示された数値の累積合計を印刷します。第二のラインD Eのリットル AYS 6360秒(106分)、次いで、(明らかに、1)そのシグナムをとり、その行(すなわち前、数印刷用1)に移行します。

ただし、1966年以降のAPL \ 360(IBM System / 360の APL )は、実際には1バイト(無料のIBM / 370エミュレーターでテスト済み)に勝っています

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

睡眠Iビーム(「IBMは、」 - ?それを得る)における待ち時間かかるjiffy単位1 / 300 番目の第二のを、私たちは19×10の待つ5 jiffy単位= 105分及び33 1 / 3秒。


私はこれからすべての時間の測定値をキロジフとメガジフで与えます。
パベル

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

@ngn APL * PLUSにはがありません⎕A
アダム

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

@Adámping ^
ngn

26

ムンプス-1966年頃の30文字(1977年に最初のANSI標準)

コードゴルフでの私の最初の試み、ここに行きます!

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

MUMPSは、ボストンのマサチューセッツ総合病院によって作成されたEHRソフトウェアの一般的な言語です。最も知られている実装は、ウィスコンシン州ベローナのEpic Systemsです。


6
よくやった!あなたは地獄のその特定のサークルに入りたいはずですMUMPSは...実際には、コードゴルフに最適です

2
世界が危機に瀕していた場合、私は起動時に「U 0」を置くかもしれません...
PSR

5
@psr、より重要なこと:世界を救うか、ゴルフをコード化するか!
アンドリューロビンソン

2
@psrムンプスを聞いたことがない人に冗談を説明してもらえますか?私ではなく、ただええと-仮説的に。ムンプスのことを聞いたことのない人がこれにつまずく場合。;)
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)

次のプログラムは、時刻がseconds / 2で測定されるシステムで機能します。

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

^Hおよび$CONTROL-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シェル、47 45バイト

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

2
それに私を打つ。sleep当時、実際に利用可能な証拠を見つけようとしていましたが、それを見つけましたか?en.wikipedia.org/wiki/...
デジタルトラウマ

条件sleepとして使用できますwhile。2バイト
節約-ThinkChaos

寝るでしょう@plg 前に許可されていないよう数列を、(それは、すぐにプログラムを実行した後にシーケンスを印刷している出力、その後眠ります)。
ドアノブ

5
したがって、最後に手動で数値を入力した直後にプログラムを開始します。;)
ロジャー

1
Unixバージョン6にはsleepコマンドが含まれていました(man.cat-v.org/unix-6th/1/sleepを参照)。
マッテオイタリア


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つあるはずです。Fortran77のスリープ関数への参照しか見つかりませんでしたが、Fortran IVおよび66にはすでに存在しているはずです。

PS:ラベル42の代わりにラベル1を使用して、1バイトを削り取ることができます。

PPS:問題のコンピューターがプログラム入力にパンチングカードを使用している場合、すべてがうまくいかず、バイト数は問題になりません:D。


@proudhaskellerいいえ、左の7列は予約されているため、行4の最後の1バイトのみを保存します。
frodoskywalker

1
正確に、私はそれを変更しなかった理由である1バイトだけを安全にしたいと思います;)
バーサロール

3
ああ、必須の空白は、私の目には懐かしい涙を置く:D
イヴ・クレット

で置き換えること60*107でバイトを削ることもでき80**2ます。
マーク

[OK]を、その後1はまた、単に6420.使用することができます
Bersaelor


10

Altair Basic

確かに、デズモンドとケルビンはただの楽しみのためにAltair 8800(またはエミュレーター)を持っていたでしょう。Altair Basic(Bill Gatesという名の、2人の小さなMicro-Softと呼ばれる新興企業の)が1975年のリリースを発表しました。

Desmondは、内部FORループが1分間続くように少し微調整する必要があります。当時、誰もが忙しいループが間違っていることを知っていましたが、誰もがそれを使用していました!

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)、リアルタイムクロックへの割り込みを介してアクセスできます電力線または内部水晶。

彼は、クロック入力を処理する割り込みルーチンを作成する必要があります。これは、ポートを更新する可能性があります。

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
ジオビット

4
うーん、Desmond、Altair ...もしかして「エツィオ」と呼ばれる言語はありますか?
クロルタン

10

Unixシステム6のPDP-11アセンブラ-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
2文字少ないために\ nを削除します。彼は、それが別の行にある必要があるとは言わなかった。:)
アンドリューロビンソン

@AndrewRobinson:少し不公平だと思われますが、その後のすべての出力では4が42と一緒にbashされます...代わりに、セミコロンで\ n(2文字)を変更できます。また、msg無駄です、私は一緒に行くことができますm(他の4バイトを剃る)。
マッテオイタリア

1
br代わりにを使用して、手紙と指示語を保存しjmpますか?また、書き込みにはr0のファイル記述子が必要です。最初のループで1(または2)が含まれているようですが、スリープ時間でそれを壊しています。
Random832

@ Random832:おっと、それをテストしたときにおそらく動作しました。スリープ時間として1または2を使用して、動作するかどうかをすばやく試してみたからです。についての正しいbr、それと他のいくつかのトリックのおかげで(主に空白を切り取り、可能な限り8進数を使用)、最初の文字を追加することで74文字になりましたmov
マッテオイタリア

8

ロゴ、61バイト(おそらく)または48バイト(おそらくない)

残念ながら、BBN のThe LOGO System:Preliminary Manual(1967)のオンラインコピー、またはMIT Logo Group(1960年代以降)の参考資料を見つけることができませんでした。LCSIのAppleロゴは少し新しい(〜1980)。ただし、オンラインブックに基づいて、次のいくつかのバリエーションがおそらくその時点で機能していました。WAIT 60は60秒ではなく1秒待機することに注意してください。

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)の標準でした。エキゾチックと見なされるようになったのはごく最近のことです。
リチ

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

パスカル-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、50バイト

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

これに関する経験はありません。ウィキペディアで見ました: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

@matsjoyceだからこそ、タイマー付きで1つとなしで1つを投稿しました:)
Teun Pronk

3
あなたの抜け穴はこのチャレンジでは機能しませんが、デズモンドはそれを逃れることができるのでしょうか。104〜108分のウィンドウの間にない限り、コンピューターは何もしないので、入力されている余分な「4 8 15 16 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に出力します)。
  • do-whileループをgotoに置き換え-6文字を節約

3

トンプソンシェル、1971年(スリープコマンドの場合は1973年)

43バイト

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

Bourneシェルは1977年に存在していましたが、1979年のv7まではUnixのリリースバージョンではありませんでした。元のUnixシェルには派手なループ制御コマンドはありませんでした。(ループを終了する場合は、ifコマンドを使用してgotoをスキップできます。)


それはexec $0ちょっとした節約のために持っていただろうgotoか?
ニール

2

C、50バイト

他のCソリューションよりも短いため、複製ではありません。他のCソリューションに関するDigital Traumaの(ほぼ)同じコメントに気付く前に、実際にこれを書きました。

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

これは、他のソリューションに対する些細な修正/改善であり、したがって、だまされていると主張します。これを書く前にコメントを見たかどうかは関係ありません。
メゴ

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
それは賢いです!プログラムは「sleep-ping」と言うことができます。:P
DJMcMayhem

わーい!

@DrGreenEg​​gsandIronManどこがsystem大丈夫で、どこが大丈夫でないのですか?あなたは大丈夫ですsystem("ping ...")が、挑戦は私がsystem例えばbashコマンドのためにCから使用できないと言います。ALGOLは、印刷を行っているが、私はよりも別の方法を持っていないping(8)か、sleep(1)スリープ状態に。

さて、チャレンジを書いたとき、私はグーグルで調べて、bashが89年に出てきたので、「bashの使用は不正行為だ!」と思いました。大きな問題はsystem("sleep")、当時のOSで動作するかどうかだと思います。投稿を編集します。
DJMcMayhem

1
NCPにpingがあったとは思わない。インターネットは、1980年代初頭まではTCP / IPに移行せず、ICMPエコー要求の最初の言及は4月1981日付け、RFC777にあるように見える
ninjalj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.