黄色の木に分岐した2本の道路(パート3)


10

注:これは、以前の私の挑戦であった、黄色の木材に分岐した2本の道路(パート2)に基づいています。その質問の人気と2つの道路が黄色の森に分岐したため(パート1)、3 つ目の道路を作成したいと思いました。しかし、最初の2は、あまりにも簡単(た2バイトの最初の答えは、第二の15バイトの答え。)だから私は、より複雑な何かをしました...

インスピレーション

この挑戦は、ロバート・フロストの有名な詩、「道はとられない」に触発されました。

黄色い森に分かれた2本の道、
そして申し訳ありませんが、両方を旅することはできませんでした。
一人旅人になり、長い間立ち
、できるだけ下を見下ろし
ました。

... 2段落をトリミング...

私はため息をついてこれを言います。
年齢とそれゆえ年齢:
2つの道路が森の中で分岐し、私は—通行が
少ない方の道路を利用しました
。それがすべての違いを生んでいます。

最後から2番目の行に注意してくださいI took the one less traveled by,

裏話

あなたは、道を歩いている盲目の冒険家を助けるために割り当てられ、The Road Not Takenに触発されました。冒険者が道路の分岐点に近づいていて、あまり移動しない経路を進みたいと考えています。あなたは冒険者が実際にどこにいるのかを見つけ、冒険者にどこを曲がるかを教えなければなりません。

チャレンジ

あなたの目標は、道路が分岐している地図上で最も移動が少ない道路を見つけることです。マップは改行(または\n、必要に応じて)を含む文字列であり、幅と高さが不明です。マップでは、道路は0〜9数字で構成され、交差点は#sで構成されています。あなたは現在あなたが通っている道を見つけ、他の道の中で最も通った道と、盲目の冒険家のためにあまり通らなかった道を見つけなければなりません。マップ内の森はスペースで表されます。ここに簡単なマップがあります:

2   2
 1 0 
  #  
  2  
  2  

このマップは、幅5、高さ5です。道路がY字型に分岐していることに注目してください。Yの向きはどのようなものでもかまいません。そのため、「回転した」マップを理解できる必要があります。

どういう#意味

地図が分岐する場所にはがあり#ます。これはパスのスコアには影響しません。

数字が実際に意味すること

各パス(数字の線、曲がりがある場合があります)にはスコアがあります。パスのスコアはその数字を合計することによって決定されるため、最初の例では、最初のパス(左上から時計回り)のスコアは2 + 1 = 3、2番目のパスは2 + 0 = 2、3番目のパスは2 + 2 = 4です。道路には、斜めに接続された数字が含まれている場合があります。

現在地を見つける

あなたは最高得点の道を進んでいます。他の2つのパスは、移動が多い道路と移動が少ない道路です。最も低いスコアの道路を見つける必要があります。

旅行者にどこへ行くかを伝える

旅行者に「左」または「右」に行くように指示する必要があります。方向は旅行者の視点からのものであることを覚えておいてください(彼はフォークに面しています)。

マップの例

  14
9#  
  04

