随机票证代码生成器


18

一家彩票公司希望生成一个长度为10个字符的随机彩票号码。

用任何语言编写代码以创建这样的数字,其中每个数字仅出现一次,例如,9354716208在该数字中,从0到9的所有整数都仅出现一次。该数字应为随机数。

  • 生成的号码应显示在屏幕上。
  • 它必须能够生成所有允许字符的所有排列。
  • 要求代码尽可能小(以字节为单位)。

3
为什么要用Java或PhP?
Fabinout 2014年

4
通常,根据代码高尔夫球的描述,允许任何语言都是一个好主意。
Konrad Borowski

10
当像@Howard这样的人有5个或8个字符的答案时,最长且最少打高尔夫球的答案(SQL答案)之一(甚至没有字符数)如何成为代码高尔夫球中可接受的答案?
Darren Stone

1
是的,@ marinus有一个4字节的解决方案(我的是6字节)
Timtech

4
-1鉴于这是一场高尔夫挑战赛,因此选择获奖者是不适当的。
DavidC 2014年

Answers:


41

J(4个字节)

无法抗拒。

?~10

在J中,如果F是dyadic,F~ x则与相同x F x


3
+1我想我可能不得不尝试比Python更简洁的方式来击败它。
Joachim Isaksson 2014年

这是否允许以零开头的密码?根据规则,程序“必须能够生成所有允许字符的所有排列”
DavidC 2014年

@DavidCarraher:是的。它从该间隔中选择10个非重复的随机数[0..10),因此基本上意味着随机排列为'0123456789'。
marinus 2014年

1
我知道了。我提出这个问题是因为在大多数语言中,“数字” 0123456789将自动被编辑为123456789形式。字符串“ 0123456789”保持不变。所以我的问题确实是这样的:您的输出是数字还是字符串?
DavidC 2014年

@DavidCarraher这是一个数组。
2014年

12

J,5个字符,APL,8个字符

Ĵ

10?10

J具有内置的交易运算符(?)。因此,我们可以从10(10?10)中取10 。

杀伤人员地雷

1-⍨10?10

APL具有相同的运算符,不幸的是,运算符以1而不是0开头。因此,我们从每个数字中减去一个(由于通勤算子而产生的1-⍨X平均值X-1)。


哦,哇,太好了。
Konrad Borowski14年

如果OP会特别要求提供数字而不是数组,则还应将其转换为base10数字,并加上10#.
swish

您可以假设⎕IO←0这样,您不必减去一。另外,对于J和APL,您都可以使用commute来保存字节,?~10并且?⍨10由于派生函数的单子应用程序也将其右参数用作左参数。但是请注意,这使得J代码与Marinus的J代码相同。
亚当

9

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)

1
您可以from random import*用来保存一个字符。这看起来像我的Perl 6解决方案,但更冗长,但是很高兴看到这样的事情即使在更冗长的情况下也可以在Python中工作。
Konrad Borowski14年

@xfix是的,可悲的是,Python中的模块在比较时有些冗长:)使用导入修复程序进行了更新,这对高尔夫运动来说是很新的,因此不符合我的习惯用法。
Joachim Isaksson 2014年

您可以通过从字符串采样"0123456789"而不是使用rangeand它们映射来保存更多字符str
Blckknght 2014年

@Blckknght谢谢,更新了您的建议:)
Joachim Isaksson

8

PHP,29个字符

<?=str_shuffle('0123456789');

使用PHP,不需要结束标记。但是,如果这违反规则,则可以替换; ?>为1净增加。


你打败我这个解决方案。
Shaun Bebbers

8

红宝石,18岁

irb以下位置运行:

[*0..9].shuffle*''

如果您希望它是一个独立的程序,输出为stdout(规则似乎不需要这样做),那么请在开始时添加以下四个字符:

$><<

您可以缩短(0..9).to_a[*0..9]
霍华德

做完了,先生。谢谢!
达伦·斯通

别客气。但是为什么不首先使用[*0..9].shuffle
霍华德

@霍华德,因为已经晚了,我很傻。:) 谢谢!
达伦·斯通

此返回数组的编号为非数字

8

PHP-37个字符

<?=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
Konrad Borowski14年

@xfix谢谢,我会解决。:)
cjfaure

您甚至不需要<?=?>。没有这些,它就是有效的PHP代码。
杰里米2014年

@Jeremy高尔夫要求显示数字;此外,echo 它的长度<?=?>合并后的长度相同,没有这些长度,则无法在Codepad中使用。不过谢谢 :P
cjfaure

1
@Jeremy Ah,PHP,除终端外,非嵌入式实现非常稀缺。:P
cjfaure

8

Perl 6(18岁 16个字符)

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

+1我认为您之前不需要空格pick
霍华德

1
@霍华德:我真的需要它。[~](根据Perl 6语法将其解析为listop),如果其中包含任何参数,则需要在其后有一个空格(或paren)。否则,Perl 6编译器会抱怨“连续两个术语”。在旧版本的Perl 6中并不需要它,但这已成为过去。Perl 6仍在开发中。
Konrad Borowski

1
@xfix:使用print代替say [~]并保存2个字符:)
Ayiko

@Ayiko:感谢您的改进:)。
Konrad Borowski14年

7

GolfScript,12个字符

10,{;9rand}$

只需生成数字列表(10,)并{...}$根据一些随机键对其进行排序-这将产生数字的随机顺序。

