«Вампус» и ChatGPT 5.2

Прочитал тут новость, что недавно была обнаружена лента с кодом операционной системы UNIXv4. Этот код считался утерянным, но в декабре его смогли восстановить с ленты и я, конечно же, сразу пошёл смотреть что из себя представлял Юникс в 1973 году.

Ничего особо интересного, кстати, команд — кот наплакал. Некоторые вполне узнаваемы (cat, например, или pwd), некоторые выглядят непривычно (chdir вместо cd), а некоторых нет вовсе (sed, awk).

Зато есть несколько игр, одна из которых — моя старая знакомая, игра «Hunt the Wumpus». Моё знакомство с ней началось с поисков игры «Убей вампира» под «Радио-86РК», первый компьютер, на котором я начал программировать. Я про это много писал.

Игра текстовая и очень простая для программирования, я её несколько раз реализовывал, например, для наручных часов «The Sensor Watch», но это не значит, что я умею в неё играть! Я как-то ни разу не сел и не разобрался какой стратегии надо придерживаться, чтобы выиграть.

В этот раз я тоже не стал заморачиваться, а вместо этого решил посмотреть — выстроит ли стратегию какая-нибудь современная нейросеть. Взял «ЧатГПТ 5.2» в рассуждающем режиме, зря я что ли за неё плачу́?

Первые три игры нейросеть проигрывала, выясняя правила (они отличаются от реализации к реализации), а после, получив все подробности, начала выигрывать. Я сыграл с её подсказками пять партий, все пять она выиграла.

Сетка утверждает, что единственная возможность проиграть — на первом ходу, там слишком мало информации, а дальше, если играть аккуратно, проиграть уже невозможно.

Скриншот чата: игрок в Wumpus анализирует комнату 20, ИИ советует проверить ветку 13. Показаны команды m 2 и m 13.

3 комментария

99 бутылок: Basic в UNIXv4

А раз я узнал как запустить UNIXv4, грех не воспользоваться возможностью посмотреть что там за языки программирования есть на борту. Ассемблер и Си меня не заинтересовали, но оказалось, что в комплект входит довольно интересный «Бейсик», маленький, но мощный.

На нём я и решил написать «Песню о пиве».

86. Basic в UNIXv4 работает в двух режимах — интерактивном, в нём операторы вводятся без номера и выполняются сразу же, и программном, где номер строки указывается, а оператор запоминается для последующего выполнения. Этими двумя режимами можно пользоваться вперемешку.

Редактора нет, набивать программу нужно сразу в буфер интерпретатора, либо создавать при помощи стороннего редактора. Важно не ошибиться, так как редактировать программу можно только полной заменой строки, указав новому варианту тот же номер.

Почти во всём это довольно стандартный «Бейсик», но тут есть две особенности.

Во-первых, строки программы можно вызывать, как подпрограммы, прямо по номеру. Причём параметры передаются не через глобальные переменные, как обычно, а получаются при помощи функции arg(…). То есть 2000(i) — это вызов подпрограммы, которая начинается с номера 2000 и заканчивается, когда встретит первый попавшийся return, причём return может вернуть значение, если это требуется.

Во-вторых, логические выражения порождают нули и единицы, их можно использовать в арифметических выражениях и передавать, например, в goto. Так умеет далеко не каждый «Бейсик». А благодаря тому, что операторы вычисляются слева направо, можно писать вот такое: 1 < 3 < 2. Будет ноль.

У меня в коде есть пугающая конструкция goto 2110 + 10 * ((arg(1) > 0) + (arg(1) > 1)). Выглядит страшно, признаюсь, я её специально запутал, так, мне кажется, лучше передаётся дух эпохи, судя по старым программам, так вполне могли тогда написать.

На самом деле тут всё просто: выражение в скобках для нуля даёт ноль, для единицы — единицу, а для значения больше единицы — двойку. Это нужно для условного перехода на разные части подпрограммы, так как строкового типа нет и единственный способ вывести нужную строку — передать её в print как есть.

Кроме числового типа (числа с плавающей точкой тоже поддерживаются), есть массивы, причём даже двумерные с индексами от нуля до 32768.

10 for i=0 98
20 2000(99-i)
30 2100(98-i)
40 print
50 next
60 print "No more bottles of beer on the wall, no more bottles of beer."
70 print "Go to the store and buy some more, 99 bottles of beer on the wall."
80 done

2000 if arg(1) == 1 goto 2030
2010 print arg(1) " bottles of beer on the wall, " arg(1) " bottles of beer."
2020 return
2030 print "1 bottle of beer on the wall, 1 bottle of beer."
2040 return

2100 goto 2110 + 10 * ((arg(1) > 0) + (arg(1) > 1))
2110 print "Take one down and pass it around, no bottles of beer on the wall."
2115 return
2120 print "Take one down and pass it around, 1 bottle of beer on the wall."
2125 return

2130 print "Take one down and pass it around, " arg(1) " bottles of beer on the wall."
2135 return

run

Программу, которая у меня получилась и её вывод я заскриншотил для истории. Интересно, конечно, когда в последний раз на этом «Бейсике» кто-то что-то писал, кроме меня.

Скриншот терминала с программой на BASIC, реализующей песню «99 бутылок пива на стене», и её выводом: цикл от 99 до 0 с фразами «Take one down and pass it around».

2 комментария