การรวมกันเป็นแถว


24

บทนำ

พิจารณาสองอาร์เรย์ของความยาวเดียวกันพูดและA = [0,1,0,2] B = [-1,1,2,2]สมมติว่าเรารู้ว่าเนื้อหาของพวกเขาเท่าเทียมกันในแต่ละแง่มุมรายการต่อรายการ:

  • 0เทียบเท่ากับ-1,
  • 1เทียบเท่ากับ1,
  • 0เทียบเท่ากับ2และ
  • 22เทียบเท่ากับ

ความเท่าเทียมกันคือสกรรมกริยา: -1และ0เทียบเท่าและ0และ2เทียบเท่าดังนั้น-1และ2ยังเทียบเท่า การรวมกันของAและBเป็นอาร์เรย์ที่แต่ละรายการของA(หรือB) ถูกแทนที่ด้วยจำนวนมากที่สุดที่เทียบเท่ากับมัน [2,1,2,2]ในกรณีนี้รวมกันจะเป็น

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้อาร์เรย์จำนวนเต็มสองตัวที่มีความยาวไม่เท่ากันที่มีความยาวเท่ากัน คุณยังสามารถแก้ไขหนึ่งในอินพุตแทนการส่งคืน จำนวนไบต์ต่ำสุดชนะ

กรณีทดสอบ

[0] [0] -> [0]
[1] [2] -> [2]
[0,-1] [-1,-1] -> [0,0]
[0,1,0] [2,1,0] -> [2,1,2]
[1,2,3] [0,0,1] -> [3,3,3]
[0,1,0,2] [-1,1,2,2] -> [2,1,2,2]
[1,0,1,-4] [-3,-1,-2,2] -> [1,0,1,2]
[1,2,3,-2] [1,0,-3,-2] -> [1,2,3,-2]
[-3,-2,-1,0,1] [-1,-1,-1,-1,-1] -> [1,1,1,1,1]
[-3,-2,-1,0,1] [2,-1,0,1,-3] -> [2,2,2,2,2]
[-3,5,5,3,1] [4,2,3,1,2] -> [4,5,5,5,5]
[4,0,2,-5,0] [0,4,-5,3,5] -> [5,5,3,3,5]
[-2,4,-2,3,2,4,1,1] [-2,4,1,2,2,3,1,-2] -> [1,4,1,4,4,4,1,1]
[-10,-20,-11,12,-18,14,-8,-1,-14,15,-17,18,18,-6,3,1,15,-15,-19,-19] [-13,6,-4,3,19,1,-10,-15,-15,11,6,9,-11,18,6,6,-5,-15,7,-11] -> [-8,14,18,14,19,14,-8,-1,-1,15,14,18,18,18,14,14,15,-1,18,18]
[20,15,2,4,-10,-4,-19,15,-5,2,13,-3,-18,-5,-6,0,3,-6,3,-17] [-18,7,6,19,-8,-4,-16,-1,13,-18,8,8,-16,17,-9,14,-2,-12,7,6] -> [20,15,20,19,-8,-4,20,15,17,20,17,17,20,17,-6,14,15,-6,15,20]

3
ฉันไม่แน่ใจว่าทำไมคุณถึงเรียกการรวมการดำเนินการนั้น
ทำให้เสียชีวิต

4
@Fatalize ผมได้แรงบันดาลใจจากประเภทรวมกัน
Zgarb

คำตอบ:


6

JavaScript (ES6), 100 90 110 102 96 ไบต์

a=>b=>a.map(v=>t[v],a.map((_,k)=>a.map((x,i)=>t[x]=t[y=b[i]]=Math.max(k?t[x]:x,k?t[y]:y)),t={}))

โซลูชันเริ่มต้นของฉันคือ 90 ไบต์:

a=>b=>a.map(v=>t[v],a.map(_=>a.map((x,i)=>t[x]=t[y=b[i]]=Math.max(t[x]||x,t[y]||y)),t={}))

แม้ว่าจะผ่านทุกกรณีทดสอบ แต่ก็ล้มเหลวสำหรับบางอย่างเช่น:

A = [0, -1], B = [-1, -1]

กรณีทดสอบ


นั่นเป็นจำนวนมากa.map...
ETHproductions

@ETHproductions Yup อาจมีวิธีที่ดีกว่า ข้อเท็จจริงที่น่าสนใจอย่างไม่น่าเชื่อ: สองสิ่งแรกa.mapสามารถถูกแทนที่ด้วยb.mapเช่นกัน
Arnauld

ฉันได้เพิ่มกรณีทดสอบใหม่สำหรับสถานการณ์ของคุณ
Zgarb

5

CJam , 27 ไบต์

l~_])\z_,*f{{_2$&,*|}/:e>}p

ลองออนไลน์! ชุดทดสอบ

คำอธิบาย

