ช่วยฉันแก้ให้หายยุ่งสายเหล่านี้!


12

สายไฟของฉันยุ่งเหยิงทั้งหมด!

มันน่ารำคาญไหมถ้าสายพันกันทั้งหมด? นั่นเป็นสิ่งที่เพิ่งเกิดขึ้นกับฉันดังนั้นฉันต้องการช่วยฉันแก้ให้หายยุ่ง! เพื่อความสะดวกของคุณฉันได้ตัดการเชื่อมต่อทั้งหมดจากอุปกรณ์ แต่พวกเขายังคงเชื่อมต่อกับเต้าเสียบ ความท้าทายของคุณคือหาวิธีแก้ให้หายยุ่ง!

อินพุต

อินพุตจะประกอบด้วยช่องว่างท่อและ Xs (ทั้งสองกรณี) อินพุตจะมีลักษณะดังนี้:

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

ทุน X หมายความว่าเส้นลวดด้านซ้ายตัดผ่านเส้นลวดด้านขวาและตัวพิมพ์เล็ก x หมายถึงสิ่งที่ตรงกันข้าม | | | |...บรรทัดแรกและครั้งสุดท้ายจะเป็น คุณอาจรับอินพุตเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคอาร์เรย์ของสตริง ฯลฯ รูปแบบไม่เข้มงวดตราบใดที่เหมาะสมและไม่มีข้อมูลเพิ่มเติมใด ๆ

เอาท์พุต

สำหรับความท้าทายนี้ฉันไม่เพียงต้องรู้ว่าฉันจะต้องใช้เวลานานแค่ไหนฉันต้องรู้ว่าต้องทำอย่างไร ดังนั้นเอาท์พุทรายการคู่ที่เป็นจำนวนเต็มด้วยอักขระ R หรือ L ตัวพิมพ์เล็กและใหญ่ซึ่งแสดงว่าสายสองเส้นใดที่ไม่แก้ให้หายยุ่งและทางไหน (R หมายถึงทางซ้ายขวาและในทางกลับกันสำหรับ L) คุณต้องบอกฉันว่าวิธีไหนที่จะเปิดโปงพวกเขา ฉันไม่สามารถคิดออกเอง เอาต์พุตก็มีความยืดหยุ่นเช่นกันตราบใดที่คุณส่งออกจำนวนเต็มคู่ทั้งหมด + ตัวอักษรในลำดับที่ถูกต้องและคุณไม่ได้ส่งออกข้อความไร้สาระพิเศษใด ๆ (วงเล็บ, เครื่องหมายจุลภาคและอื่น ๆ ) สายไฟอาจเป็นศูนย์หรือหนึ่งดัชนี แต่ดัชนีจะต้องเริ่มจากด้านซ้าย โปรดทราบว่าคุณต้องแก้ให้หายจากด้านล่างไม่ใช่ด้านบน รูปแบบผลลัพธ์จะต้องสอดคล้องกันและโปรดระบุว่าคุณแสดงผลอย่างไรหากไม่ชัดเจน กรณีของตัวละครไม่สอดคล้องกัน

ตัวอย่างผลลัพธ์

สำหรับตัวอย่างอินพุตด้านบนเอาต์พุตจะเป็นดังนี้:

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 |นี้ (มันไม่สมเหตุสมผลเพราะมันหมายความว่าเส้นลวดกลางกำลังถูกตัดผ่านสายไฟทั้งซ้ายและขวา)

ไม่วกวนเสมอ ...

อินพุตอาจเป็นไพพ์เดียว อย่างไรก็ตามอินพุตจะไม่ว่างเปล่า

ทางออกที่ถูกต้องสั้นที่สุดชนะเมื่อวันที่ 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

คำตอบ:


1

Befunge, 173 ไบต์

อินพุตถูกอ่านจาก stdin ในรูปแบบที่แน่นอนที่กำหนดไว้ในคำอธิบายการท้าทายแม้ว่ามันเป็นสิ่งสำคัญที่ทุก ๆ บรรทัดต้องมีความยาวที่ถูกต้องและบรรทัดสุดท้ายจะต้องมีการขึ้นบรรทัดใหม่

$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

นี่คือคำตอบที่ชนะ เยี่ยมมาก! ขอบคุณสำหรับการตรวจสอบคำตอบอื่น ๆ สำหรับฉัน! :)
HyperNeutrino

@AlexL ขอบคุณ นี่คือคำตอบที่ชนะครั้งแรกของฉันในเว็บไซต์ ไม่คิดว่ามันจะเป็นไปได้ด้วย Befunge :)
James Holderness

ไม่มีปัญหา. ขอแสดงความยินดีกับชัยชนะ! ฉันค่อนข้างประหลาดใจเช่นเดียวกับที่คุณตอบสั้น ๆ กับเบฟจอย :)
HyperNeutrino

5

Pyth - 26 25 ไบต์

ตรงไปตรงมามากบางทีฉันสามารถเล่นกอล์ฟตัวกรองได้

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

ลองมันออนไลน์ได้ที่นี่


ความพยายามดี น่าเสียดายที่ตัวละครที่ส่งออกไม่ถูกต้อง ดูเหมือนว่าจะเป็น R ทุกครั้ง แม้ว่าจะลองดี ตัวเลขออกมาถูกต้องแล้ว!
HyperNeutrino

@AlexL ฉันโง่ฉันได้พลิก args ไปที่inแก้ไขและมันช่วยฉันไบต์ด้วย
Maltysen

ฉันเห็น. คำตอบที่ดี! มี upvote :)
HyperNeutrino

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"]]e กรัม การเรียงลำดับแบบย้อนกลับช่วยในการคัดออก


คุณsมาจากไหน ฉันทำงานบน repl.it ReferenceError: s is not definedและก็บอกว่ามี
HyperNeutrino

@AlexL อุ๊ปส์ฉันวางรหัสรุ่นก่อนหน้าโดยไม่ตั้งใจซึ่งฉันยังเล่นกอล์ฟไม่เสร็จ ควรได้รับการแก้ไขแล้ว
Neil

@JamesHolderness คำถามมีการเปลี่ยนแปลงตั้งแต่ฉันส่งคำตอบของฉันฉันต้องอัปเดต
Neil

@ JamesHolderness อ๋อ ขออภัยเกี่ยวกับสิ่งนั้นนีล ฉันต้องการชี้แจงบางส่วนของคำถามที่ไม่ได้ชี้แจงก่อนหน้านี้
HyperNeutrino

@ JamesHolderness ฉันรู้ว่านี่คือสาเหตุที่ฉันทำเครื่องหมายคำตอบว่าไม่ใช่การคอมไพล์เพราะมันตอบคำถามซ้ำก่อนหน้านี้จนกระทั่งถึงเวลาที่ฉันสามารถอัปเดตข้อกำหนดปัจจุบันได้
Neil

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

@ JamesHolderness ใช่ว่าดูเหมือนปัญหา โปรดแก้ไขสิ่งนั้น TFeld มิฉะนั้นพยายามดี!
HyperNeutrino

@AlexL ควรได้รับการแก้ไขแล้ว
TFeld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.