О серии
Во-первых, вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь о серии вообще. Тем не менее, существует таблица лидеров по всем задачам. Вы можете найти таблицу лидеров вместе с дополнительной информацией о серии в первом посте .
Несмотря на то, что у меня есть ряд идей для этой серии, будущие проблемы еще не заложены. Если у вас есть какие-либо предложения, пожалуйста, сообщите мне об этом в соответствующей песочнице .
Отверстие 4: парадокс Бертран
Бертрана парадокс интересная проблема, которая показывает , как различные методы для выбора случайных аккордов в круге может дать различные распределения аккордов, их середин и их длину.
В этой задаче вы должны генерировать случайные аккорды единичного круга, используя «правильный» метод, то есть тот, который производит распределение аккордов, которое является инвариантным при масштабировании и трансляции. В связанной статье в Википедии «Метод 2» является таким методом.
Вот точные правила:
- Вы должны взять одно положительное целое число,
N
которое указывает, сколько аккордов должно быть возвращено. На выходе должен быть списокN
аккордов, каждый из которых указан в виде двух точек на единичной окружности, заданных их полярным углом в радианах. - Ваш код должен иметь возможность возвращать как минимум 2 20 различных значений для каждого из двух углов . Если имеющийся у вас ГСЧ имеет меньший диапазон, вы должны сначала создать ГСЧ с достаточно большим диапазоном поверх встроенного, либо вы должны реализовать свой собственный подходящий ГСЧ . Эта страница может быть полезна для этого.
- Распределение аккордов должно быть неотличимо от распределения, произведенного «Методом 2» в связанной статье Википедии. Если вы применяете другой алгоритм выбора аккордов, пожалуйста, приложите подтверждение правильности. Какой бы алгоритм вы ни выбрали для реализации, он теоретически должен быть способен генерировать любой действительный аккорд в единичном круге (за исключением ограничений базовых типов данных PRNG или ограниченной точности).
- Ваша реализация должна использовать и возвращать либо числа с плавающей запятой (шириной не менее 32 бит), либо числа с фиксированной запятой (шириной не менее 24 бит), и все арифметические операции должны быть точными в пределах не более 16 ulp .
Вы можете написать полную программу или функцию и получить ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и произвести вывод через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вывод может быть в любом удобном формате списка или строки, если отдельные числа четко различимы, а их общее число всегда четное.
Это код гольф, поэтому выигрывает самое короткое представление (в байтах). И, конечно же, самая короткая заявка на пользователя также войдет в общую таблицу лидеров серии.
Визуализация
Вы можете использовать следующий фрагмент для рендеринга сгенерированных строк и проверки их распределения. Просто вставьте список пар углов в текстовую область. Фрагмент должен быть в состоянии обрабатывать практически любой формат списка, если числа являются простыми десятичными числами (без научных обозначений). Я рекомендую вам использовать не менее 1000 строк, чтобы получить хорошее представление о распределении. Я также предоставил некоторые примеры данных для различных методов, представленных в статье ниже.
Пример данных, сгенерированных методом 1.
Пример данных, сгенерированных по методу 2.
Пример данных, сгенерированных по методу 3.
Leaderboard
Первый пост серии генерирует таблицу лидеров.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Язык в настоящее время не отображается, но фрагмент требует и анализирует его, и я могу добавить таблицу лидеров по языкам в будущем.)