Dizi birleştirme


24

Giriş

Aynı uzunluktaki iki dizileri düşünün, demek A = [0,1,0,2]ve B = [-1,1,2,2]. İçeriklerinin bir anlamda eşdeğer olduğunu bildiğimizi varsayalım:

  • 0eşittir -1,
  • 1eşittir 1,
  • 0eşittir 2ve
  • 2eşittir 2.

Denklik geçişli geçerli: -1ve 0eşdeğerdir ve 0ve 2böylece, eşdeğerdir -1ve 2aynı zamanda eşdeğerdir. Birleşme ait Ave Bher öğe dizisidir A(veya B) buna eşdeğer en çok sayıda almıştır. Bu durumda, birleşme olacaktır [2,1,2,2].

Görev

Eşit uzunlukta iki boş olmayan tamsayı dizisi alan ve birleştirme çıktısını alan bir program veya işlev yazın. Ayrıca, geri dönüş yerine girişlerden birini de değiştirebilirsiniz. En düşük bayt sayısı kazanır.

Test durumları

[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
Neden bu operasyon birliğini çağırdığına emin değilim.
16'da

4
@Fatalize Tür birleşmesinden ilham aldım .
Zgarb

Yanıtlar:


6

JavaScript (ES6), 100 90 110 102 96 bayt

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

İlk çözümüm 90 bayttı:

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

Tüm test durumlarını geçmesine rağmen, aşağıdaki gibi bir şey için başarısız olur:

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

Test durumları


Bu çok a.map...
ETHproductions 11:16

@ETHproductions Yup. Daha iyi bir yol olabilir. Hafif ilginç gerçek: ilk ikisi de a.mapaynı şekilde değiştirilebilir b.map.
Arnauld,

Durumunuz için yeni bir test davası ekledim.
Zgarb

5

CJam , 27 bayt

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

Çevrimiçi deneyin! Test odası.

açıklama

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 bayt

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 bayt

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

İlk listedeki her değeri, daha büyükse, ikinci listedeki karşılık gelen öğeyle değiştirerek aynı anda her iki listeyi de güncelleştirir. Değiştirme mapsözlüğün getyöntemiyle yapılır . Sonra listeleri değiştirir ve eşit olana kadar tekrar eder.


2

Pyth, 13 bayt

eMumS{s@#dGGC

Çevrimiçi deneyin: Gösteri

Açıklama:

Her çiftle başla. Üst üste binen listelerle her çifti (liste) yinelemeli olarak genişletin, öğeleri tekilleştirin ve sıralayın. Bu işlem birleştiğinde durun. Her listenin maksimum değerini yazdırın.


2

Php, 266 241 213 200 bayt

Çözüm:

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

Kullanım: u([1,2,3], [0,0,1]);İstediğiniz diziyi döndürür.

Çok golf oynamam:

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

Mathematica, 56 bayt

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

0

Java, 273 263 bayt

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

Yöntem f(int[]a,int[]b)zorluğu çözer.

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

}

İlk önce her iki diziden geçin ve eşdeğer sayıları takip edin. Ardından, ilk dizideki her elemanı, eşdeğer sayıların depolanması için değiştirin.


0

Python, 522 bayt

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çıklama

Her iki dizideki ( ave bbu durumda) her benzersiz elemana karşılık gelen bir değerler tablosu yapın . Örneğin

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

o zaman masa şöyle olurdu:

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

o zaman, örneğin, ben de en soldaki eleman almak farz, derinlik ilk arama uygulamak adeğeri daha sonra 0ve 0eşdeğerlikleri vardır: 0ve 2. Yana 0zaten ziyaret edilmiş gidin 2. 2 denklikler var 0. En soldaki eleman seçmeye yönelik en iyi sonucu Yani aDİR 2. İşte ağaç:

   0   
 /   \
0     2
       \
        0

ve oradaki en büyük değeri almak istiyorsan, sonuç budur 2.


PPCG'ye Hoşgeldiniz! In kod golf , kendi programında mümkün olan en kısa ByteCount almak hedefliyoruz. Bu, işlev ve değişken adlarını kısaltmak ve programınızdaki gereksiz boşlukları kaldırmak anlamına gelir.
Kritixi Lithos 12:16

İki diziyi de kodlama yerine kullanıcı girişi olarak almalısınız.
Zgarb

0

PHP, 132 bayt

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

İki diziyi alan adsız işlev.

Bu benim mücadelenin çıktısında belirtildiği gibi benim “dizilerden birini değiştir” dir. Bu, iki dizinin her biri boyunca döngü yapar, eğer mevcut olanı depolanandan büyükse denkliği kaydeder, ardından ilk dizi boyunca döner ve tüm değerleri en büyük eşdeğerleriyle değiştirir. İlk dizi referans (bu nedenle &$a) tarafından alınır , bu nedenle iletilen dizi 'yerinde' değiştirilir.


0

Java, 170 bayt

golfed

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

İki int[]s'yi argüman olarak alan ve döndüren adsız işlev int[].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.