หลีกเลี่ยงเชื้อสายที่ลาดชันที่สุด!


19

พื้นหลัง

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

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

โชคดีที่คุณนำโทรศัพท์ satของคุณมาด้วยซึ่งคุณได้แก้ไขก่อนการเดินทางเพื่อให้คุณสามารถตั้งโปรแกรมและดำเนินการโปรแกรมต่างๆได้

ท้าทาย

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

แผนที่ทำจากตัวละคร/และ\(รวมถึงช่องว่างและบรรทัดใหม่) ในแผนที่ใด ๆ ยอดเขาจะถูกแสดงโดยเสมอ

 /\ 
 \/ 

และจากแต่ละด้าน ( 1,2,3หรือ4) ของการประชุมสุดยอดคุณจะพบทางลง "ที่เป็นไปได้" เสมอ

1 /\ 2
3 \/ 4

เส้นทางจะถูกนำเสนอในวิธีถัดไปเสมอ:

                      \
  Steep-> /          /
           /        / <-Flat
            /      \
      Flat-> \    \
              /  \ <-Steep
               /\
               \/

โดยที่ตัวละครใหม่แต่ละตัวจะอยู่ทางด้านซ้าย / ขวาของรุ่นก่อน ความหมายของตัวละครแต่ละตัวคือ:

  • หากเครื่องหมายสแลช / แบ็กสแลชขนานกับด้านบน -> นับว่าเป็นส่วน 'ชัน'
  • หากเครื่องหมายทับขวา / แบ็กสแลชตั้งฉากกับด้านประชุมสุดยอด -> นับว่าเป็นส่วน 'แบน'

* สำหรับการอ้างอิงเพิ่มเติมดูกราฟิกด้านบน

หมายเหตุ : ด้านข้างสามารถมีความยาวแตกต่างกันและตัวละครที่ประกอบด้วยยอดก็นับเป็นส่วนหนึ่งของด้านข้างของพวกเขา ในกรณีที่เสมอคุณสามารถเลือกใด ๆ ก็ได้

ช่องโหว่มาตรฐานไม่ได้รับอนุญาต

อินพุต

สตริงที่แสดงถึงแผนที่ของภูเขาหรือไฟล์ข้อความล้วนที่มีข้อมูลเดียวกัน

ทั้ง

C:\....\file.txt

หรือ

                  \
      /          /
       /        /
        /      \
         \    \
          /  \
           /\
           \/
          \  /
         \    \
        \      \
       \        \
      /          /

เป็นสตริงเป็นอินพุตที่ถูกต้อง

เอาท์พุต

ในฐานะที่เป็นออกคุณควรผลิตทั้งในไฟล์ข้อความธรรมดาหรือโดย stdout ต์การแสดงรายละเอียดของ ASCII ด้านที่มีความสูงชันเฉลี่ยที่เล็กที่สุดที่ใช้_สำหรับชิ้นส่วนแบนและ/สำหรับชิ้นส่วนที่สูงชันพร้อมกับความสูงชันเฉลี่ย(number of "/")/(total chars)ของด้านข้าง

ตัวอย่างผลลัพธ์ของแผนที่ด้านบน:

       /
   ___/
  /
  AS:0.5

รูปแบบไม่สำคัญตราบใดที่คุณมีโปรไฟล์และความชันเฉลี่ย

เกณฑ์การให้คะแนน

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

กรณีทดสอบ

การป้อนข้อมูล:

                  \
      /          /
       /        /
        /      \
         \    \
          /  \
           /\
           \/
          \  /
         \    \
        \      \
       \        \
      /          /

เอาท์พุท:

       /
   ___/
  /
  AS=0.5

การป้อนข้อมูล:

                  /
      \          /
       /        /
        \      /
         \    /
          /  /
           /\
           \/
          \  /
         \    \
        \      \
       \        \
      /          /
     / 
    / 

เอาท์พุท:

______/
AS=0.143 (1/7)

การป้อนข้อมูล:

           /        \
            \      \
             /    /
              /  \
               /\
               \/
              \  /
             \    /
            \      /
           /        \

เอาท์พุท:

        /        
       /
      /       
    _/
    AS=0.8

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

6
@RetoKoradi คุณพูดถูก ฉันไม่รู้ว่าทำไมฉันถึงทำแบบนี้ ... คุณรู้ไหมว่ามันยากที่จะทำให้ความคิดของคุณเป็นไปตามลำดับ ...
โยอานส์

เอาต์พุตควรมีจำนวนความชันที่น้อยที่สุด (1,2,3 หรือ 4) หรือไม่? คุณรู้ว่าหนึ่งในนั้นคือผู้ชนะแน่นอน แต่ไม่ใช่หนึ่งในนั้น
วิก

1
* โปรแกรมเมอร์ไม่ได้รับบาดเจ็บระหว่างการบรรยายนี้ * ฉันเป็นห่วง. +1
edc65

3
ฉันชอบที่คุณใช้Sagarmāthā :)
Beta Decay

คำตอบ:


4

JavaScript (ES6), 303

ทดสอบการเรียกใช้ข้อมูลโค้ดในเบราว์เซอร์ที่สอดคล้องกับ EcmaScript แน่นอนว่า Firefox อาจเป็น Chrome การใช้สตริงเท็มเพลตฟังก์ชั่นลูกศร

// Golfed, no indentenation, all newlines are significant

f=s=>(s=`
${s}
`.split`
`,s.map((r,i)=>~(q=r.search(/\/\\/))&&(y=i,x=q),x=y=0),z=[],[0,2,0,2].map((d,i)=>{t=x+i%2,u=y+i/2|0,b=s[u][t];for(p=[''],n=l=0;(c=s[u][t])>' ';++l,t+=d-1,u+=(i&2)-1)c==b?p.push(p[n++].replace(/./g,' ',w='/')):w='_',p=p.map((r,i)=>(i<n?' ':w)+r);z=z[0]<(p[0]=n/l)?z:p}),z.join`
`)

// Less golfed

U=s=>(
  s=(`\n${s}\n`).split`\n`,
  x = y = 0,
  s.map((r,i)=>~(q=r.search(/\/\\/))&&(y=i,x=q)),
  z=[],
  [0,2,0,2].map((d,i) => {
    t = x+i%2,
    u = y+i/2|0,
    b = s[u][t];
    for(p=[''], n=l=0; (c=s[u][t])>' '; ++l, t += d-1, u +=(i&2)-1)
      c == b
        ? p.push(p[n++].replace(/./g,' ',w='/'))
        : w='_',
      p = p.map((r,i) => (i<n?' ':w)+r);
    z = z[0]<(p[0]=n/l)?z:p
  }),
  z.join`\n`
)

// TEST
// redirect console into the snippet body
console.log=x=>O.innerHTML+=x+'\n'

maps=[ // as javascript string literals, each baskslasch has to be repeated
`                  \\
      /          /
       /        /
        /      \\
         \\    \\
          /  \\
           /\\
           \\/
          \\  /
         \\    \\
        \\      \\
       \\        \\
      /          /`,
`                  /
      \\          /
       /        /
        \\      /
         \\    /
          /  /
           /\\
           \\/
          \\  /
         \\    \\
        \\      \\
       \\        \\
      /          /
     / 
    / `,
`           /        \\
            \\      \\
             /    /
              /  \\
               /\\
               \\/
              \\  /
             \\    /
            \\      /
           /        \\`]

maps.forEach(m=>console.log(m + '\n'+ f(m) +'\n'))
<pre id=O></pre>

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