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.
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 N
ukuran 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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 62426; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 9206; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Jawaban:
Scratch ,
221217 byteKlik 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.
sumber
Memproses 2,
219 199 241 220219 byteMembutuhkan gambar yang disimpan
.png
dalam direktori yang sama dengan .pdesumber
Python 2,
262253246240 byteWow. 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 milidetikc=d.set_mode((400,)*2)
- Buat permukaan tampilan 400x400while c.fill((255,)*3):
- Secara efektifwhile 1:
tetapi membersihkan layar jugae=event.get(2);c.blit(image.load("I"),p);d.flip()
- Hanya mengumpulkan acara keyboard, memuat gambar yang disimpan dalam file png disebutI
dan menggambarnya. Perbarui layarif 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.sumber
Haskell, 410 byte
Gambar alien diharapkan dalam file bernama
b
dalam.bmp
format.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
/KeyDown
acara?Cara kerjanya: empat parameter terakhir
play
adalah 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.e
mencariKeyDown
peristiwa kunci kursor dan menetapkan fungsi yang sesuai di negara bagian atau untukKeyUp
tombol apa saja untuk mengatur ulang fungsi di negara bagian ke fungsi identitas.%
menerapkan fungsi dari negara ke koordinat saat ini dan memeriksa batas-batas.sumber
Elm, 240 byte
Coba di sini . Hitungan byte adalah setelah mengganti URL dengan
.png
.sumber
AutoIt ,
269267 byteMembutuhkan 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.au3
untuk mendapatkan akses_IsPressed
. Fungsi yang menerima kode kunci dan kembaliTrue
atauFalse
ketika tombol ditekan.Spesifikasi tantangannya cukup keren, sehingga kita harus membuat jendela berukuran 400px persegi. Parameter ukuran default (dinotasikan sebagai
-1
atauDefault
) adalah 400x400. Itu gaya jendela diperpanjang diatur ke34078728
. 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).$1
dan$2
dideklarasikan dan akan menahan offset x dan y dari gambar yang dimuat oleh kontrol$0
.$3
menjadi 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_IsPressed
ke integer yang dapat ditambahkan atau ditambahkan dari x offset. Sama untuk y.$1=($1>336)?336:($1<0)?0:$1
menggunakan 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):
sumber
Lua + LÖVE, 291 karakter
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.sumber
SpecBAS -
285255 byteMemuat 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.
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.
sumber
Ruby with Shoes,
252243 karakterIni 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.
sumber
Tcl / Tk , 242 byte
sumber
invaders.tcl
; Anda juga perlu memiliki gambar yang disimpan seperti.png
dalam folder yang sama. Untuk menjalankan jenis skripwish invaders.tcl
di shell. PS: Bisa lebih golf jika kode disisipkan ke dalam shell interaktif, karena didukung oleh perintah disingkat default.JavaScript (menggunakan paper.js), 215 byte
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.
sumber