避免急剧下降!


19

背景

几个月前,您的人生冒险才刚刚开始。现在,在这个确切的时刻(是的,现在),经过几个月的苦难和辛勤工作,您和一群朋友正站在世界之巅。是的,你是对的,你在萨加玛塔山的山顶上。

但是,事情进展得并不理想。浓雾笼罩着您,一场令人难以置信的糟糕风暴即将来临。您没有在向上固定任何绳索,并且脚印已被雪覆盖。如果要生存(至少到今天为止),则需要尽快离开那里,但是您必须首先找到一种方法来知道那座山的哪一面应该降落。

幸运的是,您带来了旅行前修改过的卫星电话,因此您可以在其中编程和执行程序。

挑战

您已经能够以ASCII老式,无法在世界顶上看的方式将山脉的地图下载到手机上。您的任务是确定哪座山面的下降最容易,因此您可以增加生存的机会。为此,您有一个绝妙的主意,那就是在手机上编写一个程序,该程序将告诉您最简单的方法。(免责声明:这些活动是由专业人员完成的。在叙述中没有程序员受到伤害。请不要在家中尝试。)

地图仅由字符/\(以及空格和换行符)组成。在任何地图中,山顶始终以

 /\ 
 \/ 

从山顶的每一侧(1,2,34),您总会在山上找到“可能”的方式。

1 /\ 2
3 \/ 4

路线总是以以下方式显示:

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

每个新角色都位于其前任角色的左/右位置。每个字符的含义是:

  • 如果斜线/反斜线与其顶峰侧平行->视为“陡峭”部分。
  • 如果斜线/反斜线垂直于其顶峰侧->视为“平坦”部分。

*有关更多参考,请参见上图。

注意:边的长度可以不同,构成峰顶的字符也算作边的一部分。万一抽签,您可以选择其中任何一个。

不允许出现标准漏洞

输入项

代表山脉地图或包含相同信息的纯文本文件的字符串。

要么

C:\....\file.txt

要么

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

作为字符串是有效输入。

输出量

作为输出,您应该以纯文本形式生成文件,或者通过stdout 生成侧面ASCII轮廓表示法,以最小的平均陡度_平面部分和/陡峭的部分 side 的平均陡度一起使用(number of "/")/(total chars)

上面地图的输出示例:

       /
   ___/
  /
  AS:0.5

格式并不重要,只要您具有轮廓和平均陡度即可。

计分

什么?您想获得比挽救您和您的朋友的生命并成为有史以来第一位在世界之巅进行编程的程序员更好的回报吗?好的...这是代码高尔夫,所以最短的程序以字节为单位。

测试用例

输入:

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

输出:

       /
   ___/
  /
  AS=0.5

输入:

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

输出:

______/
AS=0.143 (1/7)

输入:

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

输出:

        /        
       /
      /       
    _/
    AS=0.8

根据示例,如果您从左到右阅读该配置文件,它看起来好像是从下到上的路径?似乎有些不寻常,因为我们是从上到下移动的,但是如果以这种方式明确定义它没问题。
Reto Koradi 2015年

6
@RetoKoradi你是对的。我不知道为什么要这样做...您知道,在这么大的困难下很难保持您的思想井井有条...
Ioannes 2015年

输出是否还应包括最不陡峭的斜率(1、2、3或4)?就目前而言,您知道其中一个绝对是赢家,但不是哪个。
2015年

1
*在叙述中没有程序员受伤。* 我在乎。+1
edc65

3
我喜欢您使用了Sagarmāthā:)
Beta Decay

Answers:


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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.