Tentukan apakah mobil dapat berkeliling rute dengan jumlah gas yang terbatas

8

Menggunakan bahasa pemrograman apa pun yang mendukung fungsi, miliki fungsi tersebut

is_enough(strArr) 

take strArryang akan menjadi array yang terdiri dari elemen-elemen berikut:

  • N yang akan menjadi jumlah pompa bensin dalam rute melingkar
  • dan setiap elemen selanjutnya akan menjadi string di g:cmana
    • g adalah jumlah gas dalam galon di pompa bensin itu dan
    • c akan menjadi jumlah galon gas yang dibutuhkan untuk sampai ke pompa bensin berikut.

Misalnya strArrmungkin:

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

Tujuan Anda adalah mengembalikan indeks pompa bensin awal yang akan memungkinkan Anda untuk melakukan perjalanan di seluruh rute sekali, jika tidak mengembalikan string "tidak mungkin" .

Untuk contoh di atas ada 4 pompa bensin, dan program Anda harus mengembalikan string "1" karena:

  • Mulai dari stasiun 1 Anda menerima 3 galon gas dan menghabiskan 1 sampai ke stasiun berikutnya.

  • Maka Anda memiliki 2 galon + 2 lebih di stasiun berikutnya dan Anda menghabiskan 2 sehingga Anda memiliki 2 galon ketika Anda sampai ke stasiun ke-3.

  • Anda kemudian memiliki 3 tetapi Anda menghabiskan 2 sampai ke stasiun akhir,

  • Di stasiun terakhir Anda menerima 0 galon dan Anda menghabiskan galon terakhir Anda sampai ke titik awal.

Memulai dari pompa bensin lain akan membuat perjalanan di sekitar rute menjadi tidak mungkin, jadi jawabannya adalah "1" .

Jika ada beberapa pompa bensin yang memungkinkan untuk memulai, kembalikan indeks terkecil (dari pompa bensin). Nakan >= 2.

Output Sampel yang Benar:

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

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

Pemenang akan menjadi orang yang menggunakan kode terpendek meskipun akan lama.

Ayo
sumber
1
Apa kriteria kemenangan yang objektif? Saya memilih untuk menutup karena tidak ada cara untuk mengetahui siapa pemenangnya.
Gagang Pintu
Cukup letakkan tag kode-golf di atasnya dan itu akan baik-baik saja.
daniero
3
Memilih untuk menutup hanya karena tag yang hilang sedikit kejam, bukan begitu? Cukup tambahkan tag.
Timwi
Apakah selalu ada N+1elemen yang tepat strArr? Ini akan membuat Nberlebihan jika bahasa sudah menyediakan cara untuk mendapatkan panjang array, kan? (Itu masih akan berguna untuk misalnya C.)
FireFly
2
Dua jawaban menafsirkan spec sebagai membutuhkan nama is_enough(9 karakter); tiga menggunakan nama char tunggal, dan satu tidak menamai fungsinya sama sekali. Bisakah Anda menjelaskan apa yang diizinkan?
Peter Taylor

Jawaban:

1

APL (70)

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

Penjelasan:

  • 1↓⍵: drop elemen pertama (panjang), kita tidak membutuhkannya
  • {... : untuk masing-masing pompa bensin ...
    • ⎕ML←3: set ⎕MLke 3 dalam fungsi dalam (mengubah perilaku )
    • ⍵⊂⍨⍵≠':': pisahkan string :
    • ⍎¨: mengevaluasi setiap bagian
    • -/: kurangi angka kedua dari yang pertama (memberi efek bersih untuk setiap pompa bensin)
  • K←: simpan di K
  • Z←⍳⍴K: dapatkan indeks untuk pompa bensin ( 1panjangnya K), simpan diZ
  • ⌽∘K¨Z: rotate Koleh masing-masing nilai Z, memberikan array array
  • ¯1⌽: putar array ini ke kiri sebanyak 1 (untuk meletakkan yang tidak berubah terlebih dahulu, bukan yang terakhir)
  • +\¨: buat jumlah yang berjalan untuk setiap array dalam
  • 0∧.≤¨: untuk setiap jumlah yang berjalan, lihat apakah ada nilai negatif
  • Z/⍨: pilih dari Zelemen-elemen yang jumlah runningnya tidak memiliki nilai negatif
  • ×⍴G←: simpan di G. Jika Gmemiliki elemen:
  • :⊃G: mengembalikan elemen pertama G.
  • ⋄'impossible': jika tidak, kembali impossible.
marinus
sumber
1

Bash 178 170 161 157

Agak lurus ke depan.

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])}

Melamun:

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]
     )
}
Runium
sumber
1

Ruby, 111

Inilah solusi Ruby menggunakan 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}"}

Contoh penggunaan:

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"

EDIT : Nama fungsi yang diperbaiki dan jenis kembali.

Paul Prestidge
sumber
0

Ruby 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"}

Uji:

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
daniero
sumber
Spec membutuhkan string untuk dikembalikan dalam semua kasus.
stan
@ bbyby Saya tidak dapat menemukan persyaratan itu di mana pun dalam spesifikasi. Bisakah Anda mengutip?
John Dvorak
1
Untuk contoh di atas ada 4 pompa bensin, dan program Anda harus mengembalikan string "1" karena:
stan
Ah mengacaukannya; Lagi pula solusi Chron jauh lebih pendek: D
daniero
0

Python, 131

Saya menemukan ini cukup memuaskan.

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]
stan
sumber
ada apa reduce()disini Saya mendapatkan kesalahanNameError: name 'reduce' is not defined
Er Harsh Rathore
@ErHarshRathore ini adalah Python 2. Dalam Python 3, reducemasih dalam lib standar, tetapi dipindahkan ke functoolsmodul.
alkasm
Ya! Saya mendapatkannya from functools import reduceterima kasih
Er Harsh Rathore
@ErHarshRathore Selain itu backticks di `i`sini setara dengan str(i)di Python 3.
alkasm
Apakah Anda ingin posting ini diperbarui sekarang ke python 3.x?
Er Harsh Rathore
0

GolfScript (72 karakter)

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

Demo online

Ini melakukan pendekatan brute force yang jelas. Bit IMO yang paling menarik adalah penentuan apakah jumlah sebagian array delta-fuel pernah turun di bawah 0:

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

Ini menghemat 1 char lebih jelas

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

Jika output diindeks pada 0 daripada pada 1, pendekatan alternatif untuk memutar array akan lebih baik:

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

Tetapi pendekatan ini tidak mudah diadopsi untuk mengindeks pada 1:

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

atau

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