Шаблони газонокосарок


9

Взято з Google Code Jam 2013 Кваліфікаційний раунд Проблема B :

Аліса та Боб мають газон перед своїм будинком, що має форму прямокутника N метра на М метр. Щороку вони намагаються обрізати газон за якоюсь цікавою схемою. Раніше вони різали ножицями, що було дуже трудомістким; але тепер у них є нова автоматична газонокосарка з кількома налаштуваннями, і вони хочуть спробувати її.

Нова газонокосарка має встановлення висоти - її можна встановити на будь-яку висоту h від 1 до 100 міліметрів, і вона буде обрізати всю траву вище, ніж h, яка зустрічається до висоти h. Ви запускаєте його, заходячи на газон у будь-якій частині краю газону; потім газонокосарка йде по прямій лінії, перпендикулярній до краю газону, на який вона ввійшла, обрізаючи траву шириною 1 м, поки не вийде з газону з іншого боку. Висоту газонокосарки можна встановити лише тоді, коли її немає на газоні.

У Аліси та Боба є ряд різноманітних моделей трави, які вони могли мати на своєму газоні. Для кожного з них вони хочуть знати, чи можна зрізати траву за цим малюнком за допомогою нової газонокосарки. Кожен малюнок описується, вказуючи висоту трави на кожному квадраті 1 м х 1 м газону.

Спочатку трава заввишки 100 мм на всій галявині.

Напишіть функцію, яка займає двовимірний масив цілих висот і визначає, чи можна газон відповідно вирізати.

Ось 100 тестових випадків з Google Code Jam. Перші 35 випадків повинні пройти, решта не повинні.

Найкоротший код виграє.


2
Чи можете ви вказати на ліцензію, згідно з якою стають доступними тестові проблеми Google Code Jam?
Пітер Тейлор

Я змінив його на посилання на проблему, а не копіював її безпосередньо.
cardboard_box

Я думаю, що дуже прикро, якщо головоломка / запитання представлено тут лише за посиланням. Проблема повинна бути надана в повному обсязі з усіма необхідними деталями.
Говард

2
"Усі заяви про проблеми, вхідні дані та аналіз конкурсу ліцензовані відповідно до ліцензії Creative Commons Attribution." ~ З проблемної сторінки
MrZander

Відповіді:


9

J, 15 символів

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

Не очікував цього короткого рішення.

Коротке пояснення:

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

Якщо у вашій функції є 4 інші функції, як у рішенні: (f1 f2 f3 f4)а вхідний J обчислює її як f1(input,f3(f2(input),f4(input)))тобто input f1 ((f2 input) f3 (f4 input)).


поясніть, будь ласка, алгоритм (я не можу прочитати J код ^^)
Олів'є Дулак

2
@OlivierDulac Просто додано зараз.
randomra

5

APL, 15 символів

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

Пояснення:

  • ⌈⌿⍵ обчислює максимум стовпців резус
  • ⌈/⍵ робить те ж саме з рядками
  • ∘.⌊ робить зовнішній добуток попередніх двох щодо функціональних мінімумів
  • ⍵≡ порівнює результат з резус

Приклади:

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

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


0

У мене трохи довший код python, але він пройшов усі тестові випадки, наведені в 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.