Mari kita menggambar Mona Lisa


39

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

mona

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 . 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 0x7EC80000dan 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, ORdan XORoperasi 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!

1
"Anda didorong untuk" bermasalah, karena jika melakukannya bertentangan dengan penghematan byte, haruskah seseorang melakukannya atau tidak? Ini harus berupa "Anda harus" (melakukannya meskipun biayanya byte), atau "Anda boleh" (lakukan hanya jika menghemat byte).

1
Biasanya saya pikir lebih baik untuk membagi opsi ascii menjadi tantangan lain, jika tidak ada 2 jenis sub-tantangan.
FryAmTheEggman

1
@FryAmTheEggman Awalnya hanya dimaksudkan untuk keluaran grafis dan menambahkan opsi ASCII ini mungkin memang ide yang buruk. Semoga saya tidak merusak beberapa jawaban WIP dengan menghapusnya ...
Arnauld

4
@ATaco Paint Starry Nigh adalah tantangan kode dengan tujuan berbeda (mereproduksi gambar sedekat mungkin). Ini adalah kolmogorov-kompleksitas dengan output konstan.
Arnauld

1
Itu bisa dimengerti, Mengurangi suara dekat saya.
ATaco

Jawaban:


7

opcode x86, 227 224 223 Bytes

0000h: 68 20 A8 07 B8 13 00 CD 10 66 BF 40 00 C8 7E 5A
0010h: 89 FD BE 5B 01 AD 89 C7 89 E9 C1 E1 05 66 D1 E7
0020h: 73 09 66 81 F7 B7 1D C1 04 89 FA 80 E2 82 74 09
0030h: 7A 04 78 08 40 40 05 7F 7F 80 C4 02 FE CC 25 7F
0040h: 7F 89 EB 83 E3 03 8A B7 DB 01 88 E3 6B DB 40 01
0050h: C3 26 88 37 E2 C7 4D 75 BC EB FE 0A 03 BE 37 9B
0060h: 2F 2B 07 3C 0E 9B F5 91 8A 0B 1B BD 0E 78 93 3E
0070h: B8 5A B0 B5 70 80 02 B1 D0 D2 9C 93 20 9C 20 11
0080h: 3D D6 26 19 DF F5 97 A3 90 47 A3 F7 8A 59 08 AD
0090h: 29 2C A3 FC 7D 7D 0D 7A D5 51 30 31 D4 2B 54 42
00a0h: B2 14 B1 96 8A 14 29 F1 B0 2C 53 13 04 09 0A BB
00b0h: 3E 16 E9 77 18 E2 B8 72 AC C7 80 40 52 3C 8D AF
00c0h: 3E 63 AD 14 1E 3D B2 8F 23 7B C0 9D AF 2E 31 CE
00d0h: 96 A7 25 37 9E 44 2C B9 2B 39 21 43 00 06 42   

  0100 6820A8                 push A820
  0103 07                     pop es
  0104 B81300                 mov ax, 0013
  0107 CD10                   int 10
  0109 66BF4000C87E           mov edi, 7EC80040
  010F 5A                     pop dx
  0110 89FD                   mov bp, di
  0112 BE5B01                 mov si, 015B
  0115 AD                     lodsw
  0116 89C7                   mov di, ax
  0118 89E9                   mov cx, bp
  011A C1E105                 shl cx, 05
  011D 66D1E7                 shl edi, 01
  0120 7309                   jnb 012B
  0122 6681F7B71DC104         xor edi, 04C11DB7
  0129 89FA                   mov dx, di
  012B 80E282                 and dl, 82
  012E 7409                   je 0139
  0130 7A04                   jpe 0136
  0132 7808                   js 013C
  0134 40                     inc ax
  0135 40                     inc ax
  0136 057F7F                 add ax, 7F7F
  0139 80C402                 add ah, 02
  013C FECC                   dec ah
  013E 257F7F                 and ax, 7F7F
  0141 89EB                   mov bx, bp
  0143 83E303                 and bx, 0003
  0146 8AB7DB01               mov dh, [bx+01DB]
  014A 88E3                   mov bl , ah
  014C 6BDB40                 imul bx, 0040
  014F 01C3                   add bx, ax
  0151 268837                 mov es:[bx], dh
  0154 E2C7                   loop 011D
  0156 4D                     dec bp
  0157 75BC                   jne 0115
  0159 EBFE                   jmp 0159
  015B 0A03BE37...3921        brush_dw
  01DB 43000642               color_db

Gambar: masukkan deskripsi gambar di sini


1
Maukah Anda menyertakan penjelasan tentang ini dan tangkapan layar dari keluaran - karena tidak jelas sendiri
Taylor Scott

