你愿意做我的织女吗?


14

我最近一直在玩' The Weaver ',我认为这对提出了一个有趣的挑战。

前提:

韦弗(Weaver)游戏是一种游戏,其中给您提供了多个丝带,它们分别来自两个方向,彼此成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

其中代表交换。

输出: [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)(或者>=1如果选择1索引,则将严格为正数())
  • 忽略板外的任何交换
  • 您可以选择使用字母([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
关于“ 忽略板外的所有交换”-表示我们不能假设所有交换坐标都在板上,因此我们需要过滤它们的有效性(忽略无效的坐标),或者这意味着我们可以忽略坐标在板外的情况,因为输入将始终有效?
Bergi '18

@Bergi表示输入可能包括板外交换,您必须过滤或忽略它们。(第三个示例包括此类互换)
Asone Tuhid

哦。我认为,如果交换仅具有有效的坐标,那么挑战本来会更有趣,但是我们不能假设它们按照适合我们的解决方案的顺序进行排序。
Bergi '18

1
@Bergi您可能是对的,嗯,现在更改为时已晚。不,所有坐标都将是正数,我将更新问题。
Asone Tuhid

1
@AsoneTuhid如果坐标为(row,col),则首先输入/输出左侧色带,然后输入/输出顶部色带更有意义。可以吗
ngn

Answers:


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按字典顺序排序。ab是表示字符的列表(左侧色带,色带顶部)。

通过修改列表a和返回b


3

果冻37 35 30字节

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

在线尝试!

Dyadic程序,将交换索引的0索引列表作为左参数(按相反的词典顺序排序),将(左功能区,顶部功能区)作为右参数。返回(右侧功能区,底部功能区)。


果冻是一种默认语言。(几乎)没有变量可以使用,因此一次执行涉及两个以上变量的任何事情都是一团糟。

第一个链接将[l,t]其作为左参数,将[x,y](0-indexing)作为其右参数,并[l,t]使用l[x]和返回r[y]交换。

ṙ“ z0U1¦Zḟ€0ṙ” N}
ṙ“ Zipwith旋转。当前值:[[l x,t y]]
                   (所以l [x]和r [x]分别变成l [0]和r [0])
  z0 Zip,用0填充。对应(新)索引处的元素为
                   配对使用0作为填充符。
    U1¦反转索引为“ 1”(第一个索引)的货币对。
       Zḟ0再次压缩并滤除0,有效撤消z0。
           ṙ“ N} Zipwith旋转负移量,与”ṙ“`相反。

所以基本上是“ U1¦ṙ"z0”。


第二个链接仅过滤掉OoB索引(<Ạ¥Ðf L€),附加第二个参数(⁹ṭ),反向(),并减少ç(与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,¨⍺)⊢⍵}/(⍵∩,⍳≢¨⍺),⊂⍺}

在线尝试!

左参数是一对字符向量-左功能区和顶部功能区。正确的参数是坐标对的向量-交换位置。返回一对右色带和底色带。(请注意,与示例不同,我对功能区使用左上角和右下角的顺序,以便与坐标中的行列轴顺序保持一致。)

掉期必须这样排序时交换到左上角的另一个来之前 之后它。如果两个交换位于彼此的左下/右上,则它们的顺序无关紧要。

编辑:通过要求输入中的交换顺序相反,节省了一个字节()


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嗯,我认为那是作弊。修改输入对象与通过引用参数输出不同。
Bergi '18

1
问:“这是否意味着在允许的语言中,可以简单地用赋值替换要返回的七个字符?” 答:“是的,只要在调用该函数的上下文中可以访问更改的值”。对我来说似乎很清楚。
Asone Tuhid

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.