車が限られた量のガスでルートを迂回できるかどうかを判断する


8

関数をサポートするプログラミング言語を使用して、関数を持っている

is_enough(strArr) 

そのテイクstrArr以下の要素からなる配列であろう。

  • N これは循環ルートのガソリンスタンドの数になります
  • 後続の各要素は文字列g:cに なります
    • g そのガソリンスタンドでのガロン単位のガス量であり、
    • c 次のガソリンスタンドに行くのに必要なガロンのガスの量になります。

たとえば、次のようにstrArrなります。

["4","3:1","2:2","1:2","0:1"]. 

あなたの目標は、ルート全体を1度移動できる開始ガソリンスタンドのインデックスを返すことです。それ以外の場合は、文字列"impossible"を返します。

上記の例では4つのガソリンスタンドがあり、次の理由により、プログラムは文字列「1」を返す必要があります。

  • 駅から始まる1あなたが受け取る3ガスのガロンをして過ごす1を次のステーションになって。

  • 次に、あなたが持っている2ガロン+ 2次の駅でより多くを、あなたが過ごす2をあなたは持っているので、2サード駅に着くときガロン。

  • その後、3つありますが、最後の駅まで2つ費やします。

  • 最終ステーションでは0ガロンを受け取り、最終ガロンを出発点に到達させます。

他のガソリンスタンドから出発すると、ルートを回避できなくなるため、答えは"1"です。

開始可能なガソリンスタンドが複数ある場合は、(ガソリンスタンドの)最小のインデックスを返します。Nになります>= 2

正しいサンプル出力:

Input: ["4","1:1","2:2","1:2","0:1"]
Output: "impossible"

Input: ["4","0:1","2:2","1:2","3:1"]
Output: "4"

勝者は長くなりますが、最短のコードを使用する人になります。


1
客観的な勝利基準は何ですか?勝者が誰であるかを知る方法がないので、私は閉じることに投票します。
ドアノブ

その上にコードゴルフタグを置くだけで大丈夫です。
daniero 14

3
タグが欠けているという理由だけで投票を終了するのは少々厳しいですよね。タグを追加するだけです。
Timwi、2014

には常に正確N+1な要素がありstrArrますか?N言語が配列の長さを取得する方法をすでに提供している場合、これは冗長になりますか?(ただし、Cなどでも便利です)
FireFly 14

2
回答の2つは、仕様を名前is_enough(9文字)が必要と解釈しています。3つは単一文字の名前を使用しており、1つは関数にまったく名前を付けていません。何が許されるかを明確にしていただけませんか?
Peter Taylor

回答:


1

APL(70)

{×⍴G←Z/⍨0∧.≤¨+\¨¯1⌽⌽∘K¨Z←⍳⍴K←{⎕ML←3⋄-/⍎¨⍵⊂⍨⍵≠':'}¨1↓⍵:⊃G⋄'impossible'}

