Kocok pemetaan

9

Kami mendefinisikan peta sebagai satu set pasangan nilai kunci. Untuk tantangan ini, Anda perlu mengambil masing-masing nilai dan menetapkannya ke kunci yang dipilih secara acak.

  • Anda harus mengacak nilai secara acak, dan mengeluarkan peta yang dihasilkan. Ini berarti bahwa setiap kali kami menjalankan program Anda, kami memiliki peluang untuk mendapatkan hasil yang berbeda
  • Setiap permutasi yang mungkin dari nilai harus memiliki peluang yang tidak nol untuk muncul.
  • Semua kunci asli dan nilai asli harus muncul di array yang dihasilkan. Nilai yang berulang harus muncul beberapa kali dalam array yang dihasilkan.

Misalnya, jika peta Anda adalah:

[0:10, 1:10, 5:5]

semua yang berikut ini harus memiliki peluang tampil:

[0:10, 1:10, 5:5]  (original map)
[0:10, 1:5,  5:10]
[0:10, 1:10, 5:5]  (technically the same map, but I swapped the two tens)
[0:10, 1:5,  5:10]
[0:5,  1:10, 5:10]
[0:5,  1:10, 5:10]

Input / output yang dapat diterima:

  • Peta asli bahasa Anda
  • Anda dapat memasukkan berbagai pasangan nilai kunci. Anda tidak boleh memasukkan 2 array, satu dengan kunci, lainnya dengan nilai.
  • Anda dapat menggunakan representasi string apa pun di atas
  • Jika Anda memasukkan array atau peta, Anda dapat memodifikasi objek asli alih-alih kembali
  • Jenis input harus sesuai dengan tipe output
  • Jika Anda memasukkan array, urutan tombol harus dipertahankan.
  • Anda dapat mengasumsikan bahwa kunci itu unik, tetapi Anda tidak dapat mengasumsikan bahwa nilainya unik.

Ini adalah , jadi jawablah sesingkat mungkin

Nathan Merrill
sumber
1
Sangat terkait erat. (Perbedaannya adalah bahwa di tambang kuncinya hanyalah indeks array, bahwa saya memerlukan probabilitas seragam atas semua permutasi dan bahwa saya melarang built-in.)
Martin Ender
Apakah pasangan KV harus dalam urutan [k, v]atau [v, k]dapat diterima?
Dennis
Mereka harus berada di[k, v]
Nathan Merrill
Bisakah kita memasukkan peta asli dan menampilkan array pasangan kunci-nilai?
Steven H.
Tidak, jenisnya harus sesuai.
Nathan Merrill

Jawaban:

6

05AB1E , 5 byte

Input adalah daftar pasangan nilai kunci.

