宝くじ会社は、長さが10文字のランダムな宝くじチケット番号を生成したいと考えています。
すべての数字が1回だけ来るような数字を作成するために、任意の言語でコードを記述します。たとえば9354716208、この数字では、0から9までのすべての整数が1回だけです。この番号は乱数である必要があります。
- 生成された番号が画面に表示されます。
- すべての許容文字のすべての順列を生成できる必要があります。
- コードはできるだけ小さくする必要があります(バイト単位)。
宝くじ会社は、長さが10文字のランダムな宝くじチケット番号を生成したいと考えています。
すべての数字が1回だけ来るような数字を作成するために、任意の言語でコードを記述します。たとえば9354716208、この数字では、0から9までのすべての整数が1回だけです。この番号は乱数である必要があります。
回答:
抵抗できませんでした。
?~10
Jで、Fがダイアディックの場合、はとF~ x同じx F xです。
[0..10)するため、基本的には '0123456789'のランダム置換を意味します。
J
10?10
Jには組み込みの取引演算子(?)があります。したがって、10のうち10を取得できます(10?10)。
APL
1-⍨10?10
APLには、残念ながらゼロではなく1で始まる同じ演算子があります。したがって、我々は(各数から1を減算している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*1つのキャラクターを保存するために使用できます。これは私のPerl 6ソリューションのように見えますが、より冗長ですが、このようなものがより冗長であってもPythonで機能することを見るのは素晴らしいことです。
"0123456789"を使用するのrangeではなく、文字列からサンプリングすることにより、さらにいくつかの文字を保存できますstr。
これを実行しますirb:
[*0..9].shuffle*''
これをスタンドアロンプログラムに出力したい場合stdout(ルールはこれを必要としないようです)、次の4つの文字を最初に追加します。
$><<
(0..9).to_aでき[*0..9]ます。
[*0..9].shuffleしないのですか?
<?=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。
<?=と?>。これらのない有効なPHPコードです。
echo 長さは同じ<?=で?>結合されており、それらがないとコードパッドでは機能しません。どうもありがとう。:P
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
pick。
[~](Perl 6文法によると、listopとして解析されます)引数が含まれている場合、その後に空白(または括弧)が必要です。それ以外の場合、Perl 6コンパイラーは「2つの用語が並んでいる」ことを訴えます。Perl 6の古いバージョンでは必要ありませんでしたが、これは過去です。Perl 6はまだ作業中です。
printの代わりsay [~]と2セーブで文字:)
10,{;9rand}$
単純に数字のリスト(10,)を生成し、{...}$いくつかのランダムキーに従って並べ替えます-数字のランダムな順序が生成されます。
例(オンラインで試す):
4860972315
0137462985
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('')
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の数字で配列を作成して並べ替えるのではなく、乱数を生成することにしました。まだ配列にない番号を思いついたら、それを追加しました。これは10回繰り返され、出力を警告します。
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)
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(--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(""))
JS-フィドル:http : //jsfiddle.net/IQAndreas/3rmza/
returnとの間にスペースは必要ありません.5
番号は、必要に応じて最初の文字としてゼロを表示できるように、文字列として作成されます。
""<>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文字のランダムサンプルを返します。
util.Random.shuffle(0 to 9).mkString
私は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
投稿された他のコードとは異なり、これはすべての可能性を返します(繰り返しはありません)。
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関数を使用するかによって異なります。Enumerable.Range(0、10)を使用する代わりに、文字列の範囲「0123456789」をスペルアウトすることで、長さ10文字を削除できました。