สุ่มสเกลาร์ของอาร์เรย์


14

คุณต้องกรอกข้อมูลในอาร์เรย์ด้วยตัวเลขทุกตัวจาก0-nรวม ไม่ควรใช้หมายเลขซ้ำ อย่างไรก็ตามพวกเขาจะต้องอยู่ในลำดับสุ่ม

กฎระเบียบ

ทุกมาตรฐานกฎและช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

อาร์เรย์ต้องถูกสร้างขึ้นแบบสุ่มหลอก ทุกการเปลี่ยนแปลงที่เป็นไปได้ควรมีความน่าจะเป็นที่เท่ากัน

อินพุต

n ในทางใดก็ตามที่ได้รับอนุญาตในโพสต์ I / O บนเมตา

เอาท์พุต

อาร์เรย์ของตัวเลขมีสัญญาณรบกวนจาก0-nรวม


สามารถแยกออกเป็นบรรทัดใหม่ได้หรือไม่
DrnglVrgs

@Riley opps ที่ตั้งใจจะหายไป
Christopher

@DrnglVrgs ใช่มันสามารถ
Christopher

โดย "numbers" ฉันถือว่าคุณหมายถึง "จำนวนเต็ม" หรือไม่
Zacharý

1
@KevinCruijssen IMO รายการ = อาร์เรย์ แต่ด้วยการสนับสนุนการค้นหา ดังนั้นโปรดใช้รายการ
คริสโตเฟอร์

คำตอบ:




8

Pyth, 3 ไบต์

.Sh

สาธิต

.Sกำลังสับเปลี่ยน มันโดยปริยายดุจจำนวนเต็มป้อนข้อมูลในช่วงn เป็นและนำเข้าโดยปริยาย[0, 1, ..., n-1]h+1




5

Python 2 , 51 ไบต์

lambda n:sample(range(n+1),n+1)
from random import*

ลองออนไลน์!

มีrandom.shuffle()แต่มันจะแก้ไขข้อโต้แย้งในสถานที่แทนที่จะส่งกลับ ...


คุณสามารถใช้random.shuffle
caird coinheringaahing

@cairdcoinheringaahing ใช่ แต่นั่นไม่ได้ผล ตัวอย่างเช่นlambda n:shuffle(range(n+1))จะไม่เขียนผลลัพธ์ที่ใดก็ได้
สิ้นเชิงมนุษย์






3

Japt , 4 ไบต์

ò öx

ลองออนไลน์


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.

เอ้ยฉันมันคิดว่าöxจะเพียงพอจนกว่าฉันจะสังเกตเห็นส่วน "รวม" (คุณสามารถแทนที่xด้วยเกือบทุกอย่าง btw)
ETHproductions

@ ETHproductions นั่นเป็นความคิดแรกของฉันด้วย
Shaggy

3

C #, 76 ไบต์

using System.Linq;i=>new int[i+1].Select(x=>i--).OrderBy(x=>Guid.NewGuid());

สิ่งนี้คืนค่า IOrderedEnumerable ฉันหวังว่าไม่เป็นไรหรืออื่นฉันต้องการไบต์เพิ่มอีกสองสามไบต์สำหรับ. ToArray ()


3

CJam , 7 6 ไบต์

1 ไบต์ลบออกขอบคุณที่เอริก Outgolfer

{),mr}

นี่คือบล็อกที่ไม่ระบุชื่อ (ฟังก์ชัน) ที่ใช้จำนวนเต็มจากสแต็กและแทนที่ด้วยผลลัพธ์ ลองออนไลน์!

คำอธิบาย

{     e# Begin block
)     e# Increment: n+1
,     e# Range: [0 1 ... n]
mr    e# Shuffle
}     e# End block

ไม่{),mr}สั้นกว่า 1 ไบต์ใช่ไหม
Erik the Outgolfer

@EriktheOutgolfer แน่นอน! ขอบคุณ
Luis Mendo

3

Java 8, 114 111 97 ไบต์

