繰り返しのないランダム配列


16

ここで1つの課題に答えていましたが、このタスクは課題の一部でした。私はjavascriptで73バイトのソリューションを持っています。しかし、単純なことには多すぎると思います。

チャレンジ

入力として2つの整数を与えます:

  • N 予想される配列の長さ
  • R1で始まる間隔の範囲:1..Rではなく0..R-1

プログラム/関数の実行ごとに、1つの値が複数回発生しないようにN値が異なる長さの1つの異なる配列を出力します1..R

R-valueコードで使用する必要があります。

制限事項

以下を想定できます2 <= N <= R

私は本当に73バイトより短いJavaScriptソリューションを見たいと思っています。

しかし、もちろん、それはすべての言語に開かれています!

あなたの言語が配列を返せない場合、すべての数字を印刷できます;)


2
別のこと:私はあなたがそれらを実行ごとに変えたいとは思わないが、ただ一様にランダムに?(それ以外の場合は機能しませんR=N=10..Rこれは、多くの言語にとってより自然になるため、代替として範囲を許可することをお勧めします。
flawr

私は他の私が行うことができ、(完全なランダムと仮定)各順列が等しく可能性が高いことを含めて推薦のだshuffle(0..N)
ネイサンメリル

ルールを変更する前に、不均一なランダム品質の回答を投稿しました。
コナーオブライエン

1
一様にランダムな解と言いますが、new Date値は一様ではありません。さらに、私はあなたがそれをゴルフできると信じていますnew Date%r+1;)
コナーオブライエン

出力配列は整数である必要がありますか?明らかなように見えますが、明確に述べられているとは思いません
チャーリーウィン

回答:


16

Dyalog APL、1バイト

?

ただビルトイン。ここで試してみてください


3
このような答えで、私はあなたがOPであるかどうかを確認するために上にスクロールしなければなりませんでした
-lbstr

2
@lbstrこれでおわかりのように、私のidenticonはOPによく似ています。
リトシアスト

9

JavaScript(ES6)、68 66バイト

n=>r=>G=(s=new Set)=>s.size<n?G(s.add(Math.random()*r+1|0)):[...s]

として呼び出されます。F(N)(R)()ここFで、は関数の割り当て、N/ Rは値です。

Jsで73バイト未満を要求しました;)

編集:@ C5H8NNaO4による答えは、ルールが値を指定していないという事実の中で機能します1..R。それを考えると、バージョンは63バイトで動作します(と呼ばれますF(R)(N)):

r=>G=(n,s=[])=>n--?G((s[n]=n+1,n),s):s.sort(a=>new Date/a%1-.5)

男、これは印象的です!! +1
削除

@WashingtonGuedesありがとう=)さらに2バイト削りました。
Mwr247

7

オクターブ、22 19 9バイト

@randperm

randperm(r,n)要求されたとおりに実行します。これは、Matlabでは動作しません(少なくとも古いバージョンでは動作しません)。


1
@(n,r)randperm(r,n)
ルイスメンドー

1
randperm2つの入力は、最新のMatlabバージョンで機能します。もありrandsampleますが、それを取り除くことができない限り、より多くのバイトがかかります@(...)(許可されていると思います)
ルイスメンドー

ああ使用できます@randperm=)
flawr

5

TI-84ベーシックOS 4.0、12バイト

Prompt N,R:randIntNoRep(1,R,N

TI-84 + CSE(2013)およびCE(2015)は、基本的にTI-84 +と同じ限定BASIC方言ですが、いくつかの新しい機能があります。それらの1つはrandIntNoRepの3番目の引数です。


1
率直に言って、彼らが最初からその機能を含めなかったのはちょっとばかげている。
SuperJedi224

私はこの挑戦:)見たとき、私はすぐにTI-Basicを考えた
Timtech

5

MATL、2バイト

Zr

入力は次のとおりです。 R、、thenの順になりNます。

