отказ
Хотя я знаю, что есть этот конкретный связанный вопрос , в моем вопросе используются две гаражные двери, случайный компонент, и я также основываю это на реальных событиях, когда мой сын случайно опустил одну из указанных гаражных дверей, когда я выходил из дома. гараж на прошлой неделе ... Ничего подобного удару по голове, чтобы творческие соки текли! ;)
Фон
Лукас (мой 15-месячный сын) любит играть с гаражным пультом. На этом пульте есть две кнопки: одна для левой двери гаража и одна для правой двери гаража. Обе кнопки работают одинаково; нажмите один раз, чтобы дверь открылась, нажмите еще раз, чтобы остановить, нажмите еще раз, чтобы начать закрытие, нажмите еще раз, чтобы снова остановиться, и так далее.
Лукас любит этот пульт, он случайным образом нажимает одну из кнопок, или обе, или ни одной. Если обе кнопки нажаты, сигнал не отправляется, но нажатие одной кнопки отправит сигнал.
Итак, задача Code-Golf разделена на две части:
Первая часть
Создайте строку длиной 60 символов, представляющую случайное нажатие кнопки Лукаса в течение минуты. «Случайный» в данном случае означает «с равной вероятностью каждого входа на каждом тике». Символы следующие:
- 0: Лукас либо не нажал ни одной кнопки, или нажал обе кнопки. В любом случае, сигнал не был отправлен.
- 1: Лукас нажал кнопку левой двери гаража
- 2: Лукас нажал кнопку для правой двери гаража
Часть вторая
Используя строку, сгенерированную в первой части, смоделируйте открытие и закрытие гаража на две машины, используя числа в качестве триггеров для открытия, остановки и закрытия этих дверей.
Мои гаражные ворота довольно быстрые (см. Отказ от ответственности выше относительно того, почему). После того, как вы нажмете кнопку, для полного открытия или закрытия потребуется четыре секунды.
Итак, если закрыто:
- 0 сек: 0% открыто (закрыто); при нажатии кнопки дверь открывается
- 1 сек: 25% открытия
- 2 сек: 50% открытия
- 3 сек: 75% открытия
- 4 сек.: 100% открытие, остановка двери
И поэтому, если открыто:
- 0 сек: 100% открытия; при нажатии кнопки дверь закрывается
- 1 сек: 75% открытия
- 2 сек: 50% открытия
- 3 сек: 25% открытия
- 4 сек: 0% открыто (закрыто), дверь останавливается
Если конкретная дверь находится в движении, сигнал к той же двери остановит ее. Следующий сигнал, посланный той же двери после этого, отправит ее в противоположном направлении. Если дверь остановлена, когда она ранее находилась в движении и теперь полностью открыта или полностью закрыта, когда получен сигнал «останов», дверь будет зарегистрирована как «остановленная» в полностью открытом или полностью закрытом состоянии, готовая к двигаться в противоположном направлении, когда он получает новый сигнал.
При этом моделировании обе двери гаража будут изначально в закрытом положении. Итак, давайте посмотрим на 10-секундный список команд и посмотрим, что произойдет, если Лукас выполнит их на пульте:
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Выход
Первая часть вывода требует отображения строки длиной 60 символов, состоящей из случайных символов «0», «1» и «2», сгенерированных из первой части. например.
212022112021202211202120221120212022112021202211202120221120
Под этой строкой находится обработка этих «сигналов» в соответствии с правилами, упомянутыми выше, о том, как гаражные ворота будут вести себя с каждым соответствующим персонажем (в зависимости от секунды). В результате вы должны получить 60 строк в результате ниже начальной отображаемой строки.
Каждая из этих обработанных строк будет иметь вид:
N: (L:X% XXXXXXX, R:Y% YYYYYYY)
где:
- N - это n-й символ из соответствующей случайной строки, которая будет иметь форму 0, 1 или 2.
- X% - это процент открытости левой двери (там нет заполнения нулями)
- XXXXXXX - это статус левой двери. Если дверь не находится в движении (то есть не открывается или не закрывается), применяется статус «остановлено», то есть она была остановлена в движении (возможно только при 25%, 50% или 75%) или остановлена, когда полностью открыта (100% ) или полностью закрыт (0%). В противном случае дверь будет либо «открываться», либо «закрываться».
- Y% - это процент открытости правой двери (там нет заполнения нулями)
- YYYYYYY - это статус правой двери. Если дверь не находится в движении (то есть не открывается или не закрывается), применяется статус «остановлено», то есть она была остановлена в движении (возможно только при 25%, 50% или 75%) или остановлена, когда полностью открыта (100% ) или полностью закрыт (0%). В противном случае дверь будет либо «открываться», либо «закрываться».
Пример показан ниже с использованием 10 «сигналов» и 10 обработанных строк
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Это код-гольф, поэтому самый короткий код станет явным победителем. Я сделал это немного проще, используя такие фразы, как «открытие», «остановка» и «закрытие», которые состоят из семи букв ... так что вы можете включить это в свою стратегию.
Удачи!
1
в вашем примере последняя команда не останавливает левую дверь на 75%?Ответы:
Pyth,
156149145 байтовПрямой перевод моего ответа на Python .
Попробуйте онлайн!
Объяснение:
источник
Javascript (ES6),
277275263253250247234 байтаРазоблаченный и прокомментированный
демонстрация
источник
112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ]
(новые строки после запятой и скобок)v^=(c-i-1?0:v&8||24)
чтобы сэкономить два байта.Python 2,
377370361357345335326316312306304 байтаВторой уровень отступа вкладка сырца (
\t
), который играет очень плохо с Markdown, поэтому он был заменен на два пространства.Я почти уверен, что это может быть дальше.
Ungolfed, с комментариями:
Сохранено
41415 байт благодаря @TheBikingViking!Сохранено 6 байт благодаря @ValueInk!
источник
range(60)
на[0]*60
.'p'[1::3]
(заменить апострофы с помощью обратных кавычек) вместо''.join(map(str,p))
.(4,0)[q<0]==c[i]and q
->((4,0)[q<0]==c[i])*q
n
эту строку.n
используется в последней строке , чтобы извлечьclosing
,stopped
,opening
из этой строки.Рубин,
263261260254 байтаКак ответ JavaScript стал таким коротким ??? Он обогнал меня, пока меня не было, и до сих пор побеждает ...
источник
C
420433424374 байтаНе запускает генератор случайных чисел, но использует случайные для лучшего распределения. Должен быть лучший способ сыграть в эту логику ...
Старая версия 1:
Старая версия 2:
источник
PHP,
254247246245235230226 байтснова победил ES!
поиграл в гольф с этих 311 (первая полная версия, уже была некоторая игра в гольф):
сломать
источник
Java 8 лямбда, 500 символов
Я сделал все возможное, вот что я придумал:
Развёрнутый в полный класс:
Довольно прямо вперед. Переменные stepLeft / stepRight обведены кружком от 0 до 3. Выполнение нескольких простых математических операций changeLeft / changeRight содержит соответствующие относительные изменения для каждого шага, которые будут добавлены в leftDoor / rightDoor. Многие заявления о том, чтобы поймать, когда дверь должна остановиться самостоятельно.
Не стесняйтесь помочь мне сократить это, я думаю, есть много дел.
источник
Haskell (lambdabot) - 409 байт
источник
imports
, например, дляrandoms
вашего кода (и количество байтов). Если есть переводчик, который импортирует по умолчанию, обратитесь к нему в названии языка.