ランダムチケットコードジェネレーター


18

宝くじ会社は、長さが10文字のランダムな宝くじチケット番号を生成したいと考えています。

すべての数字が1回だけ来るような数字を作成するために、任意の言語でコードを記述します。たとえば9354716208、この数字では、0から9までのすべての整数が1回だけです。この番号は乱数である必要があります。

  • 生成された番号が画面に表示されます。
  • すべての許容文字のすべての順列を生成できる必要があります。
  • コードはできるだけ小さくする必要があります(バイト単位)。

3
なぜJavaまたはPhPにする必要がありますか?
Fabinout

4
一般的に、code-golfの説明によると、すべての言語を許可することをお勧めします。
コンラッドボロスキー14年

10
@Howardのような人が5文字または8文字の回答を持っているときに、文字数さえ含まない最長かつ最小のゴルフ回答(SQL回答)の1つがコードゴルフで受け入れられた回答であるとはどういうことですか?
ダレンストーン14年

1
はい、@ marinusには4バイトのソリューションがあります(私の場合は6バイトです)
Timtech 14年

4
-1これはコードゴルフの挑戦であったため、勝者の選択は不適切です。
DavidC 14年

回答:


41

J(4バイト)

抵抗できませんでした。

?~10

Jで、Fがダイアディックの場合、はとF~ x同じx F xです。


3
+1これを打ち負かすには、Pythonよりも少し簡潔なものを試さなければならないかもしれないと思う。
ヨアヒムイザクソン

これにより、ゼロで始まるパスワードが許可されますか?規則によると、プログラムは「すべての可能な文字のすべての順列を生成することができなければならない」
DavidC

@DavidCarraher:はい。intervalから10個の非反復乱数を選択[0..10)するため、基本的には '0123456789'のランダム置換を意味します。
マリヌス14年

1
そうですか。ほとんどの言語では、「数値」の0123456789が自動的に123456789の形式に編集されるため、これを上げました。「0123456789」という文字列は変更されません。だから私の質問は本当にこれです:あなたの出力は数字ですか文字列ですか?
DavidC 14年

@DavidCarraherこれは配列です。
スウィッシュ

12

J、5文字およびAPL、8文字

J

10?10

Jには組み込みの取引演算子(?)があります。したがって、10のうち10を取得できます(10?10)。

APL

1-⍨10?10

APLには、残念ながらゼロではなく1で始まる同じ演算子があります。したがって、我々は(各数から1を減算している1-⍨X手段X-1により通勤オペレータに)。


ああ、すごい、いいね。
コンラッドボロスキー14年

OPは数ではない配列のために特別に求めているならば、あなたが、またbase10番号に変換する必要があります10#.
パッ

あなたはそれを仮定するかもしれ⎕IO←0ないので、あなたは1を引く必要はありません。また、JおよびAPLの両方のために、あなたがバイトを保存するために通勤を使用することができます?~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*1つのキャラクターを保存するために使用できます。これは私のPerl 6ソリューションのように見えますが、より冗長ですが、このようなものがより冗長であってもPythonで機能することを見るのは素晴らしいことです。
コンラッドボロスキー14年

@xfixはい、残念ながらPythonのモジュールは比較するのが少し冗長です:)インポートの修正で更新されました。
ヨアヒムイザクソン14年

マッピング"0123456789"を使用するのrangeではなく、文字列からサンプリングすることにより、さらにいくつかの文字を保存できますstr
Blckknght 14年

@Blckknghtありがとう、あなたの提案で更新:)
ヨアヒムIsaksson 14年

8

PHP、29文字

<?=str_shuffle('0123456789');

PHPでは、終了タグは必要ありません。しかし、それがルールに反する場合は、置き換えることができます; ?>で1純増加。


あなたは私にこの解決策を打ち負かしました。
ショーンビーバーズ

8

ルビー、18

これを実行しますirb

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