オンラインでお試しください!

説明

この関数Zrは2つの入力(この場合は暗黙的に)を受け取り、置換なしでランダムサンプリングを行います。最初の入力、Rは母集団が[1,2,...,R];であることを指定します。2番目の入力はN、母集団から取得するサンプルの数を示します。


4

J、4 3バイト

Zgarbのおかげで1バイト節約できました!(4つの線を消しても、通常の4:Dのままです

1+?

などのようN (1+?) Rに呼び出します3 (1+?) 10。これは「Roll」演算子を使用し、を除き、説明されているとおりに実行し0...n-1ます。これを許可された場合、答えは1バイトになり、

?


@tac Ah、gotcah
コナーオブライエン

4

Pyth、6バイト

<.SSQE

ここで試してみてください!

範囲は最初の行にあり、長さは2行目にあります。

説明

<.SSQE#Q =範囲、E =長さ

   SQ#範囲1 ... Qを生成
 .S#リストをシャッフル
<E#最初のE要素を取得

競合しない5バイトバージョン

Pythへの最後の追加Qは、必要に応じてプログラムの最後に暗黙的なsを追加します。ここでは、入力形式を逆にすることでこれを使用できます。そのため、長さが最初になり、次に範囲が続きます。

<.SSE

ここで試してみてください!

ここでE我々が1ベースのリストに変身範囲、であるS、とそれをシャッフル.Sし、最初のテイクQを持つ要素が<<で暗黙的に追加される整数が必要ですQ


4

Rengのv.2.1、140の 103 98 97バイト

これは以前のバージョンでも動作するはずです。

v      v      $/$'l#y0#z>(:)):(ez+#z zt>a$;!
>i#ci#x>cu1+lxetv    j21\!q   yy#-1y($/^
>n?~v
^oW <

ここで試すことができます!入力はmaximum lengthなど10 3です。

私はこれをとても誇りに思っています、あなたも知りません。誰かがJavaの答えで私をbeatったら、それは私の一日になります。Javaの答えに勝った場合は、私の1日も考慮に入れてください。

回復したら、後で詳しく説明します。ただし、一般的に:

v         v      $/$r$
>i#bbi1+#x>:u1+lxet

これにより、乱数が生成されます。他の部分は重複があるかどうかをチェックし、重複がある場合はプロセスが繰り返されます。それ以外の場合、結果はスペースで区切られて印刷されます。

ここではいくつかの例を示します。

long gif


3

CJam、8バイト

{,:)mr<}

ここで試してみてください!

これは名前のないブロックで、スタックの上部の範囲と下部の長さを期待し、スタックにリストを残します。

説明

、e#0ベースの範囲
:) e#リストの各要素をインクリメントして、その1から始まる
mr e#リストをシャッフル
<e#は最初のn個の要素を取ります

これは1つの幸せなプログラムです:)
コナーオブライエン

1
CJamは1ベースの範囲のための組み込みを持っていた場合、私はこのダムのsmileyface必要はありませんので、CᴏɴᴏʀO'Bʀɪᴇɴ私は、幸せになるでしょう@:Pを
Denker

2

Common Lisp、90

式のみの場合は52

