Oluk-A-Pearing


16

İşte armutların beş resmi ve bir çelik oluk :

A: B: C: D: E:armut A armut B armut C armut D armut E

Bunlar sadece küçük resimler, tam boyut için tıklayın!

(Bunları Algodoo ile yaptım .)

Bu görüntü sınıfı her zaman aşağıdaki özelliklere sahiptir:

  1. Her zaman beyaz arka planlı 400 × 400 pikseldir. (SE görüntüleri kayıpsız sıkıştırıldığından tam olarak beyaz olmayabilir.)
  2. Her biri (neredeyse) herhangi bir şekilde döndürülmüş ve yerleştirilmiş 1 ila 4 özdeş armutları vardır.
  3. Görüntünün altına ulaşan bir dikey çelik oluğu vardır.
  4. Kanalın altından başka, kanal ve armut sınırlayıcı kutular ( sınırlayıcı kutu örneği ) asla görüntü sınırlarına dokunmaz veya çıkmaz.
  5. Armutların sınırlayıcı kutuları hiçbir zaman üst üste gelmez veya oluğun üzerine binmez.
  6. Armutlar, B , C ve D' deki gibi oluğun eğimli kısmının altında olabilir . (Böylece oluğun sınırlayıcı kutusu bir armutun sınırlayıcı kutusuyla çakışabilir.)
  7. Oluk, armutların tüm sınırlayıcı kutularının üzerine serbestçe sığması için yeterli alan olduğu sürece ("zar zor sığacak" durumlar test edilmeyecek) ve kolon bölümünün bir kısmı görülebildiği sürece yatay ve dikey bir pozisyonda olabilir.

Meydan okuma

Böyle bir görüntüyü alan ve aynı yerde oluk ile başka bir 400 × 400 görüntü veren bir program yazın, ancak armutlar hepsi oluğun üzerinde olacak şekilde yeniden konumlandırılır (böylece içine düşebilir ve sulanabilir ve ne olursa olsun).

Çıktı görüntüsü için gereksinimler:

  1. Giriş görüntüsündeki tüm armutlar, hunisinin sol ve sağ kenarı arasında, oluğun üzerinde olacak şekilde yeniden konumlandırılmalıdır. (Bir kenar üstünde olduğu değil ok).
  2. Her armut dönme açısını korumalıdır. (Bu yüzden armutları yeniden çizmemeli, kesmeli ve yapıştırmalısınız.)
  3. Armutlar üst üste gelmemeli veya birbirlerine veya oluğa dokunmamalıdır. (Armut sınırlayıcı kutular üst üste gelebilir.)
  4. Armutlar görüntü sınırlarına dokunmamalı veya çıkmamalıdır.

Beş örnek resim için geçerli çıktı örnekleri aşağıda verilmiştir:

A: B: C: D: E:A çıkışı dışarı B dışarı C dışarı D dışarı D

Bunlar sadece küçük resimler, tam boyut için tıklayın!

E için giriş görüntüsünün zaten geçerli bir çıktı olduğunu, ancak teknik olarak gerekli olmadığında armutların yeniden düzenlenmesinin gayet iyi olduğunu unutmayın.

ayrıntılar

  • Stdin / komut satırı / işlev çağrısı ile görüntünün dosya adını veya ham görüntü verisini alın.
  • Görüntüyü istediğiniz adla bir dosyaya veya ham görüntü dosyası verilerini stdout'a veya yalnızca görüntüyü görüntülemek için çıktılayın.
  • Herhangi bir yaygın kayıpsız görüntü dosyası formatı kullanılabilir.
  • Grafikler ve görüntü kütüphaneleri kullanılabilir.
  • Burada ve orada birkaç yanlış piksel (kaybolma veya başka bir şeyden dolayı) önemli değil. Görsel olarak bir şeylerin yanlış olduğunu söyleyemezsem muhtemelen iyi olur.

Bayt cinsinden en kısa kod kazanır. Tiebreaker en yüksek oy alan yazı.


Bir Khan Academy hesabım olduğundan ve bu orada çözmek için mükemmel göründüğünden, Khan Academy'de çözebilir miyim? Sadece bir komplikasyon var: harici görüntülere izin verilmiyor. Neyse ki aracılığıyla görüntüleri çalıştırabilirsiniz bu Khan Academy dostu verilere dönüştürmek için. Bu kabul edilebilir mi?
BobTheAwesome

@BobTheAwesome Yani bir JavaScript yanıtı mı göndermek istiyorsunuz? 400x400 görüntü girmesi ve çıktısı alması gerekiyorsa da sorun değil. KA ile nasıl yaptığınızı göstermek için çalışmanızı gönderebilirsiniz, ancak 400x400 görüntülerde işe yaramazsa kazanan olarak kabul etmeyebilirim.
Calvin'in Hobileri

Mükemmel bir tesadüf; Khan Academy, Javascript + Pjs için varsayılan olarak 400x400 piksellik bir tuvale sahip.
BobTheAwesome

Hayır!! Imagenator 400x400 görüntülerde süper yavaş !!
BobTheAwesome

Yanıtlar:


6

Python 2.7, 636 bayt

import sys;from PIL.Image import*
_,m,R,I,p,H=255,400,range,open(sys.argv[1]).convert('RGB'),[],0
w,h=I.size;W,A,P,L=(_,_,_),[(x,y)for x in R(w)for y in R(h)],I.load(),I.copy()
try:
 while 1:
    s,x,y,X,Y=[[a for a in A if P[a][0]<50][0]],m,m,0,0
    while s:c=(a,b)=s.pop();x,y,X,Y=min(x,a),min(y,b),max(X,a),max(Y,b);P[c]=W;s+=[n for n in[(a+1,b),(a,b+1),(a-1,b),(a,b-1)]if n in A and P[n]!=W]
    p+=[((x,y,X,Y),X-x,Y-y)]
except:0
def G(a):r,g,b=P[a];return r==g==b and r<_
g=[a for a in A if G(a)]
(z,t),W=g[0],max([x for x,y in g]);t-=1
for r,w,h in p:
 if z+w>W:z,_=g[0];t-=H;H=0
 I.paste(L.crop(r),(z,t-h,z+w,t));z+=w;H=max(h,H)
I.show()

DÜZENLE : Artık görüntüyü işlemeden önce alfa kanalını kaldırıyor ve gerekirse armutları birkaç satıra hizalıyor

Üretilen görüntüler:

bir B C D ve E

ve dikey armutlarla (bilgisayarımda yaklaşık 3 dakika sürer):

test durumu dikey


1
Görüntüler befores / afters mı? Eğer öyleyse BE için yanlış olanları aldığını düşünüyorum ...
Sp3000

soldaki giriş görüntüsü ve sağdaki çıkış görüntüleri ... ölçekleme ve kopya yapıştırma nedeniyle hiç piksel mükemmel değiller, bunları sadece komut dosyasının nasıl çalıştığına dair ipuçları vermek için koydum ..
dieter


aslında hayır ... iki nedenden dolayı: sonsuz bir döngüye girer, çünkü bu belirli görüntünün bir alfa kanalı vardır -> komut dosyasını düzelterek ilk önce görüntüyü dönüştürür. Diğer nedeni, armutları birkaç sıraya hizalayan kodu kaldırmamın -> geri koyarak
dieter
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.