สลับการแมป


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]ยอมรับได้หรือไม่
เดนนิส

พวกเขาจำเป็นต้องอยู่ใน[k, v]
นาธานเมอร์ริลล์

เราสามารถใส่แผนที่ดั้งเดิมและส่งออกอาร์เรย์ของคู่ของคีย์ - ค่าได้หรือไม่?
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}

ค่อนข้างแน่ใจว่านี่เป็นอัลกอริทึมที่สั้นที่สุดในภาษาส่วนใหญ่ที่มี 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 ไบต์

ใช้โครงสร้างพจนานุกรมดั้งเดิมของไพ ธ อน

ขอบคุณ @ 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 for loop
Jonas Schäfer

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ยังแต่ละองค์ประกอบสำหรับการเรียงลำดับ สิ่งเหล่านั้นถูกไพพ์ไปยังลูปอื่น|%{...}โดยที่การวนซ้ำแต่ละครั้งจะส่งออก tuple ขององค์ประกอบแรกที่สอดคล้องกันของ tuple และหมายเลขที่เรียง

ตัวอย่าง

ตัวอย่างที่นี่มีข้อมูลเพิ่มเติม-join','เกี่ยวกับเอาต์พุต tuple ดังนั้นจึงแสดงได้ดีกว่าบนคอนโซลเนื่องจากเอาต์พุตเริ่มต้นสำหรับอาร์เรย์หลายมิตินั้นอ่านยาก

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

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 like object type คือ:

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

.WHAT บนวัตถุส่งคืนชนิด


0

R, 47 (28) ไบต์

สายไปงานเลี้ยงเล็กน้อย แต่แม้ว่าฉันจะโพสต์วิธีแก้ปัญหาใน R โดยใช้ builtins

สิ่งที่ใกล้เคียงการวิจัยมีอาร์เรย์กับการทำแผนที่คีย์ / listค่าเป็น ฟังก์ชั่นต่อไปนี้จะรับlistวัตถุเป็นอินพุตและเอาต์พุตรายการที่มีการสับเปลี่ยนค่า

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

อธิบาย

builtin setNames()สามารถกำหนดชื่อให้กับวัตถุโดยการป้อนR-vectorชื่อ ดังนั้นครั้งแรกสับเปลี่ยนlistโดยsample()ที่ shuffles 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}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.