帮我解开这些电线!


12

我的电线都纠结了!

电线缠在一起不是很烦吗?好吧,这只是发生在我身上,所以我想帮助我解开他们!为了方便起见,我已将所有设备与设备断开连接,但它们仍连接到电源插座。您的挑战是弄清楚如何解开它们!

输入值

输入将包含空格,管道和Xs(两种情况)。输入将如下所示:

| | | |
 X  | |
| |  x 
|  X  |
| | | |

大写字母X表示左导线与右导线相交,小写字母x表示相反。第一行和最后一行将始终为| | | |...。您可以将输入作为逗号分隔的字符串,字符串数组等。格式并不严格,只要它有意义并且不包含任何其他信息即可。

输出量

对于这个挑战,我不仅需要知道需要多长时间,而且还需要确切地知道该怎么做。因此,输出一个整数对的列表,其中的字符R或L不区分大小写,表示要解开哪两条线以及哪种方式(R表示从右到左,反之亦然)。您需要告诉我哪种方式可以穿越他们;我自己不知道这一点。只要您以正确的顺序输出所有整数对+字符并且不输出任何多余的废话(括号,逗号等都可以),输出也非常灵活。导线可以为零或一索引,但索引必须从左侧开始。请注意,您必须从底部而不是顶部解开角度。输出样式必须一致,如果不明显,请指定输出方式。字符的大小写不一致

样本输出

对于上面的示例输入,输出将类似于:

2 3 R
3 4 L
1 2 R

这里的输出格式是用换行符分隔的值列表。这是1索引的。

进一步的规格

X和x沿任一方向垂直堆叠在一起是有效的。由于我很懒,所以我不想不必要地切换电线,因此在这种情况下不要输出任何内容。如果发现该问题,我将轻轻拉动电线使其伸直。

将多个X和x垂直堆叠也是有效的,并且只要两条导线都没有参与其他交叉,我就不需要任何额外的移动(因为我很懒)。因此,如果字符X X x X x x显示在没有任何其他交叉的列中,则输出应仍为空白!

如果不清楚,则R消除X,L消除x。

同一行中可能有两个导线交叉,在这种情况下,这两个交换的顺序无关紧要。您将永远不会得到类似的东西| X X |(这没有意义,因为这意味着中间电线在其左侧和右侧的电线上交叉了)。

并不总是有十字路口...

输入可以是单个管道。但是,输入永远不会为空。

最短的有效解决方案将在12月20日获胜!

更多例子

正如我所承诺的:

例子1

输入值

| | | | | |
| |  X   x 
 X  |  x  |
|  x  |  X 
 X   X  | |
| | | | | |

输出量

1 2 R
3 4 R
2 3 L
5 6 R
1 2 R
4 5 L
3 4 R
5 6 L

例子2

输入值

| | |
 X  |
|  x 
| | |
|  X 
|  x 
| | |

输出量

2 3 L
1 2 R

例子3

输入值

|

输出为空白。是的,您必须处理这种情况。

例子4

输入值

| |
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
| |

输出为空白。纯娱乐 :)。

例子5

输入值

| |
 X 
 X 
 x 
 X 
 x 
 x 
| |

输出仍然为空...


4
可以在同一行中缠结两对电线吗?
James Holderness

1
@JamesHolderness是的。在这种情况下,顺序无关紧要。我将在问题中澄清这一点。谢谢!
HyperNeutrino

@JamesHolderness完成!
HyperNeutrino '16

Answers:


1

Befunge,173个字节

输入是从标准输入中以挑战说明中给出的确切格式读取的,尽管至关重要的是每一行的长度都正确,并且最后一行必须包含换行符(即,该行的末尾不仅仅是EOF)。

$1>>05p~$~:55+-#v_
$_^#`"N":+1g50$<>:2+3%1-05g6g+0v>!#:v#
vg50-1*2p51:-1_^#:<*2!!-*84p6g5<
 +#,.#$"R"\#\-#+5<^g51$_:0`6*\25g\v@_:#!.#:1#,
