Penjajah ruang proto (dapatkah Anda melakukannya?)

18

Penjajah ruang proto

Ini adalah tantangan keluaran grafis di mana tugasnya adalah memberikan kode terpendek per bahasa.

Tugas

Kode Anda harus memungkinkan pengguna untuk memindahkan alien berikut di sekitar layar / jendela.

masukkan deskripsi gambar di sini

Kode Anda cukup memuatnya dari file lokal. Jangan ragu untuk mengonversinya ke format gambar standar lain atau bahkan untuk memperbaiki kesalahan piksel kecil pada gambar yang ditunjukkan dalam komentar.

Latar belakang harus putih dan jendela / layar harus setidaknya 400 piksel oleh 400 piksel. Jika bahasa Anda tidak mendukung windows / layar yang besar maka gunakan ukuran terbesar itu mendukung selama itu tidak kurang dari 200 oleh 200.

Untuk memindahkan alien di sekitar layar kode harus mendukung atas / bawah / kiri / kanan menggunakan tombol panah pada keyboard standar.

Kode Anda harus merupakan program lengkap .

Batasan / kendala

Alien harus berhenti di perbatasan. Itu juga harus bergerak pada tingkat yang seragam dengan lancar tanpa kelap-kelip yang terlihat atau gagap dan ditampilkan setidaknya 24fps. Perlu waktu antara 2 dan 5 detik untuk berpindah dari satu sisi layar / jendela ke sisi lainnya.

Bahasa dan perpustakaan

Anda dapat menggunakan bahasa atau pustaka yang Anda suka (yang tidak dirancang untuk tantangan ini). Namun, saya ingin dapat menguji kode Anda jika memungkinkan jadi jika Anda dapat memberikan instruksi yang jelas tentang cara menjalankannya di Ubuntu yang akan sangat dihargai.

Katalog

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

## Perl, 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


sumber
2
Bisakah kita membangun alien sendiri? Jika demikian, apakah kita harus memasukkan kesalahan piksel (i guess?) Dari gambar?
mınxomaτ
@ mınxomaτ Tidak terbatas pada linux! Catatan "jika memungkinkan".
@nimi Terima kasih. Ditambahkan bahwa Anda dapat memuatnya dari file lokal.
@ mınxomaτ Anda dapat membuatnya sendiri atau hanya memuatnya dari file lokal. Saya tidak melihat kesalahan piksel tetapi saya berasumsi bahwa memuatnya akan lebih sedikit kode dalam hal apapun.
Bisakah Anda mendefinisikan "berhenti di perbatasan"? Apakah seluruh alien perlu terlihat setiap saat, atau bisakah ia berhenti sebagian di luar perbatasan?
timothymh

Jawaban:

12

Scratch , 221 217 byte

Klik gambar untuk melihatnya beraksi. Gerakan ditentukan oleh penekanan tombol , sehingga akan lebih halus semakin cepat Anda mengulangi kunci diatur.

Gambar ini termasuk dalam proyek, tetapi byte Gores biasanya dihitung dari representasi tekstual golf , per posting meta ini . Jika ada ketidaksepakatan tentang apakah ini dapat diterima (atau apakah gerakannya cukup lancar) beri tahu saya dan saya akan mencoba mengatasinya.

timothymh
sumber
Jawaban ini sangat menyenangkan!
Bagaimana Anda mengukur ukuran program ini?
@Lembik lihat paragraf kedua.
timothymh
1
menghasilkan dalam 217 byte: scratchblocks.github.io/…
ev3commander
1
@Mauris Ya, itulah perintah "if on edge, bounce". Anda dapat memainkan demo dengan mengklik gambar!
timothymh
7

Memproses 2, 219 199 241 220 219 byte

int a,x=0,y=0;void setup(){size(500,500);}void draw(){background(-1);image(loadImage(".png"),x,y);if(keyPressed){a=keyCode;if(a==38)y--;if(a==37)x--;if(a==40)y++;if(a==39)x++;}x=constrain(x,0,436);y=constrain(y,0,454);}

Membutuhkan gambar yang disimpan .pngdalam direktori yang sama dengan .pde

Dokter
sumber
6

Python 2, 262 253 246 240 byte

