Пишіть короткий код асемблера для сітки процесорів, які передають значення сусідам, перетворюючи вхідний потік на цільовий без заклинювання.
Як грати
Ви програмуєте сітку надзвичайно малих комп’ютерів. Кожен вузол виконує власний короткий список інструкцій і може спілкуватися лише з безпосередніми сусідами, передаючи значення через порти. Тому число, яке має перетнути сітку, потрібно передавати вручну, вузол за вузлом.
Кожен вузол має акумулятор і набір інструкцій: перемістити значення, додати, відняти, стрибнути.
Вузел може читати або записувати дані у сусіда зверху, знизу, зліва або справа, а також у вхідний і вихідний потоки.
Порти блокуються. Вузел, що записує дані праворуч, просто чекає, поки вузел праворуч від нього не прочитає дані зі свого лівого порту.
Це означає, що два вузли мають узгоджуватися не лише за значенням, а й за часом.
Якщо за повний цикл ніхто не робить жодного кроку, а хтось досі чекає, сітка заклинюється.
Головоломка розв’язана, коли вихідний потік збігається з цільовим, який вимагає рівень.
Керування
Комп’ютер: вводьте код у текстові поля кожного вузла, оберіть рівень зі списку, а потім натисніть «Запустити».
Телефон і планшет: гра працює, але для написання коду настоятельно рекомендується зовнішня клавіатура.
Режими гри
Щоденний: одна спільна головоломка, що генерується на основі сьогоднішньої дати.
Тренування: переходьте до нових випадкових вхідних даних кнопкою «Нове».
Поради та стратегія
Спочатку проєктуйте маршрут, потім арифметику. Більшість помилок — це значення, які не можуть дістатися куди потрібно, а не неправильні суми.
Два вузли, що чекають одне на одного, — це класичне заклинювання. Якщо обидва пишуть одне в одного, перш ніж хтось прочитає, жоден не зрушить з місця.
Тримайте потік даних в одному напрямку, де це можливо. Сітку з послідовним напрямком значно легше аналізувати, ніж ту, де значення перетинаються.
Використовуйте вузол як чистий ретранслятор, коли це потрібно. Просто передавати значення далі — це легітимна і часто необхідна робота.
Дивіться на заблокований вузел, а не на неправильну відповідь. Коли вихід зупиняється, найінформативнішим є те, який вузел чекає і на кого саме.
Чому ви навчитеся
Node Network — це головоломка про паралельне програмування, передачу повідомлень та уникнення заклинювання в мережі процесорів.
Навички: паралельне та конкурентне програмування, передача повідомлень, уникнення заклинювання.
Для кого: приблизно 9–12 класи (вік 14+).
Для батьків і вчителів: конкурентність і заклинювання в дії.
Витоки
Сітка дуже маленьких комп’ютерів, кожен із яких виконує власний короткий список інструкцій і може спілкуватися лише з безпосередніми сусідами, — це TIS-100 (Zachtronics, липень 2015 року), що розгортала свої головоломки на вигаданій зіпсованій машині 1970-х років.
Обмеження, якого навчають, реальне й центральне для паралельних обчислень: без спільної пам’яті значення, яке має перетнути сітку, доводиться передавати вручну, вузол за вузлом, через обмін повідомленнями.
А ручна передача — саме те, як ви зустрічаєте взаємне блокування: два вузли чекають один на одного, і обидва зупинилися назавжди. Цю помилку насправді неможливо пояснити на дошці, бо вся складність у тому, що кожен вузол окремо поводиться правильно.
Про Node Network
Node Network — це головоломка про паралельне програмування, передачу повідомлень та уникнення заклинювання в мережі процесорів. Це оригінальна безкоштовна браузерна гра, розроблена власними силами для PlayPendium.