Çim Biçme Makinesi Modelleri


9

Alındığı Google Code Jam 2013 Eleme Turu Sorunu B :

Alice ve Bob, evlerinin önünde N metre x M metre dikdörtgen şeklinde bir çime sahiptir. Her yıl çimleri ilginç bir şekilde kesmeye çalışırlar. Kesimlerini çok zaman alıcı olan makaslarla yaparlardı; ancak şimdi çoklu ayarlara sahip yeni bir otomatik çim biçme makinesine sahipler ve denemek istiyorlar.

Yeni çim biçme makinesinin yükseklik ayarı vardır - 1 ile 100 milimetre arasında herhangi bir h yüksekliğine ayarlayabilirsiniz ve tüm çimleri h yüksekliğiyle karşılaştığı h'den daha yüksek keser. Çim kenarının herhangi bir yerinde çime girerek koşuyorsunuz; çim biçme makinesi, girdiği çimlerin kenarına dik düz bir çizgide gider ve diğer taraftaki çimlerden çıkana kadar 1 metre genişliğinde bir otla keser. Çim biçme makinesinin yüksekliği sadece çimde değilken ayarlanabilir.

Alice ve Bob, çimlerin üzerinde olabilecek çeşitli çim desenlerine sahiptir. Bunların her biri için, yeni çim biçme makineleriyle çimlerin bu desene kesilmesinin mümkün olup olmadığını bilmek istiyorlar. Her bir desen, çimlerin her 1m x 1m karesinde çim yüksekliğinin belirlenmesiyle tanımlanır.

Çim başlangıçta tüm çim üzerinde 100mm yüksekliktedir.

2D dizi tamsayı yüksekliği alan ve çimlerin buna göre kesilip kesilemeyeceğini belirleyen bir fonksiyon yazın.

İşte Google Code Jam'den 100 test örneği. İlk 35 vaka geçmeli, geri kalanı geçmemelidir.

En kısa kod kazanır.


2
Google Code Jam sorunlarının test senaryolarının sunulduğu lisansı belirtebilir misiniz?
Peter Taylor

Sorunu doğrudan kopyalamak yerine bağlantıya bağlamak için değiştirdim.
carton_box

Bulmaca / soru burada sadece bir bağlantı ile sunulması çok talihsiz olduğunu düşünüyorum. Sorun, gerekli tüm ayrıntılarla tam olarak sağlanmalıdır.
Howard

2
"Tüm sorun bildirimleri, girdi verileri ve yarışma analizleri Creative Commons Atıf Lisansı altında lisanslanmıştır." ~ Sorun sayfasından
MrZander

Yanıtlar:


9

J, 15 karakter

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

Bu kısa çözümü beklemiyordum.

Kısa açıklama:

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

Fonksiyonun diğer 4 çözümde gibi işlev ise: (f1 f2 f3 f4)ve bir giriş J gibi hesaplar f1(input,f3(f2(input),f4(input)))yani input f1 ((f2 input) f3 (f4 input)).


lütfen algoritmayı açıklayın (J kodunu okuyamıyorum ^^)
Olivier Dulac 15:13

2
@OlivierDulac Hemen şimdi eklendi.
randomra

5

APL, 15 karakter

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

Açıklama:

  • ⌈⌿⍵ rhs sütunlarının maksimumunu hesaplar
  • ⌈/⍵ satırlarla aynı şeyi yapar
  • ∘.⌊ önceki fonksiyonun dış çarpımını fonksiyon minimumuna göre yapar
  • ⍵≡ sonucu rhs ile karşılaştırır

Örnekler:

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

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

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))))]

1
8 karakter kaydetmek map(min,z(*r))yerine kullanın[min(a)for a in z(*r)]
Volatility

0

Biraz daha uzun python kodum var ama Google Code Jam 2013'te verilen tüm test senaryolarını geçti.

 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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.