import java.util.*;n->{List l=new Stack();for(;n>=0;l.add(n--));Collections.shuffle(l);return l;}

-3 ไบต์และข้อผิดพลาดคงต้องขอบคุณ@ OlivierGrégoire
-4 ไบต์ขอบคุณที่@Jakob
-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

1
ข้อผิดพลาด: nไม่รวม แก้ไขและเล่นกอล์ฟ: for(n++;--n>=0;l.add(n));. นอกจากนี้ฉันบอกว่าคุณไม่จำเป็นต้องกลับอาร์เรย์ Array and list เหมือนกันในภาษาส่วนใหญ่ดังนั้นเพียงแค่ส่งคืนรายการ
Olivier Grégoire

@ OlivierGrégoire Woops .. นั่นคือสิ่งที่คุณไม่ได้รับการตรวจสอบอย่างถูกต้องและเพิ่งโพสต์ .. ขอบคุณสำหรับการแก้ไขข้อผิดพลาด (และ 4 ไบต์บันทึกไว้ในกระบวนการ)
Kevin Cruijssen

1
ดีสามจริงเพราะผมแก้ไขอีกครั้งที่มีการแนะนำให้รู้จักตัวเองข้อผิดพลาดอื่น: ควรจะเป็น> >=
Olivier Grégoire

1
-4 ไบต์: ใช้Stackแทนและเปลี่ยนวงของคุณเพื่อVector for(;n>=0;l.add(n--));และการกลับมาjava.util.Listเป็นเรื่องปกติ
จา


2

Pyth, 4 ไบต์

.S}0

ลองที่นี่!


คุณสามารถเล่นกอล์ฟได้ถึง 3 ไบต์ .Sมีการโต้เถียงจำนวนเต็มเป็นเช่นเดียวกับ.SUและ[0..n]สามารถกำหนดเป็นUhเพื่อให้คุณสามารถใช้ซึ่งก็จะกลายเป็น.SUh .Sh
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณสำหรับคำใบ้ แต่ในขณะที่บางคนได้อ่านวิธีการแก้ปัญหาที่คุณเสนอฉันจะทิ้งเรื่องนี้ไว้
KarlKastor

มันเป็นแนวเขตว่าควรจะเป็นคำตอบที่แยกจากกันหรือไม่ แต่ฉันเชื่อว่ามันนับว่าเป็นคนล่อลวงดังนั้นแม้จะได้รับอนุญาตฉันก็คิดว่ามันเป็นแค่การสร้างขึ้นมาทดแทนดังนั้น nah ฉันไม่ต้องการโพสต์ แยกกัน แต่ isaacg ทำ
Erik the Outgolfer

2

C, 75 ไบต์

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?
LegionMammal978

แน่นอนว่าจะล้มเหลว แต่ไม่ได้ระบุช่วงข้อมูลเข้าในปัญหา โปรดอย่าทำให้ฉัน malloc :)
Computronium

เปลี่ยนaเป็น para เพื่อให้พอดีกับกฎเพิ่มเติมหรือไม่
l4m2


2

ถ่าน 33 ไบต์

A…·⁰NβFβ«AβδA‽δθPIθ↓A⟦⟧βFδ¿⁻θκ⊞βκ

ลองออนไลน์!การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด

เห็นได้ชัดว่าใช้เวลา 17 ไบต์ในการลบองค์ประกอบออกจากรายการใน Charcoal

แก้ไข: วันนี้ใช้เวลาเพียงสามไบต์โดยสมมติว่าคุณต้องการลบรายการทั้งหมดที่เกิดขึ้นจากรายการ บวกกับการเปลี่ยนแปลงอื่น ๆ ของ Charcoal ตัดคำตอบลงเหลือ 21 ไบต์: ลองออนไลน์!


Yikes นั่นเยอะมาก
Christopher

2

APL (Dyalog) 5 ไบต์

?⍨1+⊢

ลองออนไลน์!

ถือว่า⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ เครื่อง

