itu sama!
Tugas hari ini sederhana: menulis sebuah program, atau fungsi yang menampilkan sprite Mario kecil yang menganggur, dari Super Mario Bros, di NES, dengan latar belakang biru.
Setiap jenis entri valid selama menampilkan 12 * 16 piksel tersebut di mana saja di layar / jendela / browser.
(EDIT: gambar yang ditampilkan dapat ditingkatkan jika bahasa Anda tidak dapat melakukan pixel art. Anda juga dapat menampilkan seni ASCII atau HTML art, tetapi menggunakan warna yang tepat.)
Gambar (diperbesar 400%):
Anda harus menggunakan warna berikut:
- biru: # 6B8CFF
- merah: # B13425
- hijau / coklat: # 6A6B04
- oranye: # E39D25
Program terpendek (dalam jumlah karakter) menang!
Celah standar berlaku (terutama, tidak ada koneksi jaringan yang diizinkan), tetapi hardcoding dan menampilkan file gambar dalam program Anda diizinkan. (entri yang menggunakan trik ini akan diberi peringkat secara terpisah)
Kita mulai!
Papan Peringkat Saat Ini
Jawaban terpendek hanya menggunakan kode:
- Mathematica, 141. https://codegolf.stackexchange.com/a/39916/10732 (oleh Martin Büttner)
- Bash, 158. https://codegolf.stackexchange.com/a/40002/10732 (oleh hpsMouse)
- ...
Jawaban terpendek menggunakan beberapa jenis gambar hardcode:
- HTML, 102b. https://codegolf.stackexchange.com/a/39923/10732 (oleh xem dan NiettheDarkAbsol)
- PHP, 131b. https://codegolf.stackexchange.com/a/39926/10732 (oleh NiettheDarkAbsol)
- ...
Jawaban:
HTML / JS,
206158153102102
Trik yang digunakan: simpan file GIF terkompresi sebagai file HTML, dan tambahkan <img src = #> di akhir
Berkat entri ini: https://codegolf.stackexchange.com/a/39926/10732 oleh @NiettheDarkAbsol
Demo: http://meuziere.free.fr/mario/gif.html
Versi yang lebih lama:
153
Trik yang digunakan: simpan file PNG terkompresi sebagai file HTML, dan tambahkan <img src = #> di akhir
158
Trik yang digunakan: mengatur dataURI terpangkas dari PNG terkompresi sebagai SRC dari tag IMG dan mengemas semuanya dalam Unicode chars.
Jalankan itu di konsol JS Anda:
206
Dibongkar (206b):
Demo
Alat yang digunakan:
sumber
Mathematica,
412292252212163148143141 karakterIni menggunakan notasi tanda kuret
^A
untuk karakter kontrol pada titik kode1
. Dalam Mathematica, saya benar-benar dapat menanamkan karakter secara harfiah, meskipun itu mengarah pada segala macam keburukan ketika menyalin sesuatu di sekitar. Bagaimanapun, yang di atas adalah 2 karakter lebih pendek dari versi saya sebelumnya, dan saya mendapatkannya karakter dari menggunakan basis-4 bukan basis-5 untuk menyandikan indeks palet warna. Saat ini saya tidak dapat diganggu untuk memperbaiki penjelasan dan tangkapan layar di bawah, jadi saya akan meninggalkan Anda di sini dengan versi dasar-5 dari jawaban saya:Saya menyandikan piksel dalam karakter Unicode (ya untuk menghitung berdasarkan karakter!).
Berikut ini tampilannya di Mathematica:
Begini cara kerjanya:
Pertama kita mendefinisikan fungsi
f
yang mengubah string Unicode (dilewatkan sebagai argumen pertama#
) menjadi daftar bilangan bulat. Pertama kita mendapatkan kode karakter. Itu dapat ditafsirkan sebagai digit nomor 65536 basis. Dan kemudian kita mengonversi angka itu ke pangkalan lain, diteruskan sebagai argumen kedua#2
.Sekarang mari kita lakukan untuk string Unicode yang lebih panjang.
ToCharacterCode
menghasilkan daftar ini:Memperlakukan ini sebagai basis 65536:
Dan mengkonversi ke basis 5:
Itu adalah indeks warna piksel, dalam urutan biru, merah, hijau, oranye. Kami menggunakannya untuk mengindeks ke dalam daftar angka, yang merupakan palet warna.
Sekarang untuk palet warna. Itu
"넴╫賿橫ӣ鴥"
. Kami menggunakan indeks di atas untuk memilih string yang benar. Kemudian kita menerapkan fungsi kita lagi, tetapi menggunakan basis 256. Itu menghasilkan daftar 12 bilangan bulat:Kami menggunakan
;;
pengindeksan rentang untuk mengeluarkan potongan yang relevan untuk warna saat ini.Terakhir, kami hanya gunakan
Partition
untuk membaginya menjadi baris12
dan mengumpankannyaImage
. Voa!Sunting: Dengan pengemasan Unicode, RLE sudah tidak layak lagi. Menghapusnya menyimpan 50 karakter.
Sunting: Tentu saja, tanpa RLE, tidak perlu lagi pergi ke pangkalan 16.
Sunting: Dan sementara kita berada di sana, mengapa tidak Unicode-pack palet warna juga? (Saya punya firasat bahwa saya dapat menyimpan sedikit lebih banyak dengan membuat seluruh palet warna menjadi satu string dan menggunakan
Partition
juga di sana. Saya akan mencobanya nanti.)Sunting: Ya, itu mencukur 5 byte lainnya.
sumber
Jawa:
398377Cukup gambar sprite dengan membongkar int untuk setiap kolom. Ditampilkan dalam program lengkap:
Tangkapan layar wajib:
sumber
import java.awt.*
.Kode Mesin x86, 102 byte
Cara kerjanya: Gambar disimpan sebagai gambar 2-bit menggunakan palet. Setiap baris gambar disimpan sebagai 3 byte, diikuti oleh 1 byte palet warna. Ini memungkinkan data untuk dimuat sebagai DWORD tunggal. Dua belas piksel dihasilkan dengan menutupi 2 bit nilai terendah, menuliskannya ke memori video, dan kemudian menggeser kanan seluruh nilai dua bit. Setelah piksel untuk baris dikeluarkan, byte palet ditulis ke palet VGA. Ketika gambar selesai menggambar, program memasuki loop tak terbatas.
Kode perakitan untuk menghasilkan biner:
Base-64 yang disandikan biner, simpan sebagai Mario.com untuk menjalankannya: sBPNEMQHvigBgcc0AWatZpOxDInYJAOqZsHrAuL1k7rJA + 6EwHXiwxUAVSwFAEANpb5XCbm / fxq5 / vgjpdjpdjfpdjf
Output sampel:
sumber
GIF - 93 byte
Hardcoding gambar tampaknya baik-baik saja sekarang, jadi ... ya? : D
Seperti yang terlihat di Notepad ++
Seperti PHP - 131 byte
sumber
Bash + ImageMagick:
350331321 karakter(Palette tanpa malu-malu dicuri dari Martin Büttner 's jawaban .)
Output sampel:
Untuk memeriksanya dengan mudah menambahkan
-scale 120
untukconvert
parameter 's untuk mendapatkan versi 10x skala:sumber
s/185 191 127 185 254 254/1{85,91,27,85} 254{,}/
;s/do/{/
;s/done/}/
{
..}
. Terima kasih, kegembiraan.Octo / XO-Chip , 70 byte
Octo adalah bahasa assembly tingkat tinggi yang mengkompilasi menjadi instruksi bytecode untuk mesin virtual CHIP-8 . Octo menyediakan beberapa ekstensi khusus yang disebut "XO-Chip" ke bytecode CHIP-8 dasar, termasuk kemampuan untuk menggambar bitmap 4-warna melalui bitplanes yang overlay.
Bytes yang dikompilasi adalah sebagai berikut:
Jalankan di sini di browser Anda: http://johnearnest.github.io/Octo/index.html?gist=33aa37d4717a425ccd4f
Mungkin lebih mencerahkan untuk melihat bahasa assembly Octo yang menghasilkan bytecode itu:
Program utama adalah tiga instruksi dua byte. Atur register indeks memori
i
ke awal segmen data, pilih bidang gambar 3 (3 adalah bitmask; ini menunjukkan Anda ingin menggambar dalam mode 4 warna dengan kedua bitplanes) lalu menggambar sprite pada posisi x dan y yang diberikan oleh daftarv0
(diinisialisasi ke nol). 0 akhir memberikan ukuran sprite, yang dalam set instruksi SuperChip dan XO-Chip akan menggambar sprite 16x16. Dalam mode 4 warna, bitmap untuk bidang pertama segera diikuti oleh bitmap untuk bidang kedua.Untuk melihat bagaimana pesawat bekerja, pertimbangkan program yang dimodifikasi ini yang menggulirkan satu pesawat ke kanan setelah menggambar mario:
Jika Anda menikmati ini, Anda mungkin menyukai salah satu solusi saya yang ditulis dengan Octo. Sebenarnya ada kemacetan permainan yang terjadi untuk bulan Oktober berdasarkan pada alat ini.
sumber
Groovy
417386Menyenangkan sekali, tetapi dengan jumlah char yang mengerikan. GroovyFX dibutuhkan
ungolfed:
sumber
grep()
bukannyatoList()
HTML / JS,
427408264256239226 karakterObfuscatweet,
271270264256239226 karakterMenggunakan obfuscatweet, berhasil mempersingkat ini menjadi <250: D
Kode di bawah ini terdiri dari apa.
Trik yang digunakan: gambar yang dikonversi ke string String string warna, dikonversi ini menjadi String heksadesimal. Indeks base 4 menunjukkan warna (0 = biru, 1 = RED, dll.) CSS dengan inline p digunakan karena div membutuhkan konten untuk berkembang (juga p lebih pendek). Karena CSS perlu diawali dengan huruf, 'A' diawali sebelum tag CSS.
Padding dari CSS memberikan piksel. Tak satu pun dari ini menggunakan karakter Unicode, yang saya tidak terlalu akrab dengan anyways, meskipun mungkin masuk sub-300 dalam hal ini. Keuntungan relatif menggunakan padding adalah Anda dapat, seperti dalam kasus ini, meledakkan gambar dengan ukuran berapa pun yang Anda inginkan untuk setiap piksel. Saya telah menggunakan 9 piksel, tetapi jika Anda menghabiskan karakter tambahan, Anda bisa mendapatkan hingga 99 piksel per piksel yang direpresentasikan.
CSS,
127119118114100130 karakterBeralih dari
p
untukrp
menghilangkan kebutuhandisplay:inline
, biaya +1 char, -15! karakter!Menghapus semua warna dan memasukkannya ke dalam array di JS -87 chars. Lalu saya baru saja menghapus semua css
JS,
300289280275329325 karakterSaya mencoba untuk memotong sebanyak yang saya bisa dari JS polos ini memproses string hex, tetapi mengingat ini adalah percobaan pertama saya, ini adalah seberapa jauh saya hanya menggunakan apa yang saya tahu. Penulisan HTML telah dipersingkat oleh fungsi yang menambahkan tag, dan kelas menggunakan nilai basis 4 untuk menentukan warna yang akan ditampilkan.
Menggunakan pemendekan tambahan, mengganti karakter dengan tanda kurung [], dan menghapus kelas A0 dan menetapkan biru sebagai warna default untuk p, menyimpan 10 karakter tambahan. Biaya tambahan untuk menggunakan
rp
tag diimbangi oleh kerugian besar dalam CSS.Tambahan offset dari menghapus loop pad sementara hanya menambahkan '000' untuk use case dan mengiris -12 darinya.
Menambahkan JS tambahan untuk warna, lalu letakkan padding di sana. Melihat bug dengan padding yang membutuhkan 2 karakter tambahan untuk memperbaikinya. Memadatkan banyak loop
File HTML,
430429419399366342 karakterDemo
sumber
MATLAB,
194193 byteKode:
Dan hasilnya:
Pada dasarnya saya mengonversi gambar Mario sehingga setiap piksel adalah angka 2 bit. Saya kemudian menyandikannya di basis 32 yang merupakan string yang ditunjukkan dalam kode. String ini pertama kali dibentuk ulang menjadi 5 x 16 (setiap baris (12px) dari angka 2bit dikodekan ke dalam basis 32), kemudian dikonversi kembali menjadi basis 10. Hasilnya dikonversi sekali lagi, kali ini menjadi basis 4 menghasilkan array 12x16 dari 2 angka bit. Angka-angka ini diplot menggunakan
imagesc()
. Kemudian warna ditugaskan menggunakancolormap()
peta warna khusus dari nilai hex yang diperlukan.Yang mengherankan, sepertiga dari jumlah byte yang digunakan hanya untuk mendapatkan MATLAB untuk mengatur warna yang benar setelah diplot. Kode warna memiliki jumlah byte yang hampir sama dengan seluruh string base32 !.
Tanpa memperbaiki warna (menghapus
colormap()
panggilan), itu adalah 135 byte, dan ini adalah output untuk peta warna default pada MATLAB R2013a:sumber
JavaScript /
CSS/ HTML446430407353328316Saya bermain golf sebanyak yang saya bisa dan berakhir dengan beberapa HTML / JS kotor, tapi apa pun ... itu berfungsi.
Sunting : Ini dia ... saya sudah selesai.
Sunting Serius dilakukan saat ini.
JavaScript
JSFiddle
sumber
*{line-height:1}
akan membantu.<div></div>
lebih pendek daridocument.createElement('div')
. Dan JSFiddle tidak sukadocument.write
i%12?"":"<br>"
.Matlab -
449/332305 bytekompresi parsial + Menggunakan simetri gambar yang lebih rendah:
- Versi terkompresi sebagian (332 byte):
Versi sepenuhnya tidak terkompresi (449 byte):
Output dalam kedua kasus (diperbesar di layar jelas, yang asli adalah 12x16pix):
sumber
C, 4999 byte
Ini benar-benar tidak dapat bersaing dengan beberapa jawaban di sini, tapi saya pikir saya akan memberikan jawaban C mencoba. Kode adalah satu garis panjang tunggal, jadi di sini adalah tautan pastebin. Jika Anda lebih suka, ini adalah pengkodean base64 dari kode yang di-gzip:
H4sICAzFGFYCA21hcmlvLmMA3Zc9DsIwDIXv0qndUqchkXwUurAgdYiFEEyIu4NYaZBI7PzNT3Lsz4mf408bjdPjct3odh6HVeujdgg4K4vzohCM8esdjHOpkrVoALUtIrBX8y1R04DKNCGZmTp85CVdAHifYuxO3mElIlju6xaRICOgCo4pD64PoiTzHnkZcHYnRhAYcEEpFznxB1mXP4TdS/KeVGYPZbmVaQHlnRVZFi65OkhoGodq+RHrby4xsTj8i6RmapXrPvfa0Q8ZWZY1/UPbSiC7Z2bYA7r0zla57Xmo8sOEzxdNYIXFhxMAAA==
Perlu dicatat bahwa itu tidak memerlukan perpustakaan eksternal untuk dijalankan.
Memerlukan terminal xterm, Konsole, atau GNOME, karena ia menggunakan ekspansi RGB ke kode pelolosan warna ANSI untuk menampilkan warna yang benar (ANSI tidak mendefinisikan oranye). Untuk alasan yang jelas, ideone tidak akan berfungsi. Itu dapat dijalankan di Windows di bawah Cygwin, yang menggunakan xterm (sebenarnya, itulah cara saya mengujinya). MSYS mungkin bekerja; Saya tidak yakin.
Output pada mesin saya (xterm):
sumber
Excel VBA,
310307295 BytesFungsi Anonymous VBE Immediates Window yang menampilkan Mario ke objek Activesheet di sel
A1:L16
Sub
Rutin Pembantu aVersi Tidak Serigala
-3 byte untuk menghapus spasi -12 byte untuk menggunakan
[...]
notasi lebih dariRange(...)
notasi; berubah dari warna hex ke warna intKeluaran
sumber
Bash 346
bash murni dengan VT100 seperti urutan sekuensi (maaf tidak ada oranye di palet itu)
sumber
Pyth, 83 byte
Penafian: Ini bukan kandidat yang menang, karena beberapa fitur bahasa dibuat setelah memposting pertanyaan.
Berikut ini hex-dump:
Anda juga dapat mengunduh program di sini dan menjalankannya
Ini menciptakan file
o.png
:Penjelasan:
Hanya ada 4 warna berbeda, oleh karena itu saya hanya perlu 2 bit untuk menyimpan warna setiap piksel.
sumber
Memproses 2 - 359 karakter
Saya melihat tantangan ini dan langsung memikirkan fungsi pixel []. Saya berharap ini akan lebih pendek tetapi saya masih cukup senang dengan hasilnya mengingat ini adalah upaya pertama saya di kode golf.
ungolfed:
Anda dapat mengunduh pemrosesan di sini
sumber
Javascript 515
baru saja bekerja, masih harus masuk dan golf itu
sumber
div
s yang membentuk baris dengan tag yang sebaris secara default. Saya belum mengujinya, tetapi menggunakana
harus berhasil. Anda juga dapat menggunakanbackground
bukanbackground-color
.Perl - Ungolfed 927
Saya harus bermain golf ini nanti. Pertama kali mencoba
Image::Magick
.Saya yakin kami punya banyak, tapi ini milik saya:
sumber
Cetak Bash:
179158 BytesTerinspirasi oleh jawaban pengguna2485710 .
Anda harus menyetel terminal Anda untuk mencocokkan warna dengan tepat.
sumber
-D
untuk decode dan-d
untuk debug .Tcl 298
Ini adalah 2 bit per piksel gambar dalam basis 64. Pixel dipetakan ke kode melarikan diri ansi.
sumber
JavaScript - 256 karakter (161 obfus-a-tweeted)
Metode:
Untuk menentukan urutan optimal untuk siklus warna, saya menjalankan algoritma kompresi terhadap data mentah untuk masing-masing 24 permutasi [R, G, B, O] dan memilih yang menghasilkan output terpendek (126 yang terbaik, paling tidak optimal adalah sekitar 150-an)
ETA menemukan ini hanya setelah membaca jawaban lain menggunakan obfusca-tweet ...
Ide selanjutnya. - Cobalah rentang data 3-bit 0-6, dengan 7,8,9 yang langka, masing-masing mendapatkan 4 ekstra: 60000N. - periksa permutasi siklus warna di semua arah dan kecepatan selain secara horizontal satu piksel pada satu waktu. - Cobalah beberapa render pass agar warna dapat berlapis.
sumber
Javascript,
253240238236Sumber obfuscatweet ed -
253240238236Tidak terobosan -
395370365361Terima kasih kepada @compass untuk
<p>
trik tag, dan @xem untuk 2 (5) karakter.Demo
Itu mengkonversi data dari basis 36, dan mengkonversi ke basis 4.
sumber
padding:9
Melakukan apa pun tanpa unit setelahnya. Anda juga bisa menggunakan elemen huruf tunggal sepertia
atauq
yang secara implisit sebaris, alih-alihp
.document.write
ke variabel (kita harus menggunakandocument.write.bind(document)
), yang terbaik adalah menugaskandocument
ke variabel.JavaScript ES6 (HTML + CSS), 199
30731953630Menggunakan Obfusc-a-tweet :
Ini menampilkan sprite tanpa menggunakan gambar atau banyak elemen; itu hanya menyalahgunakan
box-shadow
properti CSS untuk membuat setiap piksel. Cobalah di http://jsbin.com/pozohiyezo/ . Versi tanpa gangguan ini adalah 307 karakter :Ini adalah versi HTML asli, vanilla polos. Lihat beraksi di http://jsfiddle.net/gfeLn1ey/1/ .
sumber
Javascript,
256 atau 245252 atau 241256
Sedih untuk menimpa 256, tetapi 245 dimungkinkan jika menggunakan karakter yang tidak dapat dicetak:
Ada beberapa masalah dengan mengirim solusi dengan karakter yang tidak dapat dicetak. Argumen
btoa
harus hasilatob("ij6n56kcraqlaqasasjaqbsasibtdlstlb2cmc2b2cid5dra2q3q2au7u55rj4j4kclcidld")
dengan 1 simbol panjang ditambahkan untuk melarikan diri backslash.Persingkat kedua solusi dengan 4 simbol: kita tidak perlu yang baru untuk pembuatan array.
252
241
Tidak perlu melarikan diri dalam versi ini. The
btoa
argumen 's adalah hasil dariatob("k6n56kcraqlaqasasjaqbsasibtdlstlb2cmc2b2cid5dra2q3q2au7u55rj4j4kclbaidld")
sumber
Perl,
266260257249245 byteMenggunakan pendekatan yang mirip dengan solusi bash user2485710 untuk menulis output gaya VT100. Keluarkan N eksplisit untuk baris baru dengan menyisipkan baris baru setiap 12 "vt100 piksel", 12 * 7 = 84.
sumber
SmileBASIC,
147136 karakterOutput (terpotong):
Saya mengganti semua karakter dalam string data dengan
x
's, di sini adalah kode karakter (dalam UCS-2):P$
(Palette):FF6B,8CFF,FFB1,3425,FF6A,6B04,FFE3,D925
Data gambar:
0000,83F8,0A80,A3FA,8BE4,A5EA,BEA5,A55A,7EE5,0575,BFF5,0156,BFF5,0156,BBA5,0575,3AF4,A55A,3BC4,A5EA,0BC4,A3FA,0300,83F8
Palet disimpan dalam sebuah string, setiap warna (32 bit) disimpan dalam dua karakter (masing-masing 16 bit). Data gambar (2 bit per piksel) disimpan dalam string lain (8 piksel per karakter)
Untungnya, tantangannya dicetak dalam karakter, karena file ini secara signifikan lebih besar jika disimpan dalam UTF-8.
sumber
05AB1E , 87 byte (Tidak bersaing)
Cobalah online!
Output:
Karena 05AB1E tidak dapat membuat warna, atau gambar apa pun ... Jika ini tidak dapat diterima, saya akan menghapusnya.
sumber
Bash + 05AB1E
Sinclair BASIC - 573 byte
OK, jadi Spectrum tidak dapat menampilkan warna RGB seperti yang ditentukan, jadi gunakan yang sedekat mungkin.
String adalah warna (1 = biru, 2 = merah dll) diikuti oleh huruf untuk mewakili berapa kali blok itu berulang (dengan mengambil nilai ASCII minus 96 menjadi 1,2,3 dll). Nomor tanpa surat setelah itu hanya menggambar satu blok.
"\::"
pada baris 60 adalah cara memasukkan gambar dalam editor teks sebelum berubah menjadi file TAP untuk dimuat ke emulator Fuse. (Menunjukkan grafik blok padat di layar).Setiap kata kunci adalah satu byte di Sinclair BASIC, sudah termasuk hitungan dari perintah MENGINTIP setelah itu dihasilkan.
sumber
Perl -
399171 byteMenulis file gif ke stdout.
sumber