Перемешать отображение


9

Мы определяем карту как набор пар ключ-значение. Для этой задачи вам нужно взять каждое из значений и назначить их произвольно выбранному ключу.

  • Вы должны случайным образом перемешать значения и вывести получившуюся карту. Это означает, что каждый раз, когда мы запускаем вашу программу, у нас есть шанс получить другой результат
  • Каждая возможная перестановка значений должна иметь ненулевую вероятность появления.
  • Все исходные ключи и исходные значения должны появиться в результирующем массиве. Повторяющиеся значения должны появляться в результирующем массиве одинаковое количество раз.

Например, если ваша карта была:

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

все следующее должно иметь шанс появиться:

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

Приемлемые входы / выходы:

  • Родная карта ваших языков
  • Вы можете ввести массив пар ключ-значение. Вы не можете вводить 2 массива, один с ключами, другой со значениями.
  • Вы можете использовать строковое представление любого из вышеперечисленных
  • Если вы введете массив или карту, вы можете изменить исходный объект вместо возврата
  • Тип ввода должен соответствовать типу вывода
  • Если вы вводите массив, порядок ключей должен быть сохранен.
  • Вы можете предположить, что ключи являются уникальными, но вы не можете предположить, что значения являются уникальными.

Это так ответь как можно короче


1
Очень тесно связаны. (Различия в том, что у меня ключи - это просто индексы массива, мне требуется одинаковая вероятность для всех перестановок и я запрещаю встроенные модули.)
Мартин Эндер

Должны ли пары KV быть в порядке [k, v]или будут [v, k]приемлемыми?
Деннис

Они должны быть в[k, v]
Натан Меррилл

Можем ли мы ввести собственную карту и вывести массив пар ключ-значение?
Стивен Х.

Нет, типы должны совпадать.
Натан Меррилл

Ответы:



5

Брахилог , 13 12 байт

zt@~T,?zh:Tz

Попробуйте онлайн!

Ожидает список 2-элементных списков в качестве входных данных.

объяснение

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

4

CJam, 9 байт

{z)mra+z}

Ввод - это список пар ключ-значение.

Проверьте это здесь.

объяснение

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.

Альтернативное решение с тем же количеством байтов:

{[z~mr]z}

Уверен, что это самый короткий алгоритм в большинстве языков, в которых есть Zip: p
Fatalize


3

Python 2, 77 байт

Использует эту опцию: если вы вводите массив или карту, вы можете изменить исходный объект вместо возврата . Ввод словарный словарь {0: 10, 1: 10, 5: 5}.

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

Попробуйте онлайн

Вдохновение взято из этого SO ответа .


2

Python 3, 107 байт

Использует собственную структуру словаря Python.

Спасибо @ mbomb007 за сохранение байта.

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

Идео это!


Поместите импорт перед функцией и используйте from random import*.
mbomb007

Удалить .keys(). Перебор словаря перебирает ключи. Используйте return dict(zip(d, i))вместо цикла for.
Йонас Шефер

2

Perl, 35 байт

Включает +2 для -0p

Задайте каждый ключ / значение через пробел в строке 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

1

Mathematica, 32 байта

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

Ввод - это список пар ключ-значение. является оператором транспонирования Mathematica и RandomSampleможет использоваться для перемешивания списка.


1

php, 84 байта

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

Принимает ввод как сериализованный массив, выводит то же самое.


1

Clojure, 40 34 байта

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

Принимает ключи и значения из m (карта), перемешивает значения и упаковывает их в карту.


Используйте макрос функции: # (zipmap (keys%) (shuffle (vals%)))
MattPutnam

0

PowerShell v2 +, 52 байта

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

Принимает входные данные в виде массива кортежей, что значительно короче, чем использование хеша (что потребует .GetEnumerator()и вообще не сработает).

Мы зацикливаем входной массив |%{...}, каждая итерация вытягивает второй элемент $_[1]. Они передаются Sort-Objectс {Get-Random}помощью ключа сортировки. Это позволит назначить случайный вес от 0к [Int32]::MaxValueкаждому элементу для сортировки. Они передаются в другой цикл |%{...}, причем каждая итерация выводит кортеж соответствующего первого элемента кортежа и отсортированного числа.

Примеры

В приведенных здесь примерах есть дополнительный -join','вывод о кортеже, поэтому он лучше отображается на консоли, поскольку вывод по умолчанию для многомерных массивов трудно читать.

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

Это работает для нецелых значений, а также без изменений.

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

0

JavaScript (ES6), 89 байт

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

0

Perl 6 , 28 байт

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

Ввод - это хеш
(технически любое значение с .keysметодом и .valuesметодом будет работать, но на выходе будет хеш )

Объяснение:

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

Вариант, который будет работать для других встроенных в Hash типов объектов:

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

.WHAT объект возвращает тип.


0

R, 47 (28) байтов

Немного опоздал на вечеринку, но я бы опубликовал решение в R с использованием встроенных функций.

Самое близкое, что R имеет к массиву с сопоставлением ключ / значение, это a list. Следующая функция принимает listобъект в качестве входных данных и выводит список с перемешанными значениями.

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

Разъяснения

Встроенный setNames()может назначать имена объектам путем ввода R-vectorимен. Следовательно, сначала перетасуйте, с listпомощью sample()которого перетасуйте пары, а затем присвойте имена в исходном порядке, используя names().

Пример:

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

Если xпредполагается, что он определен, нет необходимости в переносе функций, и программа сокращает до 28 байт.

setNames(sample(x),names(x))

0

Java 7, 156 байт

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

Ungolfed:

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

Тестовый код:

Попробуй это здесь.

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

Возможный вывод:

{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}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.