Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users

Dashboard
Notifications
Mark all as read
Challenges

Shuffle a subset of a list

+4
−0

Idea shamelessly stolen from caird and rak1507

Shuffle a subset of a list of unique, positive integers with uniform randomness, given the indices of that subset. For example, given the list $[A, B, C, D, E, F, G, H]$ and the indices $[0, 3, 4, 5, 7]$ (0-indexed), you would extract the list $[A, D, E, F, H]$, shuffle it, and insert the shuffled elements back according to the list of indices. Some possible results of this are (elements that stayed in place are bolded) $$[H, \textbf{B}, \textbf{C}, D, A, E, \textbf{G}, F]$$ $$[A, \textbf{B}, \textbf{C}, D, E, F, \textbf{G}, H]$$ $$[F, \textbf{B}, \textbf{C}, E, A, H, \textbf{G}, D]$$.

Rules

  • Every possible rearrangement of the list should have a non-zero chance of being chosen.
  • You may use zero- or one-indexing, but please specify which you use.
  • The indices in the input are guaranteed to be unique and valid.
  • This is code golf, so least number of bytes wins.

Test cases

All of these examples use 0-indexing.

List
Indices
Possible output

[1,2,3,4,5,6,7]
[0,1,2,3,4,5,6]
[2,3,6,1,0,4,5], etc.

[1,2,3,4,5,6,7]
[0,2,4,6]
[3,2,7,4,5,6,1], etc.

[93,6,10,1,200,41,78,31,34,27]
[0,3,4,8,9]
[1,6,10,27,93,41,78,31,200,34], etc.
Why does this post require moderator attention?
You might want to add some details to your flag.
Why should this post be closed?

0 comment threads

4 answers

+2
−0

JavaScript (Node.js), 75 68 bytes

-7 bytes thanks to Hakerh400

(a,b)=>b.map(i=>[a[i],a[j]]=[a[j=b[Math.random()*b.length|0]],a[i]])

Try it online!

Basic random swap algorithm. Unfortunately, JavaScript doesn't have a built in shuffle function.

Why does this post require moderator attention?
You might want to add some details to your flag.

1 comment thread

General comments (3 comments)
+2
−0

Jelly, 7 bytes

œPżịẊ¥F

Try it online!

Takes the 1-indexed indices on the left and the list on the right

How it works

œPżịẊ¥F - Main link. Takes I on the left and L on the right
œP      - Partition L after the indices in I, removing the borders
     ¥  - Group the previous 2 links as a dyad f(I, L):
   ị    -   Get the elements of L at the indices in I
    Ẋ   -   Shuffle uniformly
  ż     - Zip
      F - Flatten
Why does this post require moderator attention?
You might want to add some details to your flag.

0 comment threads

+1
−0

Japt, 17 bytes

ô@VøYÃíUgV öx)c f

Try it

Japt, 17 bytes

ô@VøYÃíUgV öx)c f

Try it

ô@VøYÃíUgV öx)c f     :Implicit input of arrays U=integers & V=indices
ô                     :Split U on elements ...
 @                    :That return true when their indices are passed through the following function as Y
  VøY                 :  Does V contain Y?
     Ã                :End split
      í               :Interleave with
       UgV            :  Elements in U at indices in V
           öx         :  Random permutation
             )        :End interleave
              c       :Flatten
                f     :Filter
Why does this post require moderator attention?
You might want to add some details to your flag.

0 comment threads

+1
−0

APL(Dyalog Unicode), 13 bytes SBCS

{⍵[?⍨≢⍵]}@⎕⊢⎕

Try it on APLgolf!

A tradfn submission which takes both lists on STDIN, second input is 1-indexed.

Why does this post require moderator attention?
You might want to add some details to your flag.

0 comment threads

Sign up to answer this question »

This community is part of the Codidact network. We have other communities too — take a look!

You can also join us in chat!

Want to advertise this community? Use our templates!