Haruskah saya menggunakan kamera atau lingkungan virtual, seperti yang saya jalankan di layar penuh dan tidak ada tangkapan layar lagi
l4m2


1
0122 6681F7B71DC104 xor edi, 00001DB7bug ditemukan di W32Dasm
l4m2

22

8086 Assembly - NASM (MBR) - 248 245 byte

[org 0x7C00]
[bits 16]
    push 0xA000
    pop es
    mov si, $brush
    xor cx, cx

    mov ax, 0x0013
    int 0x10

    mov ebx, 0x7EC80000

part_loop:
    lodsw
    mov bx, ax

    mov bp, 64
    sub bp, cx
    shl bp, 5
    mov sp, bp

len_loop:
    shl ebx, 1
    jnc not_carry
    xor ebx, 0x04C11DB7
    mov dh, bl
    not_carry:

    and dh, 0x82
    je dir_00
    jpe dir_82
    js dir_80
    dir_02:
        inc al  
        jmp dir_end
    dir_82:
        dec al
        jmp dir_end
    dir_00:
        inc ah
        jmp dir_end 
    dir_80:
        dec ah  
    dir_end:

    and ax, 0x7F7F
    cmp ah, 96
    jae skip

    movzx di, ah
    movzx bp, al
    imul di, 320
    add di, bp
    mov bp, cx
    and bp, 3
    mov dl, byte[bp + color]
    mov [es:di], dl
    skip:

    dec sp
    jnz len_loop
    inc cx
    cmp cx, 64
    jl part_loop    
    jmp $

color:
    db 0x43, 0x42, 0x06, 0x00

brush:
    dw  0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B
    dw  0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2
    dw  0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347
    dw  0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051
    dw  0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C
    dw  0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7
    dw  0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B
    dw  0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139


times 510 - ($-$$) db 0
DB 0x55
DB 0xAA

mona.jpg


6
Oh hei, jawaban yang mengalahkan skor dalam pertanyaan (dengan asumsi jumlah byte yang akurat). Bagus!
Draco18s

Selamat datang di PPCG! posting pertama yang indah.
Taylor Scott

Anda dapat mengurangi hingga 245 byte jika Anda menghapus tidak berguna xor dx,dxdan mengubahnya mov bp,0xa000; mov es,bpmenjadi push 0xa000; pop es.
Ruslan

1
Ini bukan 8086. 8086 tidak memilikiPUSH imm
l4m2

1
Optimasi dasar ke 240 paste.ubuntu.com/26272648
l4m2

18

Excel VBA 32-Bit, 1011 720 Bytes

Revisi 49; Δ Skor = 291 Bytes

Golf

SubRutin penuh yang tidak memerlukan input dan output Mona Lisa ke ActiveSheetobjek 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 base64kompresi kompresi byte sebagaiString .

Sub M
h Cells,0
t="5¼-™):󙈏"+vbTab+"»‘v¶<®Xn³"+chr(0)+"~ίšÐ‘š;$ÔÝ•óŽ¡¡EˆõW'«¡*{ú{Óx.OÒ/R)°@¯ˆ”'®ïQ*<¹çu¶àªp~ÅP>‹:<­«a°;!¾y­›/,”Ì#¥œ5*B)·7
s=4057*2^19
j=127
For p=0To 63
w=(Asc(Mid(t,2*p+1))+2)*256&+Asc(Mid(t,2*p+2))+2
s=s And-4^8Or w
x=255And w
y=255And w/2^8-.5
For l=1To(64-p)*32
c=s And-2^31
z=2^30And s
s=(1073741823And s)*2
s=IIf(z,s Or-2^31,s)And-1
If c Then:s=79764919Xor s:d=255And s
d=130And d
y=IIf(d,IIf(d=128,y-1And j,y),y+1And j)
x=IIf(d=2,x+1And j,IIf(d=130,x-1And j,x))
h[B2].Cells(y,x),Array(9036543,4562665,23205,0)(3And p)
Next l,p
h[97:999,DY:ZZ],0
End Sub
Sub h(r,c)
r.Interior.Color=c
r.RowHeight=48
End Sub

Catatan: Solusi ini telah dibatasi untuk versi 32-Bit dari Excel VBA sebagai ^adalah LongLongjenis literal dalam versi 64-Bit

Catatan, The Second: String adalah baris 3 bukan komentar karena tidak setara dengan"

Keluaran

Gif menampilkan ouput ke ActiveSheetsaat Mdipanggil di jendela langsung VBE. Perhatikan bahwa karena batasan ukuran file, ara gif ini memiliki lebih sedikit bingkai daripada yang sebenarnya dihasilkan. Mona

