반복없는 무작위 배열


16

나는 여기서 하나의 도전에 대답하고 있었고이 과제는 도전의 일부였습니다. 자바 스크립트에 73 바이트 솔루션이 있습니다. 그러나 나는 그것이 단순한 것을하기에는 너무 많다고 생각합니다.

도전

두 개의 정수를 입력으로 제공합니다.

  • N 예상되는 배열의 길이
  • R: 간격의 하나부터 범위입니다 1..R,하지0..R-1

프로그램 / 함수의 각 실행 에서 하나의 값이 두 번 이상 발생하지 않는 방식으로 N값을 갖는 하나의 다른 길이의 배열을 출력 1..R합니다.

R-value코드에서 사용해야합니다 .

제한 사항

다음을 가정 할 수 있습니다 2 <= N <= R..

실제로 73 바이트보다 짧은 자바 스크립트 솔루션을보고 싶습니다.

물론 모든 언어에 개방되어 있습니다!

언어가 배열을 반환 할 수 없으면 모든 숫자를 인쇄 할 수 있습니다.)


2
또 다른 것은 : 나는 당신이 그들이 매 실행마다 다르기를 원한다고 생각하지 않지만, 균일하게 무작위입니까? (그렇지 않으면 작동하지 않습니다. R=N=1) 그런 다음 0..R여러 언어에 더 자연스럽게 적용 되므로 범위 를 대안으로 허용하는 것이 좋습니다 .
flawr

나는 다른 내가 할 수있는, (완벽한 임의성 가정) 각 순열 똑같이 가능성이 있음을 포함한 추천했던shuffle(0..N)
나단 메릴

규칙을 변경하기 전에 비 균일 무작위 품질에 대한 답변을 게시했습니다.
Conor O'Brien

1
균일하게 임의의 솔루션을 말하지만 균일 new Date하지 않은 값을 생성합니다. 또한 골프를하실 수 있다고 생각합니다 new Date%r+1.)
Conor O'Brien

출력 배열은 정수 여야합니까? 명백해 보이지만, 명시 적으로 언급되어 있지 않습니다
Charlie Wynn

답변:


16

Dyalog APL, 1 바이트

?

그냥 내장되어 있습니다. 여기서 사용해보십시오 .


3
이 같은 대답으로, 나는 당신이 OP를 알아보기 위해 다시 이동했다
lbstr

2
@lbstr 이제 언급했듯이, 나의 identicon은 OP와 매우 유사합니다.
lirtosiast

9

자바 스크립트 (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 Thanks =) 또 다른 2 바이트를 면도했습니다.
Mwr247

7

옥타브, 22 19 9 바이트

@randperm

randperm(r,n)요청한 내용을 정확하게 수행합니다. Matlab에서는 (이전 버전에서는 작동하지 않습니다.)


1
@(n,r)randperm(r,n)
Luis Mendo

1
randperm최신 Matlab 버전에서는 두 개의 입력이 있습니다. 또한 randsample(하지만 @(...)허용됩니다)
Luis Mendo

@randperm=) 를 사용할 수 있습니다
flawr

5

TI-84 기본 OS 4.0, 12 바이트

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

TI-84 + CSE (2013) 및 CE (2015)는 기본적으로 TI-84 +와 동일한 제한된 기본 방언이지만 몇 가지 새로운 기능이 있습니다. 그중 하나가 randIntNoRep의 세 번째 주장입니다.


1
솔직히 말해서, 처음부터 그 기능을 포함하지 않았다는 것은 어리석은 일입니다.
SuperJedi224

나는이 도전을 보았을 때 TI-Basic을 즉시 생각했습니다. :)
Timtech

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 바이트 버전

Pyth에 마지막으로 추가 Q하면 필요한 경우 프로그램 끝에 암시 적을 추가 합니다. 입력 형식을 반대로하여 여기에서 사용할 수 있으므로 길이가 먼저오고 그 다음에 범위가옵니다.

<.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 답변으로 나를 이길 경우, 그것은 내 하루를 만들 것입니다. Java 답변을 이길 경우 내 하루도 고려하십시오.

