Thống nhất mảng


24

Giới thiệu

Hãy xem xét hai mảng có cùng độ dài, nói A = [0,1,0,2]B = [-1,1,2,2]. Giả sử chúng ta biết rằng nội dung của chúng tương đương nhau theo một nghĩa nào đó, theo từng mục:

  • 0tương đương với -1,
  • 1tương đương với 1,
  • 0tương đương với 2, và
  • 2tương đương với 2.

Tương đương là bắc cầu: -10tương đương, và 02tương đương, vì vậy -12cũng là tương đương. Sự thống nhất của ABlà mảng trong đó mỗi mục của A(hoặc B) đã được thay thế bằng số lớn nhất tương đương với nó. Trong trường hợp này, sự thống nhất sẽ là [2,1,2,2].

Nhiệm vụ

Viết chương trình hoặc hàm lấy hai mảng số nguyên không trống có độ dài bằng nhau và đưa ra sự hợp nhất của chúng. Bạn cũng có thể sửa đổi một trong những đầu vào tại chỗ thay vì quay lại. Số byte thấp nhất sẽ thắng.

Các trường hợp thử nghiệm

[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
Tôi không chắc tại sao bạn gọi đó là hợp nhất hoạt động.
Gây tử vong

4
@Firthize Tôi lấy cảm hứng từ loại thống nhất .
Zgarb

Câu trả lời:


6

JavaScript (ES6), 100 90 110 102 96 byte

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

Giải pháp ban đầu của tôi là 90 byte:

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

Mặc dù nó vượt qua tất cả các trường hợp thử nghiệm được cung cấp, nhưng nó không thành công cho một số thứ như:

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

Các trường hợp thử nghiệm


Đó là rất nhiều a.map ...
Sản phẩm ETH

@ETHproductions Yup. Có thể có một cách tốt hơn. Thực tế khá thú vị: hai cái đầu tiêna.map cũng có thể được thay thế bằng b.map.
Arnauld

Tôi đã thêm một trường hợp thử nghiệm mới cho tình huống của bạn.
Zgarb

5

CJam , 27 byte

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

Hãy thử trực tuyến! Bộ thử nghiệm.

Giải trình

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 2, 91 byte

f=lambda a,b:[a<x>b.update(b&set(x)and x)and b or max(f(zip(a,b)*len(a),{x})[0])for x in a]

4

Python, 86 byte

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

Đồng thời cập nhật cả hai danh sách bằng cách thay thế từng giá trị trong danh sách đầu tiên bằng phần tử tương ứng trong danh sách thứ hai nếu nó lớn hơn. Việc thay thế được thực hiện với phương pháp mapcủa từ điểnget . Sau đó, hoán đổi danh sách và lặp lại cho đến khi chúng bằng nhau.


2

Bình thường, 13 byte

eMumS{s@#dGGC

Dùng thử trực tuyến: Trình diễn

Giải trình:

Bắt đầu với mỗi cặp. Lặp lại mở rộng mỗi cặp (danh sách) với các danh sách chồng chéo, lặp lại các yếu tố và sắp xếp. Dừng lại khi quá trình này hội tụ. In tối đa của mỗi danh sách.


2

Php, 266 241 213 200 byte

Dung dịch:

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

Cách sử dụng: u([1,2,3], [0,0,1]);trả về mảng mong muốn.

Không chơi gôn:

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


1

Toán học, 56 byte

#/.($|##->Max@##&@@@ConnectedComponents@Thread[#<->#2])&

0

Java, 273 263 byte

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

Phương pháp f(int[]a,int[]b)giải quyết thách thức.

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

}

Đầu tiên đi qua cả hai mảng và theo dõi các số tương đương. Sau đó sửa đổi mọi phần tử trong mảng đầu tiên để có các số tương đương được lưu trữ.


0

Python, 522 byte

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)

Giải trình

Tạo một bảng các giá trị tương ứng với từng phần tử duy nhất trong cả hai mảng ( abtrong trường hợp này). Ví dụ nếu

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

sau đó bảng sẽ là:

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

sau đó áp dụng độ sâu tìm kiếm đầu tiên, vì vậy, ví dụ, giả sử tôi chọn phần tử ngoài cùng bên trái trong agiá trị là sau đó 00có các giá trị tương đương: 02. Kể từ khi0 đã được truy cập, đi đến 2. 2 có tương đương : 0. Vì vậy, kết quả tốt nhất để chọn các yếu tố ngoài cùng bên trái a2. Đây là cây:

   0   
 /   \
0     2
       \
        0

và bạn muốn lấy giá trị lớn nhất trong đó, vì vậy kết quả là 2 .


Chào mừng đến với PPCG! Trong môn đánh gôn , bạn đặt mục tiêu có được số lượng ngắn nhất có thể trong chương trình của mình. Điều này có nghĩa là rút ngắn chức năng và tên biến và loại bỏ khoảng trắng không cần thiết trong chương trình của bạn.
Kritixi Lithos

Bạn cũng nên lấy hai mảng làm đầu vào của người dùng thay vì mã hóa chúng.
Zgarb

0

PHP, 132 byte

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

Hàm ẩn danh có hai mảng.

Đây là ý kiến ​​của tôi về 'sửa đổi một trong các mảng tại chỗ', như được chỉ định trong đầu ra của thử thách. Vòng lặp này thông qua mỗi hai mảng, ghi lại sự tương đương nếu cái hiện tại lớn hơn cái được lưu trữ, sau đó lặp qua mảng đầu tiên và thay thế tất cả các giá trị bằng các giá trị tương đương lớn nhất của chúng. Mảng đầu tiên được lấy bằng tham chiếu (vì thế &$a), vì vậy mảng được truyền vào được sửa đổi 'tại chỗ'.


0

Java, 170 byte

Chơi gôn

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

Bị đánh cắp

(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!
}

Hàm ẩn danh lấy hai int[]s làm đối số và trả về một int[].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.