from pygame import*
init()
key.set_repeat(1)
p=[0,0]
d=display
c=d.set_mode((400,)*2)
while c.fill((255,)*3):
 e=event.get(2);c.blit(image.load("I"),p);d.flip()
 if e:x=e[0].key+1;q=x&2;b=q/2;p[b]=max(0,min(336+b*16,p[b]+(1-q)*(1-(2*x&2))))

Wow. Banyak sekali peretasan.

Menggunakan modul 'pygame' yang ditemukan di http://pygame.org .

Penjelasan

key.set_repeat(1) - Kirim acara kunci berulang melalui sistem acara setiap milidetik

c=d.set_mode((400,)*2) - Buat permukaan tampilan 400x400

while c.fill((255,)*3):- Secara efektif while 1:tetapi membersihkan layar juga

e=event.get(2);c.blit(image.load("I"),p);d.flip()- Hanya mengumpulkan acara keyboard, memuat gambar yang disimpan dalam file png disebut Idan menggambarnya. Perbarui layar

if e:x=e[0].key+1;q=x&2;b=q/2;p[b]=max(0,min(336+b*16,p[b]+(1-q)*(1-(2*x&2)))) - Jika ada acara, cari tahu tombol panah mana yang ditekan (lakukan hal-hal aneh jika Anda menekan tombol lain), lalu ubah posisi permukaan tergantung pada tombol mana yang Anda tekan.

Biru
sumber
Saya sangat suka solusi Anda.
@ Lembik Jadi nama file byte tunggal diperbolehkan? (Yaitu tanpa ekstensi?). Jika demikian, saya sarankan untuk mengecualikan nama file sepenuhnya dari jumlah byte.
mınxomaτ
@ mınxomaτ Saya nama file byte tunggal diizinkan tetapi saya tidak ingin membuat skema penilaian baru.
Pemrosesan @Lembik tidak dapat menangani nama file byte tunggal ... jadi ini tidak adil.
TheDoctor
2
@TheDoctor Ini hanya dalam: Bahasa yang berbeda berbeda! Saya mengusulkan kita juga melarang larangan yang mengambil input dari stdin, Anda tahu, karena tidak adil bahwa dibutuhkan begitu banyak karakter untuk melakukan itu dengan Python ...
Aleksi Torhamo
5

Haskell, 410 byte