l~       e# Read and evaluate input, dumping arrays A and B on the stack.
_        e# Copy B.
])\      e# Wrap in array, pull off B, swap. Gives B [A B] on the stack.
z        e# Transpose the [A B] matrix to get a list of all equivalent pairs.
_,*      e# Repeat this list by the number of pairs. This is to ensure that the
         e# following procedure is applied often enough to allow transitive
         e# equivalences to propagate.
f{       e# Map this block over B, passing in the list of pairs each time...
  {      e#   For each pair...
    _2$  e#     Copy both the pair and the current value/list.
    &,   e#     Get the length of their intersection. If this is non-zero,
         e#     the current pair belongs to the current equivalence class.
    *    e#     Repeat the pair that many times.
    |    e#     Set union between the current value/list and the repeated pair.
         e#     This adds the pair to the current list iff that list already
         e#     contains one value from the pair.
  }/
  :e>    e#   Get the maximum value of this equivalence class.
}
p        e# Pretty print.


4

Python ขนาด 86 ไบต์

f=lambda a,b:a*(a==b)or f(*[map({x:y for x,y in zip(a,b)if x<y}.get,x,x)for x in b,a])

อัปเดตทั้งสองรายการพร้อมกันโดยแทนที่แต่ละค่าในรายการแรกด้วยองค์ประกอบที่เกี่ยวข้องในรายการที่สองหากมีค่ามากกว่า แทนจะทำกับmapพจนานุกรมของgetวิธีการ จากนั้นสลับรายการและทำซ้ำจนกว่าจะมีค่าเท่ากัน


2

Pyth, 13 ไบต์

