เกมแห่ง arrowslits ชีวิต


26

พื้นหลัง

ความท้าทายนี้เป็นเกียรติของapsillersผู้ชนะรางวัลNot as simple ตามหมวดหมู่ Best of PPCG 2016 ด้วยความท้าทายกล่องดนตรี 4 โน้ตของฉันสามารถเล่นเพลงนั้นได้หรือไม่? ขอแสดงความยินดี!

ในหน้า "เกี่ยวกับฉัน" ผู้ใช้รายนี้มีตัวจำลองที่ประณีตมากสำหรับออโตเมติกเซลเกมแห่งชีวิต (อย่างจริงจังไปตรวจสอบออก) ในทางกลับกันคำว่าaspilleraเป็นภาษาสเปนสำหรับ "ลูกศรเรืองแสง " จากข้อเท็จจริงเหล่านี้ความท้าทายนี้เกี่ยวกับ arrowslits ใน Game of Life

เกมแห่ง arrowslits ชีวิต

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

อินพุต

อินพุตของคุณคือตารางบิตซึ่งแสดงถึงการกำหนดค่า GoL คุณสามารถนำไปใช้ในรูปแบบที่สมเหตุสมผล (สตริงหลายบรรทัดของอักขระ ASCII ที่พิมพ์ได้สองรายการ, รายการสตริง, อาร์เรย์ 2D ของจำนวนเต็ม, อาร์เรย์ 2D ของ booleans ฯลฯ ) เพื่อความชัดเจนฉันจะใช้สตริงหลายบรรทัดของตัวละคร.#ดังต่อไปนี้

อินพุตรับประกันว่ามีคุณสมบัติหลายอย่าง ครั้งแรกที่ความสูงของมันคือ2NสำหรับบางN ≥ 6และความกว้างอย่างน้อย2 คืน + 2 การป้อนข้อมูลจะเป็นของทั้งหมด.ยกเว้นว่าที่ใดที่หนึ่งในสามแถวบนสุดคือเครื่องร่อนและในแถวกลางสองแถวนั้นจะมีกำแพงของบล็อก เครื่องร่อนจะมุ่งหน้าไปทางตะวันตกเฉียงใต้หรือตะวันออกเฉียงใต้และตำแหน่งของมันจะเป็นเช่นนั้นหากผนังถูกถอดออกมันจะไม่ผ่านขอบด้านข้างก่อนที่จะถึงขอบด้านล่าง (แต่อาจถึงมุมหนึ่งของตาราง) เครื่องร่อนจะถูกแยกออกจากต้นขอบซ้ายและขวาโดยขั้นตอนอย่างน้อยหนึ่งของ.s สามารถอยู่ในช่วงใดก็ได้

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

นี่คือตัวอย่างของตารางอินพุตที่ถูกต้อง:

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

เอาท์พุต

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

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

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

สำหรับจุดประสงค์ของการท้าทายนี้คุณสามารถสันนิษฐานได้ว่าถ้าคุณจำลอง GoL ในอินพุตสำหรับขั้นตอน2 * (ความสูง - 3)เครื่องร่อนจะอยู่ที่แถวล่างสุดในตำแหน่งที่คาดหวังและกำแพงจะสมบูรณ์ .

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

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

กรณีทดสอบ

ฉันได้รวบรวมกรณีทดสอบไว้ในที่เก็บ GitHubเนื่องจากมีขนาดค่อนข้างใหญ่ นี่คือลิงค์ไปยังไฟล์แต่ละไฟล์:


มีเหตุผลใดบ้างในการรวมแถวว่างด้านล่างกำแพงในอินพุต
Martin Ender

@MartinEnder พวกเขาสร้างโซลูชันที่คุณจำลอง GoL บนอินพุทที่เป็นไปได้มากขึ้น (อย่างน้อยฉันก็หวังเช่นนั้น)
Zgarb

เครื่องร่อนจะเริ่มต้นที่แถวบนสุดเสมอหรือไม่
Rod