これをスタンドアロンプ​​ログラムに出力したい場合stdout(ルールはこれを必要としないようです)、次の4つの文字を最初に追加します。

$><<

に短縮(0..9).to_aでき[*0..9]ます。
ハワード14年

完了しました。ありがとう!
ダレンストーン

どういたしまして。しかし、なぜそもそも使用[*0..9].shuffleしないのですか?
ハワード14年

@Howard、それは遅くて、私は馬鹿だからです。:)ありがとう!
ダレンストーン14年

数ではない数でこの戻り配列

8

PHP-37文字

<?=join('',array_rand(range(0,9),10))

理論的には動作するはずの18文字のソリューションがありましたが、PHPは奇妙です。

または、xkcdの回答が必要な場合:

<?="5398421706" // Chosen by program above; guaranteed to be random ?>

編集:おかげでxfix、5文字短くなりました。EDIT AGAIN:ライブの例


完全な部分だけでなく、完全なプログラムを作成します。また、echo括弧を必要としない、とあればechoプログラムの最初のステートメントである、あなたは置き換えることができ<?php echo<?=。また、joinはのエイリアスですimplode
コンラッドボロウスキ14年

@xfixありがとう、修正します。:)
cjfaure 14年

あなたも必要ありません<?=?>。これらのない有効なPHPコードです。
ジェレミー14年

@Jeremyゴルフでは、番号を表示する必要があります。それに加えて、echo 長さは同じ<?=?>結合されており、それらがないとコードパッドでは機能しません。どうもありがとう。:P
cjfaure 14年

1
@Jeremy Ah、PHP。端末以外の非組み込み実装はほとんどありません。:P
cjfaure 14年

8

Perl 6(18 16文字)

print pick *,^10

これによりpick *0to からすべてのランダム要素()を含む配列が生成され9、結果(print)が出力されます。

サンプル出力:

$ perl6 -e 'print pick *,^10'
4801537269
$ perl6 -e 'print pick *,^10'
1970384265
$ perl6 -e 'print pick *,^10'
3571684902

+1前に空白は必要ないと思いますpick
ハワード14年

1
@ハワード:私は実際にそれが必要です。[~](Perl 6文法によると、listopとして解析されます)引数が含まれている場合、その後に空白(または括弧)が必要です。それ以外の場合、Perl 6コンパイラーは「2つの用語が並んでいる」ことを訴えます。Perl 6の古いバージョンでは必要ありませんでしたが、これは過去です。Perl 6はまだ作業中です。
コンラッドボロスキー14年

1
@xfix:使用printの代わりsay [~]と2セーブで文字:)
Ayiko

@Ayiko:改善してくれてありがとう:)。
コンラッドボロウスキ14年

7

GolfScript、12文字

10,{;9rand}$

単純に数字のリスト(10,)を生成し、{...}$いくつかのランダムキーに従って並べ替えます-数字のランダムな順序が生成されます。

例(オンラインで試す):

4860972315

0137462985

私はこれを投稿しようとしていました:P
ドアノブ

しかしがらくたシャッフルの者は親切、その:例えば、最初の桁は交換1よりも0である可能性が高いとして約3倍である9randとの99rand考え(主に)修正という。実質的に完璧9.?randでしょう。
イルマリカロネン14年

1
@IlmariKaronen私は知っていますが、質問は均一な分布については何も言いませんでした。
ハワード14年

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ます。
リルトシアスト

2
私はこのチャレンジが整数型を必要とするのではなく、「生成された数を画面に表示する」だけだと思います。
ティムテック

うーん、私は行ったように、質問は(数を求めていたと思った人を、それが明らかになっていませんでした挑戦の作者の意図と思われるリスト(JおよびAPL)のようないくつかの他のソリューションの出力をどのような場合には。。
lirtosiast

まあ、この方法は短いので、確信がない限り、私はそれを仮定しません。
ティムテック

5

オクターブ(14)

randperm(10)-1

randperm 残念ながら、1..nから選択範囲を作成するため、最後に1を引いて0-9を取得する必要があります。


5

SQLサーバー内

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()。)
マナトワーク14年

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('')
マナトワーク14年

