Какой самый короткий способ генерирования случайной строки заданной длины и с разрешенными только буквенно-цифровыми символами?
- пример случайной строки: при N = 9 вывод будет
aZua7I0Lk
- можно считать, что заданная длина N всегда больше 0
- при необходимости вы можете принять 256 как максимальное значение для N, но предпочтительны решения с более высокими пределами для N и все еще с быстрым временем вычисления
- разрешенные символы: 0-9, az и AZ
- символ может встречаться в выходной строке более одного раза
- каждая возможная строка должна быть одинаково вероятной (с точностью до генератора случайных чисел на вашем языке)
Ответы:
Желе , 4 байта
Попробуйте онлайн!
объяснение
Декартовая сила в основном генерирует весь список заданной длины, который может быть сформирован из заданного набора элементов; это именно то, что нам нужно здесь.
источник
Такси , 2577 байт
Попробуйте онлайн!
Такси супер не для этого, но вы можете сделать это! Я постараюсь объяснить, что происходит ниже версии без игры в гольф.
Начало: Получить стандартный ввод
Выберите значение стандартного ввода в виде текста, преобразуйте его в число и вставьте его где-нибудь, чтобы дождаться.
План A Часть 1: Получить случайное целое число 1-62
Получить случайное целое число, а затем получить
62
в виде числа. Дублируйте и случайное целое число, и62
потому, что они понадобятся нам позже. Вы можете нести только 3 пассажиров сразу , чтобы мы в конечном итогеrand
,rand
и62
. (Другой62
будет ждать до тех пор, пока мы не вернемся.) Идите делитьrand
на62
и усечь результат, чтобы получить целое число. Вернитесь, чтобы получить другую копию62
и умножьте ее на усеченное целое число из деления. Наконец, вычтите продукт из первого экземпляраrand
. Это дает нам номер 0-61. Теперь нам нужно вернуться к пикапу1
и добавить его к результату, чтобы получить число 1-62. Да, все эти много строк текста простоmod(rand(),62)+1
.Запланируйте Часть 2: Создайте массив символов, из которого можно выбрать
Pickup - строка со всеми действительными символами, а также один конец, который нам не нужен (подробнее об этом позже).
63
Мы собрали более ранние матчи этой строки длиной. Отнесите его Чопу Сьюи, чтобы разбить его на отдельных пассажиров.План Б: Переместите массив, чтобы мы могли выбрать персонажа
Один за другим, переместите каждого персонажа в Парк Узких Путь. Это единственный доступный стек и единственный способ не мешать оставшимся пассажирам мешать. Все остальное в Таунсбурге - это FIFO, поэтому мне придется возвращаться и очищать всех пассажиров на каждой итерации всей петли. Таким образом, я могу просто оставить их в парке, и каждый раз 63 новых персонажа будут отталкивать их с дороги. Самый первый
A
, вероятно, никогда не сбежит .План C: Подготовьтесь к выбору персонажа.
Это всего лишь несколько остановок, которые не должны были присутствовать в Плане D. Переместите такси при подготовке.
План D: Получить все символы, которые нам не нужны.
Начиная с первого символа в перевернутом «массиве» (это 63-й символ, который нам не нужен), продолжайте подбирать и объединять символы, пока мы выполняем обратный отсчет от результата
mod
функции. в плане А. Как только вы нажмете ноль, следующий персонаж будет тот, который вы хотите.План E: Утопить тех, кого вы не хотите, и вернуть выбранный.
«[P] сборщики, сброшенные с моста через реку, кажется, всегда падают за борт и впадают в реку ...» Ну, это избавляет от этой объединенной цепочки неудачников. Иди, возьми следующий персонаж и отправь его на стандартный вывод. Наконец, давайте проверим, сколько символов мы уже напечатали. Вернемся к Sunny Skies, чтобы получить значение stdin, которое мы оставили так давно. Вычтите одно и, если результат больше нуля, отправьте его обратно в ожидание и начните все сначала с плана А.
источник
code-bowling
и было пересмотрено. Самый длинныйcode-golf
ответ, который я смог найти, - это оригинальное представление Brain-Flak о базовом вызове Куайна. Это прибывает в 9.5 * 10 ^ 580 байтов. Самый длинный текущий ответ, который я нашел, был главным тестером в Unary : 1.65 * 10 ^ 56 байт.C (gcc) ,
575552 байтаСпасибо 2501 за указатели ...
Попробуйте онлайн!
источник
rand()%74
должно бытьrand()%75
&&putchar(i)
вместо троичного оператора.Желе , 5 байт
Пропустил трюк - см . 4 байта ais523
Попробуйте онлайн!
Как?
источник
Shell + pwgen , 13 байт
Образец вывода
источник
Java 8
1831499788 байтПопробуйте онлайн.
-9 байт при переносе ответа C @ 2501 , так что не забудьте также его оповестить!
Старый ответ, 97 байт
Попробуйте онлайн.
Объяснение:
источник
C, 60 байтов
Посмотрите, как это работает здесь .
Смотрите распределение здесь .
Он равномерно распределен, предполагая, что
rand() % 62
производит равномерное распределение. Поскольку 62 обычно не делит RAND_MAX равномерно, существует очень небольшое смещение.источник
Снеговик , 58 байт
Попробуйте онлайн!
Это подпрограмма, которая принимает целое число в качестве входных данных и возвращает случайную строку.
источник
((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR))
.PowerShell,
5854 байта-4 спасибо Андрею Одегову - приведение к массиву символов вместо циклического создания массива символов.
генерирует диапазон
1..2+4..5 = 1,2,4,5
всех приемлемых кодов символов, затем$args
случайным образом выбирает количество элементовrandom -Count
- результирующие элементыциклическипреобразуются в массив символов с использованием|%{}
переворачиваются и превращаются в[char]
s,[char[]]
- затем все это заключается в скобки и-join
редактируется вместе.Не работает для входа 0, так как
Get-Random
принимает только цифры выше 1 для-Count
параметра.источник
-join[char[]](65..90+97..122+48..57|random -C "$args")
PHP, 56 байт
Онлайн версия
ctype_alnum
источник
05AB1E , 6 байтов
Попробуйте онлайн!
объяснение
источник
Perl 5 , 41 байт
40 байтов кода +
-p
флаг.Попробуйте онлайн!
(a..z,A..Z,0..9)
создает массив, содержащий все буквы и цифры,[rand 62]
возвращает случайный элемент этого массива, к которому относится append (.=
)$\
, который неявно печатается в конце благодаря-p
флагу с}{
.Или для того же bytecount, но с использованием параметров, а не стандартного ввода:
Попробуйте онлайн!
источник
R, 51 байт
Та же длина, что и у другого ответа R, но другой подход.
letters
иLETTERS
обе являются встроенными переменными, содержащими все строчные и прописные буквы соответственно. Помимо0:9
этого и у нас есть весь набор буквенно-цифровых символов.источник
R
54525149 байтОбъяснение:
scan()
c(65:90,97:122,48:57)
sample(c(65:90,97:122,48:57),scan(),T)
intToUtf8
источник
JavaScript (ES6),
6154395264 байтаЭто почти как реверс-гольф! Сильно ударил по количеству байтов, гарантируя, что будет использован весь диапазон символов из всех трех групп.
Попытайся
источник
[0-5w-z]
исключительно.btoa(String.fromCharCode(Math.random()*248))[0]
равномерно покрыть весь диапазон.toString
и затем кодировать), чтобы гарантировать возвращение полного диапазона символов из всех трех групп.014589ABEFIJMNQRUVYZcdghklopstwx
(и не единообразно).Алиса , 24 байта
Попробуйте онлайн!
Этот макет уже намного лучше, чем у меня изначально (32 байта), но я уверен, что он еще не оптимален ...
объяснение
источник
Python + exrex , 81 байт
источник
Python 2,
798379 байтов+4 байта (повторение не учитывалось)
-4 байта (спасибо @Rod за предложение по использованию
printable[:62]
)источник
(s.letters+s.digits)*x
вместо этогоs.letters+s.digits
`r.sample(...)`[2::5]
вместо этого,''.join(r.sample(...))
чтобы сохранить байт (только для Python 2), и(s.letters+s.digits)*x
можете переключитьсяs.printable[:62]*x
на сохранение 4 байтаprintable
, не мог заставить[2::5]
работать (возможно, я делал это неправильно?)r.sample()
с помощью галочек``
немного информации о немБрахилог , 14 байт
Попробуйте онлайн!
объяснение
источник
MATL , 8 байт
Попробуйте онлайн!
источник
Пакет, 175 байтов
s
выполняет двойную обязанность здесь, поскольку он содержит буквенно-цифровой список и случайно выбранные символы. После вывода результата код переходит к подпрограмме, результат которой игнорируется.источник
Пайк , 4 байта
Попробуйте онлайн!
источник
MemoryError
Pyth,
711 байтовПопробуйте онлайн
объяснение
источник
C # - 121 байт
источник
APL (Dyalog) с AGL , 17 байтов
Попробуйте онлайн!
(
...)[
...]
индекс в⎕A,∆a,⎕D
прописные буквы алфавита, за которыми следуют строчные буквы и цифрыс помощью
62
(количество возможных символов⍴
изменен⎕
оцененный вклад ( n )?
замените каждое 62 на случайное число в диапазоне 1… 62APL (APLX) , 17 байтов
источник
Баш , 43 байта
Попробуйте онлайн!
источник
Пип , 13 байт
Попробуйте онлайн!
объяснение
источник
Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 63 байтованных BASIC байта
В ZX81 нет строчных символов без использования ассемблера или какого-либо UDG-ROM или чего-то еще, и на данный момент он только выводит
A-Z
. Если введен ноль, то программа останавливается и возвращается в прямой режим.источник
Japt ,
128 байтПопытайся
источник
С накоплением , 33 байта
Попробуйте онлайн! Принимает ввод с вершины стека и оставляет вывод на вершине стека.
источник