import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
main=do b<-loadBMP"b";play(InWindow""(400,400)(0,0))white 200((0,0),id)(b#)e(%)
e(EventKey(SpecialKey k)Down _ _)(c,_)|k==KeyUp=(c,fmap(+1))|k==KeyDown=(c,fmap(+(-1)))|k==KeyLeft=(c,((+(-1))?))|k==KeyRight=(c,((+1)?))
e(EventKey _ Up _ _)(c,_)=(c,id)
e _ w=w
_%(c,f)=(s?(s<$>f c),f)
s=min 200.max(-200)
b#((x,y),_)=Translate x y b
f?(a,b)=(f a,b)

Gambar alien diharapkan dalam file bernama bdalam .bmpformat.

Saya baru ke perpustakaan Gloss, jadi mungkin ini tidak optimal. Adakah yang tahu apakah saya bisa memeriksa apakah ada tombol yang ditekan alih-alih pelacakan KeyUp/ KeyDownacara?

Cara kerjanya: empat parameter terakhir playadalah keadaan dunia (diinisialisasi dengan ((0,0),id), fungsi untuk menggambar gambar dari keadaan ( #), event handler ( e) dan fungsi yang mengubah keadaan seiring waktu ( %).

Status adalah sepasang koordinat xy dan fungsi cara mengubahnya kapan saja %dipanggil.

#memindahkan bitmap ( b) ke koordinat saat ini dan menggambarnya.

emencari KeyDownperistiwa kunci kursor dan menetapkan fungsi yang sesuai di negara bagian atau untuk KeyUptombol apa saja untuk mengatur ulang fungsi di negara bagian ke fungsi identitas.

% menerapkan fungsi dari negara ke koordinat saat ini dan memeriksa batas-batas.

nimi
sumber
Saya selalu kagum Anda bahkan dapat melakukan hal semacam ini di Haskell. Terima kasih!
4

Elm, 240 byte

import Graphics.Element as G
import Keyboard as K
import Time
import Signal exposing(..)
c=min 800>>max 64
i(x,y)=G.container x y G.middle(G.image 64 48"http://i.stack.imgur.com/CUweU.png")
main=i<~foldp(\{x,y}(v,w)->(c v+x,c w-y))(99,99)(sampleOn(Time.fps 200)K.arrows)

Coba di sini . Hitungan byte adalah setelah mengganti URL dengan .png.

Lynn
sumber
Saya mungkin harus belajar Elm sekarang. Terima kasih.
3

AutoIt , 269 267 byte

#include<Misc.au3>
GUICreate(0,-1,-1,-1,-1,-1,34078728)
$0=GUICtrlCreatePic("b.bmp",0,0,64,48)
GUISetState()
Dim $1,$2
$3=_IsPressed
Do
$1+=$3("27")-$3("25")
$2+=$3("28")-$3("26")
$1=($1>336)?336:($1<0)?0:$1
$2=($2>352)?352:($2<0)?0:$2
GUICtrlSetPos($0,$1,$2)
Until 0

Membutuhkan gambar untuk disimpan sebagai b.bmp di direktori skrip. Jika Anda ingin menggunakan gambar dengan transparansi aktual, Anda harus mengubahnya dari PNG ke Bitmap 32bit (OT: format yang benar-benar tidak dihargai).

Penjelasan

Kami perlu mengimpor Misc.au3untuk mendapatkan akses_IsPressed . Fungsi yang menerima kode kunci dan kembali Trueatau Falseketika tombol ditekan.

Spesifikasi tantangannya cukup keren, sehingga kita harus membuat jendela berukuran 400px persegi. Parameter ukuran default (dinotasikan sebagai -1atau Default) adalah 400x400. Itu gaya jendela diperpanjang diatur ke 34078728. Ini memaksa jendela menjadi buffered ganda dan ditarik dari bawah ke atas. Ini diperlukan untuk menghilangkan kedipan sesuai kebutuhan tantangan. Di Windows 10, kombinasi gaya yang tidak biasa ini (dan agak tidak berdokumen) memecah bilah judul jendela (semua efek melayang dinonaktifkan).

$1dan $2dideklarasikan dan akan menahan offset x dan y dari gambar yang dimuat oleh kontrol $0.$3menjadi penunjuk ke fungsi_IsPressed untuk mempersingkat kode secara signifikan.

Karena tidak diperlukan untuk dapat keluar dari program, skrip ini berjalan dalam loop tak terbatas (Until 0 ).

$1+=$3("27")-$3("25")menyalahgunakan varian tipe data dalam AutoIt dengan secara dinamis menampilkan nilai boolean yang dikembalikan dari _IsPressedke integer yang dapat ditambahkan atau ditambahkan dari x offset. Sama untuk y. $1=($1>336)?336:($1<0)?0:$1menggunakan operator ternary yang dikenal dari bahasa seperti C untuk melakukan pemeriksaan batas untuk menghentikan alien di perbatasan.

GuiCtrlSetPos memindahkan kontrol gambar ke koordinat baru.

Berikut screenshot dengan alien transparan (Anda bahkan dapat bergerak secara diagonal):

tangkapan layar

mınxomaτ
sumber
Latar belakang Anda tidak putih!
sergiol
2

Lua + LÖVE, 291 karakter

x=0
y=0
l=love
g=l.graphics
l.window.setMode(400,400)
i=g.newImage("i")
function l.update()d=l.keyboard.isDown
if d("left")and x>0 then x=x-1 end
if d("right")and x<336 then x=x+1 end
if d("up")and y>0 then y=y-1 end
if d("down")and y<352 then y=y+1 end
end
function l.draw()g.draw(i,x,y)end

Ini menggunakan jendela 400 x 400 yang tidak dapat diubah. Saya tidak berhasil menyesuaikan diri love.keyboard.setKeyRepeat()untuk mempercepat pembacaan kunci, jadi saya melakukan cara yang disarankan, memilih status setiap kunci.

Seperti hubunganku dengan Lua for bukan yang terbaik, kali ini tidak berhasil membuat perulangan lebih pendek dari hardcoding dump kondisi masing-masing tombol.

manatwork
sumber
2

SpecBAS - 285 255 byte

1 GRAPHIC NEW v LOAD "inv8.bmp" TRANSPARENT 15
2 PALETTE COPY v,0,1 TO 5: GRAPHIC REMAP v
3 LET x,y=100
4 CLS : WINDOW PUT GRAPHIC v,0,x,y
5 LET x=x+KEYST(39)-KEYST(37),y=y+KEYST(40)-KEYST(38)
6 LET x=CLAMP(x,1 TO 400),y=CLAMP(y,1 TO 400)
7 WAIT SCREEN 
8 GO TO 4

Memuat gambar - warna 15 putih cerah, sehingga menjadi transparan.

Menggunakan gambar asli dan palet SpecBAS standar membuatnya sedikit aneh, jadi baris 2 mengubahnya untuk mencocokkan gambar input. Gambar di bawah ini menunjukkan tampilannya tanpa garis 2 dan sesudahnya.

masukkan deskripsi gambar di sini

Perintah CLAMP membatasi grafik antara 1 dan 400 di kedua arah, menghemat beberapa pernyataan IF ... THEN.

Baris 9 hanya menunggu hal-hal untuk mengejar ketinggalan dan mencegah berkedip.

Ini bergerak satu piksel pada satu waktu berdasarkan pada pemeriksaan boolean yang tombolnya ditekan, sehingga membutuhkan waktu sedikit lebih lama dari 5 detik untuk berpindah dari sisi ke sisi.

Brian
sumber
2

Ruby with Shoes, 252 243 karakter

Shoes.app{background white
i=image'i'
m=[0,0]
a=[:width,:height]
animate(99){i.left+=m[0]<=>i.left
i.top+=m[1]<=>i.top}
keypress{|k|d,v={?u=>[1,-1],?d=>[1,1],?l=>[0,-1],?r=>[0,1]}[k[0]];m[d]=[[m[d]+v*4,self.send(p=a[d])-i.send(p)].min,0].max}}

Ini menggunakan jendela yang dapat diubah ukurannya mulai dari standar 600 x 500. Jika Anda mengubah ukuran jendela sehingga penyerang dibiarkan keluar, akan kembali ketika tombol gerakan berikutnya ditekan.

Trik untuk memenuhi persyaratan adalah posisi penyerbu diubah dengan kelipatan 4, tetapi gerakan sebenarnya dibuat dengan kelipatan 1 pada 99 bingkai per detik.

manatwork
sumber
2

Tcl / Tk , 242 byte

grid [canvas .c -w 400 -he 403 -bg #FFF -highlightt 0]
.c cr i 30 24 -i [image c photo -fi .png] -t p
lmap {k b x y} "Up 1]>25 0 -5 Right 0]<368 5 0 Down 1]<376 0 5 Left 0]>30 -5 0" {bind . <$k> "if \[lindex \[.c coo p] $b {.c move p $x $y}"}
sergiol
sumber
Untuk menjalankannya di Linux apa pun: Anda harus sudah menginstal Tcl dan Tk; lalu salin kode ke file, katakanlah invaders.tcl; Anda juga perlu memiliki gambar yang disimpan seperti .pngdalam folder yang sama. Untuk menjalankan jenis skrip wish invaders.tcl di shell. PS: Bisa lebih golf jika kode disisipkan ke dalam shell interaktif, karena didukung oleh perintah disingkat default.
sergiol
1

JavaScript (menggunakan paper.js), 215 byte

v=new Raster("http://i.stack.imgur.com/CUweU.png",99,99);p=new Size(4,0)
onFrame=e=>{if(!v.isInside(view.bounds)){p=-p};v.position+=p}
onKeyDown=e=>{p=new Size([[0,-4],[0,4],[-4,0],[4,0]]["udlr".indexOf(e.key[0])])}

paper.js adalah kerangka kerja grafik JS, yang berarti fitur banyak fitur berguna tentang manipulasi gambar. Untuk menjalankan, cukup salin di atas ke bagian di sebelah kiri di sini , lalu, untuk memindahkan alien, klik sekali di bagian kanan untuk memberikan fokus. Jika browser Anda dapat mengatasinya, itu harus berjalan pada 60fps.

ivzem
sumber