Автоматизація збереження світу


63

Ви Десмонд Юм. Останні 3 роки ви з вашим партнером Кельвіном були рабом комп'ютера, який вимагає введення в нього дуже специфічної послідовності кожні 108 хвилин, щоб врятувати світ.

4 8 15 16 23 42

Ваш партнер загинув 40 днів тому (через нещасну аварію, пов’язану з головою Кельвіна та великою скелею), і вам немає з ким поговорити. Ніхто не вводить цифри для вас. Ніхто не порушує монотонності. Спочатку це було не дуже погано, але ти вже не можеш впоратися з тишею. І якщо вам доведеться ще раз прослухати "Make Your Own Kind Of Music", ви будете кричати.

Ви вирішили, що вам потрібно вийти. В текти. Ви вирішили, що побудуєте пліт і відплинете на острів. Але тоді ти усвідомлюєш погану новину: ти тут застряг. Вам потрібно продовжувати рятувати світ.

Але тоді ти усвідомлюєш добру новину: ти програміст! Ви можете автоматизувати збереження світу! В захваті ви підходите до комп'ютера, і, використовуючи свої надійні навички пітона, ви збиваєте швидкий сценарій, щоб ввести для вас цифри.

import time

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

Швидкий, простий, надійний, короткий і легкий. Все, що має бути хорошим сценарієм пітона. Але потім, намагаючись випробувати його, ви отримуєте помилку.

Bad command or file name.

Так, дивно. Ну добре, спробуємо с ++.

#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) Повторіть назавжди. (Або поки ви не зрозумієте, що це все є досконалою аферою, і що ви застрягли в дивному кінцівці через ліниве письмове запитання і не ставите запитання, на які не маєте відповідей. Дякую Дж. Дж. Абрамс!)

Однак є улов: Ви ОБОВ'ЯЗКОВИ використовувати мову, якою комп'ютер на лебідній станції насправді міг би працювати. Якщо припустити, що

A) Комп'ютер був оновлений на момент побудови,

B) Не було оновлених програмного забезпечення для комп’ютерів, і

C) Інтернету немає (тобто ви не можете завантажити Golfscript ...),

і ми робимо найкращі здогадки про дату будівництва вокзалу Лебедя, (знову ж таки, The Lost Wiki. )

Це означає, що ви повинні використовувати мову, яка була вперше випущена 31 грудня 1977 року або раніше.


Кілька роз'яснень правила:

  • Включити бібліотеки нормально, але застосовується те саме правило (бібліотеки повинні бути до 1977 року).

  • Не потрібно турбуватися про сумісність ОС.

  • Якщо ви використовуєте systemабо ваші мовні еквіваленти, ви повинні довести, що будь-які системні команди, якими ви користуєтесь, були б доступні до 1978 року. Стаття у Вікіпедії, мабуть, найкращий спосіб довести це.

  • Немає значення, коли ви запускаєте програму, доки вона опиняється в шаблоні чергування друку та режиму сну. (друк-сон-друк-сон ... і сон-друк-сон-друк ... є прийнятними.)

Це Code-Golf, тому найкоротша відповідь у байтах виграє.


Чи потрібен новий рядок в кінці кожного виводу?
Mego

3
@Mego Так, інакше цифри фактично не будуть введені .
DJMcMayhem

Відповіді:


11

APL , 28 24 25 24 байт

Це працювало в APL * PLUS STSC і в SharpAPL IPSA в 1977 році, і хоча сучасні APL мають низку нових функцій, це, як і раніше, працює на всіх основних APL-програмах сьогодні:

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

Перший рядок друкує сукупну суму показаних чисел, які є необхідними числами. Другий рядок d e l займає 6360 секунд (106 хвилин), потім приймає знак цього (очевидно, що 1) і переходить до цього рядка (тобто попереднього, що друкує номер).

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

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

Сон двутавр ( « IBM » - отримати його) виконує очікування часу в тиках в 1 / 300 - й секунді, тому ми будемо чекати 19 × 10 5 тиків = 105 хвилин і 33 1 / +3 секунди.


Я відтепер весь час вимірюю кілограми та мегадріфи.
Павло

+\⎕A⍳'EEHBHT'(якщо ⎕IO=0)
ngn

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

@ Adám +\4 4 7 1 7 19тоді?
ngn

@ Adám ping ^
ngn

26

МОМПА - 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 (Текстовий [раніше стрічка] редактор і коректор) - це текстовий редактор, що починається з 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

Оболонка Борна, 47 45 байт

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

2
Бий мене до цього. Я намагався знайти докази, які sleepфактично були наявні ще тоді - ти це знайшов? en.wikipedia.org/wiki/…
Digital Trauma

Ви можете використовувати sleepяк whileумову. Зберігає 2 байти
ThinkChaos

