Лотерейная компания хочет сгенерировать случайный лотерейный билет длиной 10 символов.
Напишите код на любом языке, чтобы создать такое число, в котором каждая цифра встречается только один раз, например, 9354716208
в этом числе все целые числа от 0 до 9 встречаются только один раз. Это число должно быть случайным числом.
- Сгенерированный номер должен отображаться на экране.
- Он должен быть в состоянии генерировать все перестановки всех допустимых символов.
- Код должен быть как можно меньше (в байтах).
Ответы:
J (4 байта)
Не смог устоять.
В J, если
F
двоично,F~ x
то же самое, что иx F x
.источник
[0..10)
, так что в основном это означает случайную перестановку «0123456789».J, 5 символов и APL, 8 символов
J
У J есть встроенный оператор сделки (
?
). Таким образом, мы можем взять 10 из 10 (10?10
).APL
APL имеет тот же оператор, который, к сожалению, начинается с единицы вместо нуля. Поэтому мы вычитаем по одному из каждого числа (
1-⍨X
значит,X-1
из-за коммутирующего оператора).источник
10#.
⎕IO←0
вам не нужно вычитать. Кроме того, как для J, так и для APL, вы можете использовать commute для сохранения байта с,?~10
и?⍨10
поскольку монадическое применение производной функции использует свой правый аргумент также в качестве левого аргумента. Отметим, однако, что это делает код J идентичным коду Marinus .Python 2,7 (
646357)Здесь нет шансов по сравнению с тяжелыми языками оператора и из-за отсутствия загруженного по умолчанию случайного числа :) Это самое короткое, что я мог придумать;
Он создает диапазон и выбирает из него 10 номеров без замены.
(Спасибо @xfix за более короткое исправление формата импорта и @blkknght за указание на мой довольно сложный диапазон выборки)
Python 2,7 (40)
Если вы запускаете его из интерактивного приглашения и можете читать через запятую, вы можете сбрить его до 40, но это немного похоже на нарушение духа правил;
источник
from random import*
чтобы сохранить один символ. Это похоже на моё решение на Perl 6, но более многословно, но приятно видеть, что что-то подобное может работать в Python, даже если более многословно."0123456789"
а не используяrange
их сопоставлениеstr
.PHP, 29 символов
<?=str_shuffle('0123456789');
В PHP закрывающий тег не требуется. Но если это противоречит правилам, вы можете заменить; с?> за 1 чистое увеличение.
источник
Руби, 18
Запустите это в
irb
:Если вы хотите, чтобы это была отдельная программа с выводом в
stdout
(правила, кажется, этого не требуют ), добавьте эти 4 символа в начале:источник
(0..9).to_a
до[*0..9]
.[*0..9].shuffle
в первую очередь?PHP - 37 символов
У меня было 18-символьное решение, которое теоретически должно работать, но PHP странный.
Или, если вы хотите получить ответ xkcd:
РЕДАКТИРОВАТЬ: Спасибо xfix, теперь он на 5 символов короче и завершено. ИЗМЕНИТЬ СНОВА: живой пример .
источник
echo
паренсы не нужны, и еслиecho
это первое утверждение в программе, вы можете заменить<?php echo
на<?=
. Кроме того,join
это псевдоним дляimplode
.<?=
и?>
. Это действительный код PHP без них.echo
это та же длина, что<?=
и в?>
сочетании, и без них она не работает в Codepad. Спасибо хоть. : PPerl 6 (
1816 символов)Это генерирует массив, содержащий все случайные элементы (
pick *
) из0
to9
и выводит результат (print
).Образец вывода:
источник
pick
.[~]
(который анализируется как листоп, согласно грамматике Perl 6) требует пробела (или paren) после него, если он содержит какие-либо аргументы. В противном случае компилятор Perl 6 жалуется на «два члена подряд». В старых версиях Perl 6 этого не было, но это уже прошлое. Perl 6 все еще работает надprint
вместоsay [~]
и сохраните 2 символа :)GolfScript, 12 символов
Просто генерирует список цифр (
10,
) и сортирует его{...}$
по некоторым случайным ключам - что дает случайный порядок цифр.Примеры (попробуйте онлайн ):
источник
9rand
на99rand
это (в основном) исправит это;9.?rand
было бы практически идеально .R (23 символа)
Образец вывода:
источник
TI-BASIC, 5 байтов
источник
randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans
.Октава (14)
randperm
к сожалению, создает выборку из 1..n, поэтому нужно вычесть 1 в конце, чтобы получить 0-9.источник
В sql server
Посмотреть демо
ИЛИ что-то похожее (любезно предоставлено @manatwork) с использованием рекурсии и xml.
источник
select i+0from(select 0i union select 1union select 2union select 3union select 4union select 5union select 6union select 7union select 8union select 9)f order by newid()for xml path('')
. (Кстати, отличный трюкnewid()
.)with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')
.(VALUES (1),(2),...)
Javascript (
797868 символов)Вместо того, чтобы создавать массив с номерами 0-9 и сортировать его, я решил создать случайные числа. Когда он придумал число, которого еще не было в массиве, то добавил его. Это повторяется десять раз, а затем оповещает о выходе.
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
источник
||
оценку короткого замыкания вместоif
:for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Математика, 27
источник
Shell / Coreutils, 23
источник
shuf -i0-9|tr -d \\n
shuf -zi0-9
JavaScript, 82 символа
РЕДАКТИРОВАТЬ: Благодаря Робу W , длина кода уменьшена до 90 символов.
РЕДАКТИРОВАТЬ: Благодаря Джорджу Риту , длина кода сокращена до 82 символов (используется для цикла).
Довольно простой способ: выбрать случайный элемент
[0,1,2,3,4,5,6,7,8,9]
массива и добавить его к выводу, затем уменьшить массив и переиграть.Старая версия (106 символов):
Читаемая версия:
Лучшая версия (90 символов):
Последняя версия (82 символа):
JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .
источник
a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)
. Большие вкладчики:Math.random(x)
===0|x
. Замените фигурные скобки и точки с запятой запятыми. Непосредственно используйте результат присваивания в качестве значения вместо использования промежуточной переменной. Наконец, инициализируйте исходный массив, используя.split(r='')
. Это короче, чем создание массива с использованием литералов массива и присвоение строкового значения в отдельном выражении.Math.floor(x) === 0|x
.l=11
и переключить состояние цикла while наwhile(--l)
a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)
- Ваш код идеально вписывается в инициализацию циклов for, условия и аргументы выражений.r
Переменной является излишним.C #, 145 байт
Ungolfed
Golfed
источник
Enumerable.Range(0,10)
, и вам не нужны фигурные скобки вforeach
цикле.JavaScript (80 символов)
JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/
источник
alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
return
и.5
К / Кона (6)
Как и в случае с J,
?
является оператором сделки; что-
силы значения , которые не повторяются.источник
Mathematica 40
Число создается в виде строки, чтобы при необходимости можно было отображать ноль в качестве первого символа.
Примеры вывода
объяснение
"0"~CharacterRange~"9"
является инфиксной нотацией для CharacterRange ["0", "9"] ". Любой из них возвращает список, {" 0 "," 1 "," 2 "," 3 "," 4 "," 5 "," 6" , "7", "8", "9"}.RandomSample[list]
по умолчанию возвращает перестановку списка. (Он также может быть использован для других видов выборки, когда включены параметры. НапримерRandomSample[list, 4]
, вернет случайную выборку из 4 символов без повторов.источник
Скала, 37
источник
Далее 72
Возможно, еще есть место для игры в гольф, но Форт сделал это трудно. Я думаю.
источник
Пролог, 177/302 персонажа
Я новичок в Прологе, так что, вероятно, это не самый сжатый код.
Возвращает:
Если вы хотите, чтобы он возвращал целое число:
Возвращает:
Использование вместо:
Дает числа в обратном порядке:
В отличие от некоторых других опубликованных кодов, это возвращает все возможности (без повторов).
источник
q / kdb [6 символов]
сгенерирует 10 уникальных случайных чисел.
источник
√ å ı ¥ ® Ï Ø ¿ , 4 байта
источник
Clojure, 42
источник
Javascript, 83 символа
Пока работает, пока массив не имеет 10 элементов.
Генерация случайного числа от 0 до 9, затем проверьте, включает ли массив! Это число, и добавьте его в массив.
источник
Это не намного меньше, чем ответ JMK, но вот немного меньшее решение C # (135):
Уплотнено (134):
Альтернативная версия (135):
Уплотненный:
Они равны по длине, но на самом деле это зависит только от того, хотите ли вы использовать функцию LinE ForEach или функцию String Join. Мне удалось удалить 10 символов длиной, указав в строке диапазон «0123456789» вместо использования Enumerable.Range (0, 10).
источник
ЛОГОТИП , 64 символа
pick возвращает случайный элемент из предоставленного списка. butmember возвращает список, в котором все вхождения указанного элемента удалены. Примечание. Не все реализации логотипа поддерживают
butmember
команду.источник
Ракетка
4543источник