一家彩票公司希望生成一个长度为10个字符的随机彩票号码。
用任何语言编写代码以创建这样的数字,其中每个数字仅出现一次,例如,9354716208在该数字中,从0到9的所有整数都仅出现一次。该数字应为随机数。
- 生成的号码应显示在屏幕上。
- 它必须能够生成所有允许字符的所有排列。
- 要求代码尽可能小(以字节为单位)。
一家彩票公司希望生成一个长度为10个字符的随机彩票号码。
用任何语言编写代码以创建这样的数字,其中每个数字仅出现一次,例如,9354716208在该数字中,从0到9的所有整数都仅出现一次。该数字应为随机数。
Answers:
无法抗拒。
?~10
在J中,如果F是dyadic,F~ x则与相同x F x。
[0..10),因此基本上意味着随机排列为'0123456789'。
Ĵ
10?10
J具有内置的交易运算符(?)。因此,我们可以从10(10?10)中取10 。
杀伤人员地雷
1-⍨10?10
APL具有相同的运算符,不幸的是,运算符以1而不是0开头。因此,我们从每个数字中减去一个(由于通勤算子而产生的1-⍨X平均值X-1)。
10#.
Python 2.7(64 63 57)
与繁重的操作员语言相比,这里没有机会,而且由于缺少默认加载的随机变量:)这是我能想到的最短的方法;
from random import*
print''.join(sample("0123456789",10))
它创建一个范围并从中采样10个数字而无需替换。
(感谢@xfix提供了较短的导入格式修复程序,感谢@blkknght指出了我较为复杂的采样范围)
Python 2.7(40)
如果从交互式提示符下运行它,并且可以读取逗号分隔的内容,则可以将其剃刮到40,但是感觉有点像违反规则的精神;
from random import*
sample(range(10),10)
from random import*用来保存一个字符。这看起来像我的Perl 6解决方案,但更冗长,但是很高兴看到这样的事情即使在更冗长的情况下也可以在Python中工作。
"0123456789"而不是使用rangeand它们映射来保存更多字符str。
PHP,29个字符
<?=str_shuffle('0123456789');
使用PHP,不需要结束标记。但是,如果这违反规则,则可以替换; ?>为1净增加。
<?=join('',array_rand(range(0,9),10))
我有一个18个字符的解决方案,理论上应该可以使用,但是PHP很奇怪。
或者,如果您想要xkcd答案:
<?="5398421706" // Chosen by program above; guaranteed to be random ?>
编辑:谢谢xfix,它现在短了5个字符,而且完整了。再次编辑:实时示例。
echo不需要括号,并且如果echo是程序中的第一条语句,则可以替换<?php echo为<?=。另外,join是的别名implode。
<?=和?>。没有这些,它就是有效的PHP代码。
echo 它的长度<?=与?>合并后的长度相同,没有这些长度,则无法在Codepad中使用。不过谢谢 :P
print pick *,^10
这会生成包含pick *从0到的所有随机元素()的数组,9并输出结果(print)。
样本输出:
$ perl6 -e 'print pick *,^10'
4801537269
$ perl6 -e 'print pick *,^10'
1970384265
$ perl6 -e 'print pick *,^10'
3571684902
pick。
[~](根据Perl 6语法将其解析为listop),如果其中包含任何参数,则需要在其后有一个空格(或paren)。否则,Perl 6编译器会抱怨“连续两个术语”。在旧版本的Perl 6中并不需要它,但这已成为过去。Perl 6仍在开发中。
print代替say [~]并保存2个字符:)
randIntNoRep(1,10
randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans。
八度(14)
randperm(10)-1
randperm 不幸的是从1..n中创建了一个选择,因此必须在末尾减去1以获得0-9。
DECLARE @RandomNo varchar(10)
SET @RandomNo = ''
;WITH num as (
SELECT 0 AS [number]
Union
select 1
Union
select 2
Union
select 3
Union
select 4
Union
select 5
Union
select 6
Union
select 7
Union
select 8
Union
select 9
)
SELECT Top 9 @RandomNo = COALESCE(@RandomNo + '', '') + cast(n.number AS varchar(1))
FROM numbers n
ORDER BY NEWID()
SELECT cast(@RandomNo AS numeric(10,0))
或使用递归和xml类似的东西(由@manatwork提供)。
with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')
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),...)
我决定不生成带有数字0-9的数组并对其进行排序,而是决定生成随机数。当它想出一个数组中还没有的数字时,就添加它。重复十次,然后警告输出。
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
||短路评估来节省1个字节,而不用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)
shuf -i0-9|paste -sd ''
shuf -i0-9|tr -d \\n
shuf -zi0-9
编辑:感谢Rob W,代码长度减少到90个字符。
编辑:感谢George Reith,代码长度减少到82个字符(用于循环)。
非常简单的方法:选择[0,1,2,3,4,5,6,7,8,9]数组的随机元素并将其附加到输出,然后减少数组并重播。
旧版本(106个字符):
a=[0,1,2,3,4,5,6,7,8,9],l=11,t="";while(--l){r=Math.floor(Math.random()*l);t+=a[r];a.splice(r,1);}alert(t)
可读版本:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], l = 10,t = "";
while(l--) {
r = Math.floor(Math.random() * l);
t += a[r];
a.splice(r, 1);
}
alert(t);
更好的版本(90个字符):
a="0123456789".split(t=""),l=11;while(--l)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)
最新版本(82个字符):
a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)
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变量是冗余的。
using System;
using System.Linq;
class P
{
static void Main()
{
Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);
}
}
using System;using System.Linq;class P{static void Main(){Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}
Enumerable.Range(0,10),并且foreach循环中不需要大括号。
alert("0123456789".split("").sort(function(){return .5-Math.random()}).join(""))
return和之间.5
-10?10
与J一样,?是交易运算符;在-力值不重复。
数字创建为字符串,以便在需要时允许零显示为第一个字符。
""<>RandomSample["0"~CharacterRange~"9"]
输出示例
“ 0568497231”
“ 6813029574”
说明
"0"~CharacterRange~"9" 是'CharacterRange [“ 0”,“ 9”]“的中缀表示法。这两个方法均返回列表{” 0“,” 1“,” 2“,” 3“,” 4“,” 5“,” 6“,” 7“,” 8“,” 9“}。
RandomSample[list]默认情况下,返回列表的排列。(当包含参数时,它还可以用于其他类型的采样。例如,RandomSample[list, 4]将返回4个字符的随机样本,没有重复。
我是Prolog的初学者,所以这可能不是最简洁的代码。
:- use_module(library(clpfd)).
sort(N) :-
N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
domain([N0],1,9),
domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
all_different(N),
labeling([],N).
返回值:
| ?- sort2(N).
N = [1,0,2,3,4,5,6,7,8,9] ? ;
N = [1,0,2,3,4,5,6,7,9,8] ? ;
N = [1,0,2,3,4,5,6,8,7,9] ? ;
N = [1,0,2,3,4,5,6,8,9,7] ? ;
N = [1,0,2,3,4,5,6,9,7,8] ?
yes
如果希望它返回整数:
:- use_module(library(clpfd)).
sort(M) :-
N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
domain([N0],1,9),
domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
all_different(N),
labeling([],N),
M is (N0*1000000000)+(N1*100000000)+(N2*10000000)+(N3*1000000)+
(N4*100000)+(N5*10000)+(N6*1000)+(N7*100)+(N8*10)+N9.
返回值:
| ?- sort(N).
N = 1023456789 ? ;
N = 1023456798 ? ;
N = 1023456879 ? ;
N = 1023456897 ? ;
N = 1023456978 ?
yes
改为使用:
labeling([down],N)
以相反的顺序给出数字:
| ?- sort(N).
N = 9876543210 ? n
N = 9876543201 ? n
N = 9876543120 ? n
N = 9876543102 ? n
N = 9876543021 ?
yes
与发布的某些其他代码不同,这将返回所有可能性(无重复)。
Clojure,42岁
(println (apply str (shuffle (range 10))))
6209847315
a=[];while(!a[9]){b=Math.floor(Math.random()*10);!a.includes(b)&&a.push(b)}alert(a)
在运行之前,直到数组具有10个元素。
从0-9生成随机数,然后检查数组!是否包括此数字并将其添加到数组中。
这并不比JMK的答案小很多,但是这里的C#解决方案稍微小一些(135):
using System;
using System.Linq;
class P {
static void Main()
{
Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid())));
}
}
压实(134):
using System;using System.Linq;class P{static void Main(){Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid())));}}
替代版本(135):
using System;
using System.Linq;
class P {
static void Main()
{
"0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);
}
}
压缩:
using System;using System.Linq;class P{static void Main(){"0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}
它们的长度相等,但实际上仅取决于您要使用Linq的ForEach函数还是String的Join函数。通过在字符串中拼出范围“ 0123456789”,而不是使用Enumerable.Range(0,10),我能够删除10个字符的长度。