Chute-A-Pearing

16

Berikut adalah lima gambar pir dan seluncuran baja :

A: B: C: D: E:pir A pir B pir C pir D pir E

Ini hanya thumbnail, klik untuk ukuran penuh!

(Saya membuat ini dengan Algodoo .)

Kelas gambar ini selalu memiliki properti berikut:

  1. Mereka selalu 400 × 400 piksel dengan latar belakang putih. (Ini mungkin tidak terlalu putih karena gambar SE dikompresi dengan mudah.)
  2. Mereka memiliki 1 hingga 4 pir identik, masing-masing diputar dan diposisikan dalam (hampir) dengan cara apa pun.
  3. Mereka memiliki satu saluran baja vertikal yang mencapai bagian bawah gambar.
  4. Selain bagian bawah parasut, parasut dan kotak pembatas pir ( contoh kotak pembatas ) tidak pernah menyentuh atau keluar dari batas gambar.
  5. Kotak pir yang saling mengikat tidak pernah saling tumpang tindih maupun tumpang tindih saluran.
  6. Pir mungkin berada di bawah bagian miring dari parasut, seperti dalam B , C , dan D . (Jadi kotak luncuran parasut bisa tumpang tindih dengan kotak lintasan pir.)
  7. Chute dapat memiliki posisi horizontal dan vertikal selama ada ruang yang cukup untuk semua kotak pembungkus pir agar pas secara bebas di atasnya (tidak ada case yang "hampir pas" akan diuji) dan sebagian bagian kolom terlihat.

Tantangan

Tulis sebuah program yang mengambil gambar seperti itu dan mengeluarkan gambar 400 × 400 lainnya dengan saluran di tempat yang sama, tetapi dengan pir diposisikan ulang sehingga mereka semua di atas saluran (sehingga mereka dapat jatuh ke dalamnya dan dijus dan lain-lain).

Persyaratan untuk gambar output adalah:

  1. Semua pir pada gambar input harus direposisi sedemikian rupa sehingga berada di atas saluran, di antara tepi kiri dan kanan corongnya. (Di atas tepi tidak ok.)
  2. Setiap pir harus mempertahankan sudut rotasi. (Jadi Anda harus memotong dan menempelkan pir, bukan menggambar ulang.)
  3. Pir tidak boleh tumpang tindih atau menyentuh satu sama lain atau saluran. (Kotak pear terikat mungkin tumpang tindih.)
  4. Pir tidak boleh menyentuh atau keluar dari batas gambar.

Berikut adalah contoh output yang valid untuk lima gambar sampel:

A: B: C: D: E:keluar A keluar B keluar C keluar D keluar D

Ini hanya thumbnail, klik untuk ukuran penuh!

Perhatikan bahwa gambar input untuk E sudah merupakan output yang valid, tetapi mengatur ulang pir jika tidak diperlukan secara teknis baik-baik saja.

Detail

  • Ambil nama file gambar atau data gambar mentah melalui stdin / command line / function call.
  • Keluarkan gambar ke file dengan nama pilihan Anda atau output data file gambar mentah ke stdout atau hanya menampilkan gambar.
  • Setiap format file gambar lossless umum dapat digunakan.
  • Grafik dan pustaka gambar dapat digunakan.
  • Beberapa piksel yang salah di sana-sini (karena kehilangan atau sesuatu) bukanlah masalah besar. Jika saya tidak dapat mengatakan bahwa ada sesuatu yang salah secara visual maka itu mungkin baik-baik saja.

Kode terpendek dalam byte menang. Tiebreaker adalah pos terpilih tertinggi.

Hobi Calvin
sumber
Karena saya memiliki akun Khan Academy, dan ini tampaknya sempurna untuk diselesaikan di sana, dapatkah saya menyelesaikannya di Khan Academy? Hanya ada satu komplikasi: gambar eksternal tidak diperbolehkan. Untungnya saya dapat menjalankan gambar melalui ini untuk mengubahnya menjadi data ramah Khan Academy. Apakah ini dapat diterima?
BobTheAwesome
@BobTheAwesome Jadi Anda ingin mengirim jawaban JavaScript? Tidak apa-apa, meskipun itu seharusnya input dan output gambar 400x400. Anda dapat memposting pekerjaan Anda untuk memamerkan bagaimana Anda melakukannya dengan KA tetapi saya mungkin tidak menerimanya sebagai pemenang jika tidak bekerja pada 400x400 gambar.
Hobi Calvin
Suatu kebetulan yang sempurna; Khan Academy kebetulan memiliki default kanvas 400x400px untuk Javascript + Pjs.
BobTheAwesome
Tidak!! Imagenator super lambat pada gambar 400x400 !!
BobTheAwesome

Jawaban:

6

Python 2.7, 636 byte

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

EDIT : sekarang menghapus saluran alpha sebelum menangani gambar, dan luruskan pir pada beberapa baris jika perlu

Gambar yang dihasilkan:

SEBUAH B C D dan E

dan dengan pir vertikal (membutuhkan sekitar 3 menit di komputer saya):

Kasus cobaan vertikal

pelaku diet
sumber
1
Apakah gambar sebelum / sesudahnya? Jika demikian saya pikir Anda telah mengambil yang salah untuk BE ...
Sp3000
input gambar di sebelah kiri, dan gambar output di sebelah kanan ... mereka tidak sempurna pixel sama sekali karena penskalaan ulang dan copy-paste, saya telah menempatkan mereka hanya untuk memberikan petunjuk tentang cara kerja script ..
dieter
Apakah ini akan berhasil jika semua pir horisontal ?
Hobi Calvin
sebenarnya tidak ... karena dua alasan: itu jatuh ke dalam loop tak terbatas karena gambar khusus ini memiliki saluran alpha -> memperbaiki skrip sehingga mengkonversi gambar terlebih dahulu. Alasan lain mengapa saya menghapus kode yang menyelaraskan pir pada beberapa baris -> meletakkannya kembali
dieter