Автоматизировать спасение мира


63

Вы Десмонд Хьюм. Последние 3 года вы и ваш партнер Кельвин работали на компьютере, для которого требуется вводить очень специфическую последовательность каждые 108 минут, чтобы спасти мир.

4 8 15 16 23 42

Ваш партнер умер 40 дней назад (из-за несчастного случая с головой Кельвина и большим камнем), и вам не с кем поговорить. Никто не вводит цифры для вас. Никто не нарушит однообразие. Сначала это было не так уж плохо, но вы больше не можете справиться с тишиной. И если вам придется слушать «Создайте свой собственный вид музыки» еще раз, вы будете кричать.

Вы решаете, что Вам нужно выбраться. Сбежать. Вы решаете, что построите плот и отплывете от острова. Но потом вы понимаете плохие новости: вы застряли здесь. Вы должны продолжать спасать мир.

Но потом ты понимаешь хорошие новости: ты программист! Вы можете автоматизировать спасение мира! Взволнованный, вы подбегаете к компьютеру и, используя свои верные навыки работы с 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) Повторите навсегда. (Или до тех пор, пока вы не поймете, что это все сложное мошенничество и что вы застряли в странном подвешенном состоянии из-за ленивого письма и задавания вопросов, на которые у вас нет ответов. Спасибо Джей Джей Абрамс!)

Однако здесь есть одна загвоздка: вы ДОЛЖНЫ использовать язык, который компьютер на станции лебедя мог бы реально запустить. При условии, что

А) Компьютер был обновлен во время строительства,

Б) Обновлений программного обеспечения компьютеров не было, и

C) Нет доступного интернет-соединения (имеется в виду, что вы не можете загрузить Golfscript ...),

и сделать наше лучшее предположение о дате строительства станции Лебедь, (опять же, потерянная вики ).

Это означает, что вы должны использовать язык, который был впервые выпущен 31 декабря 1977 года или ранее.


Несколько уточнений правил:

  • Включение библиотек в порядке, но применяется то же правило (библиотеки должны быть до 1977 года).

  • Вам не нужно беспокоиться о совместимости ОС.

  • Если вы используете systemили ваш эквивалент языка, вы должны доказать, что любые системные команды, которые вы используете, были бы доступны до 1978 года. Статья в Википедии, вероятно, лучший способ доказать это.

  • Неважно, когда вы запускаете программу, до тех пор, пока она заканчивается чередованием печати и сна. (print-sleep-print-sleep ... и sleep-print-sleep-print ... оба приемлемы.)

Это Code-Golf, поэтому выигрывает самый короткий ответ в байтах.


Требуется ли перевод строки в конце каждого вывода?
Mego

3
@Mego Да, иначе цифры не будут введены .
DJMcMayhem

Ответы:


11

APL , 28 24 25 24 байта

Это сработало в STSC APL * PLUS и в IPSA SharpAPL в 1977 году, и хотя современные APL имеют массу новых функций, сегодня это все еще работает на всех основных APL:

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

Первая строка печатает накопленную сумму показанных чисел, которые являются необходимыми числами. Вторая линия д е л н я 6360 секунд (106 минут), а затем принимает сигнумов того , что (1, очевидно), и переходит к этой линии (т.е. предыдущий, номер-печать один).

Однако APL \ 360 (APL для IBM System / 360 ) 1966 года фактически бьет его на один байт (протестировано на бесплатном эмуляторе IBM / 370 ):

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

Спящий двутавровый лучIBM » - понимаете?) Занимает время ожидания с точностью до 1300- й секунды, поэтому мы ждем 19 × 10 5-ти jiffies = 105 минут и 33 13 секунды.


Теперь я даю измерения времени в килоджифиях и мегаджифайях.
Павел

+\⎕A⍳'EEHBHT'(если ⎕IO=0)
нгн

@ngn APL * PLUS не имеет ⎕A.
Адам

@ Адам +\4 4 7 1 7 19тогда?
нгн

@ Adám ping ^
ngn

26

MUMPS - 30 символов, около 1966 г. (стандарт ANSI впервые в 1977 г.)

Моя первая попытка кода гольф, здесь мы идем!

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

MUMPS по-прежнему является популярным языком для программного обеспечения EHR, созданного Массачусетской больницей общего профиля в Бостоне. Наиболее известной реализацией является Epic Systems в Вероне, Висконсин.


6
Отличная работа! MUMPS на самом деле идеально подходит для игры в гольф кода, если вы хотите войти в этот конкретный круг ада ...

2
Если бы на кону был мир, я мог бы поставить «U 0» в начале ...
PSR

5
@psr, что важнее: спасать мир или играть в гольф ?!
Эндрю Робинсон

2
@psr Не могли бы вы объяснить шутку кому-то, кто никогда не слышал о MUMPS раньше? Не я, просто ... гипотетически. В случае, если кто-то, кто не слышал о MUMPS, наткнется на это. ;)
DJMcMayhem

3
@DJMcMayhem - Оператор записи («W») записывает данные в текущее устройство вывода (какое устройство является текущим, имеет глобальное значение, нравится вам эта идея или нет). Текущее устройство, вероятно, будет стандартным выходом. Но U 0 установил бы его на стандартный вывод (обычно, но это уже никому не смешно).
PSR

20

TECO, 53 байта

TECO (Text [ранее Tape] Editor and Corrector) - текстовый редактор, созданный в 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и $должны быть введены, нажав, соответственно, 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 shell, 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
Версия 6 Unix включала команду sleep (см. Man.cat-v.org/unix-6th/1/sleep ).
Маттео Италия


