列車を妨害して遅く走らせる[終了]


15

「アラビアバザールに行って、恋に落ちたプレゼントを買いたいと思っています。しかし、到着が遅すぎると、すべての店が閉まってしまい、何も買えなくなります。私?

目標:すべての店舗が閉鎖される前に、ノースリッチモンドストリートから少年をアラビアに連れて行きます。
実際の目標:店が閉まる前に少年がアラビアに到着しないようにしてください。

プログラムは、次の形式で入力を受け取ります。

<time> <map>

どこ

  • <time>少年が旅行に費やすことができる最大時間(分単位)です。正の整数です。
  • <map> 電車が通ることができるルートのグラフです。

グラフの形式は次のとおりです。

  • 各ステートメントはセミコロンで終了します。
  • マップ内のノード(スイッチを表す)は、単一の小文字を使用して表されます。
  • ノード間のパスは、構文a,X,bで表されます。ここXで、はパスの重みを表す整数です。パスの重みは、列車がこれらの2つのノードを通過するのにかかる時間(分単位)です。
  • アラビアはで表されa、ノースリッチモンドストリートはで表されますn
  • すべてのパスは双方向です。

たとえば、このグラフ(パスが双方向のふりをします):

グラフ
ウィキメディア・コモンズ経由のArtyom Kalininによる画像CC BY-SA 3.0ライセンスの下で使用されます。

次のようにグラフ表記に記録されます。

a,4,b;a,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,f;

この入力には、 nため、無効な入力であることに。無効な入力が与えられた場合、プログラムは何でも実行できます。

入力例を次に示します。

21 n,4,b;n,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,a;

(これは、上の画像とa置き換えられnf置き換えられたグラフと同じグラフです。aです)。

少年はから取得する必要がありますnへのa21分以内。彼がルートを取る場合n-> c-> e-> d-> a、彼は20分でそこに着きます。ノードのコンマ区切りリストとしてそのルートを表すことができます。

n,c,e,d,a

一方、ルートn-> b-> c-> e-> d-> aでは、少年は27分かかりますが、これは間に合いません。このルートを次のように表すことができます。

n,b,c,e,d,a

少年が間に合わないようにする別の可能なルートは次のとおりです。

n,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,e,d,a

プログラムは上記のように入力を受け取り、一見すると男の子が間に合うようにルートを出力するように見えますが、実際にはは男の子が間に合わないようにするルートを出力します。任意の入力に対して、バックトラッキングなしでルートが常に存在します。これにより、男の子は間に合いません。

これは手に負えない人気のコンテストなので、最も投票数の多いエントリが勝ちます。バグを隠す工夫のおかげで投票が与えられます-明らかではないほど良いです。

以下は、プログラムをテストするためのサンプルグラフです。

入力:

12 a,2,c;a,2,e;b,5,c;b,4,d;b,11,e;d,7,n;e,4,n;

視覚的表現(この視覚的表現は明確にするためだけであり、課題の一部ではありません):

入力1

可能出力:

n,d,b,e,a

入力:

10 a,8,b;a,12,d;b,1,n;d,11,n;a,1,n;

これがグラフの視覚画像です。

入力2

可能出力:

n,d,a

 


(スタンドアロンプ​​ログラムの代わりに)関数を記述できますか?
golfer9338 14年

@ golfer9338はい。可能な場合、私は、プログラムを好むだろうが、人手不足の部分は、関数が許可されている関数であることに依存している場合。
アブサン

Javascriptでこれを行う予定があるので、私は尋ねています。
golfer9338 14年

3
本当の質問は、なぜ私たちはこの愛に打たれた少年をいじめようとするのですか?おそらく彼は私たちの家族をin辱したのでしょうか?私たちは彼の愛情の対象にデザインを持っていますか?知っておく必要があります!
Claudiu

3
私は、人手不足の課題があるため、この光景にオフトピックオフトピックとして、この質問を閉じるために投票しています
ロハンJhunjhunwalaを

回答:


2

Python 3(2ではない)

編集:私は午前中にこれをアンゴルフします、おっと。

これは完全に通常のA-star検索です。正しい?いい?すべてのテストケースで動作するようです。

def a(b,c,d):
    e,f,g=[],{},{}
    f[c]=0
    while f:
        h=sorted(f.keys(),key=lambda z:-f[z],reverse=True)[-1]
        if h==d:break
        e.append(h)
        for z in b[h]:
            if z in e:continue
            if z in f and f[z]>f[h]+b[z][h]:continue
            g[z]=h
            f[z]=f[h]+b[z][h]
        del f[h]
    i=[]
    j=d
    q=0
    while j!=c:
        i.append(j)
        q+=b[j][g[j]]
        j=g[j]
    return q,(i+[c])[::-1]
t,q=input().split(" ")
t=int(t)
q=q[:-1]
q=[i.split(",")for i in q.split(";")]
g={a:{}for a in __import__("functools").reduce(lambda zz,zy:zz+zy,[[v[0],v[2]]for v in q])}
for l in q:g[l[0]][l[2]]=g[l[2]][l[0]]=int(l[1])

r=a(g,'n','a')
print("time-good: %d, time-ours: %d" % (t, r[0]))
print("path: %s" % " -> ".join(r[1]))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.