Potasuj mapowanie

9

Definiujemy mapę jako zestaw par klucz-wartość. W tym wyzwaniu musisz wziąć każdą z wartości i przypisać ją do losowo wybranego klucza.

  • Musisz losowo przetasować wartości i wydrukować wynikową mapę. Oznacza to, że za każdym razem, gdy uruchamiamy Twój program, mamy szansę uzyskać inną wydajność
  • Każda możliwa permutacja wartości musi mieć niezerową szansę pojawienia się.
  • Wszystkie oryginalne klucze i oryginalne wartości muszą pojawić się w wynikowej tablicy. Powtarzane wartości muszą pojawiać się tyle samo razy w wynikowej tablicy.

Na przykład, jeśli twoja mapa to:

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

wszystkie poniższe muszą mieć szansę pojawienia się:

[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]

Dopuszczalne wejścia / wyjścia:

  • Natywna mapa Twoich języków
  • Możesz wprowadzić tablicę par klucz-wartość. Ty może nie wejście 2 tablice, jeden z klawiszy, druga z wartościami.
  • Możesz użyć reprezentacji ciągu dowolnego z powyższych
  • Jeśli wprowadzisz tablicę lub mapę, możesz zmodyfikować oryginalny obiekt zamiast zwracać
  • Typ wejściowy musi być zgodny z typem wyjściowym
  • Jeśli wprowadzisz tablicę, kolejność kluczy musi być zachowana.
  • Możesz założyć, że klucze są unikalne, ale nie możesz założyć, że wartości są unikalne.

To jest , więc odpowiedz tak krótko, jak to możliwe

Nathan Merrill
źródło
1
Bardzo blisko spokrewniony. (Różnice polegają na tym, że w moich kluczach są po prostu wskaźniki tablicy, że wymagam jednakowego prawdopodobieństwa dla wszystkich permutacji i nie zezwalam na wbudowane).
Martin Ender
Czy pary KV muszą być w kolejności, [k, v]czy byłyby [v, k]do przyjęcia?
Dennis
Muszą być w [k, v]
środku
Czy możemy wprowadzić natywną mapę i wygenerować tablicę par klucz-wartość?
Steven H.
Nie, typy muszą się zgadzać.
Nathan Merrill,

Odpowiedzi:

6

05AB1E , 5 bajtów

Dane wejściowe to lista par klucz-wartość.

ø       # 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.

Wypróbuj online!

Emigna
źródło
5

Brachylog , 13 12 bajtów

zt@~T,?zh:Tz

Wypróbuj online!

Oczekuje listy 2-elementowych list jako danych wejściowych.

Wyjaśnienie

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
Fatalizować
źródło
4

CJam, 9 bajtów

{z)mra+z}

Dane wejściowe to lista par klucz-wartość.

Sprawdź to tutaj.

Wyjaśnienie

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.

Alternatywne rozwiązanie, ta sama liczba bajtów:

{[z~mr]z}
Martin Ender
źródło
Jestem pewien, że jest to najkrótszy algorytm w większości języków, które mają Zip: p
Fatalize 13.09.16
4

Galaretka , 5 bajtów

Ṫ€Ẋṭ"

Wypróbuj online!

Wyjaśnienie

Ṫ€Ẋṭ"  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
mile
źródło
3
Wygląda na toTEXt"
ETHproductions
3

Python 2, 77 bajtów

Korzysta z tej opcji: jeśli wprowadzisz tablicę lub mapę, możesz zmodyfikować oryginalny obiekt zamiast zwracać . Wejście jest dosłowne jak słownik {0: 10, 1: 10, 5: 5}.

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

Wypróbuj online

Inspiracja zaczerpnięta z tej SO odpowiedzi .

mbomb007
źródło
2

Python 3, 107 bajtów

Używa natywnej struktury słownika Pythona.

Dzięki @ mbomb007 za zapisanie bajtu.

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