@plg Це буде спати, перш ніж виводити числову послідовність, яка, здається, не є дозволеною (вона повинна надрукувати послідовність відразу після запуску програми, а потім спати).
Дверна ручка

5
Отже, ви запускаєте програму відразу після того, як ви вручну вводили цифри. ;)
Роджер

1
Версія 6 Unix включала команду сну (див. 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 пробілів, і я міг знайти лише посилання на функцію сну для Fortran 77, але вона мала існувати вже у Fortran IV і 66.

PS: Ми можемо зірвати один байт, використовуючи мітку 1 замість мітки 42.

PPS: Якщо комп'ютер, про який йде мова, використовує перфокарти для введення програми, вам все не пощастило, і байти вже не мають значення: D.


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

1
Точно я б
захистив

3
Ах, обов'язковий пробіл поміщає ностальгічну сльозу мені в очі: D
Ів Клетт

Ви можете поголити байт, замінивши 60*107на 80**2.
Марк

Гаразд, але тоді можна також просто використовувати 6420.
Bersaelor


10

Altair Basic

Напевно, Десмонд та Кельвін мали б 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функцію, тому код буде спрощений до чогось такого:

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
Хм, Десмонд, Альтаїр ... Чи існує мова, яка називається "Еціо"?
Кролтан

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 байти).
Маттео Італія

1
Ви б зберегли лист та вказівне слово, використовуючи brзамість jmp, чи не так? Крім того, для запису потрібен дескриптор файлу в r0 - у вас, мабуть, є 1 (або 2) для першого циклу, але ви перебиваєте його під час сну.
Випадково832

@ Random832: wops, це, ймовірно, спрацювало, коли я тестував його, тому що я використав 1 або 2 як час сну, щоб швидко спробувати, чи працює. Звертаємо увагу br, завдяки цьому та деяким іншим хитрощам (головним чином, розрізання на пробіл та використання вісімки, коли це можливо), ми отримали 74 символи, навіть додавши перший mov.
Маттео Італія

8

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

На жаль, мені не вдалося знайти онлайн-копію системи LOGO: Попередній посібник (1967) від BBN, або будь-які посилання групи логотипів MIT (1960-х +). Apple Logo від 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 був нормою для Lisp (і тоді Схема); Лише недавно його стали сприймати як екзотику.
rici

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, але я перерахував їх тут у малій та великій літери для зручності (як моєї, так і вашої! :-) ). Зауважте також, що ^ насправді відображатиметься як ↑. Після детокенізації, після перерахування цього з LISTцим, це призведе до:

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

ПЕТ-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

Маленький розмову, 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 Ось чому я опублікував один із таймером і один без :)
Teun Pronk

3
Хоча ваша лазівка ​​не справляється з викликом, мені цікаво, чи зможе Десмонд уникнути цього. Я впевнений, що комп'ютер нічого не робить, якщо він не знаходиться між вікном 104-108 хвилин, тому він просто ігнорує зайві "4 8 15 16 23 42", які вводяться. Однак я впевнений, що Уолт був би дуже збентежений усіма номерами, які хтось йому надсилає. = D
DJMcMayhem

3

САС, 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 - зберігає 6 символів

3

Оболонка Томпсона, 1971 (1973 для сну)

43 байти

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

Оскільки оболонка Bourne, хоча вона існувала в 1977 році, не була у випущеній версії Unix до v7 в 1979 році. Оригінальна оболонка Unix не мала жодних фантазійних команд управління циклом. (Якщо ви хотіли закінчити цикл, ви можете скористатися ifкомандою, щоб пропустити goto.)


Хіба це мало exec $0б невелику економію goto?
Ніл

2

C, 50 байт

Коротше, ніж інше рішення C, і, отже, не дублікат. Я фактично написав це, перш ніж помітив (майже) однаковий коментар Digital Trauma щодо іншого рішення C.

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

Я б заперечував, що це інше рішення - це банальна модифікація / вдосконалення для іншого рішення, і, таким чином, це дура. Ви бачили коментар чи ні перед тим, як писати це, не має значення.
Мего

1

COBOL, 240 байт

Так, провідний пробіл є важливим. Компілюйте і бігайте так cobc -x save.cob; ./save. (Цей -xпараметр створює виконуваний файл на відміну від спільного lib, і тому я не думаю, що його потрібно рахувати.)

       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 / Вт, 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 Ha!
кіт

@DrGreenEggsandIronMan Де рядок, де systemдобре, а не гаразд? У вас все добре, system("ping ...")але виклик говорить, що я не можу використовувати systemз C, наприклад, команди bash. ALGOL займається друком, але я не маю іншого способу, як ping(8)або sleep(1)спати.
кіт

Що ж, коли я написав виклик, я погуглив і побачив, що баш вийшов у 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.