Tidak disatukan

Rutin penuh ungolfed subyang tidak mengambil input dan menghasilkan mona lisa menggunakan metode yang dijelaskan di atas pada ActiveSheetobjek

Option Private Module
Option Compare Text
Option Explicit
Option Base 0


Public Sub MonaLisa()
    On Error GoTo 0

    Dim part As Integer, _
        length As Integer, _
        M As Long, _
        seed As Long, _
        dir As Long, _
        word As Long, _
        carry As Long, _
        bx As Byte, _
        by As Byte, _
        BRUSH, _
        COLOR

    Let COLOR = Array(&H89E2FF, &H459EE9, &H5AA5, 0)
    Let BRUSH = Array( _
            778, 14270, 12187, 1835, 3644, 62875, 35473, 6923, _
            3773, 37752, 47166, 45146, 28853, 640, 53425, 40146, _
            8339, 8348, 15633, 9942, 57113, 38901, 37027, 41799, _
            35575, 2137, 10669, 41772, 32252, 3453, 54650, 12369, _
            54321, 21547, 45634, 45332, 35478, 10516, 45297, 21292, _
            1043, 2569, 16059, 59670, 6263, 47330, 44146, 32967, _
            21056, 36156, 16047, 44387, 7700, 45629, 9103, 49275, _
            44957, 12590, 38606, 9639, 40503, 11332, 11193, 8505)

    Let dir = 0
    Let carry = 0
    Let seed = &H7EC80000

    Let Cells.Interior.Color = 0
    Let Cells.ColumnWidth = 2

    Call Range("A1:DX96").Select
    Let ActiveWindow.Zoom = True
    Call Range("A1").Select

    For part = 0 To 63 Step 1

        Call VBA.DoEvents

        Let word = BRUSH(part)
        Let seed = (seed And &HFFFF0000) Or word

        Let bx = word And 255
        Let by = Int(word / (2 ^ 8)) And 255

        For length = 0 To (64 - part) * 32 - 1 Step 1

            Let carry = seed And &H80000000
            Let M = seed And &H40000000
            Let seed = (seed And &H3FFFFFFF) * 2
            If M <> 0 Then Let seed = seed Or &H80000000

            Let seed = seed And &HFFFFFFFF

            If carry Then
                Let seed = seed Xor 79764919
                Let dir = Int(seed And 255)
            End If

            Select Case dir And 130
                Case 0:   Let by = Int(by + 1) And 127
                Case 2:   Let bx = Int(bx + 1) And 127
                Case 128: Let by = Int(by - 1) And 127
                Case 130: Let bx = Int(bx - 1) And 127
            End Select
            Let Cells(by + 1, bx + 1).Interior.Color = COLOR(part And 3)
        Next length
    Next part

    Let Range("97:999,DY:ZZ").Interior.Color=0

End Sub

4
Hei, animasi yang bagus!
Arnauld

@Arnauld, terima kasih: P butuh lebih banyak pekerjaan daripada seharusnya
Taylor Scott

10

HTML + CSS + JavaScript (ES6), 499 byte

  • HTML: 33 byte
  • CSS: 17 byte
  • JS: 678 ... 478 475 473 465 459 455 451 447 449 byte

Tidak 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.