@ Rod ใช่มันจะอยู่แถวบนสุดมุ่งหน้าไปทางตะวันตกเฉียงใต้หรือตะวันออกเฉียงใต้
Zgarb

เกมแห่งชีวิตอีกเกมหนึ่ง: P
Christopher

คำตอบ:


15

Python 2 , 142 136 135 ไบต์

-6 ไบต์ขอบคุณ ElPedro
-1 ไบต์ขอบคุณ TuukkaX

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

ตรวจสอบการวางแนว (ตะวันออก / ตะวันตก):

west_east
ใช้z=p[2].index(1)เพื่อรับสี่เหลี่ยมจัตุรัสแรกในแถวที่ 3 (แสดงด้วยสี่เหลี่ยมสีแดง) แล้วm=(p[1][z]-p[1][z+1]<1)*2-1ลบค่าทางด้านขวา (สีเขียว) จากด้านซ้าย (สีน้ำเงิน) ด้วยวิธีนี้ทั้ง 4 เครื่องร่อนที่จะไป ทิศตะวันตกเฉียงใต้ในผล1(แถวบนสุดในภาพ) ในขณะที่คนที่จะไปทางตะวันออกเฉียงใต้ในผลหรือ0 จากนั้นแปลง: และใช้กับพารามิเตอร์เพื่อย้อนกลับรายการเมื่อจัดการกับรายการตะวันตก วิธีนี้เครื่องร่อนที่ไปทางตะวันตกเฉียงใต้ถูกทำเช่นเดียวกับที่ไปทางตะวันออกเฉียงใต้-1
1 -> -10,-1 -> 1

การเคลื่อนไหวของเครื่องร่อน

ร่อน
นี่คือการเคลื่อนไหวที่ร่อนไปทางตะวันออกเฉียงใต้มีรูปแบบ "บันได" และบล็อกซ้ายสุดในบรรทัดที่ 3 นั้นคงที่ทุกรูปแบบ เมื่อใช้เป็นจุดเริ่มต้นบล็อก 3 รอบทางด้านซ้ายและขวาและบล็อกกลาง 4 ถูกตรวจสอบว่ามี1s (ซึ่งจะเป็นกำแพง)
arrowslits
arrowslits_path


ฉันคิดว่าคุณจะสูญเสีย 4 ไบต์โดยการตั้งค่าตัวแปรiไป0นอกforวงแล้วเพิ่ม 1 enumerateถึงมันผ่านแต่ละและเพื่อให้ได้รับการกำจัด ดูเหมือนว่าจะทำงานเมื่อฉันลองกับ TIO ของคุณ +1 สำหรับคำตอบที่ยอดเยี่ยมไม่ว่าฉันจะถูกหรือผิด
ElPedro

ดี! 1 inคุณสามารถบันทึกไบต์โดยการลบช่องว่างจาก +1
Yytsi

2
+1 สำหรับ"weast"
JungHwan Min

4

คู่, 123 122 108 ไบต์

ขอบคุณ @LuisMendo บันทึก 2 ไบต์

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

ลองออนไลน์!

หรือ

ตรวจสอบกรณีทดสอบทั้งหมด

ขอขอบคุณ Rod ที่เตรียมเคสทดสอบไว้

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

คำตอบก่อนหน้า:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

Bรูปแบบสารสกัดจากผนังแรกเป็นตัวแปร
ทำการจำลอง GoL จนกระทั่งรูปแบบผนังและรูปแบบจำลองมีเซลล์ต่างกันมาก / น้อยกว่า 5 เซลล์
หากร่อนได้รับแถวสุดท้ายแล้วฟังก์ชันจะส่งกลับค่าจริง


1
จนกว่ารูปแบบผนังและรูปแบบจำลองจะมีเซลล์ที่แตกต่างกันมาก / น้อยกว่า 5 เซลล์ นั่นฉลาด!
Luis Mendo

@LuisMendo ขอบคุณบันทึก byted
rahnema1

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