Dokumcum olacak mısın?


14

Son zamanlarda ' Weaver ' ile oynuyorum ve bence için ilginç bir meydan okuma .

Öncül:

Dokumacı, size 90 derece arayla 2 yönden gelen bir dizi şerit verildiği ve amacınız belirli bir kavşakta istenen bir çıktıyı elde etmek için bunları takas etmektir.

   Bunun gibi: Bu bir takas: Bu değil:

Bunun gibitakastakas değil

Giriş:

3 dizi:

  • Üst şeritler (soldan sağa)
  • Sol şeritler (yukarıdan aşağıya)
  • Takas edilecek kavşakların koordinatları

Çıktı:

2 dizi:

  • Alt şeritler (soldan sağa)
  • Sağ şeritler (yukarıdan aşağıya)

Örnekler:

Yukarıdaki görüntüyü ilk örnek olarak kullanacağım:

Giriş: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]

Ne oluyor:

   r   y   b
   r   y   b
r r r r•y y y y
   r   r   b
y y y y y y y y
   r   r   b
b b b b•r r•b b
   r   b   r
   r   b   r

Nerede bir takas temsil eder.

Çıktı: [r, b, r], [y, y, b]


Giriş: [a, b, c], [d, e, f], [(0, 0), (2, 1)]

Ne oluyor:

   a   b   c
   a   b   c
d d•a a a a a a
   d   b   c
e e e e e e e e
   d   b   c
f f f f•b b b b
   d   f   c
   d   f   c

Çıktı: [d, f, c], [a, e, b]


Giriş: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]

Ne oluyor:

   a   b
   a   b
a a a a•b b
   a   a
b b•a a•a a
   b   a
c c•b b•a a
   c   b
   c   b

Çıktı: [c, b], [b, a, a]

Notlar:

  • Örnekler (row, column)sanki onları alabileceğiniz gibi verilen koordinatları gösterir (column, row).
  • Üst sıra ve sol sütun aynı renkte şeritlere sahip olabilir
  • Tahta dikdörtgen olabilir
  • Tüm koordinatlar negatif değil ( >=0) (veya >=11 dizin oluşturmayı seçerseniz kesinlikle pozitif ( ) olacaktır)
  • Kartın dışındaki takasları yoksay
  • Harf ( [a-zA-Z]), tamsayılar ( [0-9]) veya her ikisiyle çalışmayı seçebilirsiniz
  • Çıktınızdaki şeritler girişteki şeritler ile tam olarak eşleşmelidir ( a -> a)
  • Takas listesinin tutarlı olduğu sürece istediğiniz şekilde sıralandığını varsayabilirsiniz (eğer yaparsanız, lütfen nasıl sıralanması gerektiğini belirtin)
  • Takas koordinatlarını 0 veya 1 dizinli olarak alabilirsiniz
  • Varsayılan boşluklar yasaktır

Daha fazla örnek:

Input:
[b], [r], []
Output:
[b], [r]

Input:
[b], [r], [(0, 0)]
Output:
[r], [b]

Input:
[r, p, y], [r, y, p], [(0, 0), (1, 2), (2, 1), (3, 2)]
Output:
[r, p, y], [r, y, p]

Input:
[b, y, o, r],
[r, o, b, y],
[(0, 0), (2, 0), (3, 2)]
Output:
[b, y, y, r],
[b, o, r, o]

Son örnek bu durumla ilgilidir (eğer görselleştirmeyi kolaylaştırırsa):

misal

Bu yani her dil için bayt en kısa cevap kazanır.


1
" Tahtanın dışındaki takasları yoksay " - bu, tüm takas koordinatlarının tahtada olduğunu varsayamayacağımız anlamına gelir ve bunları geçerlilik için filtrelememiz (geçersiz olanları yoksay) veya yok sayabileceğimiz anlamına gelir giriş her zaman geçerli olacağından koordinatların kartın dışında olması durumunda?
Bergi

@Bergi, girişin kart dışında takaslar içerebileceği ve bunları filtrelemeniz veya yoksaymanız gerektiği anlamına gelir. (3. örnekte böyle bir takas bulunmaktadır)
Asone Tuhid

Ah. Eğer takasların sadece geçerli koordinatları olsaydı, meydan okumanın daha ilginç olacağını düşünüyorum, ancak bunların çözümümüze uyan bir sıraya göre sıralandığını düşünemedik.
Bergi

1
@Bergi Muhtemelen haklısın, şimdi değiştirmek için çok geç. Ve hayır, tüm koordinatlar olumlu olacak, soruyu güncelleyeceğim.
Asone Tuhid

1
@AsoneTuhid Eğer koordinatlar (sıra, sütun) ise, önce sol şeritleri ve sonra üst şeritleri i / o yapmak daha mantıklıdır. Buna izin veriliyor mu?
ngn

Yanıtlar:


8

Python 3 , 74 bayt

def g(a,b,l):
 for x,y in l:
  if x<len(a)and y<len(b):a[x],b[y]=b[y],a[x]

Çevrimiçi deneyin!

Gerektirir lsözlük sırasını sıralanacak şekilde. ave btemsil eden karakterlerin listesidir (sol şerit, üst şerit).

