最急降下を避けてください!


19

バックグラウンド

数ヶ月前、あなたの人生の冒険はちょうど始まりました。さて、この正確な瞬間に(ええ、今)、数ヶ月の苦労と努力の後、あなたと友人のグループは世界の頂点に立っています。はい、あなたは正しいです、あなたはサガルマータの頂上にいます。

しかし、物事はあなたが望んでいるほどうまくいきません。濃い霧があなたを取り囲み、信じられないほど見栄えの悪い嵐ができるだけ早く来ています。途中でロープを固定せず、足跡が雪に覆われました。(少なくとも今日は)生き残りたい場合は、できるだけ早くそこから抜け出す必要がありますが、まず、山のどの面が下りるべきかを知る方法を見つけなければなりません。

幸いなことに、旅行前に変更した衛星電話を持ち込んで、プログラムを実行できるようにしました。

チャレンジ

ASCIIの昔ながらの判読できない世界の頂点で山の地図を携帯電話にダウンロードすることができました。あなたの仕事は、あなたが生き残る可能性を高めることができるように、山のどの面が最も簡単な降下を示すかを決定することです。そうするためには、どれが最も簡単な方法であるかを伝えるプログラムを携帯電話でコーディングするという素晴らしいアイデアを持っています。(免責事項:これらの活動は専門家によって行われています。このナレーション中にプログラマは負傷していません。自宅でこれを試さないでください。)

マップは文字のみで構成されている/\(プラススペースや改行)。どのマップでも、山の頂上は常に

 /\ 
 \/ 

そして、山頂の両側(1,2,3または4)からは、常に山を下る「可能な」方法を見つけるでしょう。

1 /\ 2
3 \/ 4

ルートは常に次の方法で表示されます。

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

ここで、各新しいキャラクターは、その前身の左/右のいずれかの場所です。各文字の意味は次のとおりです。

  • スラッシュ/バックラッシュが山頂側に平行な場合->「急な」部分としてカウントされます。
  • スラッシュ/バックスラッシュが頂上に垂直の場合->「フラット」パーツとしてカウントされます。

*詳細については、上の図を参照してください。

:側面の長さは異なる場合があり、頂上を構成する文字も側面の一部としてカウントされます。引き分けの場合は、それらのいずれかを選択できます。

標準の抜け穴は許可されていません。

入力

山の地図を表す文字列または同じ情報を含むプレーンテキストファイル。

どちらか

C:\....\file.txt

または

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

文字列は有効な入力です。

出力

出力として、あなたは、プレーンテキストまたは標準出力によってファイルのいずれかで生成しなければならない最小の平均勾配を有する側のASCIIプロファイル表現使用して_平坦部および/急部品の平均勾配とともに側を(number of "/")/(total chars)

上記のマップの出力例:

       /
   ___/
  /
  AS:0.5

プロファイルと平均の急峻さがある限り、形式は重要ではありません。

得点

何?あなたとあなたの友人の命を救い、世界のトップでプログラミングを行った最初のプログラマーになるよりも良い報酬が欲しいですか?さて...これはコードゴルフですので、バイト単位の最短プログラムが勝ちです。

テストケース

入力:

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

出力:

       /
   ___/
  /
  AS=0.5

入力:

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

出力:

______/
AS=0.143 (1/7)

入力:

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

出力:

        /        
       /
      /       
    _/
    AS=0.8

例に基づいて、左から右に読むと、プロファイルは下から上へのパスを示しているように見えますか?上から下に移動しているため、やや珍しいようですが、この方法で明確に定義されていれば問題はありません。
レトコラディ

6
@RetoKoradiあなたは正しい。私は順番に自分の考えを保つために、そのハードそのheigthで、このよう...あなたが知っているそれをしなかった理由を私は...知らない
Ioannes

出力には、最急勾配(1、2、3、または4)の勾配の数も含める必要がありますか?現状では、そのうちの1つが明確に勝者であるが、どの勝者ではないことを知っています。
ヴィック

1
*このナレーション中にプログラマは負傷しませんでした。* 私は気にします。+1
edc65

3
私はあなたがSagarmāthāを使用したことを気に入っています:)
ベータ崩壊

回答:


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.