매핑 셔플


9

키-값 쌍 세트로 맵을 정의합니다. 이 문제를 해결하려면 각 값을 가져 와서 임의로 선택한 키에 할당해야합니다.

  • 임의로 값을 섞고 결과 맵을 출력 해야합니다 . 즉, 프로그램을 실행할 때마다 다른 결과를 얻을 수 있습니다.
  • 값의 각 가능한 순열은 0이 아닌 확률로 나타나야합니다.
  • 모든 원래 키와 원래 값이 결과 배열에 나타나야합니다. 반복되는 값은 결과 배열에서 같은 횟수로 표시되어야합니다.

예를 들어지도가 다음과 같은 경우

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

네이티브 맵을 입력하고 키-값 쌍의 배열을 출력 할 수 있습니까?
Steven H.

아니요, 유형이 일치해야합니다.
Nathan Merrill

답변:



5

Brachylog , 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}

P : 확신이 우편이 대부분의 언어에서 가장 짧은 알고리즘
Fatalize


3

파이썬 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

파이썬 3, 107 바이트

파이썬의 기본 사전 구조를 사용합니다.

바이트를 저장해 준 @ 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 루프 대신 사용하십시오 .
Jonas Schäfer

2

펄, 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

수학, 32 바이트

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

입력은 키-값 쌍의 목록입니다. Mathematica의 조옮김 연산자이며 RandomSample목록을 섞는 데 사용할 수 있습니다.


1

PHP, 84 바이트

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

직렬화 된 배열로 입력을 받아서 동일하게 출력합니다.


1

클로저, 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

자바 스크립트 (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

펄 6 , 28 바이트

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

입력은 해시입니다
(기술적으로 .keys메소드.values메소드 가 있는 모든 값 은 작동하지만 출력은 Hash입니다 )

설명:

# 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

경우 xIS 정의 할 가정이 기능 포장이 필요 없습니다 프로그램은 28 바이트로 줄일 수 있습니다.

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

0

자바 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.