>+::25p6g\48*\6p48 *-:!^!:--1*2`0:<

在线尝试!

该解决方案的基本思想是,我们有一个“数组”来跟踪每条电线的捻数。因此,每当我们在一个方向上发生扭曲时,我们都会为关联的导线增加计数,而在另一个方向上发生扭曲则会减少计数。

在处理特定电线的扭曲的同时,我们还查看了其左侧和右侧的电线的扭曲计数。如果它们中的任何一个都不为零,则我们需要将这些扭曲“冲洗”到堆栈上,因为以后将无法通过相反方向的扭曲来解开它们。

在输入的最后一行之后,输入流重复返回EOF,并且至少出于冲洗目的,这些EOF字符被解释为每条导线中的扭曲。这将强制程序刷新数组中所有未完成的计数,但不会生成任何新的扭曲计数。

处理完输入后,所有用于理线纠缠的命令现在都将位于堆栈上。这意味着我们可以简单地以相反的顺序弹出它们,以输出从下向上解缠电线所需的指令。


这似乎工作完美。做得好!
HyperNeutrino '16

这是制胜法宝。做得好!另外,感谢您为我检查其他答案!:)
HyperNeutrino '16

@AlexL。谢谢。这是我在网站上的第一个获奖答案。认为Befunge不可能做到。:)
James Holderness

没问题。恭喜胜利!对于您做出Befunge回答的时间如此之短,我感到很惊讶。:)
HyperNeutrino,2016年

5

Pyth- 26 25字节

很简单,也许我可以过滤一下。

fhhT_m+hB/xrdZ\x2@"RL"}\x

在这里在线尝试


好好尝试。不幸的是,输出的字符不正确。似乎每次都是R。尽力而为;数字正确显示!
HyperNeutrino

@AlexL。我很愚蠢,我已经将args翻转为in固定,它也为我节省了一个字节
Maltysen

我知道了。好答案!进行投票。:)
HyperNeutrino '16

2
如果我没记错的话,这似乎无法解决您将X和x垂直堆叠的情况。它告诉您不必要地来回交换电线。
James Holderness

5

JavaScript(ES6),178个字节

f=([t,...a],r=[])=>a[0]?t.replace(/x/gi,(c,i)=>(c=c<'x'?'R':'L',i=++i/2,r.reduce((f,[j,,d],n)=>f||i<j+2&&j<i+2&&(j-i|c==d||r.splice(n,1)&&2),0)<2?r=[[i,i+1,c],...r]:r))&&f(a,r):r

将输入作为代表行的字符串数组并返回值数组的数组,例如[[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]。反向排序有助于消除这种情况。


你从哪里来s?我在repl.it上运行它,它告诉我有一个ReferenceError: s is not defined
HyperNeutrino

@AlexL。糟糕,我不小心粘贴了我尚未完成打高尔夫球的代码的先前版本。现在应该修复。
尼尔

@JamesHolderness自提交答案以来,问题已更改,我必须对其进行更新。
尼尔

@JamesHolderness是的。抱歉,尼尔。我只需要澄清一些我之前没有澄清的问题。
HyperNeutrino

@JamesHolderness我意识到,这就是为什么我将答案标记为非竞争性原因,因为它回答了问题的上一迭代,直到能够将其更新为当前要求为止。
尼尔

3

Python 2中,244个 241字节

m=[]
for l in input():
 for i in range(len(l)):
  c=l[i];a=i/2+1;L,R=[a,a+1,'LR'[c>'v']],[a,a+1,'RL'[c>'v']];x=m.index(L)if L in m else-1;M=zip(*m[:x+1])
  if c in'xX':
   if x>=0and(a in M[1]or a+1in M[0])<1:del m[x]
   else:m=[R]+m
print m

将输入作为字符串列表

例:

输入: ['| | | |', ' X | |', '| | x ', '| X |', ' x | |']

输出: [[1, 2, 'L'], [2, 3, 'R'], [3, 4, 'L'], [1, 2, 'R']]

编辑:固定情况:

输入: ['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']

输出: [[1, 2, 'L'], [2, 3, 'R'], [1, 2, 'R']]


@JamesHolderness应该现在修复。
TFeld

看起来现在可以正常工作了!
HyperNeutrino '16

@JamesHolderness是的,这似乎是一个问题。请解决该问题,TFeld。否则,请尝试!
HyperNeutrino

@AlexL。应该立即修复
TFeld
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.