ø       # zip into a list of keys and one of values
 `      # flatten
  .r    # randomize the values
    ø   # zip back again into a list of key-value pairs.

Cobalah online!

Emigna
sumber
5

Brachylog , 13 12 byte

zt@~T,?zh:Tz

Cobalah online!

Mengharapkan daftar daftar 2-elemen sebagai input.

Penjelasan

z              Zip the input to get a list of keys and a list of values
 t@~T,         Take the list of values, and shuffle it ; call that T
      ?zh      Zip the input to get the list of keys
         :Tz   Zip the list of keys with the list of shuffled values
Fatalisasi
sumber
4

CJam, 9 byte

{z)mra+z}

Input adalah daftar pasangan nilai kunci.

Uji di sini.

Penjelasan

z  e# Zip, to separate keys from values.
)  e# Pull off values.
mr e# Shuffle them.
a+ e# Append them to the array again.
z  e# Zip, to restore key-value pairs.

Solusi alternatif, jumlah byte yang sama:

{[z~mr]z}
Martin Ender
sumber
Cukup yakin ini adalah algoritma terpendek di sebagian besar bahasa yang memiliki Zip: p
Fatalize
4

Jelly , 5 byte

Ṫ€Ẋṭ"

Cobalah online!

Penjelasan

Ṫ€Ẋṭ"  Input: list of [k, v] pairs
Ṫ€     Pop and return the last element of each k-v pair (modifies each list)
  Ẋ    Shuffle the list of v's
   ṭ"  Append each v back to a k and return
mil
sumber
3
SepertinyaTEXt"
ETHproduksi
3

Python 2, 77 byte

Menggunakan opsi ini: Jika Anda memasukkan larik atau peta, Anda dapat memodifikasi objek asli alih-alih kembali . Input adalah seperti kamus literal {0: 10, 1: 10, 5: 5}.

from random import*
D=input()
k=D.keys()
shuffle(k)
D=dict(zip(k,D.values()))

Cobalah online

Inspirasi diambil dari jawaban SO ini .

mbomb007
sumber
2

Python 3, 107 byte

Menggunakan struktur kamus asli Python.

Terima kasih kepada @ mbomb007 untuk menghemat satu byte.

from random import*
def f(d,o={}):
 i=list(d.values());shuffle(i)
 for k in d.keys():o[k]=i.pop()
 return o

Ide itu!

Peluruhan Beta
sumber
Masukkan impor sebelum fungsi, dan gunakan from random import*.
mbomb007
Hapus .keys(). Iterasi kamus yang diputar di atas tombol. Gunakan return dict(zip(d, i))sebagai ganti for loop.
Jonas Schäfer
2

Perl, 35 byte

Termasuk +2 untuk -0p

Berikan setiap kunci / nilai yang dipisahkan oleh spasi pada garis STDIN

shuffle.pl
1 5
3 8
9 2
^D

shuffle.pl:

#!/usr/bin/perl -p0
@F=/ .*/g;s//splice@F,rand@F,1/eg
Ton Hospel
sumber
1

Mathematica, 32 byte

{#,RandomSample@#2}&@@(#)&

Input adalah daftar pasangan nilai kunci. adalah operator transposisi Mathematica, dan RandomSampledapat digunakan untuk mengacak daftar.

Martin Ender
sumber
1

php, 84 byte

<?= serialise(array_combine(array_keys($a=unserialize($argv[1])),shuffle($a)?$a:0));

Mengambil input sebagai array serial, menghasilkan output yang sama.

pengguna59178
sumber
1

Clojure, 40 34 byte

#(zipmap(keys %)(shuffle(vals %)))

Mengambil kunci dan nilai dari m (peta), mengocok nilai-nilai dan ritsleting ke dalam peta.

menandai
sumber
Gunakan fungsi makro: # (zipmap (keys%) (shuffle (vals%)))
MattPutnam
0

PowerShell v2 +, 52 byte

param($a)$a|%{$_[1]}|sort {random}|%{$a[$i++][0],$_}

Mengambil input sebagai array tupel, yang secara signifikan lebih pendek daripada menggunakan hash (yang akan membutuhkan .GetEnumerator()dan yang lainnya untuk bekerja).

Kami loop array input |%{...}, setiap iterasi menarik keluar elemen kedua $_[1]. Mereka disalurkan ke Sort-Objectdengan {Get-Random}sebagai kunci penyortiran. Ini akan menetapkan bobot acak dari 0hingga [Int32]::MaxValueke setiap elemen untuk disortir. Mereka disalurkan ke loop lain |%{...}, dengan setiap iterasi mengeluarkan tupel dari elemen pertama yang sesuai dari tuple dan nomor yang diurutkan.

Contohnya

Contoh-contoh di sini memiliki tambahan -join','pada output tuple sehingga ditampilkan lebih baik di konsol, karena output default untuk array multi-dimensi sulit dibaca.

PS C:\Tools\Scripts\golfing> .\shuffle-a-mapping.ps1 ((0,10),(1,10),(5,5))
0,10
1,5
5,10

PS C:\Tools\Scripts\golfing> .\shuffle-a-mapping.ps1 ((0,10),(1,10),(5,5))
0,10
1,10
5,5

PS C:\Tools\Scripts\golfing> .\shuffle-a-mapping.ps1 ((1,1),(2,2),(3,3),(4,4),(5,5))
1,2
2,4
3,3
4,5
5,1

Ini berfungsi untuk nilai-nilai non-integer juga tanpa modifikasi.

PS C:\Tools\Scripts\golfing> .\shuffle-a-mapping.ps1 (('one','one'),('two','two'),('three','three'),('four','four'))
one,four
two,three
three,two
four,one
AdmBorkBork
sumber
0

JavaScript (ES6), 89 byte

a=>a.map((_,i)=>[i,Math.random()]).sort((a,b)=>a[1]-b[1]).map(([i],j)=>[a[j][0],a[i][1]])
Neil
sumber
0

Perl 6 , 28 byte

{%(.keys.pick(*)Z=>.values)}

Input adalah Hash
(Secara teknis nilai apa pun dengan .keysmetode dan .valuesmetode akan berfungsi, tetapi outputnya adalah Hash )

Penjelasan:

# bare block lambda with implicit parameter 「$_」
{

  # turn the list of key => value Pairs into a Hash
  %(
      # get the keys from 「$_」 ( implicit method call on 「$_」 )
      .keys

      # get all of the keys in random order
      .pick(*)

    # zip using 「&infix:« => »」 the Pair constructor
    Z[=>]

      # the values from 「$_」 ( implicit method call on 「$_」 )
      .values
  )
}

Varian yang dapat digunakan untuk jenis objek bawaan Hash like lainnya adalah:

{.WHAT.(.keys.pick(*)Z=>.values)}

.WHAT pada objek mengembalikan tipe.

Brad Gilbert b2gills
sumber
0

R, 47 (28) byte

Sedikit terlambat ke pesta tapi meskipun saya akan memposting solusi dalam R menggunakan builtins.

Hal terdekat yang dimiliki R ke array dengan pemetaan kunci / nilai adalah a list. Fungsi berikut mengambil listobjek sebagai input dan menampilkan daftar dengan nilainya yang dikocok.

function(x)return(setNames(sample(x),names(x)))

Dijelaskan

Builtin setNames()dapat menetapkan nama ke objek dengan memasukkan R-vectornama. Oleh karena itu, pertama-tama kocok listdengan sample()yang mengocok pasangan, dan kemudian menetapkan nama-nama dalam urutan asli menggunakannames() .

Contoh:

z  <- list(fish = 1, dog = 2, cat = 3, monkey = 4, harambe = 69)

f=function(x)return(setNames(sample(x),names(x)))
f(z)

$fish
[1] 3

$dog
[1] 1

$cat
[1] 2

$monkey
[1] 69

$harambe
[1] 4

Jika xdiasumsikan didefinisikan tidak perlu untuk pembungkus fungsi dan program dikurangi menjadi 28 byte.

setNames(sample(x),names(x))
Billywob
sumber
0

Java 7, 156 byte

import java.util.*;void c(Map m){List t=new ArrayList(m.values());Collections.shuffle(t);Iterator i=t.iterator();for(Object k:m.keySet())m.put(k,i.next());}

Tidak Disatukan:

void c(Map m){
  List t = new ArrayList(m.values());
  Collections.shuffle(t);
  Iterator i = t.iterator();
  for(Object k : m.keySet()){
    m.put(k, i.next());
  }
}

Kode uji:

Coba di sini.

import java.util.*;
class M{
  static void c(Map m){List t=new ArrayList(m.values());Collections.shuffle(t);Iterator i=t.iterator();for(Object k:m.keySet())m.put(k,i.next());}

  public static void main(String[]a){
    for(int i=0;i<10;i++){
      Map m=new HashMap();
      m.put(0, 10);
      m.put(1, 10);
      m.put(5, 5);
      c(m);
      System.out.println(m);
    }
  }
}

Output yang mungkin:

{0=5, 1=10, 5=10}
{0=10, 1=10, 5=5}
{0=10, 1=5, 5=10}
{0=10, 1=10, 5=5}
{0=10, 1=10, 5=5}
{0=10, 1=10, 5=5}
{0=10, 1=10, 5=5}
{0=10, 1=10, 5=5}
{0=10, 1=5, 5=10}
{0=5, 1=10, 5=10}
Kevin Cruijssen
sumber