説明:

  • 1↓⍵:最初の要素(長さ)をドロップします、それは必要ありません
  • {... :各ガソリンスタンドについて...
    • ⎕ML←3⎕ML内部関数内で3に設定(の動作を変更
    • ⍵⊂⍨⍵≠':':文字列を分割する :
    • ⍎¨:各パーツを評価する
    • -/:最初の数値から2番目の数値を引く(各ガソリンスタンドに正味の影響を与える)
  • K←:それらをKに格納する
  • Z←⍳⍴K:ガソリンスタンドのインデックスを(の1長さまでK)取得し、保存しますZ
  • ⌽∘K¨Z:のK各値で回転しZ、配列の配列を与える
  • ¯1⌽:この配列を左に1だけ回転します(変更されていない配列を最後ではなく最初に配置します)
  • +\¨:各内部配列の実行合計を作成します
  • 0∧.≤¨:実行中の合計ごとに、負の値があるかどうかを確認します
  • Z/⍨:現在のZ合計に負の値がない要素から選択します
  • ×⍴G←:に保存しGます。G要素がある場合:
  • :⊃G:の最初の要素を返しGます。
  • ⋄'impossible':それ以外の場合はを返しimpossibleます。

1

バッシュ178 170 161 157

むしろまっすぐ進む。

is_enough(){((t=(n=$1-1)<0))&&echo impossible||(x=(n ${@:3} $2);for z in ${@:2};do(((t+=${z%:*}-${z#*:})<0))&&is_enough ${x[*]}&&return;done;echo $[$#-++n])}

間隔をあけて:

is_enough() {
     ((t=(n=$1-1)<0)) && echo impossible || (
         x=(n ${@:3} $2);
         for z in ${@:2};do
             (((t+=${z%:*}-${z#*:})<0)) && is_enough ${x[*]} && return;
         done;
         echo $[$#-++n]
     )
}

1

ルビー、111

これが使用するRubyソリューションevalです:

is_enough=->a{_,*s=a
"#{(1..s.size).find{|i|g=0;s.rotate(i-1).all?{|x|g+=eval x.tr ?:,?-;g>=0}}||:impossible}"}

使用例:

is_enough[%w(4 3:1 2:2 1:2 0:1)] #=> "1"
is_enough[%w(4 1:1 2:2 1:2 0:1)] #=> "impossible"
is_enough[%w(4 0:1 2:2 1:2 3:1)] #=> "4"
is_enough[%w(4 1:2 2:1 4:3 0:1)] #=> "2"
is_enough[%w(4 0:1 2:2 1:2 3:1)] #=> "4"
is_enough[%w(4 0:1 0:1 4:1 0:1)] #=> "3"
is_enough[%w(8 0:1 0:1 4:1 0:1 2:1 3:1 0:0 0:1)] #=> "3"

編集:関数名と戻り値の型を修正しました。


0

ルビー132

g=->a{n,*a=a.map{|e|e.split(?:).map &:to_i}
(r=(0...n[0]).find{|i|a.rotate(i).inject(0){|m,(j,k)|m&&m>=0&&m+j-k}})?r+1:"impossible"}

テスト:

irb(main):003:0> g[["4","1:1","2:2","1:2","0:1"]]
=> "impossible"
irb(main):004:0> g[["4","0:1","2:2","1:2","3:1"]]
=> 4

仕様では、すべての場合に文字列を返す必要があります。
ブース2014

@boothby仕様のどこにもその要件はありません。引用できますか?
John Dvorak

1
例えば、4つのガソリンスタンドがある上に、そしてあなたのプログラムは、文字列「1」理由を返す必要があります:
boothby

ああそれをねじ込みます。とにかく
Chron

0

Python、131

このワンライナーはかなり満足できると思います。

E=lambda s:([`i`for i in range(1,len(s)+1)if reduce(lambda r,t:r+eval(t[0]+'-'+t[-1])*(r>=0),s[i:]+s[1:i],0)>=0]+['impossible'])[0]

reduce()ここは何ですか?エラーが発生するNameError: name 'reduce' is not defined
Er Harsh Rathore

@ErHarshRathoreこれはPython 2です。Python3ではreduceまだ標準ライブラリにありfunctoolsますが、モジュールに移動されました。
alkasm

うん!私はそれを得たfrom functools import reduceおかげで
Erを過酷なRathore

@ErHarshRathoreさらに、バッククォート`i`、ここでは、と等価であるstr(i)Pythonの3に
alkasm

この投稿を今すぐpython 3.xに更新する必要がありますか?
Er Harsh Rathore

0

GolfScript(72文字)

{(~\{':'/{~}/-}%[\),1>{;.{1$-1>*+}*-1>\(+\},~"impossible"]1=}:is_enough;

オンラインデモ

これは明らかにブルートフォースアプローチを実行します。最も興味深いビットIMOは、デルタ燃料の配列の部分合計が0を下回るかどうかの判断です。

{1$-1>*+}*-1>

これは、より明白な1文字を節約します

[{1$+}*]{0<},!

出力のインデックスが1ではなく0の場合、配列を回転させる別の方法が推奨されます。

{(;{':'/{~}/-}%:A[,,{A\{(+}*{1$-1>*+}*-1>},~"impossible"]0=}:is_enough;

しかし、このアプローチは1でのインデックス作成に簡単に採用することはできません。

{(;{':'/{~}/-}%:A[,),1>{A\({(+}*{1$-1>*+}*-1>},~"impossible"]0=}:is_enough;

または

{(;{':'/{~}/-}%:A[,,{A\{(+}*{1$-1>*+}*-1>},{)}%~"impossible"]0=}:is_enough;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.