pengantar
Anda adalah pengawas tempat parkir dan manajer Anda sedang mempersiapkan untuk mengecilkan ukurannya menjadi ekstrem.
Ini adalah versi masalah yang disederhanakan dan diadaptasi di tingkat atas PAT tahun lalu .
Tantangan
Anda diminta menghitung berapa banyak mobil yang ada di tempat parkir pada saat yang bersamaan, paling banyak .
Aturan standar berlaku. Dan ini adalah kode-golf sehingga kode terpendek menang.
Baris pertama adalah jumlah entri (tidak lebih dari 100,000
, input Anda mungkin tidak mengandung baris ini jika Anda suka, karena itu hanya pengganti sementara untuk menentukan di mana input berakhir ). Teks berikut ini berisi satu entri per baris. Dan setiap entri mencakup tiga angka:
<Car plate number> <Time (seconds) since open> <0(In) | 1(Out)>
Modifikasi 2: Tidak apa-apa menggunakan array tiga kali lipat sebagai input.
Modifikasi 3: Anda dapat mengubah urutan angka dalam satu entri. Dan Anda dapat memilih mana yang akan digunakan. (lihat bagian Keterangan)
Input dijamin valid, dengan asumsi bahwa:
Car plate number
adalah bilangan bulat dalam kisaran10000
~99999
Time
adalah bilangan bulat dalam kisaran0
~86400
Dan
- Entri tidak harus dipesan secara kronologis.
- Tidak ada mobil sebelum detik pertama.
- Tidak perlu ada mobil setelah detik terakhir.
- Mobil tidak akan pergi sebelum masuk.
Car plate number
unik. (tetapi mobil yang sama dapat mengunjungi lebih dari satu kali)- Jadi tidak mungkin bagi mobil untuk memasuki tempat parkir ketika sudah ada di dalamnya.
- Mobil yang sama tidak akan masuk dan keluar pada saat yang sama
time
. - Mobil dianggap berada di tempat parkir pada saat keluar / masuk.
Contoh 1
Memasukkan
11
97845 36000 1
75487 16500 1
12345 16 0
75486 3300 0
12345 6500 1
97845 32800 0
12345 16400 0
97846 16501 1
97846 16500 0
75486 8800 1
75487 3300 0
Keluaran
3
Penjelasan
Di 16500
, mobil 12345
dan 75487
berada di tempat parkir.
Contoh 2
Saya membuat ini karena saya menemukan banyak kode gagal di dalamnya.
Input (dengan baris pertama ditinggalkan)
12345 16400 0
12345 16500 1
75487 16500 0
75487 16600 1
Keluaran
2
Penjelasan
Di 16500
, mobil 12345
dan 75487
berada di tempat parkir.
Catatan
Sebenarnya, tidak ketiganya diperlukan untuk output. Paling tidak, Anda hanya perlu piring + waktu atau waktu + keluar / masuk untuk hasilnya. Tetapi algoritma ini sedikit berbeda dalam dua keadaan, sehingga pilihan menjadi lebih pendek tetap tidak diketahui dalam bahasa tertentu. Dan tentu saja Anda dapat menggunakan ketiga angka tersebut. Jadi saya meninggalkan mereka dalam tantangan.
Jawaban:
Mathematica, 33 byte
Saya harus membaca pernyataan masalah dengan lebih baik untuk menyadari bahwa ada algoritma yang jauh lebih sederhana yang tidak memerlukan informasi plat nomor.
Fungsi yang tidak disebutkan namanya mengembalikan integer; format input adalah daftar tiga kali lipat yang dipesan dalam formulir
{time, 0|1, license plate}
. Kita mulai denganSort
ing, yang membuat daftar kronologis dan juga memutus ikatan waktu dengan menyortir0
sebelum1
; kemudian2#2-1&@@@
menyimpan informasi kedatangan / keberangkatan dan melupakan sisanya, dan juga mengonversi0
s ke-1
s.Accumulate
menghitung total berjalan dari daftar itu; hasilnya adalah daftar negatif dari jumlah mobil di tempat parkir setelah setiap kedatangan / keberangkatan. KemudianMin
pilih yang terkecil (paling negatif) dari ini dan tanda negatif dilucuti.Mathematica, 56 byte
Kiriman asli (beberapa komentar pertama merujuk pada kiriman ini). Fungsi yang tidak disebutkan namanya mengembalikan integer; format input adalah daftar tiga kali lipat yang dipesan dalam formulir
{time, 0|1, license plate}
.Alasan kami memilih untuk menempatkan entri waktu lebih dulu dan entri masuk / keluar kedua adalah untuk itu
Sort@#
mengurutkan daftar secara kronologis, dan mencatat kedatangan sebelum keberangkatan jika mereka simultan. Setelah itu,#3->#2&@@@
mengembalikan daftar "aturan" formulirlicense plate -> 0|1
, masih diurutkan secara kronologis.Kemudian,
FoldList[List,{},...]
buat daftar semua segmen awal dari daftar aturan itu. Sebenarnya, itu benar-benar mengacaukan segmen-segmen awal itu; ituk
th awal segmen ujung sampai menjadi daftar dengan satu aturan di kedalaman 2, satu aturan di kedalaman 3, ..., dan satu aturan di kedalamank
1. (FoldList[Append,{},...]
akan menghasilkan hasil yang lebih alami.) Namun,<|#|>
mengubah masing-masing segmen awal ini menjadi "asosiasi", yang memiliki dua efek yang diinginkan: pertama, itu benar-benar meratakan struktur daftar bersarang yang baru saja kita buat; dan kedua, ini kemudian memaksa aturan untuk mengesampingkan aturan sebelumnya, yang persis seperti yang kita butuhkan di sini — untuk mobil apa pun yang telah meninggalkan tempat parkir, catatan entri awalnya sekarang benar-benar hilang (dan juga untuk mobil yang masuk kembali) .Jadi yang tersisa untuk dilakukan adalah
Count
berapa banyak0
yang ada di masing-masing asosiasi ini, dan ambilMax
.sumber
Haskell,
76 6361 byte2 byte disimpan oleh variasi saran @ nimi.
Mengharapkan argumen sebagai daftar tiga kali lipat dalam urutan yang diberikan oleh pernyataan masalah.
Untuk setiap waktu yang memungkinkan (dan lebih banyak lagi), kami mencari terlebih dahulu untuk datang dan kemudian meninggalkan acara mobil dan mengubahnya ke daftar plus atau minus. Kami mengambil jumlah parsial dari daftar ini dan kemudian pepatah dari jumlah parsial ini.
sumber
import
dan gunakan[(-1)^c|i<-[1..86400],(_,b,c)<-l,i==b]
.PHP 7.1,
126117 bytemengambil input dari file
i
, abaikan baris pertama. Jalankan dengan-r
.Membutuhkan baris tambahan di input. Ganti
-2
dengan-3
untuk Windows.kerusakan
sumber
$d
sebagai input atau input yang diurutkan (berdasarkan waktu dan masuk / keluar). Dan hal itu akan mengambil terlalu banyak dari tantangan. Input yangttttt i plate
selaras akan menghemat 17 byte, 19 lebih banyak dengan jumlah yang selaras dengan nomor pelat.C, 147 byte
Program lengkap, membaca input dari
stdin
.Cobalah di ideone .
sumber
%d
scanf
cukup, saya kira.cin
. LOLOktaf,
50,6438 byteSama dengan jawaban Matematika @Greg Martin
Fungsi mendapat array dengan 3 kolom
[time, i/o,plateN]
jawaban sebelumnya:
Fungsi ini hanya mendapat dua input
t
: waktu danO
: I / O dari dua elemen pertama array selA
yang berisi tiga input!Matriks tipis dibuat untuk menghitung setiap catatan waktu jumlah mobil yang ada. Untuk itu waktu keluar + 1 dipertimbangkan untuk keluar mobil dan sesuai 1 perubahan ke -1 dan 0 diubah menjadi 1.
Penggunaan jarang di sini sangat penting karena beberapa mobil dapat tiba atau pergi pada saat yang sama.
Kemudian jumlah kumulatif dihitung mewakili jumlah mobil saat ini di tempat parkir dan maks ditemukan.
sumber
JavaScript (ES6),
637371 byteIni menerima input sebagai array dari entri yang dipesan
[time, inout, plate]
. Sayangnya karena fakta bahwa waktu keluar yang sama berarti kedua mobil dipertimbangkan dalam lot saat ini, algoritma pengurutan harus dipesan0
sebelum1
, yang biayanya 11 byte.Kredit
Demo
sumber
d=[[16400,75487,0],[16500,75487,1],[16500,99999,0],[16600,99999,1]];
saya seharusnya mencetak 2?d=>Math.max(...d.sort(([a,b],[c,d])=>a-b||c-d).map(e=>s+=1-e[1]*2,s=0))
JavaScript (ES6),
83…6870 byteEDIT: diperbaiki untuk mendukung contoh ke-2
Mengambil input sebagai array
[in_out, time, plate]
array. Namunplate
kolom tersebut sebenarnya diabaikan.Uji
Tampilkan cuplikan kode
sumber
in_out
kolom bukanplate
kolom harus menghemat enam byte:v=>n+=1-v[2]*2
.