Mô hình máy cắt cỏ


9

Lấy từ Bài kiểm tra Vòng loại B 2013 của Google Code Jam :

Alice và Bob có một bãi cỏ ở phía trước ngôi nhà của họ, có hình chữ nhật N mét vuông M. Mỗi năm, họ cố gắng cắt cỏ theo một số mô hình thú vị. Họ thường cắt bằng kéo, rất tốn thời gian; nhưng bây giờ họ có một máy cắt cỏ tự động mới với nhiều cài đặt và họ muốn dùng thử.

Máy cắt cỏ mới có cài đặt độ cao - bạn có thể đặt nó ở bất kỳ độ cao h nào trong khoảng từ 1 đến 100 mm và nó sẽ cắt tất cả các loại cỏ cao hơn h mà nó gặp phải với chiều cao h. Bạn chạy nó bằng cách vào bãi cỏ ở bất kỳ phần nào của mép cỏ; sau đó máy cắt cỏ đi theo một đường thẳng, vuông góc với mép của bãi cỏ mà nó đi vào, cắt cỏ rộng khoảng 1m, cho đến khi nó ra khỏi bãi cỏ ở phía bên kia. Chiều cao của máy cắt cỏ chỉ có thể được đặt khi nó không ở trên bãi cỏ.

Alice và Bob có một số mẫu cỏ khác nhau mà họ có thể có trên bãi cỏ của họ. Đối với mỗi người trong số họ, họ muốn biết liệu có thể cắt cỏ thành mô hình này bằng máy cắt cỏ mới của họ hay không. Mỗi mẫu được mô tả bằng cách chỉ định chiều cao của cỏ trên mỗi ô vuông 1m x 1m.

Cỏ ban đầu cao 100mm trên toàn bộ bãi cỏ.

Viết hàm lấy một mảng 2D có chiều cao nguyên và xác định xem có thể cắt cỏ không.

Dưới đây là 100 trường hợp thử nghiệm từ Google Code Jam. 35 trường hợp đầu tiên nên vượt qua, phần còn lại không nên.

Mã ngắn nhất sẽ thắng.


2
Bạn có thể chỉ ra giấy phép theo đó các sự cố Google Code Jam là các trường hợp thử nghiệm được cung cấp không?
Peter Taylor

Tôi đã thay đổi nó để liên kết với vấn đề thay vì sao chép trực tiếp.
tông_box

Tôi nghĩ rằng thật đáng tiếc nếu câu đố / câu hỏi được trình bày ở đây chỉ với một liên kết. Vấn đề cần được cung cấp đầy đủ với tất cả các chi tiết cần thiết.
Howard

2
"Tất cả các báo cáo vấn đề, dữ liệu đầu vào và phân tích cuộc thi đều được cấp phép theo Giấy phép ghi nhận tác giả Creative Commons." ~ Từ trang sự cố
MrZander

Câu trả lời:


9

J, 15 ký tự

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

Không mong đợi giải pháp ngắn này.

Giải thích ngắn gọn:

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

Nếu chức năng của bạn là 4 chức năng khác như trong các giải pháp: (f1 f2 f3 f4)và một đầu vào J tính nó như f1(input,f3(f2(input),f4(input)))ví dụ input f1 ((f2 input) f3 (f4 input)).


vui lòng giải thích thuật toán (tôi không thể đọc mã J ^^)
Olivier Dulac

2
@OlivierDulac Chỉ cần thêm ngay bây giờ.
Randomra

5

APL, 15 ký tự

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

Giải trình:

  • ⌈⌿⍵ tính toán tối đa các cột của rhs
  • ⌈/⍵ làm tương tự với các hàng
  • ∘.⌊ sản phẩm bên ngoài của hai phần trước có liên quan đến chức năng tối thiểu không
  • ⍵≡ so sánh kết quả với rhs

Ví dụ:

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

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

3

Con trăn, 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))))]

1
Sử dụng map(min,z(*r))thay vì [min(a)for a in z(*r)]để lưu 8 ký tự
Biến động

0

Tôi có mã python dài hơn một chút nhưng nó đã vượt qua tất cả các trường hợp thử nghiệm được đưa ra tại 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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.