配列にはすべての数値を0-n含める必要があります。数字は繰り返さないでください。ただし、それらはランダムな順序でなければなりません。
ルール
すべての標準コードゴルフ規則と標準抜け穴が禁止されています
配列は擬似ランダムに生成する必要があります。可能なすべての順列は、等しい確率を持つ必要があります。
入力
n メタのI / O投稿で許可される方法。
出力
スクランブルされた数値の配列0-n。
配列にはすべての数値を0-n含める必要があります。数字は繰り返さないでください。ただし、それらはランダムな順序でなければなりません。
すべての標準コードゴルフ規則と標準抜け穴が禁止されています
配列は擬似ランダムに生成する必要があります。可能なすべての順列は、等しい確率を持つ必要があります。
n メタのI / O投稿で許可される方法。
スクランブルされた数値の配列0-n。
回答:
{pick *,0..$_}
{ # bare block lambda with implicit parameter 「$_」
pick # choose randomly without repeats
*, # Whatever (all)
0 .. $_ # Range from 0, to the input (inclusive)
}
0rẊ
解説:
0rẊ
0r Inclusive range 0 to input.
Ẋ Shuffle.
Implicit print.
‘ḶẊ
説明:
‘ḶẊ
‘ Input +1
Ḷ Range 0 to argument.
Ẋ Shuffle.
lambda n:sample(range(n+1),n+1)
from random import*
ありますrandom.shuffle()が、引数を返す代わりにその場で変更します...
random.shuffle
lambda n:shuffle(range(n+1))どこにも出力を書き込みません。
QZ@q
Q % Implicitly input n. Add 1
Z@ % Random permutation of [1 2 ... n+1]
q % Subtract 1, element-wise. Implicitly display
Erik the Outgolferのおかげで1バイトが削除されました。
{),mr}
これは、スタックから整数を取得して結果で置き換える匿名ブロック(関数)です。オンラインでお試しください!
{ e# Begin block
) e# Increment: n+1
, e# Range: [0 1 ... n]
mr e# Shuffle
} e# End block
{),mr}1バイトは短くないですか?
import java.util.*;n->{List l=new Stack();for(;n>=0;l.add(n--));Collections.shuffle(l);return l;}
-3バイト。@OlivierGrégoireのおかげでバグ修正。@Jakobの
おかげで-4バイト。
を削除して-10バイト。.toArray()
説明:
import java.util.*; // Required import for List, Stack and Collections
n->{ // Method with integer parameter and Object-array return-type
List l=new Stack(); // Initialize a List
for(;n>=0;l.add(n--)); // Loop to fill the list with 0 through `n`
Collections.shuffle(l); // Randomly shuffle the List
return l; // Convert the List to an Object-array and return it
} // End of method
n。修正とゴルフ:for(n++;--n>=0;l.add(n));。また、配列を返す必要はありません。配列とリストはほとんどの言語で同じなので、リストを返すだけです。
>する必要があります>=。
Stack代わりにa Vectorを使用し、ループをに変更しますfor(;n>=0;l.add(n--));。そして、を返すことjava.util.Listは間違いなく大丈夫です。
.S整数の引数ではと同じで.SU、[0..n]としてコード化Uhできるので.SUh、使用できます.Sh。
a[99],z,y;f(n){if(n){a[n]=--n;f(n);z=a[n];a[n]=a[y=rand()%(n+1)];a[y]=z;}}
途中で配列の終わりから初期化し、途中でランダム要素と交換する再帰関数。
n > 98?
aより規則に合うようにパラに変更しますか?
A…·⁰NβFβ«AβδA‽δθPIθ↓A⟦⟧βFδ¿⁻θκ⊞βκ
オンラインでお試しください!リンクは、コードの詳細バージョンです。
どうやら、Charcoalのリストから要素を削除するには17バイトかかります。
編集:最近では、リストからアイテムのすべての出現を削除することを想定して、3バイトしかかかりません。これに加えて、他のチャコールの変更により、回答が21バイトに削減されました。オンラインで試してください!
?⍨1+⊢
想定 ⎕IO←0ます。これは多くのマシンでデフォルトです。
⊢ 正しい議論
1+ 1を追加します
?⍨数値0 .. 1+⊢-1を生成し、2つの数値が繰り返されないように配列でランダムに処理します
解決:
{(0-x)?1+x}
例:
q){(0-x)?1+x}10
5 9 7 1 2 4 8 0 3 10
q){(0-x)?1+x}10
6 10 2 8 4 5 9 0 7 3
q){(0-x)?1+x}10
9 6 4 1 10 8 2 7 0 5
説明:
重複のない完全なリストを提供するには、負の入力で? 演算子を使用します0->n。
{(0-x)?1+x} / solution
{ } / lambda expression
x / implicit input
1+ / add one
? / rand
(0-x) / negate x, 'dont put item back in the bag'
randIntNoRep(0,Ans
うん、ビルトイン。randIntNoRep(は2バイトのトークンであり、Ans1バイトです。
Ans→N
seq(X,X,0,N→L₁
rand(N+1→L₂
SortA(L₂,L₁
L₁
tibasicdevから直接。おそらくゴルフはできますが、私はまだ何も見つけていません。
これがすること:ランダム配列をソートし、2番目の引数(L₁ここ)の要素を対応する要素と同じ方法で移動します。
n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())
f(5)10回試してみました5が、毎回最後の2つの項目の1つです。
f(5)1e5回実行するクイックテストを実行し、結果の各数値の平均位置を見つけるだけです。結果の配列は[ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ]だったので、均一ではないと思います。(コード)
n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
random()は均一ではありません。(たとえば)en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
PRNGをシードする必要性にほとんど負けています。
import(."fmt";."math/rand";."time")
func f(n int){Seed(Now().UnixNano());Println(Perm(n+1))}
->n{[*0..n].shuffle}
(?@!A.i.)>:
>: | Increment
(?@!A.i.) | Fork, (f g h) n is evaluated as (f n) g (h n)
i. | Integers in range [0,n) inclusive
?@! | Random integer in the range [0, n!)
A. | Permute right argument according to left
例:
0 A. i.>:5
0 1 2 3 4 5
1 A. i.>:5
0 1 2 3 5 4
(?@!A.i.)>: 5
2 3 5 1 0 4
(?@!A.i.)>: 5
0 3 5 1 2 4
proc R n {lsort -c {try expr\ rand()>.5 on 9} [if [incr n -1]+2 {concat [R $n] [incr n]}]}
proc R n {proc f a\ b {expr rand()>.5}
set i -1
while \$i<$n {lappend L [incr i]}
lsort -c f $L}