Ideone to!

Rozpad beta
źródło
Umieść import przed funkcją i użyj from random import*.
mbomb007
Usuń .keys(). Iteracja słownika polega na iteracji po klawiszach. Użyj return dict(zip(d, i))zamiast pętli for.
Jonas Schäfer
2

Perl, 35 bajtów

Obejmuje +2 za -0p

Podaj każdy klucz / wartość oddzielone spacją w wierszu 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
źródło
1

Mathematica, 32 bajty

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

Dane wejściowe to lista par klucz-wartość. jest operatorem transpozycji Mathematiki i RandomSamplemożna go użyć do przetasowania listy.

Martin Ender
źródło
1

php, 84 bajtów

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

Pobiera dane wejściowe jako szeregową tablicę, generuje to samo.

użytkownik59178
źródło
1

Clojure, 40 34 bajtów

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

Bierze klucze i wartości z m (mapa), tasuje wartości i zamyka je w mapę.

znak
źródło
Użyj makra funkcji: # (zipmap (klawisze%) (losowanie (vals%)))
MattPutnam 13.09.16
0

PowerShell v2 +, 52 bajty

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

Pobiera dane wejściowe jako tablicę krotek, co jest znacznie krótsze niż użycie skrótu (który wymagałby .GetEnumerator()i co by nie działało).

Zapętlamy tablicę wejściową |%{...}, a każda iteracja wyciąga drugi element $_[1]. Są one przesyłane Sort-Objectza pomocą {Get-Random}jako klucza sortującego. Będzie to przypisać losowo wagi od 0celu [Int32]::MaxValuedo każdego elementu do sortowania. Są one przesyłane do innej pętli |%{...}, z której każda iteracja generuje krotkę odpowiedniego pierwszego elementu krotki i posortowanej liczby.

Przykłady

Przykłady tutaj mają dodatkowe -join','dane wyjściowe krotki, więc lepiej widać to na konsoli, ponieważ trudno jest odczytać domyślne dane wyjściowe dla tablic wielowymiarowych.

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

Działa to również w przypadku wartości niecałkowitych bez modyfikacji.

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
źródło
0

JavaScript (ES6), 89 bajtów

a=>a.map((_,i)=>[i,Math.random()]).sort((a,b)=>a[1]-b[1]).map(([i],j)=>[a[j][0],a[i][1]])
Neil
źródło
0

Perl 6 , 28 bajtów

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

Dane wejściowe to skrót
(technicznie każda wartość z .keysmetodą i .valuesmetoda działałaby, ale dane wyjściowe to skrót )

Wyjaśnienie:

# 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
  )
}

Wariant, który działałby dla innych typów obiektów typu Hash, jest:

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

.WHAT na obiekcie zwraca typ.

Brad Gilbert b2gills
źródło
0

R, 47 (28) bajtów

Trochę późno na imprezę, ale mimo to opublikowałbym rozwiązanie w R za pomocą wbudowanych funkcji.

R najbardziej zbliżony do tablicy z odwzorowaniem klucza / wartości to list. Poniższa funkcja pobiera listobiekt jako dane wejściowe i wyświetla listę z losowymi wartościami.

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

Wyjaśnione

Wbudowany setNames()może przypisywać nazwy do obiektów, wprowadzając a R-vectornazw. Dlatego najpierw należy potasować, listwedług sample()którego tasuje pary, a następnie przypisać nazwy w oryginalnej kolejności za pomocą names().

Przykład:

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

Jeśli xzakłada się, że jest zdefiniowany, nie ma potrzeby zawijania funkcji, a program zmniejsza się do 28 bajtów.

setNames(sample(x),names(x))
Billywob
źródło
0

Java 7, 156 bajtów

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());}

Nie golfowany:

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());
  }
}

Kod testowy:

Wypróbuj tutaj.

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);
    }
  }
}

Możliwe wyjście:

{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
źródło