with(C.getContext`2d`)for(s=4057<<19,d=n=65;n--;)for(w=n-44?` ℹ⮹ⱄ鸷▧雎ㄮ꾝쁻⎏눽Ḕ굣㺯贼剀胇걲룢ᡷ㺻ਉГ匬냱⤔誖넔뉂含퐱け핺ൽ緼ꌬ⦭࡙諷ꍇ那韵�⛖㴑ₜₓ鳒킱ʀ炵끚렾鍸ຽᬋ誑฼ܫ⾛㞾̊`.charCodeAt(n):57113,s=s&~65535|w,x=w&255,y=w>>8,fillStyle="#"+["FFE289","000","A55A00","E99E45"][n&3],k=32*n;k--;fillRect(x,y,1,1))(s*=2)/2>>31&&(d=s^=79764919),D=d&128?-1:1,d&2?x=x+D&127:y=y+D&127
*{background:#000
<canvas id=C width=128 height=96>

Untuk skala yang lebih besar, ganti CSS dengan yang berikut ini:

canvas { background: #000; image-rendering: pixelated; zoom: 3 }

Sejarah Beranotasi!

Saya bersenang-senang bermain kode referensi Arnauld, dan Anda bisa mendapatkannya di sini. Nikmati!


3
Kerja bagus dan terima kasih karena telah berbagi sejarah!
Arnauld

@Arnauld Senang menerima tantangan!
darrylyeo

9

Befunge, 1131 1052 byte

"Dq~"1+00g"Ot"0"-R"0003"7/"727*"E1"5*\2*39*27*"\1"3*\2*:8-"ph"2*2\"N"2*"  =&~a"v
v  *83+"k~>"*524\*2"XS)"*2"E"-1:*2"YT"*2"j0"\+94*3"G}"+"%~)"8*2\+"%~E"-7:+" w"+<
>"V\"2*\2*"@"2*"R/"3*">~/"+56*"Y"2*"##`"2*\5*"1K"2*"%O"2*",+!_"2*25*\"{ "+"+<{"v
v"/~Y"+"y~G"+"%~"*5"1"*55*2"k"+98+9:*3"1"*2\*3";i"*2\+"7~@Z>x"*3"?"+92+" q"+" "<
>+",~"2*"}zQ1+BK"2*45*\45*",~s"+\25*9+9"~="+29+2*"wq"2*"r~I"+"@<c#"5*\45*"=o "+v
  v_,#!>#:<"P3 128 96 127"_v`+" k":p39+1:%*:*82<<0<<<\*5"%9D7"+")~"*2"g."+" }{"<
#@_:63p"@d~"03p2*13p043p0v^_:"@"%\"@"/p93g28*:*+^>\04>1-:93p3g2*+:v>g+\%:v>:"_"`
_3*55+,:2g.:1+2g.2+2g.1+v_:48**\1-:83p\83g:1g:23p\0v |:g39`\0p3g39<3v4\+4<^+1$$<
`v0:\%4g++77/"@"\%"@":::<^!:$$_\73g>0#p0#33g#:`#g^#< _$!#v_28*:*::0^>/2%8*-03p:v
">\:88vv%"@":\g38:\<_\73p\1-:!^v4:%\+g32::p31-*2+%2\*"@"% 4/"@":\++"C~":%\+g31:<
~v<\%*<>\"@"/77++p\0^!-g36:%**<>5*9++\:4/8%4*\2%+2*-23p:3 3g+\%:"="3*+\033g`28*v
">88*/7v>g!+53g2-!-153g2%+28*8^v2`\0\%2/2+*:*82:g34+*:*82<p34p33:-*2++%8\*+88< 8
^-1p++7<^35+*:*28\%**8*28-%2g35>#<*#2+#-:#!5#-3#3p#g1#3-#5!#+< >8+#:/#\4#*%#*^#<

Ada sejumlah masalah yang menjadikan ini masalah yang menantang di Befunge:

  1. 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.

  2. Befunge tidak memiliki operasi sedikit pun. Banyak ANDoperasi hanya dapat ditiru dengan operator modulo (misalnya a AND 0x7Fdapat diganti dengan a % 0x80). Namun, XORmemerlukan 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 menghitung a XOR 0xC1, kami menggunakan rumus:a + 0xC1 - (a/64%4*64 + a%2)*2

  3. 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 .


Mungkin bukan alat termudah untuk pekerjaan itu. Sudah selesai dilakukan dengan baik!
Arnauld

7

Python 3, 544 536 523 519 518 byte

from tkinter import*
s=32456<<16
d=0
b="#000"
a=Canvas(Tk(),w=128,he=96,bg=b)
a.pack()
for p in range(64):w=ord("̊㞾⾛ܫ฼誑ᬋຽ鍸렾끚炵ʀ킱鳒ₓₜ㴑⛖\udf19韵那ꍇ諷࡙⦭ꌬ緼ൽ핺け퐱含뉂넔誖⤔냱匬Гਉ㺻ᡷ룢걲胇剀贼㺯굣Ḕ눽⎏쁻꾝ㄮ雎▧鸷ⱄ⮹ℹ"[p]);s=s&~65535|w;*e,=divmod(w,256)[::-1];exec("c=s&8<<28>0;s=s*2^79764919*c;d=[d,s&255][c];e[d&2<1]=e[d&2<1]+(d&128<1)*2-1&127;a.create_line(*e,e[0]+1,e[1]+1,f=['#FFE289','#E99E45','#A55A00',b][p&3]);"*(64-p)*32)

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

Mona Lisa di jendela tk

Identik dengan output CCB60.


Ini 518 byte, bukan 396
ASCII-satunya

@ ASCII-saja saya lupa menghitung karakter Unicode lebih dari satu byte. Oof. Tidak heran jumlah byte tampak sangat rendah ...
notjagan

7

Java 7, 681 677 675 626 612 610 byte

Object l(){BufferedImage g=new BufferedImage(128,96,1);String b="̊㞾⾛
ܫ\u0E3C\uF59B誑ᬋຽ鍸렾끚炵ʀ킱鳒ₓₜ㴑⛖\udf19韵那ꍇ諷࡙⦭ꌬ緼ൽ핺け퐱含뉂넔誖⤔냱匬Гਉ
\uE916ᡷ룢걲胇剀贼㺯굣Ḕ눽⎏쁻꾝\u312E雎▧鸷ⱄ\u2BB9";for(int 
s=0x7EC80000,d=0,x,y,z=130,u,w,c,r=255,t=127,p=0,o;p<64;p++)
{w=b.charAt(p);s=s&0xFFFF0000|w;x=w&r;y=(w>>8)&r;for(o=0;o<(64-p)*32;o++)
{c=s&0x80000000;s<<=1;if(c!=0){s^=0x4C11DB7;d=s&r;}x=(u=d&z)==2?x+1&t:u==z?
x-1&t:x;y=u==0?y+1&t:u==128?y-1&t:y;if(x<128&y<96)g.setRGB(x,y,new int[]
{0xFFE289,0xE99E45,0xA55A00,0}[p&3]);}}return g;}

Menghasilkan gambar berikut dalam resolusi 128x96:
masukkan deskripsi gambar di sini

Saya tahu ini bahkan tidak dekat 250 byte tapi hei itu java

-2 byte terima kasih kepada Zacharý


Ya, sepertinya tidak ada yang menyambut Anda di PPCG, jadi hai, dan selamat datang di PPCG! Posting yang bagus, saya hanya memiliki dua rekomendasi pemformatan untuk Anda 1, tajuknya, demi memiliki papan peringkat yang seharusnya berformat #Language, <s>Old Scores</s> Score Bytesdan 2 Anda dapat membuat kode Anda sedikit lebih mudah dibaca dengan menambahkan bendera bahasa formulir <!-- language-all: lang-java -->sebelum blok kode Anda
Taylor Scott

1
Hai terima kasih telah menyambut saya :)! Saya sekarang telah mengedit posting saya dengan perbaikan yang Anda usulkan.
Twometer

