あなたは私のウィーバーになりますか?


14

私は最近「The Weaver」をプレイしてきましたが、これはにとって興味深い挑戦になると思います。

前提:

ウィーバーは、2つの方向から90度離れた多数のリボンが与えられるゲームであり、目標は、特定の交差点でそれらを交換して、所望の出力を達成することです。

   このように:これはスワップです:これはそうではありません:

このようなスワップスワップではない

入力:

3つの配列:

  • 上部のリボン(左から右)
  • 左のリボン(上から下)
  • 交換する交差点の座標

出力:

2つの配列:

  • 下のリボン(左から右)
  • 右リボン(上から下)

例:

最初の例として上記の画像を使用します。

入力: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]

何が起こるのですか:

   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

where はスワップを表します。

出力: [r, b, r], [y, y, b]


入力: [a, b, c], [d, e, f], [(0, 0), (2, 1)]

何が起こるのですか:

   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

出力: [d, f, c], [a, e, b]


入力: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]

何が起こるのですか:

   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

出力: [c, b], [b, a, a]

ノート:

  • 例では、座標をとして(row, column)取り扱っているように示しています(column, row)
  • 上の行と左の列には同じ色のリボンがあります
  • ボードは長方形にすることができます
  • すべての座標は非負(>=0)(>=11インデックスを選択した場合は厳密に正())になります
  • ボード外のスワップを無視します
  • 文字([a-zA-Z])、整数([0-9])、またはその両方を使用することを選択できます
  • 出力のリボンは、入力のリボンと正確に一致する必要があります(a -> a
  • スワップのリストは、一貫している限り、任意の方法でソートされていると想定できます(その場合、ソート方法を指定してください)。
  • スワップ座標を0または1のインデックスとして取得できます
  • デフォルトの抜け穴は禁止されています

その他の例:

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]

最後の例は、このケースに関連しています(視覚化が容易になる場合):

例

これはので、各言語のバイト単位の最短回答が勝ちです。


1
Re " ボードの外にあるスワップを無視する "-すべてのスワップ座標がボード上にあると仮定できないことを意味し、有効性のためにそれらをフィルタリングする必要があります(無効なものを無視)入力が常に有効であるため、座標がボードの外側にある場合
ベルギ

@Bergiは、入力にボード外のスワップが含まれる可能性があることを意味し、それらをフィルタリングまたは無視する必要があります。(3番目の例には、このようなスワップが含まれています)
Asone Tuhid

ああ。スワップに有効な座標しかなければ、チャレンジはもっと面白かったと思いますが、ソリューションに合った順序でソートされているとは想定できませんでした。
ベルギ

1
@Bergiあなたはおそらく正しいでしょう、まあ、今は変更するには遅すぎます。いいえ、すべての座標が正になります。質問を更新します。
アソーントゥヒッド

1
@AsoneTuhid座標が(row、col)の場合、左側のリボンを最初に、上部のリボンを2番目に入出力する方が理にかなっています。それは許されますか?
ngn

回答:


8

Python 3、74バイト

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]

オンラインでお試しください!

l辞書編集順にソートする必要があります。aおよびbを表す文字のリストです(左リボン、上リボン)。

リストaとを変更して戻りますb


3

ゼリー37 35 30バイト

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

オンラインでお試しください!

ダイアディックプログラムでは、左引数としてスワップインデックスの0インデックスリスト(逆の辞書順でソート)および右引数として(左リボン、上リボン)を使用します。戻り値(右リボン、下リボン)。


ゼリーは暗黙の言語です。動作する変数は(ほとんど)ありません。そのため、一度に2つ以上の変数を使用することは、面倒です。

最初のリンクは[l,t]、左の引数として[x,y](0-indexing)を右の引数として受け取り、[l,t]with l[x]r[y]交換されます。

ṙ "z0U1¦Zḟ€0ṙ" N}
ṙ "Zipwith rotate。現在の値:` [lṙx、tṙy] `
                   (したがって、l [x]とr [x]はそれぞれl [0]とr [0]になります)
  z0 Zip、0で埋めます。対応する(新しい)インデックスの要素は
                   0をフィラーとして、ペアになります。
    U1¦インデックス `1`(最初のインデックス)でペアを反転します。
       Zḟ€0再びZipし、 `0`をフィルターで除外して、z0を効果的に元に戻します。
           ṙ "N} Zipwithは、`ṙ "`の逆の負のシフト量で回転します。

したがって、基本的に「U1¦ṙ"z0」です。


第2のリンク単に(OOBインデックスを除外<Ạ¥Ðf L€)、第2引数(追加⁹ṭ)、(逆)、及びオーバー低減ç(Haskellのに似てfoldl


2

Python 2、193バイト

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]

オンラインでお試しください!

1インデックスのスワップ座標を取ります


2

APL(Dyalog Classic)31 30バイト

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

オンラインでお試しください!

左の引数は、左リボンと上部リボンの文字ベクトルのペアです。正しい引数は座標ペアのベクトルです-位置を交換します。右リボンと下リボンのペアを返します。(例とは異なり、リボンの左上と右下の順序を使用して、座標の行-列軸の順序と一致させることに注意してください。)

スワップは別の左上にスワップが来るようにソートする必要があります前に した後、それ。2つのスワップが互いに左下/右上にある場合、それらの順序は関係ありません。

編集:入力でスワップの逆順を要求することで1バイト()を保存しました


1

Javascript、87 76 62バイト

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

オンラインでお試しください!

Python 3の答えと同じ些細なアルゴリズム。配列を座標タプルとして使用します。リボンの色を真実の値で指定する必要があります。またはのいずれかのx1,y1前に来るように、座標を部分的に順序付ける必要がありx2,y2ます。入力配列を変更して戻ります。x1 < x2 && y1 = y2x1 = x2 && y1 < y2


私はかなり確信して削除することができますよ;return[r,c]、それを呼び出して変更することにより、リターン
Asone Tuhid

if(r[i]&&c[j])さらにバイトを節約します。
ニール

私の状態が強すぎることは知っていますが、あなたの状態は矛盾しています。検討してくださいx1=1,x2=2,y1=2,y2=1。なぜならx1<x2(x1,y1)前に来る(x2,y2); なぜならy2<y1(x2,y2)前に来るから(x1,y1)です。「x1 < x2y1 < y2」で十分だと思います。
user202729

@AsoneTuhidうーん、それは不正行為だと思う。入力オブジェクトの変更は、参照パラメーターによる出力と同じではありません。
ベルギ

1
Q:「これは、それを許可する言語では、返される7文字を単に割り当てに置き換えることができるということですか?」A:「はい、変更された値は、関数を呼び出したコンテキストでアクセス可能になります。」私にはかなり明確に思えます。
アソーヌトゥヒッド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.