eMumS{s@#dGGC

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

เริ่มต้นด้วยแต่ละคู่ วนซ้ำแต่ละรายการ (รายการ) ด้วยรายการที่ทับซ้อนกันซ้ำองค์ประกอบและการจัดเรียงซ้ำ หยุดเมื่อกระบวนการนี้มาบรรจบกัน พิมพ์สูงสุดของแต่ละรายการ


2

PHP, 266 241 213 200 ไบต์

วิธีการแก้:

function u($x,$y){foreach($x as$i=>$j){$k[$y[$i]][]=$j;$k[$j][]=$y[$i];}$h=function($c,&$w)use($k,&$h){$w[]=$c;foreach($k[$c]as$u)!in_array($u,$w)&&$h($u,$w);return max($w);};return array_map($h,$x);}

การใช้: u([1,2,3], [0,0,1]);ส่งคืนอาร์เรย์ที่ต้องการ

ไม่เล่นกอล์ฟ:

function unify($x, $y)
{
    foreach($x as $i=>$j) {
        $k[$y[$i]][] = $j;
        $k[$j][] = $y[$i];
    }

    $h = function ($c, &$w=[]) use ($k, &$h) {
        $w[] = $c;
        foreach($k[$c] as $u)
            !in_array($u, $w) && $h($u, $w);
        return max($w);
    };

    return array_map($h, $x);
}



0

Java, 273 263 ไบต์

interface Z{int z(int x);default Z g(int m,int n){return x->{for(int t;x!=(t=x==m?z(n):z(x));)x=t;return x;};}static void f(int[]a,int[]b){Z y=x->x;int i=0,v;for(int u:a){u=y.z(u);v=y.z(b[i++]);if(u<v)y=y.g(u,v);if(v<u)y=y.g(v,u);}i=0;for(int u:a)a[i++]=y.z(u);}}

วิธีการf(int[]a,int[]b)แก้ปัญหาที่ท้าทาย

interface Z{

  //should return an "equivalent" integer
  int z(int x);

  //return a Z lambda where the 1st arg is "equivalent" to the 2nd arg
  default Z g(int m,int n){
    return x->{
      for(int t;x!=(t=x==m?z(n):z(x));) //always find the last equivalent number for x
        x=t;
      return x;
    };
  }

  //solve the challenge
  static void f(int[]a,int[]b){
    Z y=x->x; //start off with all numbers only equivalent only to themselves
    int i=0,v;
    for(int u:a){
      u=y.z(u); //get a's element's equivalent number
      v=y.z(b[i++]); //get b's element's equivalent number
      if(u<v)y=y.g(u,v); //if a's was smaller than b's, make a's equivalent to b's
      if(v<u)y=y.g(v,u); //if b's was smaller than a's, make b's equivalent to a's
    }
    i=0;
    for(int u:a) //overwrite a with each element's equivalent value
      a[i++]=y.z(u);
  }

}

ขั้นแรกให้ดูทั้งสองอาร์เรย์และติดตามตัวเลขที่เทียบเท่ากัน จากนั้นปรับเปลี่ยนทุกองค์ประกอบในอาร์เรย์แรกเพื่อให้มีการจัดเก็บตัวเลขที่เทียบเท่ากัน


0

Python 522 ไบต์

a = [-2,4,-2,3,2,4,1,1]
b = [-2,4,1,2,2,3,1,-2]
m = {}
visited = {}
for i in range(len(a)):
    if a[i] in m:
        if b[i] not in m[a[i]]:
            m[a[i]].append(b[i])
    else:
        l = []
        l.append(b[i])
        m[a[i]] = l
    if b[i] in m:
        if a[i] not in m[b[i]]:
            m[b[i]].append(a[i])
    else:
        l = []
        l.append(a[i])
        m[b[i]] = l

def dfs(v, maximum):
    if v > maximum:
        maximum = v
    visited[v] = True
    for n in m[v]:
        if not visited[n]:
            d = dfs(n, maximum)
            if d > v:
                maximum = d
    return maximum

result = []
for k in range(len(a)):
    for q in m:
        visited[q] = False
    result.append(max(dfs(a[k], a[k]), dfs(b[k], b[k])))

print(result)

คำอธิบาย

สร้างตารางค่าที่สอดคล้องกับองค์ประกอบเฉพาะในทั้งสองอาร์เรย์ ( aและbในกรณีนี้) ตัวอย่างเช่นถ้า

a = [0,1,0] 
b = [2,1,0]

จากนั้นตารางจะเป็น:

0:[0,2]
1:[1]
2:[0]

จากนั้นให้ใช้การค้นหาครั้งแรกลึกดังนั้นสำหรับตัวอย่างเช่นสมมติว่าผมเลือกองค์ประกอบซ้ายสุดในaค่าเป็นแล้ว0และ0มี equivalences นี้และ0 2นับตั้งแต่ได้รับการเยี่ยมชมแล้วให้ไปที่0 22 มี equivalences 0นี้: ดังนั้นผลที่ดีที่สุดสำหรับการเลือกองค์ประกอบซ้ายสุดในมีa 2นี่คือต้นไม้:

   0   
 /   \
0     2
       \
        0

2และคุณต้องการที่จะใช้ค่าที่มากที่สุดในการมีดังนั้นผลที่ได้คือ


ยินดีต้อนรับสู่ PPCG! ในcode-golfคุณตั้งเป้าหมายที่จะรับผลตอบแทนที่สั้นที่สุดในโปรแกรมของคุณ ซึ่งหมายถึงการย่อฟังก์ชั่นและชื่อตัวแปรและลบช่องว่างที่ไม่จำเป็นในโปรแกรมของคุณ
Kritixi Lithos

คุณควรใช้ทั้งสองอาร์เรย์เป็นอินพุตของผู้ใช้แทนการเข้ารหัสแบบฮาร์ดไดรฟ์
Zgarb

0

PHP, 132 ไบต์

function(&$a,$b){for(;$i<count($a);$i++){$r=$a[$i];$s=$b[$i];$r<$c[$s]?:$c[$s]=$r;$s<$c[$r]?:$c[$r]=$s;}foreach($a as&$v)$v=$c[$v];}

ฟังก์ชั่นไม่ระบุชื่อที่ใช้เวลาสองอาร์เรย์

นี่คือเวลาของฉันในการ 'แก้ไขหนึ่งในอาร์เรย์ในสถานที่' ตามที่ระบุไว้ในผลลัพธ์ของความท้าทาย สิ่งนี้จะวนซ้ำในแต่ละอาร์เรย์ทั้งสองซึ่งจะบันทึกความเท่ากันถ้าอันปัจจุบันนั้นใหญ่กว่าอันที่เก็บไว้จากนั้นวนซ้ำผ่านอาร์เรย์แรกและแทนที่ค่าทั้งหมดด้วยค่าเทียบเท่าที่ใหญ่ที่สุด อาร์เรย์แรกถูกใช้โดยการอ้างอิง (ดังนั้น&$a) ดังนั้นอาร์เรย์ที่ส่งผ่านจะถูกแก้ไข 'ในตำแหน่ง'


0

Java, 170 ไบต์

แข็งแรงเล่นกอล์ฟ

(a,b)->{int[]d=a.clone();for(int i=0,y;i<d.length;i++){y=0;for(int j=0;j<a.length;j++)if(a[j]==d[i]||b[j]==d[i])y=Integer.max(y,Integer.max(a[j],b[j]));d[i]=y;}return d;}

Ungolfed

(a, b) -> {                                        // Two argument lambda
    int[] d = a.clone();                           // We clone our first array for modification
    for (int i = 0,y; i < d.length; i++) {         // Going through the elements of d...
        y = 0;                                     // We initialize our 'highest' equivalent
        for (int j = 0; j < a.length; j++) {       // Going through each of our arrays (a and b)...
            if (a[j] == d[i] || b[j] == d[i]) {    // If either of them is the number we're trying to match for equivalence...
                y = Integer.max(y, Integer.max(a[j], b[j])); // We see if the new number is bigger than the largest we've found.
            }
        }
        d[i] = y;                                  // We then assign the largest equivalent number for the current position in our output array.
    }
    return d; // And return!
}

ฟังก์ชั่นที่ไม่ระบุชื่อที่จะใช้เวลาสองint[]s int[]เป็นข้อโต้แย้งและส่งกลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.