マッピングをシャッフルする


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
非常に密接に関連しています。(違いは、私の場合、キーは単に配列のインデックスであること、すべての順列に対して一定の確率が必要であること、および組み込みを許可しないことです。)
Martin Ender

KVペアは正しい順序である[k, v]必要が[v, k]ありますか、それとも許容されますか?
Dennis

彼らはいる必要があります[k, v]
ネイサンメリル

ネイティブマップを入力して、キーと値のペアの配列を出力できますか?
Steven H.

いいえ、タイプは一致する必要があります。
Nathan Merrill

回答:



5

Brachylog13 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ループの代わりに使用します。
JonasSchäfer2016

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()あり、機能しないものです)。

入力配列をループし、|%{...}反復ごとに2番目の要素を引き出します$_[1]。これらはにパイプされているSort-Object{Get-Random}、ソートキーとして。これにより、並べ替えのために各要素0[Int32]::MaxValueto からto までのランダムな重みが割り当てられます。それらは別のループ|%{...}にパイプされ、各反復で、タプルの対応する最初の要素のタプルとソートされた番号が出力されます。

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

オブジェクト型のような他の組み込みハッシュで機能するバリアントは次のとおりです。

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

.WHAT オブジェクトのタイプを返します。


0

R、47(28)バイト

パーティーには少し遅れますが、ビルトインを使用してRで解決策を投稿します。

Rがキーと値のマッピングを持つ配列に最も近いものは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、ISが定義されると仮定そこに関数ラッピングは必要ませんし、プログラムが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());}

非ゴルフ:

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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.