У ленивого физика есть задача провести эксперимент с двумя щелями. Тем не менее, они ленивы и не могут быть обеспокоены настройкой всего оборудования самостоятельно, поэтому имитируют эффекты. Хотя они не могут программировать, поэтому им понадобится помощь. Поскольку они ленивы, ваша программа должна быть максимально короткой.
Учитывая нечетное положительное целое число n
( n >= 1
и n % 2 == 1
), выполните моделирование.
Как это устроено
Вы начнете с пустого холста, и каждый кадр отдельной частицы света пройдет через щели и приземлится на холст. Частица приземлится в максимумах с вероятностью:
n = 1
:
+-----+
| |
| 1/2 |
| |
+-----+
n = 3
:
+-----+ +-----+ +-----+
| | | | | |
| 1/4 | | 1/2 | | 1/4 |
| | | | | |
+-----+ +-----+ +-----+
n = 5
:
+-----+ +-----+ +-----+ +-----+ +-----+
| | | | | | | | | |
| 1/8 | | 1/4 | | 1/2 | | 1/4 | | 1/8 |
| | | | | | | | | |
+-----+ +-----+ +-----+ +-----+ +-----+
и т.п.
Например, для того, чтобы n=5
мы отметили средний квадрат, есть вероятность падения в нем 50%. Если он падает в конце кадра, если не перейти к следующим двум, есть вероятность 25% падения в них. Если он падает в конце кадра, если не перейти к следующим двум, есть вероятность падения в 12,5%. Если он не падает, это не имеет значения, это все равно конец кадра.
Существует некоторая путаница в том, как рассчитать шансы, в основном это связано с тем, что люди думают о них как о вероятностях, которые должны составлять в целом 1. Удалите эту идею из своего разума, и она должна немного прояснить ее для вас.
- На кадр будет приходиться не более одной частицы, это означает, что частица может вообще не приземлиться на этот кадр.
- Частица может быть представлена любым печатным символом.
- Частица приземлится в любом месте коробки со случайным шансом.
- Ширина ящиков должна соответствовать
2n-1
размеру холста. Так чтоn=5
они должны быть1/9
шириной холста. - Высота ящиков должна быть высотой холста.
- Частица вообще не должна попадать за пределы коробок.
- Если частица уже приземлилась в выбранном месте, которое не имеет значения, она может снова приземлиться там.
- Вышеуказанные поля ascii для ясности не должны быть нарисованы.
- Вы можете выбрать свой собственный размер холста, если это разумно. Например, он должен иметь высоту не более нескольких пикселей. Это также должно быть в состоянии соответствовать всем коробкам на этом.
- Если ваш код спит между кадрами, вам не нужно добавлять его в счетчик байтов.
Должны быть промежутки между каждым из максимумов, минимумов. Это должно быть той же ширины, что и коробка, но частицы там не будут приземляться. Смотрите следующую диаграмму:
+---+---+---+---+---+
| | | | | |
|max|min|max|min|max|
| | | | | |
+---+---+---+---+---+
Программа должна работать до тех пор, пока она не будет остановлена вручную.
правила
- Генератор псевдослучайных чисел (pRNG) в порядке.
- Стандартные лазейки запрещены.
- Входные данные могут быть приняты в любом разумном формате.
- Вы должны вывести на STDOUT.
- Это код-гольф, поэтому выигрывает самый короткий ответ.
пример
Следующий GIF является примером запуска для n = 5
. Я только быстро его подобрал, так что шансы могут быть немного ниже.
Ответы:
Python 2,
207200 байтУ этого безумия есть способ, обещаю. Следует интерпретации вероятности, которую я прокомментировал в ОП.
Изменить: -7 байт через некоторые умные ленивые оценки (и удаление некоторых признаков)
источник
BASH, 396 - 11 = 385 байт
К сожалению, я не могу продемонстрировать это на TryItOnline из-за бесконечного цикла и управляющих последовательностей ANSI, которые перемещают курсор, но вы все равно можете скопировать и вставить его в свой терминал!
Unminified версия:
источник
$[ ]
вместо$(( ))
. Вместо тогоfor i in `seq $((($1+1)/2)) -1 1`;do ...;done
, чтобы попробоватьfor((i=($1+1)/2;i>0;i--));{ ...;}
. Вместо того[ $(($RANDOM%2)) -eq 1 ]
, чтобы попробовать((RANDOM%2))
.sector
,SS
и т. д. должны быть заменены именами переменных в 1 символ.Mathematica, 231 байт
вход
выход
источник
C # (.NET 4.5),
319254 байтаСохранено 65 байт благодаря TheLethalCoder!
Фу, это было много работы, но это работает как-то.
Поскольку для этого используются
Console
специальные функции и спящий поток, к сожалению, он не будет работать на TIO.источник
Action<int>
сохранения байтов,while(true)
-> (while(1>0)
->for(;;)
.using C=Console;
Илиusing static Console;
.namespace System{using static Console;n=>{for(var r=new Random();;)for(int w=WindowWidth/(2*n-1),i=(n-1)/2,c=0,m=2,l;i>-1;i--,c+=2)if((l =r.Next(0,(m*=2+1)*2))<2){SetCursorPosition((i+(l<1?c:0))*2*w+r.Next(0,w),r.Next(0,WindowHeight));Write('*');break;}}}
Variable is not existing in the current context
ошибок.Clojure + Quil, 394 байта
Ну, я конечно не выиграл, но это была хорошая тренировка мозга! Возможно, я выбрал слишком окольный способ сделать это, но это работает! В основном, как это работает:
Значения x каждого столбца рассчитываются на основе
n
. Затем «активные столбцы», которые будут содержать точки, отфильтровываются. Затем столбцы упаковываются в архив с возможностью выбора.Анимация начинается, и в каждом кадре вводится петля. Начиная с середины, пробуется каждая пара столбцов. Как только одна пара столбцов выбрана, один столбец из пары выбирается случайным образом.
Точка рисуется в произвольной позиции в выбранном столбце, внутренний цикл завершается, и начинается новый кадр.
Использует графическую библиотеку Quil, которая, по сути, является оболочкой обработки для Clojure.
Обратите внимание, что гольф-код не производит ту же анимацию, как показано в GIF. В коде для гольфа фон серый, а окно и точки меньше. Это имеет тот же эффект, но не так красиво.
Посмотрите код ungolfed для подробного объяснения:
источник
C #, 238 байт
Попробуйте онлайн!(Это не сработает, но ты знаешь).
Полная / Отформатированная версия:
источник