Побудуйте цифровий годинник у грі життя Conway


478

Ваше завдання - створити імітацію гри життя, що представляє цифровий годинник, який задовольняє таким властивостям:

  1. Годинник відображає годинник і хвилини в десяткової системі (наприклад 12:00, 3:59, 7:24) з іншою державою для кожного з 1,440 хвилин в день - або годинник йтимуть від 0 до 23 або від 1 до 12 з індикатором PM.

  2. Шаблон є періодичним, і стан обертається навколо без будь-якої зовнішньої взаємодії.

  3. Оновлення хвилин проходить через рівні проміжки часу - від однієї зміни хвилини до наступної займає стільки ж поколінь.

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

    • Цифри видимі і добре помітні. Ви повинні мати можливість з упевненістю розповісти, який час відображається.

    • Цифри оновлюються на місці. Кожне нове число з’являється в тому самому місці, що і попереднє число, і обмежувальних полів цифр майже немає. (Зокрема, цифра не містить 10 різних цифр у різних місцях, які відкриваються щоразу, коли цифри змінюються.)

    • Цифри з’являються поруч, без зайвого проміжку між ними.


Ваша програма оцінюватиметься за такими параметрами (з нижчими критеріями, які виконують роль краватки для вищих критеріїв):

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

  • Найшвидше виконання - найменше поколінь, що просунулися на одну хвилину.

  • Початкове число живих клітин - менший рахунок виграє.

  • Перший до повідомлення - виграє попередня публікація.


5
@tuskiomi Ні, дисплей повинен бути десятковим.
Джо Z.

2
Я впевнений, що це B3 / S23, але ви могли б підтвердити чи спростувати?
Conor O'Brien

2
"Вони також повинні оновитись на місці - кожне нове число повинно з’являтися там же, що і попереднє число." Як ви визначаєте "там же", оскільки цифри не обов'язково будуть прямокутними.
Мартін Ендер

4
наскільки помітними повинні бути наші десяткові цифри? це "якщо ти знаєш, що це таке, і ти косиш, то ти можеш сказати різницю між 0 і 8", або це потрібно, щоб пройти тест "анонімний спостерігач може сказати, що це таке, не вимагаючи"?
Спарр

3
це було також розміщено в блозі Хакадей: hackaday.com/2017/03/11/a-
clock-create-with-conways-

Відповіді:


1012

11,520 поколінь на кількість годин / 10,016 х 6,796 ящик / 244,596 кількість поп

Ось ви йдете ... Було весело.

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

Але, ей, це красиво. Подивіться:

введіть тут опис зображення

Запусти!

Отримайте дизайн із цієї суті . Скопіюйте весь текст файлу в буфер обміну.

Нове : ось версія з AM та PM індикаторами для вимогливих.

Перейдіть до онлайн-тренажера JavaScript Conway . Клацніть імпорт , вставте текст дизайну. Ви повинні побачити дизайн. Потім перейдіть до налаштувань і встановіть крок генерації на 512, або щось навколо цих ліній, або вам доведеться чекати назавжди, щоб побачити оновлення дисплея годин.

Клацніть біжи , зачекай трохи і здивуйся!

Пряме посилання на версію браузера.

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

Як це працює

Тут використовується технологія p30. Просто основні речі, планери та легкі космічні кораблі. В основному дизайн іде зверху вниз:

  • На самому верху - годинник. Це годинник 11520 періоду. Зауважте, що для забезпечення належного оновлення дисплея вам потрібно близько 10 000 поколінь, але дизайн все одно повинен бути стабільним з годинником меншого періоду (приблизно 5 000 або близько того - годинник повинен бути кратним 60).
  • Потім відбувається етап розподілу годинника. Планер годинника скопійований у врівноважене дерево, тож наприкінці 32 планери прилітають в той самий момент на счетчик.
  • Етап лічильника проводиться за допомогою засувки RS для кожного стану та для кожної цифри (ми рахуємо у десятковій кількості). Так існує 10 станів для правої цифри хвилин, 6 станів для лівої цифри мінут і 12 станів для годин (обидві цифри годин об’єднані тут). Для кожної з цих груп лічильник веде себе як регістр зсуву.
  • Після етапу підрахунку з'являються таблиці пошуку. Вони перетворюють імпульси стану для відображення сегментів дій ON / OFF.
  • Потім, сам дисплей. Сегменти просто зроблені з декількох рядків LWSS. У кожному сегменті є своя засувка для підтримки свого стану. Я міг би зробити простий логічний АБО з цифр станів, щоб знати, що сегмент повинен бути УВІМКНЕНО або ВИМКНЕНО, і позбутися цих засувок, але при зміні цифр не буде змін для сегментів, що не змінюються (через затримка сигналу). І там будуть довгі потоки планера, що надходять від таблиці пошуку до розрядних сегментів. Таким чином, це було б не так красиво. І це треба було. Так.

У будь-якому випадку, в цій конструкції насправді немає нічого надзвичайного. Немає дивовижних реакцій, які були виявлені в цьому процесі, і немає дійсно розумних комбінацій, про які раніше ніхто не думав. Просто шматочки, взяті тут і там, і зібрані (і я навіть не впевнений, що зробив це "правильним" способом - я був фактично абсолютно новим у цьому). Однак це вимагало багато терпіння. Зробити всі ті планери, які підійшли в потрібний час у правильному положенні, було чуханням голови.

Можливі оптимізації:

  • Замість того, щоб копіювати та поширювати один і той же кореневий годинник на n клітинок лічильника, я міг би просто поставити один і той же блок годин n разів (один раз для кожної лічильникової комірки). Це насправді було б набагато простіше. Але тоді я не зміг би налаштувати це так легко, змінивши годинник в одній точці ... І в мене є електроніка, і в реальній схемі це було б жахливо неправильно.
  • У кожному сегменті є своя засувка RS. Для цього потрібні таблиці пошуку для виведення як R, так і S імпульсів. Якби у нас був фіксатор, який би просто перемикав його стан із загального вхідного імпульсу, ми могли б зробити таблиці пошуку наполовину більшими. Для крапки в ПМ є така засувка, але вона величезна, і я не можу придумати щось більш практичне.
  • Зменшіть дисплей менше. Але це було б не так приємно. І це треба було. Так.

26
Гарний. Гарна відповідь.
Павло

33
@ Poke, давай, ти міг би спробувати додати це самостійно ... У будь-якому випадку, я відредагував публікацію з версією з AM + PM, для вашого задоволення.
дим

48
Щойно ви знаєте, ця відповідь була представлена в Microsiervos , одному з найважливіших блогів про технології на іспанській мові, з понад 800 000 підписників у Twitter
Луїс Мендо

26
@Rory Ти береш голову, б'єш її по стіні в десятки разів сильніше. Ви готові почати.
дим

34
Таким чином, процес проектування такий: "Гаразд, мені потрібно зіткнутися з цим, і мій планер в цей час приходить звідси в цю позицію. Подивимося, привеземо його туди за допомогою двох відбивачів. По-трішному, це потрібно для зіткнення - це лише два кроки покоління занадто рано, там. Якщо я трохи переміщу світловідбивачі, давайте подивимось ... Лайно, занадто пізно. Добре, давайте зіткнемось з ними десь інше. Тьоре, у мене немає місця, щоб змусити туди планер. Добре, давайте додамо ще два непотрібні відбивачі лише для того, щоб вони замість цього прибули. Лайно, відбивачі стикаються з цим іншим потоком планера ... Лайно, давайте спати ".
дим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.