Пузырьковые обертывания - это развлечения на высшем уровне. Каждый может согласиться с этим.
Теперь вы будете делать так, чтобы даже компьютеры наслаждались пузырями.
Спекуляции
Вам дадут два целых числа, w и h (каждое из них по ширине и высоте)
Ваша программа должна вывести все w * h фазы, ожидая 1 секунду между каждым и завершиться.
Каждая пузырчатая пленка начинается со всех заполненных ячеек.
Например, 4 * 6 пузырчатая пленка начинается как:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
И каждая фаза, случайная не вытолкнутая ячейка выталкивается. Например,
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
Программа должна завершиться, когда все ячейки вытолкнуты. ака.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Примеры
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
и0
вместоO
иX
?(1,1)
чтобы у a не было пузырьков (например, верхняя левая "ячейка" всегда подчеркивание)?Ответы:
C (Windows),
260248 байтисточник
system("cls")
это также зависит от Windows, поэтому код не будет более переносимым с библиотекой потоков. А с C ++ мне бы тоже нужно было включитьiostream
илиcstdio
.Python 3 ,
222220 байтЭто мой первый ответ, поэтому, пожалуйста, будьте осторожны (и укажите на ошибки, которые я сделал).
Попробуйте онлайн!
Как это работает:
r*c+r%2*c%2
время:r*c
в шаблоне есть пузырьки, если только r и c нечетны, и в этом случае они естьr*c+1
.источник
f(c,r)
и все будет в порядке).MATL , 37 байт
Верхний левый угол всегда является подчеркиванием (разрешено вызовом).
Экран очищается между фазами. Я мог бы сохранить байт, не очистив экран, но в этом случае он выглядит лучше.
Программа завершает работу с ошибкой ( разрешенной по умолчанию ) после отображения всех фаз.
Попробуйте это в MATL Online! (Если через пару секунд это не сработает, обновите страницу и попробуйте снова).
источник
Mathematica (145 байт)
Анонимная функция, имеет высоту и ширину в качестве входных данных (в таком порядке - если это проблема, замените
{##}
с{#2,#}
в середине коды для дополнительного 2 байта).Код:
Объяснение:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
создает начальную незапертую пузырчатую пленку, создавая массив "_" и "O", а затем StringJoining их между символами новой строки.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
многократно выбирает одну из «O» для замены на «X» столько раз, сколько существует «O» (это Floor [width * height / 2] - спасибо @JonathanAllan за идею поставить «_» "вместо" O "в верхнем левом углу, иначе это будетCeiling
вместо этого и, следовательно, на 2 байта больше).Monitor[Do[Pause@1,{i,...}],i]
заставляетi
принимать значения в списке, который мы только что рассчитали, по 1 секунде каждое и печатает динамическиi
.Пример вывода:
источник
Желе ,
3029 байтВызывает ссылку как диаду с аргументами программы, а затем завершает работу с сообщением (код для которого есть
çṛ“\'=ṙMḋḌẓ(ėo»
)Нюанс: нижний правый «ячейка» всегда будет пузырь (а не в верхнем левом углу, как , например , в вопросе), это должно гарантировать , что , когда все пузырьки извлекаются случайные возвращается выбор 0 , который будет
"X"
на конец списка - его замена не приводит к изменению значения и прерывает цикл.Примечание: не очищает экран (не было указано, и я не уверен, как это сделать).
Как?
источник
Scala , 764 байта
Как это работает
Алгоритм сначала заполняет 2D-последовательность ложными значениями. Он определяет, сколько итераций (открытых блоков) существует на основе введенных аргументов командной строки. Он создает сгиб с этим значением в качестве верхней границы. Целочисленное значение сгиба неявно используется только как способ подсчета количества итераций, которые должен выполнить алгоритм. Заполненная последовательность, которую мы создали ранее, является начальной последовательностью для сгиба. Это используется при генерации новой двумерной последовательности ложных значений с соответствующими им единицами.
Например,
Будет превращен в
Обратите внимание, что все списки, которые являются полностью истинными (имеют длину 0), исключаются из списка результатов. Затем алгоритм берет этот список и выбирает случайный список во внешнем списке. Случайный список выбирается как случайная строка, которую мы выбираем. Из этой случайной строки мы снова находим случайное число, индекс столбца. Как только мы находим эти два случайных индекса, мы спим в потоке, в котором мы находимся, в течение 1000 миллисекунд.
После того, как мы закончили спать, мы очищаем экран и создаем новую доску со
true
значением, обновленным в случайных индексах, которые мы создали.Чтобы правильно распечатать это, мы используем
map
и заархивируем его индексом карты, чтобы мы имели это в нашем контексте. Мы используем значение истинности последовательности относительно того, должны ли мы печататьX
или илиO
или или_
. Чтобы выбрать последнее, мы используем значение индекса в качестве руководства.Интересные вещи на заметку
Чтобы выяснить, следует ли печатать
O
или_
, используется условное выражение((r._2 % 2) + c._2) % 2 == 0
.r._2
ссылается на текущий индекс строки, аc._2
ссылается на текущий столбец. Если один находится в нечетной строке,r._2 % 2
будет 1, поэтому смещениеc._2
на 1 в условном выражении. Это гарантирует, что в нечетных строках столбцы перемещаются на 1, как и предполагалось.Распечатка строки в
"\033[H\033[2J\n"
соответствии с прочитанным мною ответом Stackoverflow очищает экран. Он пишет байты в терминал и делает что-то напуганное, чего я не очень понимаю. Но я нашел, что это самый простой способ сделать это. Однако он не работает на консольном эмуляторе Intellij IDEA. Вам придется запустить его с помощью обычного терминала.Другое уравнение можно было бы найти странно видеть , когда первый глядя на этот код
(l * k) / 2 - (l * k + 1) % 2
. Во-первых, давайте демистифицируем имена переменных.l
ссылается на первые аргументы, переданные в программу, аk
ссылается на второй. Для того, чтобы перевести его,(first * second) / 2 - (first * second + 1) % 2
. Цель этого уравнения - найти точное количество итераций, необходимое для получения последовательности всех X. В первый раз, когда я сделал это, я просто сделал(first * second) / 2
так, чтобы это имело смысл. Для каждогоn
элемента в каждом подсписке естьn / 2
всплывающие подсказки. Тем не менее, это нарушается при работе с такими ресурсами, как(11 13)
, Нам нужно вычислить произведение двух чисел, сделать его нечетным, если оно четным, и даже если оно нечетным, и затем принять его значение на 2. Это работает, потому что строки и столбцы, которые являются нечетными, потребуют на одну итерацию меньше чтобы добраться до конечного результата.map
используется вместо a,forEach
потому что в нем меньше символов.Вещи, которые можно улучшить
Одна вещь, которая действительно беспокоит меня об этом решении - это частое использование
zipWithIndex
. Это занимает так много персонажей. Я попытался сделать так, чтобы я мог определить свою собственную односимвольную функцию, которая будет просто выполнятьzipWithIndex
с переданным значением. Но оказывается, что Scala не позволяет анонимной функции иметь параметры типа. Возможно, есть другой способ сделать то, что я делаю, без использования,zipWithIndex
но я не слишком много думал о том, как сделать это умным способом.В настоящее время код выполняется в два этапа. Первый генерирует новую доску, а второй проход печатает ее. Я думаю, что если объединить эти два прохода в один, это сэкономит пару байтов.
Это первый кодовый гольф, который я сделал, поэтому я уверен, что есть много возможностей для совершенствования. Если вы хотите увидеть код до того, как я максимально оптимизирую его для байтов, вот оно.
источник
JavaScript (ES6),
246229 байтисточник
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
как-то сочетается? Возможно, логический флаг, чтобы сначала определить_O
илиO_
, а затем сделать.repeat(w).slice(w)
?Python - 290 байт
Я никогда не делал ничего подобного раньше, поэтому любая конструктивная критика будет оценена :)
Главный трюк здесь - просто раздражающий вложенный список пониманий. Я мог бы сохранить несколько символов, не имея новой строки между попами, но это выглядит ужасно.
источник
w
и вh
качестве ввода (через STDIN, как ввод функции или что-то подобное), вместо того, чтобы иметь жестко закодированныйH=4 W=6
. Кроме того, хотя я никогда не программировал на Python, я думаю, что вы можете использовать некоторые пробелы в своем текущем коде. Также может быть интересно прочитать советы по игре в гольф на Python, чтобы дать вам идеи о том, как играть в гольф дальше. Приятного пребывания! :)Древесный уголь ,
494639 байт (неконкурентный)Подробный
источник
APL (Dyalog) ,
6159 байтов⎕←
выведитеm←
m , где m - это'O_'[
...]
эти символы, проиндексированные ...2|
делением-остатком-при-делении-на-два-/¨
разности между каждой из⍳
всех координат (индексов) в массиве⎕
числового ввода формы (количество строк и столбцов) )(
...)[
...]←'X'
присвоить символ X одному из ...b/
отфильтрованный в каждом конкретном Ь (должны быть определены),m
распущенной элементы м, в частности , ...?
случайный элемент (число букв) в диапазоне от одного до+/
суммыb←
Ь , где Ь является'O'=
булева где буква равна,m
т издал⎕DL 1
Д е л ау один второй→2
Перейти к строке 2,/⍨
если (с подсветкой отфильтровано) является'O'∊
ли буква членом⎕←m
выведенного значения, где выводимое значение равно mПопробуйте онлайн!
С версии 16.0 будет короче:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
источник
Python 3,
195188 байтИспользование
bytearray
иdecode
кажется короче, чем нарезка и сборка строки а-ляa[:i]+'X'+a[i+1:]
.источник
Java 7, 317 байт
Объяснение:
Test gif (4,6)
источник
Perl, 148 байт
146 байт кода +
-pl
флаги.Чтобы запустить это:
источник
MATLAB (R2016b), 172 байта
Код:
Рекомендации всегда приветствуются! Попробуйте онлайн!
Выход программы:
Объяснение:
источник