13

Фортран 66 ( 108 98 байт)

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

Несомненно, что у рассматриваемого компьютера был компилятор FORTRAN, поскольку он доминировал в научных и инженерных областях в эпоху. Я родился через 18 лет после одноименного года, но во время моей математической программы в университете мы изучали фортран. Одна забавная лекция, которую мы узнали, как программировать на перфокартах. Здесь не так просто отформатировать его правильно, перед каждой командой должно быть 6 пробелов, и я мог найти только ссылку на Sleep-функцию для Fortran 77, но она должна была существовать уже в Fortran IV и 66.

PS: мы могли бы удалить один байт, используя метку 1 вместо метки 42.

PPS: Если рассматриваемый компьютер использует перфокарты для ввода программы, вам не повезло, и байты больше не имеют значения: D.


@proudhaskeller Нет, левые 7 столбцов зарезервированы, поэтому вы сохраняете только один байт в конце строки 4.
frodoskywalker

1
Точно, я бы сохранил только один байт, поэтому я не изменил его;)
Bersaelor

3
Ах, обязательный пробел вызывает ностальгическую слезу в моих глазах: D
Ив Клетт

Вы могли бы сбрить байты, заменяя 60*107с 80**2, тоже.
Марк

Хорошо, но тогда можно также использовать 6420.
Bersaelor


10

Альтаир Базовый

Несомненно, Десмонд и Келвин имели бы Altair 8800 (или эмулятор) просто для удовольствия. Altair Basic (от какого-то парня по имени Билл Гейтс, из небольшого стартапа с двумя людьми под названием Micro-Soft) пискет в 1975 году.

Десмонду нужно будет немного подстроиться, чтобы внутренний 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

В качестве альтернативы, Десмонд мог установить плату 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

4
Хм, Десмонд, Альтаир ... Есть ли какой-нибудь язык под названием "Эцио" случайно?
Кролтан

10

Ассемблер PDP-11 для Unix System 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: wops, это, вероятно, работало, когда я тестировал его, потому что я использовал 1 или 2 как время сна, чтобы быстро попробовать, если это сработало. Правильно br, благодаря этому и некоторым другим трюкам (в основном, сокращая пробелы и используя восьмеричные по возможности) мы получили 74 символа, даже добавив первый mov.
Маттео Италия

8

LOGO, 61 байт (возможно) или 48 байт (возможно, нет)

К сожалению, мне не удалось найти онлайн-копию « Системы LOGO: предварительное руководство» (1967) BBN или каких-либо ссылок группы логотипов MIT (1960-е годы +). Логотип Apple от LCSI является слишком новым (~ 1980). Однако, основываясь на онлайн-книгах, в то время, вероятно, работали некоторые варианты следующего. Обратите внимание, что WAIT 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 была нормой для Лисп (а затем и Схемы); только недавно это стало рассматриваться как экзотика.
Ричи

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 был представлен с Commodore PET в октябре 1977 года. Команды обычно показывались в верхнем регистре и в графических символах CBM, но я перечислил их здесь в нижнем регистре + верхнем регистре для простоты (и моего, и вашего! :-) ). Также обратите внимание, что ^ на самом деле будет отображаться как ↑. Detokenized, после перечисления этого с LISTэтим приведет к:

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

PET 6502 работал на частоте 1 МГц, поэтому для его завершения потребуется около 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

Далее 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 Вот почему я опубликовал один с таймером, а другой без :)
Теун Пронк

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он действовал в SAS 1977 года.

Улучшения:

  • data _null_;-> data;сохраняет 7 символов (и теперь создает пустой набор данных, а также печатает на стандартный вывод).
  • Замененный цикл do-while на goto - сохраняет 6 символов

3

Shell Томпсона, 1971 (1973 для команды сна)

43 байта

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

Поскольку оболочка Bourne, хотя и существовала в 1977 году, отсутствовала в выпущенной версии Unix до v7 в 1979. Первоначальная оболочка Unix не имела каких-либо причудливых команд управления циклом. (Если вы хотите завершить цикл, вы можете использовать ifкоманду, чтобы пропустить переход.)


Было бы это exec $0для небольшой экономии goto?
Нил

2

C, 50 байтов

Короче, чем другое решение C, и, следовательно, не дубликат. Я на самом деле написал это прежде, чем заметил (почти) идентичный комментарий Digital Trauma о другом C-решении.

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

Я бы сказал, что это тривиальная модификация / усовершенствование другого решения и, следовательно, обман. Видел ли ты комментарий перед тем, как писать это не имеет значения.
Mego

1

КОБОЛ, 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

АЛГОЛ 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

@DrGreenEggsandIronMan Ха!
кот

@DrGreenEggsandIronMan Где строка, где systemвсе в порядке, а не в порядке? С тобой все в порядке, system("ping ...")но задача говорит, что я не могу использовать systemиз C, например, команды bash. Алгол занимается печатью, но у меня нет другого пути, кроме как ping(8)или sleep(1)спать.
кот

Ну, когда я написал задачу, я погуглил и увидел, что bash вышел в 89 году, поэтому я подумал: «Использование bash - это обман!». Я предполагаю, что большая проблема заключается в том, system("sleep")будет ли работать с ОС с того времени. Я буду редактировать пост.
DJMcMayhem

1
Я не думаю, что был пинг для NCP. Интернет не переходил на TCP / IP до начала 80-х, и первое упоминание ICMP Echo Request, по-видимому, содержится в RFC777, датированном апрелем 1981 года.
ninjalj
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.