Про серію
По-перше, ви можете ставитися до цього, як і до будь-якого іншого виклику коду для гольфу, і відповісти на нього, не турбуючись про серію взагалі. Однак існує лідери у всіх викликах. Ви можете знайти таблицю лідерів разом з додатковою інформацією про серію в першій публікації .
Хоча у мене є маса ідей, що вибудовуються для цієї серії, майбутні виклики ще не поставлені в камені. Якщо у вас є якісь пропозиції, будь ласка, повідомте мене про це у відповідній поштовій скриньці .
Отвір 4: Парадокс Бертрана
Бертрана парадокс цікава проблема, яка показує , як різні методи для вибору випадкових акордів в колі може дати різні розподілу акордів, їх центрів і їх довжину.
У цьому виклику ви повинні генерувати випадкові акорди одиничного кола, використовуючи метод "правильний", тобто такий, який виробляє розподіл акордів, інваріантних під час масштабування та перекладу. У пов'язаній статті Вікіпедії "Метод 2" є таким методом.
Ось точні правила:
- Ви повинні взяти одне ціле число,
N
яке визначає, скільки акордів потрібно повернути. Вихід повинен бути спискомN
акордів, кожен із яких вказаний як дві точки на одиничному колі, заданий їх полярним кутом у радіанах. - Ваш код повинен мати можливість повернути щонайменше 2 20 різних значень для кожного з двох кутів . Якщо наявний RNG має менший діапазон, вам слід спочатку створити RNG з достатньо великим діапазоном поверх вбудованого, або ви повинні реалізувати свій власний відповідний RNG . Ця сторінка може бути корисною для цього.
- Розподіл акордів повинен бути невідмінним від того, який виробляється "Методом 2" у пов'язаній статті Вікіпедії. Якщо ви використовуєте інший алгоритм для вибору акордів, додайте доказ коректності. Який би алгоритм ви не вирішили застосувати, він теоретично повинен бути здатний генерувати будь-які дійсні акорди в одиничному колі (обмеження заборони базових типів PRNG або обмеженої точності даних).
- Ваша реалізація повинна використовувати або повертати числа з плаваючою комою (принаймні 32 біта в ширину) або цифри з фіксованою точкою (принаймні 24 біти в ширину), і всі арифметичні операції повинні бути точними не більше ніж в 16 ulp .
Ви можете написати повну програму або функцію і взяти вхід через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та виробляти вихід через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).
Вихід може бути у будь-якому зручному форматі списку чи рядків, якщо окремі числа чітко відрізняються, а їх загальна кількість завжди є парною.
Це код гольфу, тому виграє найкоротше подання (у байтах). І звичайно, найкоротше подання на кожного користувача також увійде в загальну таблицю лідерів серії.
Візуалізація
Ви можете використовувати наступний фрагмент для відображення згенерованих рядків та перевірки їх розповсюдження. Просто вставте список пар кутів у текстову область. Фрагмент повинен мати можливість обробляти майже будь-який формат списку, якщо цифри є простими десятковими числами (без наукових позначень). Рекомендую використовувати щонайменше 1000 рядків, щоб добре зрозуміти розподіл. Я також надав деякі приклади даних для різних методів, представлених у статті нижче.
Приклад даних, створених методом 1.
Приклад даних, створених методом 2.
Приклад даних, створених методом 3.
Таблиця лідерів
Перший пост серії генерує таблицю лідерів.
Щоб відповіді відображалися, почніть кожну відповідь із заголовка, використовуючи такий шаблон Markdown:
# Language Name, N bytes
де N
розмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Мова наразі не відображається, але фрагмент вимагає і аналізує його, і я можу в майбутньому додати таблицю лідерів за мовою.)