2
Tidak masalah @ Twometer, ini terlihat hebat dan semoga Anda menikmati golf Anda
Taylor Scott

1
Dua byte dapat dicukur: 0x04C11DB7=> 0x4C11DB7dan 0x7f=> 127. Jangan menjadi gila ketika tidak dibutuhkan.
Zacharý

1
Saya suka itu "tapi hei itu Jawa"
Jack

4

C #, 960 850 byte

using System.Drawing;_=>{var m = new Bitmap(128,96);Graphics.FromImage(m).FillRectangle(Brushes.Black,0,0,128,96);for(int s=0x7EC80000,d=0,p=0,w,x,y,l,c,t,n=127;p<64;++p){w=new[]{778,14270,12187,1835,3644,62875,35473,6923,3773,37752,47166,45146,28853,640,53425,40146,8339,8348,15633,9942,57113,38901,37027,41799,35575,2137,10669,41772,32252,3453,54650,12369,54321,21547,45634,45332,35478,10516,45297,21292,1043,2569,16059,59670,6263,47330,44146,32967,21056,36156,16047,44387,7700,45629,9103,49275,44957,12590,38606,9639,40503,11332,11193,8505}[p];s=s>>16<<16|w;x=w&255;y=w>>8&255;for(l=0;l++<(64-p)*32;){c=(int)(s&0x80000000);s*=2;if(c!=0){s^=79764919;d=s&255;}t=d&130;x=t==2?(x+1)&n:t==130?(x-1)&n:x;y=t<1?(y+1)&n:t==128?(y-1)&n:y;if(x<=n&y<96)m.SetPixel(x,y,Color.FromArgb((int)new[]{0xFFFFE289,0xFFE99E45,0xFFA55A00,0xFF000000}[p&3]));}}return m;}

Salinan 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:

using System.Drawing;