あなたはとのCTEを簡素化することができます(VALUES (1),(2),...)
ypercubeᵀᴹ

5

Javascript(79 78 68文字)

0〜9の数字で配列を作成して並べ替えるのではなく、乱数を生成することにしました。まだ配列にない番号を思いついたら、それを追加しました。これは10回繰り返され、出力を警告します。

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)
スティーブンPalinkas

1
@StevenPalinkasありがとう、素晴らしいアイデア!それに応じて投稿を更新しました。
scribblemaniac

:我々はまた、コード内の再配置のビットと2バイト節約することができますfor(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
スティーブンPalinkas

私たちは、使用して、追加の8つのバイトを保存することができ、「速記」:同じようMath.floorのためにfor(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
スティーブンPalinkas


4

Shell / Coreutils、23

shuf -i0-9|paste -sd ''

私たちは、末尾の改行を必要としない場合は、あなたが20にこれを剃ることができますshuf -i0-9|tr -d \\n
joeytwiddle

どうshuf -zi0-9
ですか-marcosm

@marcosm:ゼロで終了する行が表示されますが、これは少し奇妙です。
-Hasturkun

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 14年

@RobWヒントをありがとう。回答を更新しました。PS私はあなたが意味すると思いますMath.floor(x) === 0|x
gthacoder

1
これは常に最後に9を持ちます。修正するには、While l=11ループ条件を初期化して切り替えますwhile(--l)
グレッグ14年

@グレッグ良い点。ありがとうございました。答えを更新しました。
gthacoder 14年

1
82文字:a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)-コードはforループの初期化、条件、および式の引数に完全に適合します。r変数が冗長です。
ジョージリース14年

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ループ内に中括弧は必要ありません。
リック14年

3

JavaScript(80文字)

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

JS-フィドル:http : //jsfiddle.net/IQAndreas/3rmza/


3
これは使用することによって、さらにgolfedことができます矢印機能(現在はFFで動作しますが、どこでも通訳にすぐに来ている):alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
apsillers

1
returnとの間にスペースは必要ありません.5
Tibos 14年

1
@Greg Shhhh!実際のシャッフル機能が何文字使用するか考えていますか?;)
IQAndreas 14年

1
@Gregこれはランダムな分布(Math.randomが十分にランダムであると仮定)であり、均一な分布ではありません。
SuperJedi224

1
元のブログ投稿はなくなり、後世のためのインターネットアーカイブが追加されました:web.archive.org/web/20150212083701/http
Greg

3

K /コナ(6)

-10?10

Jと同様に?、取引演算子です。これにより-、値が繰り返されなくなります。


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を表示するのでしょうか?
アンクシュ14年

OPによると、プログラムは「すべての許可された文字のすべての順列を生成できなければなりません」。
DavidC 14年

@Ankushこれは中置表記法なので、「0」は常に最初の文字ではありません。
アジャシャ14年

アジャシャは正しいです。プログラムは任意の順列を生成できます。これを明確にするために、上記のいくつかのコメントを追加しました。
DavidC 14年


2

フォース、72

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

まだゴルフの余地があるかもしれませんが、フォースはこれを難しくしました。おもう。


2

プロローグ、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

Clojure、42

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

6209847315


生成された番号は、部品ではなく画面に表示される必要があります。
シル

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関数を使用するかによって異なります。Enumerable.Range(0、10)を使用する代わりに、文字列の範囲「0123456789」をスペルアウトすることで、長さ10文字を削除できました。


1

ロゴ、64文字

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

pickは、指定されたリストのランダムなアイテム返します。 butmemberは、指定されたアイテムのすべての出現を削除したリストを返します。 注:すべてのロゴ実装がbutmemberコマンドをサポートするわけではありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.