หลักสูตรอุปสรรคของฉันแตกต่างกันอย่างไร


21

พื้นหลัง

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

อินพุต

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

เส้นทางผ่านอุปสรรคหลักสูตรเริ่มต้นที่มุมบนด้านซ้ายและปลายที่มุมด้านล่างขวาและไปเท่านั้นหรือลง นอกจากนี้เส้นทางที่ถูกต้องไม่สามารถผ่านสิ่งกีดขวางได้ นี่คือตัวอย่างบางส่วนที่วาดด้วย+-characters:

Valid path  Invalid path  Invalid path  Invalid path
++........   ++........    +++++.....    ..+.......
.++++++#..   .+.....#..    ....+++#++    ..++...#..
......+#..   .+.++++#..    .......#.+    ...+++.#..
....#.++++   .+++#.++++    ....#....+    ....#+....

เส้นทางสองเส้นทางนั้นมีความคล้ายคลึงกัน1หากสามารถแปลงเป็นอีกเส้นทางหนึ่งได้ด้วยการเคลื่อนที่ที+ละจุด พา ธ กลางจะต้องถูกต้องเช่นกันดังนั้นคุณไม่สามารถโค้งงอข้ามสิ่งกีดขวางได้ ตัวอย่างเช่นสองเส้นทางแรกที่นี่มีความคล้ายคลึงเป็นหลัก แต่ที่สามแตกต่างจากพวกเขาเป็นหลักเนื่องจากมันไม่สามารถเลื้อยข้ามสองอุปสรรค:

++........   +.........   +++++++++.
.+++++.#..   ++.....#..   .......#+.
.....+.#..   .++++++#..   .......#++
....#+++++   ....#.++++   ....#....+

เอาท์พุต

ผลลัพธ์ของคุณคือจำนวนเส้นทางที่แตกต่างกันอย่างมากผ่านเส้นทางของสิ่งกีดขวาง กล่าวอีกนัยหนึ่งถ้าเส้นทางที่ถูกต้องทั้งหมดถูกแบ่งออกเป็นคลาสของเส้นทางที่คล้ายกันเป็นหลักผลลัพธ์คือจำนวนของคลาส โปรดทราบว่าหมายเลขนี้อาจเป็น 0 หากไม่มีเส้นทางที่ถูกต้อง

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต ไม่มีเวลา จำกัด เว้นแต่คุณควรประเมินโปรแกรมของคุณในทุกกรณีทดสอบก่อนที่จะส่ง

กรณีทดสอบ

....
....
.... => 1

...#
....
...# => 0

#..#
..#.
.... => 0

......
......
..##..
......
...... => 2

......
...#..
......
..#...
#..... => 3

......
..#...
......
....#.
#..... => 4

.......
##.....
....###
...#...
..##.#.
#....#.
..#.... => 0

......#.
..##....
...#....
.......#
....#...
.##...#.
....#...
##...... => 7

.........
.#.#.#.#.
.........
#.#...#.#
.........
.#.#.#.#.
......... => 17

..........
.#........
..........
.....#....
#.........
........#.
......#...
.......... => 10

.........
.#.......
.........
...#.....
.........
.....#...
.........
.......#.
......... => 16

1 ระยะทางเทคนิคที่ถูกต้องคือ"homotopic"


1
คุณหมายถึงอะไรโดย " ย้ายที+ละครั้ง "? นี่แปลว่าเส้นทางที่คล้ายกันเป็นหลักจะต้องมีความยาวเท่ากันหรือไม่?
ปีเตอร์เทย์เลอร์

3
@PeterTaylor เส้นทางทั้งหมดมีความยาวเท่ากันเนื่องจากสามารถลงและไปทางขวาเท่านั้น โดยการ "ขยับหนึ่ง+" โดยพื้นฐานแล้วฉันหมายถึงว่ามุมหนึ่งของเส้นทางนั้นกลับด้านเป็นมุมของทิศทางตรงกันข้าม
Zgarb

1
@Peter: เนื่องจากคุณสามารถไปทางขวาหรือลงเท่านั้นเส้นทางทั้งหมดจึงมีความยาวเท่ากัน
Deusovi

คำตอบ:


8

หอยทาก , 53 49 ไบต์

