Pola Mesin Pemotong Rumput

9

Diambil dari Putaran Kode Kualifikasi Google Code Jam 2013 B :

Alice dan Bob memiliki halaman di depan rumah mereka, berbentuk seperti N meter persegi panjang M meter. Setiap tahun, mereka mencoba memotong halaman dengan pola yang menarik. Mereka biasa memotong dengan gunting, yang sangat memakan waktu; tetapi sekarang mereka memiliki mesin pemotong rumput otomatis baru dengan beberapa pengaturan, dan mereka ingin mencobanya.

Mesin pemotong rumput baru memiliki pengaturan ketinggian - Anda dapat mengaturnya untuk ketinggian apa pun antara 1 dan 100 milimeter, dan itu akan memotong semua rumput lebih tinggi dari pada saat ia bertemu dengan ketinggian h. Anda menjalankannya dengan memasuki halaman di bagian manapun dari tepi halaman; kemudian mesin pemotong rumput berjalan dalam garis lurus, tegak lurus ke tepi halaman yang dimasukinya, memotong rumput dalam petak seluas 1 m, sampai keluar dari halaman di sisi lain. Tinggi mesin pemotong rumput hanya dapat diatur jika tidak ada di halaman.

Alice dan Bob memiliki sejumlah pola rumput yang bisa mereka miliki di halaman mereka. Untuk masing-masing dari mereka, mereka ingin tahu apakah mungkin untuk memotong rumput ke dalam pola ini dengan mesin pemotong rumput baru mereka. Setiap pola dijelaskan dengan menentukan ketinggian rumput pada setiap 1m x 1m persegi halaman.

Rumput awalnya setinggi 100mm di seluruh halaman.

Tulis fungsi yang mengambil deret 2D dari bilangan bulat tinggi dan menentukan apakah halaman dapat dipotong sesuai.

Berikut adalah 100 kasus uji dari Google Code Jam. 35 kasus pertama harus lulus, sisanya tidak.

Kode terpendek menang.

kotak kardus
sumber
2
Bisakah Anda menunjukkan lisensi untuk masalah Google Code Jam yang tersedia?
Peter Taylor
Saya telah mengubahnya untuk menautkan ke masalah daripada menyalinnya secara langsung.
cardboard_box
Saya pikir sangat disayangkan jika teka-teki / pertanyaan disajikan di sini hanya dengan tautan. Masalahnya harus disediakan secara lengkap dengan semua detail yang diperlukan.
Howard
2
"Semua pernyataan masalah, input data, dan analisis kontes dilisensikan di bawah Lisensi Atribusi Creative Commons." ~ Dari halaman masalah
MrZander

Jawaban:

9

J, 15 karakter

   (-:>./"1<./>./)

Tidak mengharapkan solusi singkat ini.

Penjelasan singkat:

(input == ((max of rows of input) table with min of left and right (max in columns of input)))
(      -:          >./"1                        <./                       >./              )

Jika fungsi Anda adalah 4 fungsi lain seperti dalam solusi: (f1 f2 f3 f4)dan input J menghitungnya seperti f1(input,f3(f2(input),f4(input)))yaitu input f1 ((f2 input) f3 (f4 input)).

randomra
sumber
tolong jelaskan algoritmenya (Saya tidak bisa membaca kode J ^^)
Olivier Dulac
2
@OlivierDulac Baru saja menambahkan sekarang.
randomra
5

APL, 15 karakter

{⍵≡(⌈/⍵)∘.⌊⌈⌿⍵}

Penjelasan:

  • ⌈⌿⍵ menghitung maksimum kolom rhs
  • ⌈/⍵ melakukan hal yang sama dengan baris
  • ∘.⌊ apakah produk luar dari dua sebelumnya sehubungan dengan fungsi minimum
  • ⍵≡ membandingkan hasilnya dengan rhs

Contoh:

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 3 3 ⍴ 2 1 2 1 1 1 2 1 2
1

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 2 3 ⍴ 2 2 2 2 1 1
0 
Howard
sumber
3

Python, 112 104

z=zip
y=lambda l:[[max(r)]*len(r)for r in l]
f=lambda l:l==[map(min,z(*r))for r in z(y(l),z(*y(z(*l))))]
kotak kardus
sumber
1
Gunakan map(min,z(*r))alih-alih [min(a)for a in z(*r)]untuk menyimpan 8 karakter
Volatilitas
0

Saya memiliki kode python yang sedikit lebih panjang tetapi melewati semua test case yang diberikan di Google Code Jam 2013.

 a=input();io=0
 while io<a:
     io+=1;[b,c]=map(int,raw_input("").strip().split());koi=[];koi1=[]
     for i in xrange(b):
         koi.append(map(int,raw_input("").strip().split()))
    rowmax=[]
    for i in koi:
        rowmax.append(max(i))
    for i in xrange(c):
        t=[]
        for j in koi:
            t.append(j[i])
        koi1.append(t);colmax=[]
    for i in koi1:
        colmax.append(max(i))
    toi1=[]
    for i in xrange(b):
        s=[]
        for j in xrange(c):
           s.append(min(colmax[j],rowmax[i]))
        toi1.append(s)
     if toi1==koi:
        print "Case #%d:"%io,"YES"
     else:
        print "Case #%d:"%io,"NO"
tusharmakkar08
sumber