出力: "右"(旅行者が9道路にいる、0 + 4 <1 + 4

  9  
  9  
  9  
  9  
  9  
  #  
 8 8 
 8 8 
88 88
8   7

出力:「左」(旅行者が99999道路にいる、8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

出力:「右」(旅行者が98765道路にいる、0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

出力:「右」(旅行者が4422道路にいる、4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

「左」を出力(旅行者は999道路にいる、8 + 8 + 8> 7 + 7 + 7

知っておくべきこと:

  • 各行が同じ長さになるように、マップにはスペースが埋め込まれます。
  • 文字列leftまたはをSTDOUT / console / fileに出力する必要がありrightます。オプションで、その後に改行が続きます。
  • 入力は、改行、\ns、または行の配列/リスト(各行は文字列)を含む文字列として受け取る必要があります。その入力が置かれる場所は、関数、コマンドライン引数、ファイル、またはSTDINである必要があります。変数は(関数パラメーターでない限り)許容される入力デバイスではありません。同様に、JSおよび他の言語の関数式を変数に割り当てる必要があります。
  • これはなので、バイト単位の最短の回答が優先されます。
  • 禁止されている標準の抜け穴

想定できること

  • 入力は有効になります。このようなものはテストされません:
0 0 0
 0 0
  #
 0 0
  • パスのスコアは決して結び付けられません。
  • 入力の長さは、幅または高さを問わず、言語の文字列制限未満にすることができます。
  • 2つのパスの間には常に少なくとも1つのスペースがあります。
  • パスには曲がり、曲がり角などがある場合があります。これらは高速道路ではなく道路です。

何か質問がある?下のコメントと楽しいゴルフで私に尋ねてください!


ウィル#は常に水平に中央にありますか?
David Archibald

12
サンドボックスを使用するときがきたと思います。そして、おそらくいくつかの新しいインスピレーションを見つけます。このレートでは、面白いチャレンジシリーズを作成するよりも、詩を宣伝しているように感じます。特にあなたが一人一人を除いて詩を投稿するので。最初から見てきましたが、それで十分です。
mbomb007 2017年

4
ほら 私はあなたの課題を気に入りましたが、pt 2で1つも受け入れずに3を投稿するだけで難しさを追加するのは速すぎます。2への編集は、回転、絶対出力などのわずかな変更に対して十分です。
David Archibald

2
それは前のものとは非常に異なる挑戦であり、私はそれが好きです... Y形状は当然のように取ることができます(1つのパスは常に1つのエッジで終わり、他の2つは反対側のエッジで終わります)。
dnep 2017年

1
@dnepはい、そうです。
programmer5000

回答:


4

D348の 321 312 302バイト

import std.stdio,std.algorithm,std.regex,std.range;void h(R,U)(R s,U r){U[2]c;foreach(L;s.map!(a=>a.array.split)){U l=L.length-1;r>1?r=l^r-2:0;l?c[]+=l*L.map!sum.array[]:c;}write(c[r]>c[!r]?"right":"left");}void main(){auto s=stdin.byLineCopy.array;!s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);}

未ゴルフ

import std.stdio,std.algorithm,std.regex,std.range;

void h(R,U)(R s, U reverse) {
    U[2] counts;
    /* Now that all paths are up/down, every line we need to count up has
       precisely two space-delimited parts to sum up. */
    foreach (line; s.map!(a=>a.array.split)) {
        U len = line.length - 1;
        reverse > 1 ? reverse = len ^ reverse - 2 : 0;
        len ? counts[] += len * line.map!sum.array[] : counts;
    }

    /* Switch left/right as needed based on our orientation */
    write(counts[reverse] > counts[!reverse] ? "right" : "left");
}

void main() {
    /* Treat the input as a matrix of integers */
    auto s = stdin.byLineCopy.array;

    /* If moving left/right intead of up/down, transpose */
    !s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);
}

オンラインでお試しください!


最初の回答者になっておめでとうございます!あなたはこれに勝つかもしれません... Dにリンクできますか?
programmer5000

2

Python 2、304バイト

オンラインでお試しください

A=input()
S=str(A)[2:-2].replace("', '",'')
i=S.index('#')
r=len(A[0])
w=1
a=i/r
if' '<S[i-r]:w=-w;A=A[::w];a=len(A)+~a
if' '<S[i+1]:A=zip(*A[::-1]);a=i%r
if' '<S[i-1]:A=zip(*A)[::-1];a=len(A)-i%r-1
s=0
for c in' '.join(map(''.join,A[0:a])).split():s+=sum(map(int,c));s=-s
print['left','right'][::w][s>0]

このプログラムは道路の方向を推定し、上向きに回転させて、この課題のパート2の私のソリューションを使用します。


2バイトで殴られた!イライラについて話してください!
caird coinheringaahing

@ user00001それが私がたくさん泣く理由です
デッドポッサム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.