これらのワイヤを解くのを手伝ってください!


12

私のワイヤーはすべて絡まっています!

ワイヤーがすべて絡まると迷惑になりませんか?まあ、それはちょうど私に起こったので、私はそれらを解くのを手伝いたいです!便宜上、これらすべてをデバイスから切断しましたが、すべてコンセントに接続されたままです。あなたの課題は、それらを解く方法を理解することです!

入力

入力は、スペース、パイプ、およびXで構成されます(両方の場合)。入力は次のようになります。

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

大文字のXは、左のワイヤが右のワイヤと交差することを意味し、小文字のxはその反対を意味します。最初と最後の行は常にです| | | |...。入力は、コンマ区切りの文字列、文字列の配列などとして使用できます。意味があり、余分な情報が含まれていない限り、形式は厳密ではありません。

出力

この挑戦のために、私はどれくらい時間がかかるかを知る必要があるだけでなく、私は何をすべきかを正確に知る必要があります。したがって、大文字と小文字を区別しない文字RまたはLを持つ整数ペアのリストを出力します。これは、2本のワイヤを解く方法と方向を表します(RはLの場合は右、左の場合はその逆)。どの方法でそれらを解除するかを教えてください。私は自分でそれを理解できません。すべての整数ペア+文字を正しい順序で出力し、余分なナンセンステキスト(括弧、コンマなどは問題ありません)を出力しない限り、出力もかなり柔軟です。ワイヤには、0個または1個のインデックスを付けることができますが、インデックスは左から開始する必要があります。上部からではなく、下部からもつれを解く必要があることに注意してください。出力スタイルは一貫している必要があり、明確でない場合は出力方法を指定してください。キャラクターの大文字小文字は一致していませんが、

サンプル出力

上記の入力例の場合、出力は次のようになります。

2 3 R
3 4 L
1 2 R

ここでの出力形式は、スペースで区切られた値の改行で区切られたリストです。これは1インデックスです。

さらなる仕様

Xとxをいずれかの順序で互いに垂直に積み重ねることは有効です。私は怠け者であるため、不必要にワイヤを切り替えたくないので、これらの場合には何も出力しないでください。それが見つかったら、ワイヤーをそっと引っ張ってまっすぐにします。

また、複数のXとxを垂直に積み重ねることも有効です。また、どちらのワイヤも他の交差に関与していない限り、余分な動きは必要ありません(怠け者だからです)。したがって、文字がX X x X x x他の交差なしで列に表示される場合、出力は空白のままです。

これが明確でない場合、RはXを除去し、Lはxを除去します。

同じ行に2つのワイヤ交差がある可能性があります。その場合、これら2つのスワップの順序は重要ではありません。次のようなものは得られ| 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
同じ列に2組のワイヤを絡ませることは可能ですか?
ジェームズホルダーネス

1
@JamesHoldernessはい、そうです。この場合、順序は関係ありません。質問でそれを明確にします。ありがとう!
ハイパーニュートリノ16

@JamesHolderness完了!
ハイパーニュートリノ16

回答:


0

Befunge、173バイト

入力はチャレンジの説明で指定された正確な形式でstdinから読み取られますが、すべての行が正しい長さであり、最終行に改行が含まれていることが重要です(つまり、その行の最後に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:<

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

このソリューションの基本的な考え方は、各ワイヤのツイストカウントを追跡する「アレイ」があるということです。そのため、1つの方向でねじれが発生するたびに、関連するワイヤのカウントを増やしますが、他の方向でねじれを行うとカウントが減ります。

特定のワイヤのツイストを処理すると同時に、その左右のワイヤのツイスト数も調べます。どちらかがゼロ以外の場合、それらのツイストをスタックに「フラッシュ」する必要があります。これは、後の反対方向のツイストによってそれらを解くことができなくなるためです。

入力の最後の行の後、入力ストリームはEOFを繰り返し返し、これらのEOF文字は、少なくともフラッシュの目的のために、すべてのワイヤのねじれとして解釈されます。これにより、プログラムは配列内の未処理のカウントをフラッシュしますが、新しいツイストカウントは生成されません。

入力の処理が完了すると、ワイヤのもつれを解くためのすべてのコマンドがスタックに配置されます。これは、ワイヤーを下から解くのに必要な命令を出力するために、単に逆の順序でそれらをポップオフできることを意味します。


これは完全に機能するようです。よくやった!
ハイパーニュートリノ16

これが勝利の答えです。よくやった!また、他の回答を確認してくれてありがとう!:)
HyperNeutrino 16

@AlexL。ありがとう。これはサイトでの私の最初の勝利の答えです。Befungeでそれが可能になるとは思わなかった。:)
ジェームズホルダーネス

問題ない。勝利おめでとうございます!あなたがBefungeの答えをどれほど短くしたかだけでなく、私はかなり驚いています。:)
HyperNeutrino 16

4

Pyth- 26 25バイト

非常に簡単です。たぶん私はフィルタリングをゴルフすることができます。

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

こちらからオンラインでお試しください


良い試み。残念ながら、出力される文字は正しくありません。毎回Rのようです。でも試してみてください。数字が正しく出ています!
ハイパーニュートリノ16

@AlexL。私は、私は引数をひっくり返した、愚かだin、固定され、それがあまりにも私のバイトを保存
Maltysen

そうですか。いい答え!賛成票を持っている。:)
HyperNeutrino 16

2
私が間違っていなければ、Xとxが垂直に積み上げられている場合を処理するようには見えません。不必要にワイヤを交換するように指示されます。
ジェームズホルダーネス

4

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うん。申し訳ありません、ニール。先ほど明らかにしなかった質問の一部を明確にする必要がありました。
ハイパーニュートリノ16

@JamesHolderness私は、それが現在の要件に更新できるようになるまで、質問の前の反復に答えたとき、私が答えを非競合としてマークした理由を理解しています。
ニール

2

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 16

これは、現在正常に動作しているようです!
HyperNeutrino

@JamesHoldernessはい、それは問題のようです。それを修正してください、TFeld。それ以外の場合は、素晴らしい試みです!
ハイパーニュートリノ16

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