Pada tahun 2014, demoscener Jakub 'Ilmenit' Debski merilis demo grafis prosedural 250-byte (1) untuk Atari XL yang disebut Mona . Ini menggambar gambar berikut (2) :
Tugas Anda adalah untuk menghasilkan gambar yang sama persis, menggunakan bahasa pilihan Anda.
(1) Rincian: 136 byte data + 114 byte kode.
(2) Gambar aslinya adalah 128x96. Versi di atas diperbesar menjadi 256x192. Beberapa piksel berbeda dari aslinya, tetapi ini adalah output yang diharapkan dengan pseudo-code yang dijelaskan dalam tantangan ini.
Bagaimana?
Ini adalah kode-golf . Meskipun Anda diizinkan untuk menggunakan metode apa pun, hasil terbaik kemungkinan besar akan dicapai dengan menggunakan algoritma asli yang dijelaskan di bawah ini.
NB : Paragraf ini bukan spesifikasi melainkan deskripsi umum. Silakan merujuk ke pseudo-code dan implementasi referensi untuk rincian algoritma.
Gambar ini terbuat dari 64 sapuan kuas pseudo-acak ( lihat video ini ), bersepeda melalui warna berikut (dalam format heksadesimal RRGGBB):
COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]
Latar belakang awalnya diisi dengan warna ke-4 (hitam). Setiap pukulan lebih pendek dari yang sebelumnya.
Generator pseudo-acak menggunakan Linear-Feedback Shift Register (LFSR) pada bilangan bulat 32-bit yang awalnya diatur ke 0x7EC80000
dan XOR'ed dengan 0x04C11DB7
.
Setiap langkah diinisialisasi dengan nilai 16-bit yang menimpa byte terendah dari biji:
BRUSH = [
0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B,
0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2,
0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347,
0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051,
0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C,
0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7,
0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B,
0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139
];
Nilai-nilai ini juga digunakan untuk mengatur posisi baru (bx, oleh) dari kuas pada awal langkah: bx diberikan oleh byte paling signifikan dan oleh diberikan oleh byte paling signifikan.
Arah pukulan diberikan oleh bit # 1 dan # 7 dari seed. (Lihat pernyataan SWITCH dalam kode semu.)
Kode semu
Di bawah ini adalah algoritma dalam pseudo-code, dengan asumsi array 0-diindeks, di mana AND
, OR
dan XOR
operasi bitwise berarti.
seed = 0x7EC80000
dir = 0x00
FOR part = 0 TO 63
word = BRUSH[part]
seed = (seed AND 0xFFFF0000) OR word
bx = word AND 0xFF
by = (word >> 8) AND 0xFF
FOR len = 0 TO (64 - part) * 32 - 1
carry = seed AND 0x80000000
seed = (seed << 1) AND 0xFFFFFFFF
IF carry
seed = seed XOR 0x04C11DB7
dir = seed AND 0xFF
ENDIF
SWITCH dir AND 0x82
CASE 0x00:
by = (by + 1) AND 0x7F
ENDCASE
CASE 0x02:
bx = (bx + 1) AND 0x7F
ENDCASE
CASE 0x80:
by = (by - 1) AND 0x7F
ENDCASE
CASE 0x82:
bx = (bx - 1) AND 0x7F
ENDCASE
ENDSWITCH
drawPixel(bx, by, COLOR[part AND 3])
ENDFOR
ENDFOR
Implementasi referensi
Di bawah ini adalah implementasi referensi ungolfed dalam JavaScript.
Anda juga dapat melihat versi animasi di sini .
Klarifikasi dan aturan
- Keluaran harus dipangkas menjadi 128x96, meskipun algoritme menarik di luar area ini.
- Jika bahasa / platform Anda tidak dapat menampilkan warna yang dijelaskan di atas, Anda harus menggunakan warna yang sedekat mungkin.
- Jika Anda memutuskan untuk menggunakan metode alternatif, Anda masih harus menghasilkan output yang sama persis.
- Untuk jaga-jaga: mengirimkan kode perakitan 6502 asli atau versi yang sedikit diedit tidak diperbolehkan.
- Bisakah Anda mengalahkan 250 byte? Selamat menggambar!
Jawaban:
opcode x86,
227224223 BytesGambar:
sumber
0122 6681F7B71DC104 xor edi, 00001DB7
bug ditemukan di W32Dasm8086 Assembly - NASM (MBR) -
248245 bytesumber
xor dx,dx
dan mengubahnyamov bp,0xa000; mov es,bp
menjadipush 0xa000; pop es
.PUSH imm
Excel VBA 32-Bit,
1011720 BytesRevisi 49; Δ Skor = 291 Bytes
Golf
Sub
Rutin penuh yang tidak memerlukan input dan output Mona Lisa keActiveSheet
objek pada jangkauan[A1:DX96]
.Ada banyak ilmu hitam yang terlibat dalam bermain golf ini ke keadaan saat ini, - dari catatan, beberapa trik yang terlibat adalah persiapan pixel art , bit shifting warna konversi tipe implisit , dan
kompresi byte sebagaibase64
kompresiString
.Catatan: Solusi ini telah dibatasi untuk versi 32-Bit dari Excel VBA sebagai
^
adalahLongLong
jenis literal dalam versi 64-BitCatatan, The Second: String adalah baris 3 bukan komentar karena
”
tidak setara dengan"
Keluaran
Gif menampilkan ouput ke
ActiveSheet
saatM
dipanggil di jendela langsung VBE. Perhatikan bahwa karena batasan ukuran file,aragif ini memiliki lebih sedikit bingkai daripada yang sebenarnya dihasilkan.Tidak disatukan
Rutin penuh ungolfed
sub
yang tidak mengambil input dan menghasilkan mona lisa menggunakan metode yang dijelaskan di atas padaActiveSheet
objeksumber
HTML + CSS + JavaScript (ES6), 499 byte
678...478475473465459455451447449 byteTidak ada yang mendekati 250 byte, tapi saya pasti akan puas dengan di bawah 500 byte! Terima kasih banyak kepada @Arnauld dan @Firefly karena membantu saya mengurangi monster ini.
Untuk skala yang lebih besar, ganti CSS dengan yang berikut ini:
Sejarah Beranotasi!
Saya bersenang-senang bermain kode referensi Arnauld, dan Anda bisa mendapatkannya di sini. Nikmati!
Tampilkan cuplikan kode
sumber
Befunge,
11311052 byteAda sejumlah masalah yang menjadikan ini masalah yang menantang di Befunge:
Befunge hanya memiliki 2000 byte memori yang dapat digunakan (dan itu termasuk kode sumber), jadi tidak ada cara kita dapat merender keseluruhan gambar ke dalam memori sebelum mengeluarkannya. Cara saya mengatasinya adalah dengan berulang kali menjalankan algoritma 96 kali, sekali untuk setiap baris. Setiap run menyimpan hanya piksel yang diperlukan untuk baris saat ini, yang kemudian dikeluarkan di akhir proses. Ini memungkinkan kita untuk bertahan dengan penyangga piksel hanya 128 byte.
Befunge tidak memiliki operasi sedikit pun. Banyak
AND
operasi hanya dapat ditiru dengan operator modulo (misalnyaa AND 0x7F
dapat diganti dengana % 0x80
). Namun,XOR
memerlukan beberapa manipulasi bit yang agak rumit, yang harus kita hadapi satu byte pada satu waktu, menggunakan satu set formula kustom yang di-hardcode untuk menangani empat byte yang kita butuhkan. Misalnya, untuk menghitunga XOR 0xC1
, kami menggunakan rumus:a + 0xC1 - (a/64%4*64 + a%2)*2
Meskipun bukan batasan Befunge per se, antarmuka pada TIO tidak mampu menangani karakter ASCII yang diperluas dalam sumber, yang akan menjadi cara termudah untuk menyimpan brush dan tabel warna. Saya mengatasinya dengan membuat tabel-tabel itu sebagai daftar angka pada stack, kemudian memiliki sedikit inisialisasi loop yang menyalin nilai-nilai dari stack ke memori. Sebagian besar waktu saya dihabiskan untuk bermain golf di meja ini, yang menghabiskan lima setengah baris pertama kode.
Sayangnya, terlepas dari semua usaha saya untuk membuat kode yang kompatibel dengan TIO, dan pilihan saya untuk format file yang dapat diekstraksi dari TIO ( PPM ), itu terlalu lambat untuk diselesaikan dalam batas waktu 60 detik (menjalankan algoritma 96 kali mungkin tidak membantu). Tetapi karena itu menghasilkan gambar baris demi baris, Anda masih harus mendapatkan cukup dari output untuk memulihkan hampir setengah gambar.
Cobalah online!
Jika Anda tidak memiliki penampil file PPM lokal, Anda dapat dengan mudah mengkonversi ke format lain menggunakan salah satu dari banyak konverter online. Salah satu contohnya adalah Convertio .
sumber
Python 3,
544536523519518 byteIni adalah versi lanjutan dari terjemahan Python CCB60 dari implementasi referensi. Saya awalnya menggunakan nomor hex besar untuk mewakili kuas algoritma, tetapi saya kemudian menyadari bahwa asumsi saya yang tidak berdasar bahwa representasi string Unicode tidak akan bekerja di Python adalah salah.
Saya awalnya berpikir jumlah byte saya jauh lebih rendah, tetapi seperti yang ditunjukkan ASCII saja , saya tidak ingat untuk menghitung karakter Unicode lebih dari satu byte.
Output (128 x 96)
Identik dengan output CCB60.
sumber
Java 7,
681677675626612610 byteMenghasilkan gambar berikut dalam resolusi 128x96:
Saya tahu ini bahkan tidak dekat 250 byte tapi hei itu java
-2 byte terima kasih kepada Zacharý
sumber
#Language, <s>Old Scores</s> Score Bytes
dan 2 Anda dapat membuat kode Anda sedikit lebih mudah dibaca dengan menambahkan bendera bahasa formulir<!-- language-all: lang-java -->
sebelum blok kode Anda0x04C11DB7
=>0x4C11DB7
dan0x7f
=>127
. Jangan menjadi gila ketika tidak dibutuhkan.C #,
960850 byteSalinan langsung kode pseudo dengan beberapa golf ditambahkan. Masih ada banyak yang bisa di-golf, tetapi saya ingin memposting jawaban saya untuk membuat bola bergulir.
Versi Lengkap / Terformat:
sumber
var m = new Bitmap(128,96)
AE IU WAUGH WYPython 2.7; Total
880876 byte (termasuk data)-4 byte hingga 876 berkat ZacharyT. (Penerjemah python saya tidak suka sarannya untuk menjatuhkan spasi antara tahun 80-an dan yang lain).
Saran Taylor Scott untuk memasukkan kuas ke dalam Basis 10 sangat bagus, tetapi notjagan (dalam komentar) mengambil sarannya selangkah lebih maju, menggunakan format integer diperpanjang python dalam hex. jawaban notjagan ada di Python 3, dan merupakan peningkatan dari apa yang saya lakukan sehingga dia layak mendapatkan pujian. Saya harap dia akan mempostingnya sebagai jawaban terpisah.
Keluaran ke jendela Tkinter. Tanpa penskalaan, gambar sangat kecil, tetapi penskalaan menambahkan sekitar selusin byte ke hitungan.
Tidak banyak yang terjadi di sini kecuali terjemahan ke Python dan beberapa golf dasar. Terkadang manipulasi bit-bijaksana lebih pendek, terkadang matematika bilangan bulat. Saya tidak dapat menemukan cara untuk mengemas lebih banyak logika ke dalam daftar atau array. Algoritma dasar sudah cukup padat.
sumber
<!-- language-all: lang-py -->
80
's danelse
' s. Dan,0x00
sama dengan0
, kan?import
dan*
.Tcl / Tk, 805
808815816819826839840843Masih kalah, tapiaku harus melakukannya! mungkin saya bisa golf lagi nanti!Bukan pecundang sekarang!
Tcl / Tk, 1370
Transliterasi Pseudo-kode yang sangat tidak diseragamkan sebelum golf dimulai! The
update
garis memungkinkan untuk melihat gambar yang dilakukan secara progresif!sumber
Python 3 + matplotlib, 541
Ini menyimpan gambar sebagai file png "i". Untuk menampilkan gambar, Anda dapat mengganti imsave dengan imshow dan pertunjukan untuk 545 byte.
sumber
SmileBASIC,
454447444 byteString "x" memiliki beberapa karakter unicode yang tidak valid, jadi saya tidak dapat mempostingnya di sini. Berikut adalah kode karakter dalam desimal (hanya susunan BRUSH terbalik):
8505, 11193, 11332, 40503, 9639, 38606, 12590, 44957, 49275, 9103, 45629, 7700, 44387, 16047, 36156, 21056, 32967, 44146, 47330, 6263, 59670, 16059, 2569, 1043, 21292, 45297, 10516, 35478, 45332, 45634, 21547, 54321, 12369, 54650, 3453, 32252, 41772, 10669, 2137, 35575, 41799, 37027, 38901, 57113, 9942, 15633, 8348, 8339, 40146, 53425, 640, 28853, 45146, 47166, 37752, 3773, 6923, 35473, 62875, 3644, 1835, 12187, 14270, 778
sumber
"xx...xx"
string?: r4, 764 byte
sumber untuk dijalankan di : r4 github
Saya menggunakan trik untuk membuat langkah tanpa persyaratan, mengubah bit 8 dalam tanda dan bergeser dengan bit 2. versi dengan nama stack:
sumber
Yabasic,
790779 byteSebuah dasar jawaban yang tidak mengambil input dan output untuk jendela grafis baru.
Keluaran
Di bawah ini diskalakan dengan faktor 8
sumber