示例(在线尝试):

4860972315

0137462985

我正要发布此内容:P
门把手

这类型的废话洗牌,但:例如,第一个数字是大约三倍,可能是0比1,更换9rand99rand会(大部分)的修复程序; 9.?rand几乎完美
Ilmari Karonen 2014年

1
我知道@IlmariKaronen,但问题没有说明统一分配。
2014年

6

R(23个字符)

cat(sample(0:9),sep="")

样本输出:

> cat(sample(0:9),sep="")
3570984216
> cat(sample(0:9),sep="")
3820791654
> cat(sample(0:9),sep="")
0548697132

6

TI-BASIC,5个字节

randIntNoRep(1,10

显示列表而不是数字。您正在寻找randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans
lirtosiast

2
我认为此挑战不需要整数类型,而只是“生成的数字应显示在屏幕上”。
Timtech '17

嗯,我以为这个问题要问一个数字(其他人也想问这个问题,但似乎挑战者的意图从未得到澄清。无论如何,其他解决方案都以列表的形式输出(J和APL)
。– lirtosiast

好吧,除非确定,否则我不会假设,因为这种方法更短。
Timtech '17


5

在SQL Server中

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('')

1
伙计,您喜欢CTE ...但是,由于这是代码高尔夫的挑战,因此最好将其尽可能缩短。我最好的是186个字符: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()。)
manatwork 2014年

1
好吧,你是对的。CTE较短。106个字符:with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')
manatwork 2014年

你可以简单地用CTE(VALUES (1),(2),...)
ypercubeᵀᴹ

5

Javascript(79 78 68个字符)

我决定不生成带有数字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)
Steven Palinkas

1
@StevenPalinkas谢谢,好主意!我已经相应地更新了帖子。
scribblemaniac

我们还可以在代码中进行一些重新排列,以节省2个字节:for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas

我们可以使用Math.floor 的“简写形式”额外保存8个字节,例如:for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas



4

JavaScript,82个字符

编辑:感谢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/


1
我将您的方法简化为90个字符: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='')。这比使用数组文字创建数组并在单独的表达式中分配字符串值要短。
罗布W

@RobW感谢您的提示。我更新了答案。附言:我想你的意思是Math.floor(x) === 0|x
gthacoder 2014年

1
最后总是有9。要修复,初始化l=11和将while循环条件切换为while(--l)
Greg

@Greg好点。谢谢。我更新了答案。
gthacoder 2014年

1
82个字符:a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)-您的代码非常适合for循环的初始化,条件和表达式参数。该r变量是冗余的。
George Reith 2014年

4

C#,145个字节

不打高尔夫球

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);}}

1
您可以使用Enumerable.Range(0,10),并且foreach循环中不需要大括号。
里克2014年

3

JavaScript(80个字符)

alert("0123456789".split("").sort(function(){return .5-Math.random()}).join(""))

JS小提琴:http//jsfiddle.net/IQAndreas/3rmza/


3
请注意,可以使用箭头功能(目前仅在FF中有效,但很快将在世界各地的口译人员使用)进行alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
打高尔夫球

1
您不需要在return和之间.5
放置

1
@格雷格嘘您知道一个真正的混洗功能需要多少个字符吗?;)
IQAndreas 2014年

1
@Greg这是一个随机分布(假设Math.random足够随机),它不是统一的。
SuperJedi224

1
原始博客文章不见了,添加了后代的互联网存档:web.archive.org/web/20150212083701/http
Greg


3

Mathematica 40

数字创建为字符串,以便在需要时允许零显示为第一个字符。

""<>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个字符的随机样本,没有重复。


但是为什么要显示0作为第一个字符?
Ankush 2014年

根据OP,程序“必须能够生成所有允许字符的所有排列”。
DavidC 2014年

@Ankush这是中缀表示法,因此“ 0”并不总是第一个字符。
2014年

Ajasja是正确的。该程序可以生成任何排列。我在上面添加了一些说明以澄清这一点。
DavidC 2014年


2

福斯72

needs random.fs : r ': '0 do i loop 9 for i 1+ random roll emit next ; r

可能还有打高尔夫球的空间,但是Forth很难做到这一点。我认为。


2

Prolog,177/302个字符

我是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

与发布的某些其他代码不同,这将返回所有可能性(无重复)。



2

√奥ÏØ¿,4字节

XrśO

X    › Push 10 to the stack
 r   › Push the range from [1...10]
  ś  › Shuffle the stack
   O › Output the whole stack separated by spaces

2

Clojure,42岁

(println (apply str (shuffle (range 10))))

6209847315


生成的数字应显示在屏幕上,而不是部分显示。
Sylwester 2014年

2

Javascript,83个字符

a=[];while(!a[9]){b=Math.floor(Math.random()*10);!a.includes(b)&&a.push(b)}alert(a)

在运行之前,直到数组具有10个元素。

从0-9生成随机数,然后检查数组!是否包括此数字并将其添加到数组中。


1
欢迎光临本站!:)
DJMcMayhem

1

这并不比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个字符的长度。


1

LOGO,64个字符

make "d 1234567890
repeat 10 [
    make "n pick d
    show n
    make "d butmember n d
]

pick返回所提供列表的随机项目。 butmember返回列表,其中删除了所有出现的指定项目。 注意:并非所有徽标实现都支持butmember命令。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.