일단 복구하면 나중에 자세히 설명하겠습니다. 그러나 일반적으로 :

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

이것은 난수를 생성합니다. 다른 부분은 중복이 있는지 확인하고 존재하는 경우 프로세스가 반복됩니다. 그렇지 않으면 결과가 결합되어 결과가 결합됩니다.

여기 몇 가지 예가 있어요.

long gif


3

CJam, 8 바이트

{,:)mr<}

여기 사용해보십시오!

이것은 이름이 지정되지 않은 블록으로 스택 상단의 범위와 하단의 길이를 예상하고 스택에 목록을 남깁니다.

설명

, e # 0 기반 범위
:) e #은 목록의 각 요소를 1부터 시작하도록합니다.
미스터 e #는 목록을 셔플
<e #는 첫 n 개의 요소를 취합니다

이것은 하나의 행복한 프로그램입니다 :)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ CJam에 1 기반 범위가 내장되어 있으면 더 행복 할 것이므로이 웃는 얼굴이 필요하지 않습니다. : P
Denker

2

커먼 리스프, 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 chars / 13 bytes

Ѩŝ⩤⁽1í)ą-î

Try it here (Firefox only).

Explanation

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

2

Bash + coreutils, 16

I think this is self-explanatory:

seq $2|shuf -n$1

Input N and R as command-line parameters.

Or as @rici points out, for the same score:

shuf -n$1 -i1-$2

Ideone.


1
or shuf -n$1 -i1-$2 (same length, though).
rici

@rici very nice. very clean :)
Digital Trauma

1

PowerShell v2+, 30 bytes

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

Takes input $n and $r, constructs a range 1..$r, pipes that to Get-Random with a -Count of $n, which will select $n unique elements from the range. Output is left on the pipeline as an implicit array.


1

Seriously, 5 bytes

,,R╨J

Try it online!

Explanation:

,,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 bytes

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

An anonymous function taking N first and R second.


1

Perl 6, 32 bytes

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

1

Python 3.5 - 54 53 bytes:

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

This uses the random module's sample() function to return an array with length "a" consisting of random, unique elements in the range 1 => c.


1

D, 29 bytes (expression only)

Assuming that std.random and std.range have been imported and that n and r are defined as variables, the program can be solved in the single expression:

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)

Like in @Mwr247's answer, you can call it with F(R)(N), F being the function expression


0

Mathcad, 67 "bytes"

creates a column vector of consecutive integers in range 1..R, joins it to a column vector of length R of (uniform) random numbers, sorts the resulting Rx2 matrix on the random number column, and then extracts the first n numbers from the randomized column of integers.

enter image description here


Is there a place we can test this?
Conor O'Brien

You can download trial versions of Mathcad 15 and Mathcad Prime 3.1 (the successor to Mathcad 15). Both trials run for 30 days, after which M15 stops working, but Prime 3.1 still runs, albeit with reduced functionality (eg, no programming - so the above won't work ... but the for loop can be rewritten to use range variables to create v outside of the augment statement)
Stuart Bruff


And how do you count these bytes?
Rɪᴋᴇʀ

By looking at it from a user input perspective and equating one Mathcad input operation (keyboard usually, mouse-click on toolbar if no kbd shortcut) to a character and interpreting this as a byte. csort = 5 bytes as it's typed char-by-char as are other variable/function names. The for operator is a special construct that occupies 11 characters (including 3 blank "placeholders" and 3 spaces) but is entered by ctl-shft-#, hence = 1 byte (similar to tokens in some languages). Typing ' (quote)creates balanced parentheses (usually) so counts as 1 byte. Indexing v = 3 bytes (type v[k).
Stuart Bruff

0

Python, 56 (the obvious way)

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) is shorter by a byte
Mego

Huh, I did consider from random import*, must've screwed up the counting.
shooqie

0

Perl 5, 51 43 bytes

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

Pretty straightforward anonymous sub that generates an array from 1 to R and then splices N random elements from it to return. Call with ->(N, R).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.