Listesini değiştirerek İade ave b.


3

Jöle , 37 35 30 bayt

ṙ"z0U1¦Zḟ€0ṙ"N}
<Ạ¥ÐfL€}⁹ṭṚç/Y

Çevrimiçi deneyin!

İkili program, takas indekslerinin 0-indeksleme listesini sol argüman olarak (ters sözlük sırasına göre sıralanmış) ve (sol şerit, üst şerit) sağ argüman olarak alır. Döndürür (sağ şerit, alt şerit).


Jelly, örtük bir dildir. Çalışmak için (neredeyse) hiçbir değişken yoktur, bu nedenle bir şey yapmak aynı anda ikiden fazla değişkeni içerir.

İlk bağlantı alır [l,t], sol argüman olarak [x,y]iade sağ argüman olarak (0-indeksleme) ve [l,t]ile l[x]ve r[y]alışverişinde bulundu.

R "z0U1|Zḟ € 0R" K}
ṙ "Zipwith döndür. Geçerli değer:` [l ṙ x, t ṙ y] `
                   (böylece l [x] ve r [x] sırasıyla l [0] ve r [0] olur)
  z0 Zip, 0 ile doldurun. İlgili (yeni) endekslerdeki elemanlar
                   dolgu maddesi olarak 0 ile eşleştirildi.
    U1¦ "1" endeksinde (ilk indeks) çifti tersine çevirin.
       0 Zḟ Zip tekrar ve 0 0'ları filtre, etkili bir şekilde z0 geri.
           N "N} Zip,` `ṙ" 'teriminin tersi negatif kaydırma miktarıyla döndürülür.

Yani temelde " U1¦altında ṙ"z0".


İkinci bağlantı basitçe OoB indekslerini ( <Ạ¥Ðf L€) filtreler , ikinci argümanı ( ⁹ṭ), tersini ( ) ekler ve azalt ç(Haskell'inkine benzer foldl)


2

Python 2 , 193 bayt

def f(t,l,s):
 m=[[x,y]for y in[0]+l for x in[0]+t];L=len(t)+1
 for i in range(len(m)):
  if i%L:m[i]=[m[i-L][0],m[i-1][1]][::[1,-1][(i/L,i%L)in s]]
 s=sum(m,[]);print s[2-L*2::2],s[4*L-1::2*L]

Çevrimiçi deneyin!

1 endeksli takas koordinatları alır


2

APL (Dyalog Klasik) , 31 30 bayt

{⊃{⌽@(0 1,¨⍺)⊢⍵}/(⍵∩,⍳≢¨⍺),⊂⍺}

Çevrimiçi deneyin!

Sol argüman bir çift karakter vektörüdür - sol şeritler ve üst şeritler. Doğru argüman, koordinat çiftlerinin bir vektörüdür - takas konumları. Bir çift sağ şerit ve alt şerit döndürür. (Örneklerden farklı olarak, koordinatlardaki satır-col ekseni sırasıyla tutarlı olması için şeritlerin sol üst ve sağ alt sırasını kullandığımı unutmayın.)

Swaplar başka sol üst bir takas geliyor ki sıralanması gerekir önce sonra ona. İki takas birbirinin sol alt / üst sağ tarafındaysa, bunların sırası önemli değildir.

DÜZENLEME: kaydedilen bir byte ( ) girişi swap ters düzenini gerektirerek


1

Javascript, 87 76 62 bayt

(c,r,s)=>{for([i,j]of s)if(r[i]&&c[j])[r[i],c[j]]=[c[j],r[i]]}

Çevrimiçi deneyin!

Python 3 cevabı ile aynı önemsiz algoritma. Dizileri koordinat tuplleri olarak kullanır. Şerit renklerinin doğru değerlerle belirlenmesini gerektirir. Böylece kısmen sipariş edilmesi koordinatları gerektirir x1,y1önce gelir x2,y2ya eğer x1 < x2 && y1 = y2ya x1 = x2 && y1 < y2. Girdi dizilerini değiştirerek döner.


Eminim Silebileceğiniz güzelim ;return[r,c]ve bir çağrı modifikasyonla dönüşünü
Asone TÜHİD

if(r[i]&&c[j])biraz daha bayt tasarruf ederdi.
Neil

Durumumun çok güçlü olduğunu biliyorum, ancak durumunuz kendiliğinden çelişkili. Düşünün x1=1,x2=2,y1=2,y2=1. Çünkü x1<x2, (x1,y1)önce gelir (x2,y2); fakat y2<y1, (x2,y2)önce gelir (x1,y1). Bence " x1 < x2ve y1 < y2" yeterli.
user202729

@AsoneTuhid Hm, sanırım bu hile yapıyor. Giriş nesnelerini değiştirmek, referans parametreleriyle çıktı ile aynı değildir.
Bergi

1
S: "Bu, izin veren dillerde, geri dönüş için yedi karakterin bir ödevle değiştirilebileceği anlamına mı geliyor?" C: "Evet, değiştirilen değere işlev adı verilen bağlamdan erişilebiliyorsa.". Bana çok açık geliyor.
Asone Tuhid

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.