无重复的随机数组


16

我在这里回答一个挑战,这项任务是挑战的一部分。我在JavaScript中有73个字节的解决方案。但是我认为简单的事情太过分了。

挑战

给出两个整数作为输入:

  • N 预期数组的长度
  • R的时间间隔的范围在开始一个:1..R,不0..R-1

在程序/函数的每次运行中,输出一个长度不同的数组,N其值之间的间隔1..R不超过一个。

您必须R-value在代码中使用。

限制条件

您可以假设:2 <= N <= R

我真的很想看到比我的73个字节短的javascript解决方案。

但是,当然,它对所有语言都开放!

如果您的语言无法返回数组,则可以打印所有数字;)


2
另一件事:我不希望您每次运行都希望它们有所不同,而只是均匀地随机?(否则,它将不起作用R=N=1)然后,我建议允许使用范围0..R作为替代,因为这对许多语言来说更加自然。
瑕疵的

我建议包括每个排列均等的可能性(假设完全随机),否则我可以做shuffle(0..N)
Nathan Merrill

在您更改规则之前,我发布了关于随机质量不一致的答案。
Conor O'Brien

1
您说的是均匀随机的解决方案,但是会new Date产生不均匀的值。此外,我相信您可以打高尔夫球new Date%r+1;)
Conor O'Brien

输出数组是否需要为整数?似乎很明显,但我没有看到它的明确说明
Charlie Wynn

Answers:


16

Dyalog APL,1个字节

?

只是内置的。在这里尝试。


3
有了这样的答案,我不得不向上滚动以查看您是否是OP
lbstr

2
@lbstr既然您提到了,我的identicon与OP十分相似。
lirtosiast '16

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 '16

7

八度,22 19 9字节

@randperm

randperm(r,n)完全符合要求。请注意,这在Matlab中不起作用(至少在较旧的版本中不起作用)。


1
@(n,r)randperm(r,n)
路易斯·门多

1
randperm在最新的Matlab版本中,具有两个输入的功能确实有效。还有randsample,但它需要更多的字节,除非您可以摆脱它@(...)(我认为这是允许的)
Luis Mendo

哦,我可以使用@randperm=)
更加模糊的

5

TI-84 BASIC OS 4.0,12字节

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

TI-84 + CSE(2013)和CE(2015)本质上是与TI-84 +相同的有限BASIC方言,但其中有一些新功能。其中之一是randIntNoRep的第三个参数。


1
坦率地说,他们从一开始就没有包含该功能是很愚蠢的。
SuperJedi224 '16

当我看到这一挑战时,我立即想到TI-Basic :)
Timtech '16

5

MATL,2个字节

Zr

输入是:首先R,然后N

在线尝试!

说明

该函数Zr有两个输入(在这种情况下是隐含的),并进行随机采样而不进行替换。第一个输入,R指定总体为[1,2,...,R]; 第二个输入N表示要从总体中抽取的样本数。



4

Pyth,6个字节

<.SSQE

在这里尝试!

范围在第一行,长度在第二行。

说明

<.SSQE#Q =范围,E =长度

   SQ#生成范围1 ... Q
 .S#随机排列列表
<E#取第一个E元素

非竞争性5字节版本

Q如果需要,对Pyth的最新添加将在程序末尾添加隐式s。我们可以在这里通过反转输入格式来使用它,因此长度是第一个,然后是范围。

<.SSE

在这里尝试!

E是范围,我们将其转换为基于1的列表S,使用将其洗牌,然后使用.S将其作为第一个Q元素<<期望一个整数,该整数会隐式地添加一个Q


4

礽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的答案击败了我,那将使我感到满意。如果我击败了Java回答者,那么也考虑一下我的工作。

一旦恢复,我将在以后再解释。通常,尽管:

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

这将生成随机数。另一部分检查是否存在重复项,如果存在重复项,则重复该过程。否则,将打印结果,并用空格将结果连接起来。

这里有些例子:

long gif


3

CJam,8个字节

{,:)mr<}

在这里尝试!

这是一个未命名的块,期望范围在堆栈顶部,长度在底部,并在堆栈上留下列表。

说明

,基于e#0的范围
:) e#inkrement列表中的每个元素,因此其从1开始
e#先生洗牌
<e#取前n个元素

这是一个快乐的节目:)
Conor O'Brien

1
@CᴏɴᴏʀO'Bʀɪᴇɴ如果CJam具有基于1的范围的内置函数,我会更开心,所以我不需要这个傻笑脸:P
Denker

2

普通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

𝔼𝕊𝕄𝕚𝕟,10个字符/ 13个字节

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

说明

           // implicit: î=input1, í=input2
  ⩤⁽1í)    // Inclusive range from 1 to í
Ѩŝ         // Shuffle resulting range
       ą-î // Get last îth items

2

Bash + coreutils,16

我认为这是不言而喻的:

seq $2|shuf -n$1

输入NR作为命令行参数。

或如@rici所指出的,对于相同的分数:

shuf -n$1 -i1-$2

伊迪恩


1
shuf -n$1 -i1-$2(长度相同)。
rici

@rici非常好。非常干净:)
Digital Trauma

1

PowerShell v2 +,30字节

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

取得输入$n$r,构建了一个范围1..$r,管道,为了Get-Random-C的'mount $n,这将选择$n从范围独特的元件。输出作为隐式数组留在管道上。


1

认真地,5个字节

,,R╨J

在线尝试!

说明:

,,R╨J
,,R    push N, range(1, R+1)
   ╨   push a list containing all N-length permutations of range(1, R+1)
    J  select a random element from the list

1

Clojure,38个字节

#(take %1(shuffle(map inc(range %2))))

匿名函数,N优先,R优先。


1

Perl 6,32字节

{(^$^a).permutations.pick[^$^b]}

1

蟒3.5 - 54个 53字节:

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

这使用random模块的sample()函数来返回长度为“ a”的数组,该数组由range中的随机唯一元素组成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矩阵进行排序,然后从整数的随机列。

enter image description here


有没有可以测试的地方?
Conor O'Brien

您可以下载Mathcad 15和Mathcad Prime 3.1(Mathcad 15的后续产品)的试用版。两次试用都运行了30天,此后M15停止运行,但Prime 3.1仍在运行,尽管功能有所减少(例如,没有编程-因此上述操作无效...但是可以将for循环重写为使用范围变量在增强语句之外创建v)
Stuart Bruff


以及如何计算这些字节?
Rɪᴋᴇʀ

从用户输入的角度看待它,并将一个Mathcad输入操作(通常是键盘,如果没有kbd快捷键,则在工具栏上单击鼠标)等同于一个字符,并将其解释为字节。csort = 5个字节,因为它按其他字符/函数名称逐字符地键入。for运算符是一种特殊的构造,占用11个字符(包括3个空白的“占位符”和3个空格),但由ctl-shft-#输入,因此= 1个字节(类似于某些语言中的标记)。键入'(引号)通常会创建括号,因此算作1个字节。索引v = 3个字节(类型v [k)。
Stuart Bruff

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


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.