A^
\.+d!{.l\.+a3(.|~c!~}\.+r!(.u\.+e(.|~},\.,=~d~

ครั้งหนึ่งฉันไม่ต้องใช้tคำสั่งเทเลพอร์ตอันน่าสะพรึงกลัว เป็นผลให้กรณีทดสอบเสร็จสิ้นทันทีแทนที่จะรับกัลป์

Ungolfed:

A^
r\.+
{
    d\.+
    !{ r\.u \.+ a3 (.|~)}
    r\.+
    !{ d\.l \.+ a3 (.|~)}
},
d\.,
!(dr .)

ตัวเลือกA^หมายถึงการเริ่มต้นที่มุมบนซ้ายและนับเส้นทางที่ตรงกันทั้งหมด แนวคิดหลักคือการตรวจสอบสภาพ canonicity สำหรับเส้นทาง ฉันไม่ได้คาดหวังว่ามันจะใช้งานได้จริง แต่มันตอกย้ำกรณีทดสอบดังนั้น .... สิ่งที่พยายามตรวจสอบคือภายในเส้นทางปัจจุบันเส้นทางที่เป็นโลภที่สุดถูกเลือกคือไปทางขวาหลาย ๆ ครั้งเท่าที่จะทำได้ ลงหลาย ๆ ครั้งที่เป็นไปได้ ฯลฯ โดยไม่ต้องข้ามสิ่งกีดขวางใด ๆ สิ่งนี้ทำได้โดยการตรวจสอบหลังจากเลื่อนไปทางขวา 1 ครั้งหรือมากกว่าจากนั้นลดลง 1 ครั้งหรือมากกว่านั้นไม่สามารถไปถึงจตุรัสถัดไป (ซึ่งต้องอยู่ทางขวา) ได้โดยไปทางขวาอีกครั้งในเซ็กเมนต์ขวาก่อนหน้า เงื่อนไขแบบอะนาล็อกก็จะถูกตรวจสอบเช่นกันหลังจากเลื่อนไปทางขวาแล้วลง


พูดเกี่ยวกับภาษาที่เหมาะสมสำหรับงาน!
ไม่ใช่ Charles

10

Python 2 170 131 112 ไบต์

def f(C,t=1):i="#".join(C).find("#")+1;return([]<C)*(i<1or(i<t
and f([r[i:]for r in C],t-i))+(i>1)*f(C[1:],i-1))

ฟังก์ชั่น, fใช้เส้นทางของสิ่งกีดขวางเป็นรายการของแถวและคืนค่าจำนวนเส้นทางที่แตกต่างกัน

คำอธิบาย

แนวคิดพื้นฐานคือ: เราเลือกเป็นอุปสรรคบางอย่างoเช่นว่าไม่มีอุปสรรคอื่น ๆ ในกล่อง bounding oและมุมบนด้านซ้าย

+--+....
|..|....  
+--#<==== o
.....#..
.#......
........

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

                               A
_
........       ...|////      |....
........       ...|////      |....
...#....  -->  ...#////  -->  ....
.#....#.       .#..//#/       ..#.
........       ....////       ....

   |                           |
   v                           v
                  B
........       ___
........       .#....#.
___#....  -->  ........  -->   +
/#////#/       
////////       

สิ่งต่าง ๆ มีความซับซ้อนเล็กน้อยจากข้อเท็จจริงที่ว่าหลักสูตรอุปสรรคเพียงอย่างเดียวไม่ได้นำเสนอข้อมูลที่จำเป็นทั้งหมด ตัวอย่างเช่นพิจารณาหลักสูตรBในแผนภาพด้านบน เราไม่สามารถระบุได้ว่าจะสามารถข้ามอุปสรรคแต่ละอย่างจากทางเหนือได้หรือไม่ หากBเป็นเส้นทางเข้าดังนั้นตั้งแต่เส้นทางทั้งหมดเริ่มต้นที่มุมบนซ้ายไม่มีสิ่งกีดขวางใดที่สามารถข้ามจากทางเหนือได้ แต่เนื่องจากเราสามารถไปถึงBจากทั้งสองด้านของอุปสรรคซ้ายเมื่อข้ามoจากตะวันออก เราควรปฏิบัติต่อสิ่งกีดขวางนี้ราวกับว่ามันจะถูกข้ามจากทิศเหนือเมื่อแก้ไขเส้นทาง สิ่งเดียวกันไม่ได้ขัดขวางสิ่งกีดขวางที่ถูกต้องอย่างไรก็ตามซึ่งไม่สามารถข้ามจากทิศทางนี้ได้

เรารับข้อมูลพิเศษนี้โดยการระบุพร้อมกับสิ่งกีดขวางจำนวนตัวอักษรในแถวแรกเริ่มจากทางซ้ายเพื่อให้เส้นทางสามารถเริ่มได้ ในแผนภาพด้านบนสิ่งนี้จะถูกทำให้เป็นเส้นทึบที่อยู่ถัดจากแต่ละหลักสูตร ในขณะที่ทางเทคนิคเราต้องระบุจำนวนตัวอักษรตามคอลัมน์แรกที่เส้นทางสามารถเริ่มต้นได้เช่นในกรณีของหลักสูตรย่อยAในทางปฏิบัติเรามักจะเลือกสิ่งกีดขวางสูงสุดดังนั้นจึงไม่จำเป็นต้องใช้ข้อมูลนี้ .

การเลือกที่แท้จริงของoมีดังนี้: เราทำท่าว่าแต่ละแถวนอกเหนือจากแถวสุดท้ายตามด้วยสิ่งกีดขวาง (เช่นมีส่วน#ต่อท้าย) และเลือกสิ่งกีดขวางแรกในเส้นทางผลลัพธ์ในลำดับการอ่าน สำหรับแถว (นอกเหนือจากล่าสุด) ที่ไม่มีสิ่งกีดขวางในขั้นต้นหมายความว่าเราข้ามมันได้อย่างมีประสิทธิภาพ (ในขณะที่สังเกตว่าเส้นทางด้านล่างอาจเริ่มต้นที่อักขระใด ๆ ตามแถวด้านบน) ในที่สุดเราก็จบลงด้วยเส้นทางที่มีแถวเดียวโดยไม่มีอุปสรรคซึ่งมีเพียงเส้นทางเดียวที่เป็นไปได้


นี่เป็นวิธีแก้ปัญหาที่ฉันกำลังพิจารณาอยู่ ฉันรู้ว่ามีคนโพสต์ไว้ก่อนที่ฉันจะมีโอกาส
quintopia

6

CJam, 85 84 82 81 80 79 ไบต์

qN/:Q,(Qz,(:R_T]2/e~e!{'#Qs@{\(\@>}%s-},{_}{(a\L{@+_@\-_{2$\f.=0fe=2&},}h;}w;],

ลองออนไลน์ หรือเรียกใช้ชุดทดสอบทั้งหมด

ประสิทธิภาพของการแก้ปัญหานี้อาจจะค่อนข้างแย่ แต่ก็สามารถแก้แต่ละกรณีทดสอบได้ภายในไม่กี่วินาที

คำอธิบาย

ฉันจะต้องเพิ่มการวิเคราะห์แบบเต็มของรหัสในภายหลัง แต่แนวคิดของอัลกอริทึมคือ:

  • ให้กว้างและความสูงของตารางเป็นWและHตามลำดับ
  • เราสร้างเส้นทางที่เป็นไปได้ทั้งหมดเป็นพีชคณิตที่แตกต่างของW-1สำเนา0และH-1สำเนาW-1(ซึ่ง0เป็นขั้นตอนในแนวนอนและW-1ขั้นตอนแนวตั้ง) เราเดินทุกเส้นทางเหล่านั้นด้วยซ้ำการองค์ประกอบแรกของตารางแล้วกระโดดข้ามstepเซลล์ในการอ่านคำสั่ง (ที่stepเป็น0หรือW-1) #เราทิ้งทุกเส้นทางซึ่งประกอบด้วย
  • จากนั้นเราจะลบกลุ่มของเส้นทางที่คล้ายกันหนึ่งกลุ่ม (ซึ่งจะเป็นเส้นทางทั้งหมดที่คล้ายกับเส้นทางแรกของเส้นทางที่เหลือ) การตรวจสอบเส้นทางที่คล้ายกันจะง่ายขึ้นเล็กน้อยโดยการผ่อนคลายเงื่อนไขให้เล็กน้อย: แทนที่จะตรวจสอบว่าxมีการเคลื่อนที่เราตรวจสอบว่าเส้นทางแตกต่างกันในสองแห่ง หากเป็นเช่นนั้นทั้งสองแห่งจะมีการสลับแนวตั้งและแนวนอนสลับกัน สิ่งนี้ทำให้ส่วนทั้งหมดระหว่างการเคลื่อนไหวเหล่านั้นถูกเลื่อนในแนวทแยงมุมโดยเซลล์หนึ่ง แต่ถ้าเส้นทางทั้งสองนั้นถูกต้องการขยับส่วนใดส่วนหนึ่งของเส้นทางโดยเซลล์หนึ่งเส้นทแยงมุมไม่สามารถข้ามสิ่งกีดขวางดังนั้นพวกมันจึงมีความคล้ายคลึงกัน เรายังต้องค้นหาการปิดสกรรมกริยาดังนั้นเราจึงทำต่อไปจนกว่าเราจะไม่พบเส้นทางที่คล้ายกันอีกต่อไปก่อนที่จะย้ายไปยังกลุ่มถัดไป
  • ในที่สุดเราก็นับกลุ่มที่เราพบซึ่งเราทิ้งไว้ที่ด้านล่างของสแต็ก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.