Числа, которые легко запомнить, но теоретически нелегко
Ваша задача состоит в том, чтобы создать программу / функцию на любом языке, которая генерирует равномерно случайные числа, соответствующие этим критериям:
Длина составляет 5 цифр
Есть две отдельные пары повторяющихся цифр
Один набор повторяющихся цифр находится в начале или в конце, и цифры находятся рядом друг с другом
Нечетное число вне окружено другой парой цифр
Две пары цифр и другое число должны быть уникальными
Ваша программа может поддерживать числа с ведущими нулями или нет по вашему усмотрению. Если ведущие нули поддерживаются, они должны быть включены в выходные данные: 06088, а не 6088. Если начальные нули не поддерживаются, то числа, подобные 06088, вообще не должны генерироваться.
Тестовые случаи
Принятые выходы:
55373 55494 67611 61633 09033 99757 95944 22808 65622 22161
Не принятые результаты:
55555 77787 85855 12345 99233 12131 ABCDE 5033
Более приемлемые тестовые примеры можно найти по этой ссылке .
Они были сделаны с помощью этой программы Python:
импортировать случайный для меня в диапазоне (100): if random.randint (0,100)> = 50: # Поместить пару в начало, если это правда temp = [] # рабочий массив temp.append (random.randint (0,9)) #append случайная цифра temp.append (temp [0]) # снова приложить ту же цифру x = random.randint (0,9) пока x == temp [0]: x = random.randint (0,9) temp.append (x) #append еще одна уникальная цифра y = random.randint (0,9) в то время как y == temp [0] или y == temp [2]: y = random.randint (0,9) temp.append (y) #append еще одна уникальная цифра и предыдущая уникальная цифра temp.append (х) еще: # Положите касающуюся пару в конце temp = [] # рабочий массив temp.append (random.randint (0,9)) #append случайная цифра # Пока не уникально, попробуйте еще раз x = random.randint (0,9) пока x == temp [0]: x = random.randint (0,9) temp.append (x) #append еще одна уникальная цифра temp.append (temp [0]) # снова повторить ту же 0-ую цифру y = random.randint (0,9) в то время как y == temp [0] или y == temp [1]: y = random.randint (0,9) temp.append (y) #append еще одна уникальная цифра дважды temp.append (у) tempstr = "" для меня в темп: tempstr + = str (i) печать tempstr
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
random
это не значит, что все одинаковоОтветы:
05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
CJam (16 байт)
Онлайн демо
Примечание: я предположил, что под «уникальным» ОП действительно подразумевается «отличный».
Также для 16 байтов:
рассечение
Другие варианты генерируются с использованием
[1 0 1 2 2]
и затем выбирают либо результат, либо его реверс.источник
Perl 5 ,
816356 байтВырезать 7 байтов с вдохновением от @DomHastings
Построение номера по соответствующей схеме.
Попробуйте онлайн!
Perl 5 , 89 байт
Выбирает случайные 5-значные числа, пока не найдет то, которое соответствует критериям.
Попробуйте онлайн!
источник
time%2
он достаточно случайным или нет , поскольку в некотором смысле он находится под контролем пользователя.Python 2 , 80 байт
Попробуйте онлайн!
Выводит список цифр.
Python 2 , 83 байта
Попробуйте онлайн!
Выход - это число.
источник
APL (Dyalog Unicode) ,
22 21 20 1817 байтПопробуйте онлайн!
Если это приемлемо для вывода цифры всегда в том же формате, это может быть сокращено до 12 байт, либо
1⌽1↓,∘⌽⍨3?10
или3⌽1↓,∘⌽⍨3?10
.Сохранил байт, удалив ненужное
∘
.Благодаря H.PWiz сохранен байт, а затем еще 2 байта благодаря их подсказке.
Сохраненный байт благодаря ngn.
Функция предполагает
⎕IO←0
( I ndex O rigin).Как?
источник
Input
используется для вызова функцииg
. Кроме того, значениеg←
не учитывается при подсчете байтов, поскольку это необязательно, оно используется только для вызова функции.g
вызывается в разделе ввода, является всего лишь особенностью того, как APL настроен для работы на(4∨?2)
сохраняет байт больше1 4[?2]
f
и не используя поезд. Я оставлю это для вас , хотя :)Ява 8,
145136125119 байт-9 байт благодаря @ OlivierGrégoire.
-11 байт благодаря @RickHitchcock .
-6 байт благодаря @Nevay .
Объяснение:
Попробуйте онлайн.
источник
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
11 байтов.v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Желе , 23 байта
Попробуйте онлайн!
источник
Желе ,
1211 байтПопробуйте онлайн!
объяснение
(*) Правильный аргумент
ṃ
-['0','1','2',...,'9']
случайный список , состоящий из 10 элементов. Таким образом, число13122
будет преобразовано в биективное основание 10 ([1,3,1,2,2]
) и индекс в список (так что если список естьl
, возвращаемое значение атома[l[1],l[3],l[1],l[2],l[2]]
, где Jelly использует индексирование на основе 1)источник
JavaScript (ES6), 79 байт
Попробуйте онлайн!
Как?
Math.random()
дает случайное плавание в [0..1) . Мы используем+f
для принуждения к строке. Мы игнорируем ведущий ноль и десятичную точку, выполняя[,,
( деструктурируя присвоение первых двух символов нулю ), и собираем первые 4 десятичных знака в d , a , b и c .Если , b и c представляют собой 3 разных целых числа, мы создаем окончательный вывод в формате AABCB или BCBAA (используя четность d для принятия решения). В противном случае мы попробуем еще раз, пока они не будут.
В крайне маловероятном случае
Math.random()
возврата значения без достаточного количества десятичных разрядов, по крайней мере, c будет установлен в нецифровый символ, что приведет к сбою теста и выполнению рекурсивного вызова. Если а , б и c являются действительными целыми числами, то d также гарантированно является действительным целым числом, так что это не нужно проверять.источник
&&
могут быть&
. Кроме того, как[,,a,b,c,d]
работает? Я никогда не видел вход, как[,,
раньше.a=4, b=2, c=1
потому что4-2&4-1&2-1 == 2&3&1 == 0
. Я добавил краткое объяснение о назначении переменной.&&
чтобы&
в TIO и он дал правильные выходы, поэтому я предположил , что это было возможно. Не понял,&
вместо того,&&
чтобы отфильтровать в противном случае действительные результаты. И спасибо за добавленное объяснение о назначении деструктуры, никогда не видела его раньше.Perl 6 , 42 байта
Попробуйте онлайн!
источник
Грязный , 33 байта
Использует
--numeric-output
флаг, чтобы он был читаемым, иначе он выведет строку управляющих символов с кодовыми точками, соответствующими цифрам.Попробуйте онлайн!
Разъяснение:
источник
Древесный уголь , 34 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
источник
Сетчатка , 40 байт
Попробуйте онлайн!
Может печатать строки с ведущими нулями.
объяснение
Инициализируйте строку до 10 подчеркиваний.
Циклически транслитерируйте символы слова в цифры. Это немного странно. Символы
w
иd
являются короткими для следующих строк соответственно:Циклическая транслитерация означает, что сначала обе строки повторяются до длины их LCM:
Поскольку длины строк 53 и 10 взаимно просты, каждая копия
_
соединяется с другой цифрой. И теперь циклическая транслитерация заменит i- ую копию_
с i- й парой в этом расширенном списке. Таким образом, мы получаем следующую строку:Все это, чтобы сохранить один байт над литеральной строкой
0369258147
, так что, да, я думаю? : DВ любом случае, у нас есть строка из 10 цифр.
Это перемешивает цифры. Таким образом, первые три цифры будут равномерно случайным выбором трех различных цифр.
Мы сопоставляем строку
...ABC
и превращаем ее вBABCC
. То, как мы это делаем, довольно безумно, и опять же экономит только один байт по сравнению с более простым подходом. Сначала мы сопоставляем все пары символов перекрытия (v
), захватывая вторую (.(.)
). Тогда мы сохраняем только восьмой матч (с7
нуля), который находитсяAB
в...ABC
. Затем мы заменяем ($
) на:B
($1
),ABC
($<'
который является суффиксом разделителя совпадений слева от совпадения)C
($'
который является суффиксом самого совпадения).Наконец, мы сопоставляем либо 3 или 2 символа и перетасовать спички, давая нам либо
BABCC
илиCCBAB
в случайном порядке.источник
R , 78 байт
Попробуйте онлайн!
sample
3 выбирает случайные значения из0:9
, которые расположены в векторе таким образом:a b a c c
. Теперь у нас есть 50/50 шанс изменить этот вектор, а затем объединить и напечатать.источник
rt
, но по какой-то причине я думал, что это дольше ....(
как не-опера - хорошая находка :)PHP,
737266 байтРедактировать: 66 байт благодаря предложению @David.
Попробуйте онлайн!
источник
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, но, опять же, не «равномерно случайным». Btw. Я не был знаком сrand()%2
, так что ваш комментарий помог мне немного улучшить мое решение в любом случае.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Вы можете проверить, чтоarray_rand
второй параметр возвращает здесь только уникальные результаты (проверено более 10000 итераций).Красный ,
147, 146125 байтПопробуйте онлайн!
Ungolfed:
источник
Wolfram Language (Mathematica) , 59 байт
Попробуйте онлайн!
источник
Рубин ,
6059 байтПопробуйте онлайн!
Возвращает список цифр.
источник
Python 3 + NumPy, 69 байт
объяснение
источник
C (gcc) ,
126119 байтов-6 байт от @ceilingcat
Попробуйте онлайн!
источник
J 35 байт
Попробуйте онлайн!
Я уверен, что это может быть гораздо дальше.
Объяснение:
источник