Wzory kosiarki

9

Zaczerpnięte z Google Code Jam 2013 rundy kwalifikacyjnej Problem B :

Alice i Bob mają trawnik przed domem w kształcie prostokąta o wymiarach N na metr. Każdego roku starają się przycinać trawnik w interesujący sposób. Cięcie wykonywali nożycami, co było bardzo czasochłonne; ale teraz mają nową automatyczną kosiarkę z wieloma ustawieniami i chcą ją wypróbować.

Nowa kosiarka ma ustawienie wysokości - możesz ustawić ją na dowolną wysokość h od 1 do 100 milimetrów, a będzie ona ścinać trawę wyżej niż h napotka na wysokość h. Uruchomisz go, wchodząc na trawnik w dowolnej części krawędzi trawnika; następnie kosiarka porusza się w linii prostej, prostopadłej do krawędzi trawnika, do którego wszedł, tnąc trawę w pokosie o szerokości 1 m, aż opuści trawnik po drugiej stronie. Wysokość kosiarki można ustawić tylko wtedy, gdy nie znajduje się ona na trawniku.

Alice i Bob mają wiele różnych wzorów traw, które mogą mieć na trawniku. Dla każdego z nich chcą wiedzieć, czy można kosić trawę według tego wzoru za pomocą nowej kosiarki. Każdy wzór jest opisany przez określenie wysokości trawy na każdym kwadracie trawnika o wymiarach 1 x 1 m.

Trawa ma początkowo wysokość 100 mm na całym trawniku.

Napisz funkcję, która przyjmuje tablicę 2D wysokości całkowitych i określa, czy trawnik można odpowiednio przyciąć.

Oto 100 przypadków testowych od Google Code Jam. Pierwsze 35 przypadków powinno minąć, reszta nie.

Najkrótszy kod wygrywa.

pudełko kartonowe
źródło
2
Czy możesz wskazać licencję, na podstawie której problemy z Google Code Jam są udostępniane dla przypadków testowych?
Peter Taylor
Zmieniłem to, aby połączyć z problemem, zamiast kopiować go bezpośrednio.
cardboard_box
Myślę, że to bardzo niefortunne, jeśli łamigłówka / pytanie jest przedstawione tutaj tylko z linkiem. Problem należy podać w całości ze wszystkimi niezbędnymi szczegółami.
Howard
2
„Wszystkie zgłoszenia problemów, dane wejściowe i analizy konkursowe są licencjonowane na podstawie licencji Creative Commons Uznanie autorstwa.” ~ Ze strony problemu
MrZander

Odpowiedzi:

9

J, 15 znaków

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

Nie spodziewałem się tak krótkiego rozwiązania.

Krótkie wyjaśnienie:

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

Jeśli twoją funkcją są 4 inne funkcje jak w rozwiązaniu: (f1 f2 f3 f4)a wejście J oblicza to tak, jak f1(input,f3(f2(input),f4(input)))np input f1 ((f2 input) f3 (f4 input)).

randomra
źródło
proszę wyjaśnić algorytm (nie mogę odczytać kodu J ^^)
Olivier Dulac
2
@OlivierDulac Właśnie dodane teraz.
randomra
5

APL, 15 znaków

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

Wyjaśnienie:

  • ⌈⌿⍵ oblicza maksimum kolumn rhs
  • ⌈/⍵ robi to samo z wierszami
  • ∘.⌊ robi iloczyn zewnętrzny dwóch poprzednich w odniesieniu do funkcji minimum
  • ⍵≡ porównuje wynik z rh

Przykłady:

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

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 2 3 ⍴ 2 2 2 2 1 1
0 
Howard
źródło
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))))]
pudełko kartonowe
źródło
1
Użyj map(min,z(*r))zamiast, [min(a)for a in z(*r)]aby uratować 8 znaków
Zmienność
0

Mam nieco dłuższy kod python, ale przeszedł on wszystkie przypadki testowe podane na 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
źródło