Rasenmäher Muster

9

Entnommen aus der Qualifikationsrunde für Google Code Jam 2013 Problem B :

Alice und Bob haben einen Rasen vor ihrem Haus, der wie ein Rechteck von N mal M Metern geformt ist. Jedes Jahr versuchen sie, den Rasen nach einem interessanten Muster zu schneiden. Sie schnitten mit einer Schere, was sehr zeitaufwändig war. Jetzt haben sie einen neuen automatischen Rasenmäher mit mehreren Einstellungen und möchten ihn ausprobieren.

Der neue Rasenmäher hat eine Höheneinstellung - Sie können ihn auf eine beliebige Höhe h zwischen 1 und 100 Millimeter einstellen, und er schneidet das gesamte Gras höher als h, auf das er trifft, auf Höhe h. Sie führen es aus, indem Sie den Rasen an einer beliebigen Stelle am Rand des Rasens betreten. dann fährt der Rasenmäher in einer geraden Linie senkrecht zum Rand des Rasens, in den er eingetreten ist, und schneidet Gras in einem 1 m breiten Schwad, bis er den Rasen auf der anderen Seite verlässt. Die Höhe des Rasenmähers kann nur eingestellt werden, wenn er sich nicht auf dem Rasen befindet.

Alice und Bob haben verschiedene Grasmuster, die sie auf ihrem Rasen haben könnten. Für jeden von ihnen möchten sie wissen, ob es möglich ist, das Gras mit ihrem neuen Rasenmäher in dieses Muster zu schneiden. Jedes Muster wird beschrieben, indem die Höhe des Grases auf jedem 1 x 1 Quadratmeter großen Rasen angegeben wird.

Das Gras ist anfangs 100 mm hoch auf dem gesamten Rasen.

Schreiben Sie eine Funktion, die ein 2D-Array von ganzzahligen Höhen verwendet und bestimmt, ob der Rasen entsprechend geschnitten werden kann.

Hier sind 100 Testfälle von Google Code Jam. Die ersten 35 Fälle sollten vergehen, der Rest nicht.

Der kürzeste Code gewinnt.

Pappschachtel
quelle
2
Können Sie auf die Lizenz hinweisen, unter der die Google Code Jam-Probleme Testfälle zur Verfügung gestellt werden?
Peter Taylor
Ich habe es geändert, um auf das Problem zu verlinken, anstatt es direkt zu kopieren.
cardboard_box
Ich finde es sehr bedauerlich, wenn das Rätsel / die Frage hier nur mit einem Link dargestellt wird. Das Problem sollte vollständig mit allen erforderlichen Details versehen sein.
Howard
2
"Alle Problemstellungen, Eingabedaten und Wettbewerbsanalysen sind unter der Creative Commons Attribution License lizenziert." ~ Von der Problemseite
MrZander

Antworten:

9

J, 15 Zeichen

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

Ich habe diese kurze Lösung nicht erwartet.

Kurze Erklärung:

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

Wenn Ihre Funktion 4 andere Funktionen wie in der Lösung ist: (f1 f2 f3 f4)und eine Eingabe J berechnet sie wie f1(input,f3(f2(input),f4(input)))dh input f1 ((f2 input) f3 (f4 input)).

randomra
quelle
Bitte erklären Sie den Algorithmus (ich kann J-Code nicht lesen ^^)
Olivier Dulac
2
@OlivierDulac Gerade hinzugefügt.
Randomra
5

APL, 15 Zeichen

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

Erläuterung:

  • ⌈⌿⍵ berechnet das Maximum der Spalten von rhs
  • ⌈/⍵ macht das gleiche mit Zeilen
  • ∘.⌊ tut das äußere Produkt der beiden vorhergehenden in Bezug auf das Funktionsminimum
  • ⍵≡ vergleicht das Ergebnis mit dem rhs

Beispiele:

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

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 2 3 ⍴ 2 2 2 2 1 1
0 
Howard
quelle
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))))]
Pappschachtel
quelle
1
Verwenden Sie map(min,z(*r))anstelle von [min(a)for a in z(*r)], um 8 Zeichen zu speichern
Volatility
0

Ich habe einen etwas längeren Python-Code, der jedoch alle bei Google Code Jam 2013 angegebenen Testfälle bestanden hat.

 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
quelle