О серии
Это гостевая запись для серии Random Golf of the Day.
Во-первых, вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь о серии вообще. Тем не менее, существует таблица лидеров по всем задачам. Вы можете найти таблицу лидеров вместе с дополнительной информацией о серии в первом посте .
вход
Вход не принимается.
Выход
Одна буква алфавита (регистр не имеет значения), с дополнительным завершающим переводом строки. Каждая буква должна иметь ненулевую вероятность быть выбранной, и все 26 вероятностей должны быть различны . Устранить всю двусмысленность: Различия означает, что не должно быть двух вероятностей, которые равны друг другу.
счет
Это код гольф. Самый короткий код в байтах побеждает.
Допустимая запись - это полная программа или функция с нулевой вероятностью не завершиться.
Алфавит
Чтобы избежать путаницы, конкретным алфавитом, который нужно использовать, является латинский алфавит:
Или
ABCDEFGHIJKLMNOPQRSTUVWXYZ
или же
abcdefghijklmnopqrstuvwxyz
Вы можете выбрать вывод верхнего или нижнего регистра. В качестве альтернативы вы можете выбрать вывод разных случаев на разных прогонах, если это поможет. Вероятность для данной буквы - это вероятность появления этой буквы в любом случае (верхний или нижний).
объяснение
Поскольку это не будет очевидно из результатов, пожалуйста, включите четкое объяснение того, как вы достигли 26 различных вероятностей.
Leaderboard
( отсюда )
Первый пост серии также генерирует общую таблицу лидеров.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
(Язык в настоящее время не отображается, но фрагмент требует и анализирует его, и я могу добавить таблицу лидеров по языкам в будущем.)
A
а не65
.Ответы:
Пиф, 5
Попробуй здесь
Вычисляет префиксы алфавита, так:
["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]
. Затем сглаживает список и равномерно выбирает из него случайный элемент. Это означает, что, посколькуa
появляется 26 раз, аb
появляется 25 раз, вплоть доz
всего лишь 1 появления, каждая буква имеет различную вероятность появления. Общая строка имеет 351 символов.источник
MATL, 6 персонажей
Объяснение:
Xr
Возьмите нормально распределенное случайное число.)
Используйте это для индексации в ...1Y2
АлфавитРаспределение симметрично около 0, а преобразование числа в символ симметрично около 0,5. Как таковые вероятности должны быть четкими.
источник
05AB1E , 6 байтов
Код
объяснение
Теперь у нас есть следующая строка:
После этого мы выбираем случайный элемент, используя
.R
.Вероятности
Попробуйте онлайн! ,
источник
Желе , 5 байт
Попробуйте онлайн!
Как это устроено
Фон
Пусть L 0 , ..., L 25 обозначает буквы алфавита в их естественном порядке, и S 0 , ..., S 25 равномерно произвольно выбранная , перестановка L . Определим конечную последовательность M как M n = max (L n , S n ) .
Зафиксируем n в 0,… 25 и определим k как индекс, такой что L n = S k .
С вероятностью 1/26 , L п = S п и п = к , так что М н = л н и л н occurrs один раз в М .
С вероятностью 25/26 , L п ≠ S п и п ≠ к . В этом случае происходит следующее.
С вероятностью Н / 25 , S п является одним из L 0 , ..., L п - 1 , так что л п > S п и М п = л н .
Независимо, также с вероятностью n / 25 , k является одним из 0,… n - 1 , поэтому S k > L k и M k = S k = L n .
Таким образом, ожидаемое количество вхождений L n в M составляет 1/26 + 25/26 · (n / 25 + n / 25) = (2n + 1) / 26 .
Наконец, если мы теперь выберем член m из M случайным образом, букву L n мы выберем с вероятностью (2n + 1) / 26/26 = (2n + 1) / 676 .
Это дает следующее распределение вероятностей.
Вы можете эмпирически проверить распределение, позвонив по ссылке 100 000 раз (это займет несколько секунд).
источник
MATL , 10 байт
Попробуйте онлайн!
Код генерирует равномерную случайную величину на интервале (0,1) (
r
) и вычисляет ее квадрат (U
). Это приводит к неравномерному уменьшению плотности вероятности. Умножение на 26 (26*
) гарантирует, что результат находится на интервале (0,26), а округление вниз (k
) дает значения 0,1, ..., 25 с уменьшением вероятностей. Значение используется в качестве индекса ()
) в верхнем регистре алфавита (1Y2
). Поскольку MATL использует модульную индексацию на основе 1, 0 соответствует Z, 1 - A, 2 - B и т. Д.В качестве иллюстрации того, что вероятности различны, вот дискретная гистограмма, полученная из 1000000 случайных реализаций. График получается при запуске этого в Matlab:
источник
k
! Заметил, что во время попытки codegolf.stackexchange.com/a/89648/11159Java 7,
625756 байт5 байтов благодаря Poke.
1 байт благодаря трихоплаксу.
Идео это!
Частотная диаграмма (1e6 работает, коэффициент масштабирования 1/1000)
источник
sqrt(x*y*y) = sqrt(x)*y
Perl, 24 байта
-4 байта благодаря @Martin Ender
-1 байт благодаря @Dom Hastings
Необходимо
-M5.010
или-E
запустить:Выполнение следующего кода покажет вхождение каждой буквы:
Как это работает : Я полагаю, код довольно явный, но все же: он выбирает случайное число между
0
иrand 26
. Таким образом, вероятность выбора чисел, близких к0
(буквеA
), намного выше .источник
say+(A..Z)[rand rand 26]
(A..Z)[...]
и это не сработало, поэтому я подумал, что смогу использовать анонимный массив, но это только из-заsay
... спасибо! :)PHP,
44362927 байтВычеркнуто 44 все еще регулярно 44; (
Спасибо insertusername здесь, Petah и Crypto за всю помощь
Он выбирает случайное число от 0 до 675 (= 26 2 -1), берет его квадратный корень и вычитает его (
chr
функция преобразует свой аргумент в целое число). Поскольку квадраты имеют разные интервалы между ними, вероятность каждого выбранного числа различна. Каждый n выбран с вероятностью (2n + 1) / 676.Добавление 65 к этому числу дает вам случайный символ от
A
доZ
.Идея кода работает 1000000 раз
источник
range(A,Z)
.chr()
.<s> 44 </s>
<?=chr(65+sqrt(rand(0,675)));
R,
4027 байтЭто будет принимать
1
число из26
чисел, сгенерированных с растущей вероятностью кZ
, без замены, и отображать букву, индекс которой является этим числом, из списка заглавных буквLETTERS
.Аргументы
sample
функции:источник
> <> , 14 байт
> <> - это тороидальный двумерный язык, и определенная часть вероятностей просто естественным образом происходит из-за единственного источника случайности языка. Попробуйте онлайн!
Соответствующие команды:
Таким образом, вероятности выхода:
источник
Python 2,
5857 байтОбъяснение: это генерирует случайное число с плавающей запятой в интервале
[0, 676)
, берет квадратный корень и затем помещает его в пол. Затем он добавляет 65 (значение ascii «A»), преобразует его в символ и печатает его.Это дает каждому числу от 0 до 25 определенную вероятность. Чтобы понять почему, подумайте об этом так. Сколько чисел, игнорируя нецелые числа, когда вы берете квадратный корень и пол, даете 0? Только одно число будет (ноль). Это означает, что ноль имеет вероятность
1/676
. Сколько чисел даст 1? 3 будут, 1, 2 и 3. Это означает, что у каждого есть вероятность3/676
. Двойка может быть получена с 4, 5, 6, 7 или 8, что дает ей вероятность 5, тройка имеет вероятность 7 и т.д. до 25 (Z).1 байт сохранен благодаря дырявой монахине!
источник
chr(int(65+randint(676)**.5))
chr(int(65+random()**.5*26))
. То же самое алгебраически, потому что 26 == √676. и теперь порядок действий на вашей стороне**2*26
может быть использовано обратное распределение.1/random()%26
также должен работать.PowerShell v2 +,
3331 байтПринимает диапазон от
65
до90
(то есть, от ASCIIA
доZ
), передает его через цикл. На каждой итерации мы используем оператор запятой для создания массива этого элемента, умноженного на это число. Например, это составит 6565
с, 6666
с, 6767
с и т. Д. Этот большой массив передается по трубопроводу,Get-Random
который (равномерно PRNG) выберет один элемент. Поскольку количество элементов каждого элемента различно, у каждого персонажа есть немного отличающийся процентный шанс быть выбранным. Затем мы инкапсулируем это в параны и используем его какchar
. Это осталось на конвейере и вывод неявный.(Спасибо @LeakyNun за несколько байтов в гольф еще до того, как они были опубликованы.: D)
Вероятности
(небольшое округление, чтобы я мог продемонстрировать
P
опцию-f
оператора ormat)источник
gal
output ([char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random
) получил 50 символов, затем 48, переключился на цифры и получил 42, затем 31 и остановился там; посмотрел в таблице лидеров, чтобы увидеть, где это меня поставит. Прямо здесь. Символ для персонажа идентичен. Welp, я, вероятно, не могу победить это.CJam,
211712 байтСпасибо Мартину Эндеру за то, что он спас мне 5 байтов!
Новая версия
Это формирует массив строк следующий шаблон
A
,AB
,ABC
и так далее. Это выравнивает его и выбирает случайный символ. Поскольку эта строка содержит 26 A, 25 B, 24 C и т. Д., Каждая буква имеет определенную вероятность выбора.Попробуйте онлайн!
объяснение
Старая версия
Получает различные вероятности, создавая строку, в которой каждая буква появляется количество раз, равное ее позиции в алфавите.
источник
R, 23 байта
Просто «пробует» письмо от встроенного.
1:26
вектор весов , дающих каждой буквы другую вероятность.источник
1:26
является вектором весов для каждой буквыC 35 байт
Эта программа предполагает,
RAND_MAX
что (2 ^ 32/2) - 1, так как она по умолчанию на gcc. Скомпилируйте с-lm
флагом, чтобы связатьsqrt
функцию. Вывод записывается в стандартный вывод заглавными буквами без завершающих строк.При желании, если
RAND_MAX
(2 ^ 16/2) - 1, можно использовать более короткую 32-байтовую версию:Просто для забавы, я также сделал версию, в которой не используется эта
sqrt
функция и не требуется наличие математической библиотеки (эта должна иметь значениеRAND_MAX
(2 ^ 32/2) - 1), но она оказалась длиннее, хотя я и думал, что это довольно круто:объяснение
[Первая программа]
Для первых двух использований
sqrt
функция просто отображает диапазон[0, RAND_MAX)
на[0, 25]
сквозное деление, а затем добавляет 65 (ASCIIA
) к значению, чтобы переместить его в алфавит ASCII перед его выводом.[Вторая программа]
Вторая программа немного сложнее, так как выполняет аналогичную стратегию, но без
sqrt
оператора. Поскольку биты экспоненты с плавающей запятой автоматически вычисляются при назначении целого числа, они могут эффективно использоваться в качестве грубого способа получения логарифма числа 2 с основанием 2.Так как мы хотим, чтобы диапазон
RAND_MAX
только достигал закодированного значения показателя степени 25, вычисление (2 ^ 32/2 - 1) / (2 ^ 25) дает нам только около 64, что используется при деленииrand
для его отображения к этому новому ассортименту. Я также добавил 1 к значению, поскольку представление с плавающей запятой 0 довольно странно и нарушило бы этот алгоритм.Затем с плавающей точкой вводится тип с целым числом, чтобы разрешить сдвиг битов и другие подобные операции. Поскольку в числах с плавающей запятой IEEE 754 показательные биты являются битами 30-23, число затем сдвигается вправо на 23 бита, обрезая мантиссу и позволяя считать необработанное значение показателя в виде целого числа. Обратите внимание, что знаковый бит также находится за пределами экспонентных битов, но, поскольку никогда не бывает отрицательных значений, его не нужно маскировать.
Вместо добавления 65 к этому результату, как мы делали ранее, показатели с плавающей запятой представляются в виде 8-разрядного целого числа без знака от 0 до 255, где значение показателя 0 равно 127 (просто вычтите 127, чтобы получить фактическое значение показателя со «знаком»). ). Поскольку 127 - 65 - это 62, мы вместо этого просто вычитаем 62, чтобы сдвинуть его из этого диапазона показателей с плавающей запятой и в диапазон алфавита ASCII - все за одну операцию.
распределение
Я не эксперт по математике, поэтому я не могу точно сказать точную формулу для этих распределений, но я могу (и сделал) проверить каждое значение в диапазоне,
[0, RAND_MAX)
чтобы показать, что расстояние между тем, где заканчивается диапазон одной буквы, и началом другой никогда не будет такой же. (Обратите внимание, что эти тесты предполагают случайный максимум (2 ^ 32/2) - 1)[Первая программа]
[Вторая программа]
источник
char
это целочисленный тип в C, это должно быть приемлемым.Python 2, 72 байта
Умножает символ на его значение ascii, затем выбирает один символ случайным образом из полученной строки.
Вот вероятности для каждой выбранной буквы, в процентах:
Попробуйте это: https://repl.it/Cm0x
источник
Желе , 5 байт
(Равный счет, но другой метод , к существующему решению Jelly от Dennis.)
Вероятность получения каждой буквы - это основанный на 1 индекс в алфавите, разделенный на 351 - 26-е треугольное число:
A
) = 1/351, P (B
) = 2/351, ..., P (Z
) = 26/351.Так как 1 + 2 + ... + 26 = 351, P (буква) = 1.
Реализация:
Протестируйте его на TryItOnline или получите раздачу в 100 тысяч пробежек (кредит Денниса)
источник
q, 38 байт
Не особенно коротко, но ...
Дискретная кумулятивная функция распределения - это последовательность
0.9 ^ 26, 0.9 ^ 25, ..., 0.9 ^ 0
И мы просто пример из распределения.
источник
JavaScript (ES6), 45 байт
Достигает неравномерного распределения путем возведения в квадрат случайного значения.
Math.random()
возвращает плавающий диапазон,[0,1)
поэтому результат возведения в квадрат это стремится к0
(илиa
).Контрольная работа
Показать фрагмент кода
источник
(n=Math.random(),10+26*n+n|0).toString(36)
Oracle SQL 11.2, 212 байт
Использование позиции символа в алфавите в качестве вероятности
Un-golfed
источник
TI-Basic, 39 байт
rand
генерирует равномерное значение в (0,1]. Это дает 26 ^ rand разную вероятность равняться целым числам от 1 до 26.Старая версия, 45 байт
Ограниченная точность целых чисел TI-Basic ограничивает нормальные распределения генерацией чисел в пределах µ ± 7.02σ (см.
randNorm(
). Таким образом, мы получаем абсолютное значение случайного числа с µ 0 и σ 1, умноженное на четыре, чтобы увеличить практический диапазон, упомянутый ранее, до µ ± 28.08σ. Затем мы определяем значение и добавляем 1, посколькуsub(
он индексируется 1, давая нам диапазон от 1-29 с различными вероятностями каждого.источник
PHP,
9284 байтаСоздает строку из всех букв, повторяет количество раз, которое мы делаем в цикле, а затем случайным образом выбирает букву из этой строки. Буквы позже в алфавите имеют более высокую вероятность в результате
Спасибо insertusername здесь за сбривание байтов
вероятности исхода (упорядочены по%)
источник
$x=0
что, очевидно, необходимо. Вот 84-байтовая версия:for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);
вам когда-нибудь удавалось получить значение больше, чемG
при запуске кода? В любом случае, вы всегда можете игнорироватьnotice
s при игре в гольф.strlen
Из$a
351, но вы только собирание случайного характера из первых$x
(26) символов. Вы можете это исправить и сохранить ваши шансы с изменением конечного$x
To350
на +1 байта. Вот 77-байтовая версия, которая решает проблему, но также сближает вероятности:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
Befunge,
168164 байтаБолее компактный, чем первый, с немного отличающимися вероятностями: у первого
?
есть 1/4 шанса напечатать A при «первой попытке», 2/4 шанса вернуться к тому же?
, и 1/4, чтобы перейти к следующий. Все остальные?
имеют 1/4 шанса напечатать букву под ними, 1/4, чтобы повторить попытку, 1/4 перейти к следующей букве, 1/4 перейти к предыдущей. Опять же, вероятность печати А намного выше, чем печать Z.Befunge, 186 байт
Очевидно, что не выиграет с этим, но я думаю, что это интересный ответ, тем не менее :)
v
и>
направляет курсор соответственно вниз и вправо.?
Оператор посылает курсор выключен в одном из четырех направлений в случайном порядке. Первый?
«заблокирован»v
и>
в двух направлениях, поэтому у него есть только два пути: либо распечатать букву А, либо перейти к следующему?
. Таким образом, с?
одной только стороны есть 50% -ый шанс напечатать A.У следующего
?
есть 1/3 шанса напечатать B, 1/3 при движении назад и 1/3 при движении вниз. И т. Д.Должно быть совершенно очевидно, что верхние буквы имеют гораздо большую вероятность быть напечатанными, чем нижние, но я не совсем уверен, каковы шансы каждой буквы.
Некоторая помощь с точной математикой была бы оценена :)
По крайней мере, есть вероятность 1/2 * 1/3 ^ 25, что курсор перемещается полностью вниз к Z с первой попытки, но я не уверен, как шансы перемещения курсора вверх и вниз влияют на каждую букву.
,@
печатает и выходит.источник
J,
2018 байтОнлайн переводчик
Верхний регистр.
Вероятность каждой буквы - это 1-й индекс в алфавите.
источник
зш, 63 байта
это работает путем создания этой строки:
ака 65 раз A, 66 раз B, 67 раз C ...
а затем он выбирает случайный символ в нем
источник
A
в ascii. Вы можете начать с 1, но тогда внутренний цикл становится на{65..$[#i]}
1 символ длиннееCJam, 11 байт
или же
Попробуйте онлайн!
Это решение похоже на идею Луиса и создает неравномерное распределение, взяв квадратный корень из случайной величины.
источник
Пакет, 116 байт
Работает, выбирая большую или меньшую (я забыл, какую) из двух случайных величин.
источник
Матлаб, 22
Часто будут возвращать ранние буквы, но теоретически могут коснуться их всех!
Делает одно деленное на случайное число, ограничивает его до 26 и превращает его в персонажа.
Не очень кратко, конечно, но, возможно, концепция может вдохновить другие ответы.
источник
rand
возвращать значение в [0, 1)? То есть, включая ноль, но не включая один. Если это иногда приводит к 1/0, всеmin(1/0,26)
еще вернется 26, или ошибка?rand
возвращает значение в (0,1), поэтому проблем не должно бытьrand
0 на практике, наmin(1/0,26)
самом деле возвращается 26.CJam, 10 байтов
CJam подход № 3 ...
Попробуйте онлайн!
Это создает равномерно случайное число
x
от 1 до 26, а затем использует его для создания равномерно случайного числа между0
и кx-1
которому добавляетсяA
. Это смещение приводит к меньшим символам.источник
Лабиринт , 19 байт
Попробуйте онлайн!
Это цикл, который на каждой итерации либо a) увеличивает счетчик, который начинается с нуля, либо b) заканчивается, оба с вероятностью 50%. В конце цикла счетчик берется по модулю 26 и добавляется к 65, чтобы дать букву между
A
иZ
.Это дает вероятность
A
чуть более 50%,B
чуть более 25% и т. Д. ДоZ
чуть более 1/2 26 . Теоретически, существует вероятность того, что это будет продолжаться вечно, но вероятность этого события равна нулю, как того требует задача (на практике это, вероятно, в любом случае невозможно, поскольку PRNG будет возвращать оба возможных результата в определенный момент в течение своего периода).источник