class P
{
    static void Main()
    {
        System.Func<object, Bitmap> f = _ =>
        {
            var m = new Bitmap(128, 96);
            Graphics.FromImage(m).FillRectangle(Brushes.Black, 0, 0, 128, 96);

            for (int s = 0x7EC80000, d = 0, p = 0, w, x, y, l, c, t, n = 127; p < 64; ++p)
            {
                w = new[] { 778, 14270, 12187, 1835, 3644, 62875, 35473, 6923, 3773, 37752, 47166, 45146, 28853, 640, 53425, 40146, 8339, 8348, 15633, 9942, 57113, 38901, 37027, 41799, 35575, 2137, 10669, 41772, 32252, 3453, 54650, 12369, 54321, 21547, 45634, 45332, 35478, 10516, 45297, 21292, 1043, 2569, 16059, 59670, 6263, 47330, 44146, 32967, 21056, 36156, 16047, 44387, 7700, 45629, 9103, 49275, 44957, 12590, 38606, 9639, 40503, 11332, 11193, 8505 }[p];
                s = s >> 16 << 16 | w;
                x = w & 255;
                y = w >> 8 & 255;

                for (l = 0; l++ < (64 - p) * 32;)
                {
                    c = (int)(s & 0x80000000);
                    s *= 2;

                    if (c != 0)
                    {
                        s ^= 79764919;
                        d = s & 255;
                    }

                    t = d & 130;

                    x = t == 2 ? (x + 1) & n : t == 130 ? (x - 1) & n : x;
                    y = t < 1 ? (y + 1) & n : t == 128 ? (y - 1) & n : y;

                    if (x <= n & y < 96)
                        m.SetPixel(x, y, Color.FromArgb((int)new[] { 0xFFFFE289, 0xFFE99E45, 0xFFA55A00, 0xFF000000 }[p & 3]));
                }
            }

            return m;
        };

        f(null).Save("monaLisa.jpg");
    }
}

1
var m = new Bitmap(128,96)AE IU WAUGH WY
CalculatorFeline

2
@ CalculatorFeline saya tidak mengerti?
TheLethalCoder

8
Mungkin karena ruang yang tidak dibutuhkan?
Zacharý

3

Python 2.7; Total 880 876 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.

B=[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]
s=0x7EC80000
d=0x00
from Tkinter import *
m=Tk()
a=Canvas(m,w=128,he=96,bg='black')
a.pack()
for p in range(64):
 w=B[p];s=(s&0xFFFF0000)|w;x=w%256;y=w/256
 for t in range((64-p)*32):
  c=s&0x80000000;s=(s<<1)&0xFFFFFFFF;
  if c:s=s^0x04C11DB7;d=s&0xFF
  if d&2:x=(x+(-1if d&0x80 else 1))&0x7f
  else:y=(y+(-1if d&0x80 else 1))&0x7f
  a.create_line(x,y,x+1,y+1,f=['#FFE289','#E99E45','#A55A00','#000000'][p&3])
mainloop()

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.

Mona Lisa sebagai keluaran Tkinter


1
Hanya tip pemformatan, Anda dapat membuat kode Anda sedikit lebih mudah dibaca dengan menambahkan penyorotan khusus bahasa menggunakan prettify.js. Untuk python, flag ini, yang harus ditambahkan sebelum Anda membuat blok kode, seperti<!-- language-all: lang-py -->
Taylor Scott

2
Anda tidak perlu ruang antara 80's dan else' s. Dan, 0x00sama dengan 0, kan?
Zacharý

2
Dan Anda dapat menghapus ruang antara importdan *.
Zacharý

1
Turun ke 641 byte dengan beralih ke Python 3 dan membuat beberapa perbaikan golf umum.
notjagan


2

Tcl / Tk, 805

808 815 816 819 826 839 840 843

Mona

Masih kalah, tapi aku harus melakukannya! mungkin saya bisa golf lagi nanti!

Bukan pecundang sekarang!

