Випадковий масив без повторення


16

Я відповідав на один виклик тут, і це завдання було частиною виклику. Я отримав 73-байтне рішення в JavaScript. Але я вважаю, що це занадто багато для простої речі.

Виклик

Введено як вхід два цілих числа:

  • N довжина очікуваного масиву
  • Rдіапазон інтервалу, починаючи з одного:, 1..Rне0..R-1

Виведіть у кожному запуску програми / функції один різний масив довжини Nзі значеннями, 1..Rтаким чином, щоб жодне значення не виникало більше одного разу.

Ви повинні використовувати R-valueу своєму коді.

Обмеження

Можна припустити: 2 <= N <= R.

Я дійсно хотів би бачити рішення JavaScript коротше, ніж моє 73 байти.

Але звичайно, він відкритий для всіх мов!

Якщо ваша мова не може повернути масив, ви можете надрукувати всі числа;)


2
Інша річ: я не думаю, що ти хочеш, щоб вони з кожним пробігом були різними, а просто рівномірно випадковими? (Інакше це не спрацює R=N=1) Тоді я рекомендую дозволити діапазони 0..Rяк альтернативу, оскільки це є більш природним для багатьох мов.
недолік

Я б рекомендував включати, щоб кожна перестановка була однаково вірогідною (припускаючи ідеальну випадковість), інакше я можу зробитиshuffle(0..N)
Натан Меррілл

Я розмістив свою відповідь про неоднорідну випадкову якість, перш ніж ви змінили своє правило.
Conor O'Brien

1
Ви кажете рівномірно випадкове рішення, але new Dateдає неоднорідні значення. Далі, я вважаю, ви можете пограти в нього new Date%r+1;)
Conor O'Brien

Чи повинен вихідний масив бути цілими числами? Здається, очевидно, але я не бачу цього прямо сказаного
Charlie Wynn

Відповіді:


16

Діалог APL, 1 байт

?

Просто вбудований. Спробуйте тут .


3
Маючи таку відповідь, мені довелося прокрутити назад, щоб побачити, чи був ти ОП
lbstr

2
@lbstr Тепер, коли ви це згадуєте, мій ідентикон досить схожий на ОП.
lirtosiast

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є значеннями.

Ви попросили менше, ніж 73 байти в Js;)

EDIT: Відповідь @ 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
randpermз двома входами працює в останніх версіях Matlab. Є також randsample, але це займає більше байтів, якщо ви не зможете позбутися від @(...)(я думаю, що це дозволено)
Луїс Мендо

О, я можу використовувати @randperm=)
flawr

5

TI-84 BASIC OS 4.0, 12 байт

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

TI-84 + CSE (2013) та CE (2015) - це по суті такий же обмежений діалект BASIC, як і TI-84 +, але є кілька нових особливостей. Один з них - третій аргумент randIntNoRep.


1
Чесно кажучи, це нерозумно, що вони не включали цю функцію з самого початку.
SuperJedi224

Я відразу подумав про TI-Basic, коли побачив цей виклик :)
Timtech

5

MATL , 2 байти

Zr

Вхідні дані: спочатку R, потім N.

Спробуйте в Інтернеті!

Пояснення

Функція Zrзаймає два входи (неявно в даному випадку) і робить випадкову вибірку без заміни. Перший вхід, Rвказує, що чисельність населення [1,2,...,R]; а другий вхід, Nвказує кількість проб, які потрібно взяти у популяції.


4

J, 4 3 байти

Один байт збережено завдяки Згарбу! ( Закреслені чотири досі є звичайними чотирма: D )

1+?

називають як N (1+?) R, наприклад, 3 (1+?) 10. Для цього використовується оператор "Roll" і виконує саме те, що описано, крім під 0...n-1. Якби нам було дозволено це зробити, то відповідь буде 1 байт,

?


@tac Ах, gotcah
Conor O'Brien

4

Pyth, 6 байт

<.SSQE

Спробуйте тут!

Діапазон виходить на першому рядку, а довжина на другому.

Пояснення

<.SSQE # Q = діапазон, E = довжина

   SQ # генерує діапазон 1 ... Q
 .S # перетасувати список
<E # візьміть перші елементи Е

Неконкурентна 5-байтна версія

Останнє додаток до Pyth додає неявні Qs в кінці програми, якщо це необхідно. Ми можемо використати це тут, змінивши формат введення, тож спочатку настає довжина, а потім діапазон.

<.SSE

Спробуйте тут!

Ось Eдіапазон, з яким ми перетворюємось на 1-й список S, переміщуємо його .Sта беремо перші Qелементи <. <очікує ціле число, яке неявно додається з a 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 на основі
:) е # інкремент кожного елемента списку так його 1-базований
mr 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-package та лямбда , то решта вираження становить (coerce(subseq(shuffle(iota R :start 1))0 N)'vector)52 байти.


2

Рубі, 27 23 байти

Анонімна функція, досить коротка і мила.

-4 байти від @manatwork

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

->n,r{[*1..r].sample n}Будь ласка, використовуйте розмітку коду коду замість вбудованої розмітки коду, щоб такі сценарії, як Code Golf UserScript EnScript, могли вставити розмір коду поруч.
манатура

Гаразд, це вже виправлено.
Значення чорнила

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

Вхідні дані Nта Rпараметри командного рядка.

Або, як зазначає @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унтом $n, які виберуть $nунікальні елементи з діапазону. Вихід залишається на конвеєрі як неявний масив.



1

Clojure, 38 байт

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

Анонімна функція, що приймає N першої та R секунди.



1

Python 3,5 - 54 53 байти:

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

При цьому використовується 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


Чи є місце, де ми можемо це перевірити?
Conor O'Brien

Ви можете завантажити пробні версії Mathcad 15 та Mathcad Prime 3.1 (спадкоємця Mathcad 15). Обидва випробування тривають протягом 30 днів, після чого M15 перестає працювати, але Prime 3.1 все ще працює, хоча і з обмеженою функціональністю (наприклад, відсутність програмування - тому вищезгадане не буде працювати ... але цикл for може бути переписаний для використання змінних діапазону щоб створити v поза висловлюванням розширення)
Стюарт Брюфф


І як ви рахуєте ці байти?
Rɪᴋᴇʀ

Дивлячись на це з точки зору введення користувача та прирівнюючи одну операцію введення Mathcad (клавіатура зазвичай, клацніть мишею на панелі інструментів, якщо немає ярлика kbd), до символу та інтерпретуючи це як байт. csort = 5 байт, як це вводиться char-by-char, як і інші назви змінних / функцій. Оператор for - це спеціальна конструкція, яка займає 11 символів (включаючи 3 порожні «заповнювачі» та 3 пробіли), але вводиться ctl-shft- #, отже = 1 байт (подібно до лексем у деяких мовах). Введення тексту (цитата) створює збалансовані дужки (зазвичай), тому вважається 1 байтом. Індексація v = 3 байти (тип v [k).
Стюарт Брюфф

0

Пітона, 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).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.