Menggunakan bahasa pemrograman apa pun yang mendukung fungsi, miliki fungsi tersebut
is_enough(strArr)
take strArr
yang 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:c
manag
adalah jumlah gas dalam galon di pompa bensin itu danc
akan menjadi jumlah galon gas yang dibutuhkan untuk sampai ke pompa bensin berikut.
Misalnya strArr
mungkin:
["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). N
akan >= 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.
N+1
elemen yang tepatstrArr
? Ini akan membuatN
berlebihan jika bahasa sudah menyediakan cara untuk mendapatkan panjang array, kan? (Itu masih akan berguna untuk misalnya C.)is_enough
(9 karakter); tiga menggunakan nama char tunggal, dan satu tidak menamai fungsinya sama sekali. Bisakah Anda menjelaskan apa yang diizinkan?Jawaban:
APL (70)
Penjelasan:
1↓⍵
: drop elemen pertama (panjang), kita tidak membutuhkannya{
...}¨
: untuk masing-masing pompa bensin ...⎕ML←3
: set⎕ML
ke 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 KZ←⍳⍴K
: dapatkan indeks untuk pompa bensin (1
panjangnyaK
), simpan diZ
⌽∘K¨Z
: rotateK
oleh masing-masing nilaiZ
, 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 dalam0∧.≤¨
: untuk setiap jumlah yang berjalan, lihat apakah ada nilai negatifZ/⍨
: pilih dariZ
elemen-elemen yang jumlah runningnya tidak memiliki nilai negatif×⍴G←
: simpan diG
. JikaG
memiliki elemen::⊃G
: mengembalikan elemen pertamaG
.⋄'impossible'
: jika tidak, kembaliimpossible
.sumber
Bash
178170161157Agak lurus ke depan.
Melamun:
sumber
Ruby, 111
Inilah solusi Ruby menggunakan
eval
:Contoh penggunaan:
EDIT : Nama fungsi yang diperbaiki dan jenis kembali.
sumber
Ruby 132
Uji:
sumber
Python, 131
Saya menemukan ini cukup memuaskan.
sumber
reduce()
disini Saya mendapatkan kesalahanNameError: name 'reduce' is not defined
reduce
masih dalam lib standar, tetapi dipindahkan kefunctools
modul.from functools import reduce
terima kasih`i`
sini setara denganstr(i)
di Python 3.GolfScript (72 karakter)
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:
Ini menghemat 1 char lebih jelas
Jika output diindeks pada 0 daripada pada 1, pendekatan alternatif untuk memutar array akan lebih baik:
Tetapi pendekatan ini tidak mudah diadopsi untuk mengindeks pada 1:
atau
sumber