rename set S
rename expr E
pack [canvas .c -w 130 -he 98 -bg #000]
.c cr i 67 51 -i [S I [image c photo -w 128 -h 96]]
S s 0x7EC80000
S d 0
time {S s [E $s&0xFFFF0000|[S w 0x[lindex {. 30A 37BE 2F9B 72B E3C F59B 8A91 1B0B
EBD 9378 B83E B05A 70B5 280 D0B1 9CD2
2093 209C 3D11 26D6 DF19 97F5 90A3 A347
8AF7 859 29AD A32C 7DFC D7D D57A 3051
D431 542B B242 B114 8A96 2914 B0F1 532C
413 A09 3EBB E916 1877 B8E2 AC72 80C7
5240 8D3C 3EAF AD63 1E14 B23D 238F C07B
AF9D 312E 96CE 25A7 9E37 2C44 2BB9 2139} [incr p]]]]
S x [E $w&255]
S y [E $w>>8]
time {S c [E $s&1<<31]
S s [E $s<<1]
if \$c {S s [E $s^79764919]
S d [E $s&255]}
switch [E $d&130] {0 {S y [E $y+[S h 1&127]]}
2 {S x [E $x+$h]}
128 {S y [E $y-$h]}
130 {S x [E $x-$h]}}
$I p #[lindex {FFE289 E99E45 A55A00 000} [E $p-1&3]] -t $x $y} [E (65-$p)*32]} 64

Tcl / Tk, 1370

Transliterasi Pseudo-kode yang sangat tidak diseragamkan sebelum golf dimulai! The updategaris memungkinkan untuk melihat gambar yang dilakukan secara progresif!

pack [canvas .c -w 130 -he 98 -bg #000]
.c create i 67 51 -i [set p [image create photo -w 128 -h 96]]

set COLOR {FFE289 E99E45 A55A00 000000}

set 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}

set seed 0x7EC80000
set dir 0x00

set part 0
while {$part<64} {
  set word [lindex $BRUSH $part]
  set seed [expr ($seed&0xFFFF0000)|$word]
  set bx [expr $word&0xFF]
  set by [expr $word>>8]

  set len 0
  while {$len<[expr (64-$part)*32]} {
    set carry [expr $seed&0x80000000]
    set seed [expr $seed<<1]

    if \$carry {
      set seed [expr $seed^0x04C11DB7]
      set dir [expr $seed&0xFF]
    }

    switch [expr $dir&0x82] {
      0 {
        set by [expr $by+1&0x7F]
      }
      2 {
        set bx [expr $bx+1&0x7F]
      }
      128 {
        set by [expr $by-1&0x7F]
      }
      130 {
        set bx [expr $bx-1&0x7F]
      }
    }

    $p put #[lindex $COLOR [expr $part&3]] -to $bx $by
    incr len
    update
  }
  incr part
}

2

Python 3 + matplotlib, 541

from pylab import*
B='ਃ븷鬯⬇㰎鯵醊ଛ봎碓㺸媰땰耂뇐튜錠鰠ᄽ혦᧟ꎐ䞣夈괩ⲣﱽ納竕儰㇔⭔䊲ᒱ隊ᐩⱓጄऊ묾ᛩ眘犬잀䁒㲍꼾掭ᐞ㶲輣節鶯⸱캖ꜥ㞞䐬뤫㤡'
s=32456<<16
d=0
i=zeros((256,256),'I')
for p in range(64):
    W=ord(B[p]);w=W>>8|W%256<<8;s=s&65535<<16|w;x=[w>>8,w&255]
    for l in range((64-p)*32):
        s*=2
        if s>>32:s=d=s^4374732215
        a=(-1)**(d>>7);b=d>>1&1;x[b]=x[b]+a&127;i[(*x,)]=[9036543,4562665,23205,0][p&3]
imsave('i',i.view('4B')[:96,:128,:3])

Ini menyimpan gambar sebagai file png "i". Untuk menampilkan gambar, Anda dapat mengganti imsave dengan imshow dan pertunjukan untuk 545 byte.

masukkan deskripsi gambar di sini


2

SmileBASIC, 454 447 444 byte

DIM C[5]C[1]=-7543C[2]=-1466811C[3]=-5940736S=32456<<16FOR P=-63TO.W=ASC("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"[-P])S=W+(S>>16<<16)C[4]=127AND W
C[0]=W>>8FOR L=0TO 31-P*32O=S
S=S<<1IF O<0THEN S=79764919XOR S:D=130AND S
T=D*2AND 4C[T]=127AND C[T]-(D>>6)+1GPSET C[4],C[0]+144,C[3AND P]NEXT
NEXT

String "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

masukkan deskripsi gambar di sini


Anda memposting gambar output, apakah mungkin memposting gambar dari isi "xx...xx"string?
Taylor Scott

1
Sebagian besar karakter tidak benar-benar memiliki simbol yang ditentukan untuk mereka, jadi itu benar-benar terlihat seperti "xxxxxxxxxxx". Saya bisa mendapatkan daftar kode karakter.
12Me21

Itu sebenarnya mungkin bisa membantu - saya pikir saya mungkin dapat menggunakan metode serupa dengan yabasic - oh, Anda sudah melakukannya - coolio
Taylor Scott

Ini tidak terlalu efisien karena (setidaknya dalam UTF-8) sebagian besar disimpan sebagai 3 byte atau lebih. Tapi itu masih lebih baik daripada hex dan Anda mungkin dapat mempersingkat decoder juga.
12Me21

1

: r4, 764 byte

sumber untuk dijalankan di : r4 github

masukkan deskripsi gambar di sini

^r4/lib/gui.txt
#c $FFE289 $E99E45 $A55A00 $000000
#b $37BE030A $072B2F9B $F59B0E3C $1B0B8A91 $93780EBD $B05AB83E $028070B5 $9CD2D0B1 $209C2093 $26D63D11 $97F5DF19 $A34790A3 $08598AF7 $A32C29AD $0D7D7DFC $3051D57A $542BD431 $B114B242 $29148A96 $532CB0F1 $0A090413 $E9163EBB $B8E21877 $80C7AC72 $8D3C5240 $AD633EAF $B23D1E14 $C07B238F $312EAF9D $25A796CE $2C449E37 $21392BB9
:m pick2 + $7f7f and dup $7f and over 8 >> 96 >? ( 2drop ; ) setxy ink@ a! ;
:s +? ( 2* ; ) 2* $4c11db7 xor rot drop dup 24 << 31 >> 1 or over $2 and 2 << 8 xor << rot rot ;
:d $100 $7ec80000 0 ( 64 <? )( dup $3 and 2 << 'c + @ ink dup >r 2* 'b + w@ $ffff and swap $ffff0000 and over or 64 r@ - 5 << ( 1? )( >r s swap m swap r> 1- ) drop nip r> 1+ ) 3drop ;
: cls d show 'exit >esc< ;

Saya menggunakan trik untuk membuat langkah tanpa persyaratan, mengubah bit 8 dalam tanda dan bergeser dengan bit 2. versi dengan nama stack:

| PHREDA 2017
| https://codegolf.stackexchange.com/questions/126738/lets-draw-mona-lisa
^r4/lib/gui.txt

#color  $FFE289 $E99E45 $A55A00 $000000
#brush [
$030A $37BE $2F9B $072B $0E3C $F59B $8A91 $1B0B
$0EBD $9378 $B83E $B05A $70B5 $0280 $D0B1 $9CD2
$2093 $209C $3D11 $26D6 $DF19 $97F5 $90A3 $A347
$8AF7 $0859 $29AD $A32C $7DFC $0D7D $D57A $3051
$D431 $542B $B242 $B114 $8A96 $2914 $B0F1 $532C
$0413 $0A09 $3EBB $E916 $1877 $B8E2 $AC72 $80C7
$5240 $8D3C $3EAF $AD63 $1E14 $B23D $238F $C07B
$AF9D $312E $96CE $25A7 $9E37 $2C44 $2BB9 $2139 ]

:movxy | dir seed bxy -- dir seed bxy 
  pick2 + $7f7f and
  dup $7f and
  over 8 >>
  96 >? ( 2drop ; )
  setxy ink@ a! ;

:step | dir bxy seed -- dir bxy seed
  +? ( 2* ; )
  2* $4c11db7 xor
  rot drop
  dup 24 << 31 >> 1 or
  over $2 and 2 << 8 xor <<
  rot rot ;

:draw
  $100      | dir
  $7ec80000 | seed
  0 ( 64 <? )(
    dup $3 and 2 << 'color + @ ink
    dup >r 2* 'brush + w@ $ffff and | dir seed brush
    swap $ffff0000 and over or      | dir bxy seed
    64 r@ - 5 << ( 1? )( >r         | dir bxy seed
        step swap movxy swap r> 1- ) drop nip
    r> 1+ ) 3drop ;

: cls draw show 'exit >esc< ;

1

Yabasic, 790 779 byte

Sebuah jawaban yang tidak mengambil input dan output untuk jendela grafis baru.

Open Window 128,96
j=127
s=4057*2^19
k=255
For p=-1To 63
Color Mid$("255,226,137233,158,069165,090,0000,0,0",1+And(3,p)*11,11)
If p<0Then Fill Circle 0,0,k:p=0Fi
w=Dec(Mid$("30A37BE2F9B072B0E3CF59B8A911B0B0EBD9378B83EB05A70B50280D0B19CD22093209C3D1126D6DF1997F590A3A3478AF7085929ADA32C7DFC0D7DD57A3051D431542BB242B1148A962914B0F1532C04130A093EBBE9161877B8E2AC7280C752408D3C3EAFAD631E14B23D238FC07BAF9D312E96CE25A79E372C442BB92139",4*p,4),16)
s=Or(And(-4^8,s),w)
x=And(k,w)
y=And(w/2^8,k)
For l=1To(64-p)*32
c=And(-2^31,s)
z=And(2^30,s)
s=And(1073741823,s)*2
t=s
If z Then t=Or(s,-2^31)Fi
s=And(-1,t)
If c Then s=Xor(79764919,s):d=And(k,s)Fi
d=And(130,d)
If d=0Then y=And(y+1,j)Fi
If d=2Then x=And(x+1,j)Fi
If d=128Then y=And(y-1,j)Fi
If d=130Then x=And(x-1,j)Fi
Dot x,y
Next
Next

Keluaran

Di bawah ini diskalakan dengan faktor 8

Mona.yab

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.