คำอธิบาย

อาร์กิวเมนต์ที่ถูกต้อง

1+ เพิ่ม 1 ลงไป

?⍨สร้างตัวเลข 0 .. 1+⊢-1 และสุ่มจัดการพวกมันในอาเรย์เพื่อไม่ให้ซ้ำสองตัวเลข


2

q / kdb +, 11 ไบต์

วิธีการแก้:

{(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'

2

TI-83 พื้นฐาน 5 ไบต์ (น่าเบื่อ)

randIntNoRep(0,Ans

อ๋อบิวอิน randIntNoRep(เป็นโทเค็นสองไบต์และAnsเป็นหนึ่งไบต์

สนุกมากขึ้น 34 ไบต์:

Ans→N
seq(X,X,0,N→L₁
rand(N+1→L₂
SortA(L₂,L₁
L₁

ตรงจากtibasicdev น่าจะเป็นสนามกอล์ฟ แต่ฉันยังไม่พบอะไรเลย

ให้ทำอะไร: เรียงลำดับอาร์เรย์แบบสุ่มย้ายองค์ประกอบของ ARG ที่สอง ( L₁ที่นี่) ในลักษณะเดียวกับองค์ประกอบที่สอดคล้องกัน


1

JavaScript (ES6), 51 ไบต์

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())

2
ฉันไม่คิดว่านี่จะเหมือนกัน; ฉันได้ลองf(5)10 ครั้งและ5เป็นหนึ่งในสองรายการสุดท้ายทุกครั้ง
ETHproductions

เพิ่งวิ่งสองสามครั้งด้วยตัวเองแล้วรับ1,5,4,0,2,3& 1,0,2,5,3,4. แก้ไข: และอีกสองprnt.sc/fe0goe
Shaggy

3
เพียงแค่ทำการทดสอบอย่างรวดเร็วซึ่งรันf(5)1e5 ครั้งและค้นหาตำแหน่งเฉลี่ยของแต่ละหมายเลขในผลลัพธ์ อาร์เรย์ที่เป็นผลลัพธ์คือ[ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ]ดังนั้นฉันไม่คิดว่ามันจะเหมือนกัน ( รหัส )
ETHproductions

ฉันคิดว่าฉันมีวิธีแก้ปัญหา 93 ไบต์ที่สามารถทำงานได้ n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94

การเรียงลำดับผลลัพธ์random()ไม่สม่ำเสมอ ดู (ตัวอย่าง) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil

1

Aceto , 15 14 16 ไบต์

@lXp
Y!`n
zi&
0r

กดศูนย์บนสแต็คอ่านจำนวนเต็มสร้างช่วงและสุ่ม:

Y
zi
0r

ตั้งค่า catch catch, test length สำหรับ 0 และ (ในกรณีนั้น) exit:

@lX
 !`

อื่นพิมพ์ค่าบรรทัดใหม่และข้ามกลับไปที่การทดสอบความยาว:

   p
   n
  &

(ฉันต้องเปลี่ยนรหัสเพราะฉันรู้ว่าฉันอ่านคำถามผิดและสร้างช่วงตั้งแต่ 1-n ไม่ใช่ 0-n)




1

8th , 42 36 34 34 ไบต์

รหัส

>r [] ' a:push 0 r> loop a:shuffle

SED (Stack Effect Diagram) คือ n -- a

การใช้งานและตัวอย่าง

ok> 5 >r [] ' a:push 0 r> loop a:shuffle .
[2,5,0,3,1,4]

1

Javascript (ES6), 68 ไบต์

n=>[...Array(n+1)].map((n,i)=>[Math.random(),i]).sort().map(n=>n[1])

สร้างอาร์เรย์ของฟอร์ม

[[Math.random(), 0],
 [Math.random(), 1],
 [Math.random(), 2],...]

จากนั้นเรียงลำดับและส่งคืนองค์ประกอบสุดท้ายในคำสั่งซื้อใหม่


1

J, 11 ไบต์

(?@!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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.