(use-package :alexandria)(lambda(R N)(coerce(subseq(shuffle(iota R :start 1))0 N)'vector))

非ゴルフ

;; Well known library
(use-package :alexandria)

(lambda(R N)
  (coerce                   ; make a vector from a list 
    (subseq                 ; take the sublist from 0 to N
      (shuffle              ; shuffle a list
        (iota R :start 1))  ; build a list from 1 to R
    0 N)
    'vector))

他の答えと同様に、use-packagelambdaをカウントしない場合、残りの式は(coerce(subseq(shuffle(iota R :start 1))0 N)'vector)52バイトです。


2

ルビー、27 23バイト

匿名機能、適度に短く甘い。

@manatworkから-4バイト

->n,r{[*1..r].sample n}

->n,r{[*1..r].sample n}インラインコードマークアップの代わりにコードブロックマークアップを使用してください。CodeGolf UserScript Enhancement Packなどのスクリプトは、コードサイズを横に挿入できます。
マナトワーク

よし、今は修正されています。
バリューインク


2

Bash + coreutils、16

これは一目瞭然だと思います。

seq $2|shuf -n$1

入力NおよびRコマンドラインパラメーターとして。

または、@ riciが指摘するように、同じスコアに対して:

shuf -n$1 -i1-$2

イデオネ。


1
またはshuf -n$1 -i1-$2(同じ長さですが)。
リチ

@riciとてもいい。非常にきれい:)
デジタル外傷

1

PowerShell v2 +、30バイト

param($n,$r)1..$r|Random -c $n

入力を受け取ります $n$r、範囲を構成する1..$r、とパイプGet-Random-Cのount $n選択する、$n範囲から一意の要素。出力は、暗黙的な配列としてパイプラインに残されます。





1

Pythonの3.5 - 54、53バイト:

from random import*;lambda a,c:sample(range(1,c+1),a)

これはrandomモジュールのsample()関数を使用して、範囲内のランダムな一意の要素で構成される長さ「a」の配列を返します1 => c


1

D、29バイト(式のみ)

std.randomとstd.rangeがインポートされ、nとrが変数として定義されていると仮定すると、プログラムは単一の式で解決できます。

iota(1,r).randomCover.take(n)

1

ES6、72

r=>n=>[...Array(-~r).keys()].sort(a=>new Date/a%1-.5).filter(a=>a&&n-->0)

@ Mwr247の答えのように、関数式であるF(R)(N)で呼び出すことができますF


0

Mathcad、67「バイト」

範囲1..Rの連続した整数の列ベクトルを作成し、それを(一様な)乱数の長さRの列ベクトルに結合し、結果のRx2行列を乱数列で並べ替えてから、最初のn個の数値を抽出します整数のランダム化された列。

enter image description here


これをテストできる場所はありますか?
コナーオブライエン

Mathcad 15およびMathcad Prime 3.1(Mathcad 15の後継)の試用版をダウンロードできます。両方のトライアルは30日間実行され、その後、M15は動作を停止しますが、機能は低下しますが(たとえば、プログラミングは行われません-上記は動作しませんが... forループは範囲変数を使用するように書き換えられます)拡張ステートメントの外でvを作成するには)
スチュアートブラフ


そして、これらのバイトをどのようにカウントしますか?
Rɪᴋᴇʀ

ユーザー入力の観点からそれを見て、1つのMathcad入力操作(キーボード、kbdショートカットがない場合はツールバー上でマウスクリック)を文字と同等にし、これをバイトとして解釈します。csort = 5バイト。他の変数/関数名と同様に文字ごとに入力されます。for演算子は、11文字(3つの空白の「プレースホルダー」と3つのスペースを含む)を占有する特殊な構造ですが、ctl-shft-#によって入力されるため、= 1バイト(一部の言語のトークンと同様)です。'(引用符)を入力すると、バランスの取れた括弧が(通常)作成されるため、1バイトとしてカウントされます。インデックス付けv = 3バイト(タイプv [k)。
スチュアートブラフ

0

Python、56(明白な方法)

lambda N,R:__import__('random').sample(range(1,R+1),k=N)

from random import*;lambda N,R:sample(range(1,R+1),k=N)バイトによって短い
MEGO

フー、私は考慮from random import*しました、カウントを台無しにしたに違いない
shooqie

0

Perl 5の、51の 43バイト

sub{@a=1..pop;map{splice@a,rand@a,1}1..pop}

1からRまでの配列を生成し、そこからN個のランダムな要素をスプライスして返す非常に単純な匿名サブ。で呼び出し->(N, R)ます。


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