Давайте намалюємо Мона Лізу


39

У 2014 році демонстратор Якуб 'Ільменіт' Дебскі випустив 250-байтну (1) процедурну графічну демонстрацію для Atari XL під назвою Mona . Він малює таку картинку (2) :

мона

Ваше завдання - створити точно таку ж картину, використовуючи обрану вами мову.


(1) Розбивка: 136 байт даних + 114 байт коду.
(2) Оригінальний малюнок - 128х96. Вищезгадану версію було збільшено до 256x192. Кілька пікселів відрізняються від оригіналу, але це очікуваний вихід із псевдокодом, описаним у цьому виклику.

Як?

Це . Хоча вам дозволено використовувати будь-який метод, найкращі результати, швидше за все, будуть досягнуті за допомогою оригінального алгоритму, описаного нижче.

NB : Цей параграф не є специфікацією, а загальним описом. Для отримання детальної інформації про алгоритм зверніться до псевдокоду та реалізації посилання.

Зображення складається з 64 псевдовипадкових мазків кисті ( дивіться це відео ), пропускаючи такі кольори (у шістнадцятковому форматі RRGGBB):

COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]

Фон спочатку заповнений 4-м кольором (чорним). Кожен штрих коротший за попередній.

Генератор псевдовипадкових випадків використовує регістр зсуву лінійної зворотної зв'язку (LFSR) для 32-бітного цілого числа, спочатку встановленого на 0x7EC80000і XOR'ed з 0x04C11DB7.

Кожен штрих ініціалізується 16-бітовим значенням, яке перезаписує найнижчі байти насіння:

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
];

Ці значення також використовуються для встановлення нового положення (bx, by) кисті на початку обведення: bx задається найменш значущим байтом, а by - найзначнішим байтом.

Напрямок обведення задано шматочками №1 та №7 насіння. (Див. Твердження SWITCH у псевдокоді.)

Псевдокод

Нижче наведено алгоритм в псевдокоді, припускаючи , що 0-індексовані масиви, де AND, ORі XORсередні Бітові операції.

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

Довідкова реалізація

Нижче наведено нереалізовану посилання на реалізацію в JavaScript.

Анімаційну версію ви також можете побачити тут .

Роз’яснення та правила

  • Вихід повинен бути обрізаний до 128x96, навіть незважаючи на те, що алгоритм виводиться за межі цієї області.
  • Якщо ваша мова / платформа не в змозі вивести точні кольори, описані вище, ви повинні використовувати кольори, максимально наближені.
  • Якщо ви вирішили використовувати альтернативний метод, ви все одно повинні генерувати такий самий результат.
  • Про всяк випадок: подавати оригінальний код складання 6502 або будь-яку трохи відредаговану версію заборонено.
  • Ви можете побити 250 байт? Щасливий малюнок!

1
"Ви заохочуєтесь" є проблематичним, тому що якщо це суперечить збереженню байтів, хтось повинен це робити чи ні? Це має бути або "ти повинен" (робити це, навіть якщо це коштує в байтах), або "ти можеш" (робити це лише в тому випадку, якщо це економить байти).

1
Зазвичай я думаю, що краще розділити варіант ascii на інший виклик, інакше все одно є два підпроблеми.
FryAmTheEggman

1
@FryAmTheEggman Спочатку передбачалося лише графічний вихід, і додавання цього параметра ASCII було, мабуть, поганою ідеєю. Сподіваюсь, я не збиваю відповіді на WIP, видаляючи її ...
Арнольд,

4
@ATaco Paint Starry Nigh був викликом коду з іншою метою (відтворення зображення максимально наближеним). Це звичайний колгогоров-складність з постійним виходом.
Арнольд

1
Це зрозуміло, повторюючи моє близьке голосування.
Атако

Відповіді:


7

x86 опкод, 227 224 223 байт

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

Зображення: введіть тут опис зображення


1
Ви не заперечуєте, включивши пояснення цього та скріншот результату - оскільки це не само собою пояснення
Тейлор Скотт

Чи слід використовувати камеру або віртуальне середовище, оскільки я запускаю її на повноекранному режимі і більше не
знімаю

1
Зображення: imagebin.ca/v/3mJb1bFSlGRY
l4m2

1
0122 6681F7B71DC104 xor edi, 00001DB7помилку знайдено в W32Dasm
l4m2

22

8086 Асамблея - NASM (MBR) - 248 245 байт

[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
О, ага, відповідь, яка набирає бал у питанні (якщо припустити точний підрахунок байтів). Приємно!
Draco18s

Ласкаво просимо до PPCG! чудовий перший пост.
Тейлор Скотт

Ви можете зменшити до 245 байт, якщо видалити непотрібні xor dx,dxта змінити mov bp,0xa000; mov es,bpна push 0xa000; pop es.
Руслан

1
Це не 8086. У 8086 немаєPUSH imm
l4m2

1
Базова оптимізація до 240 paste.ubuntu.com/26272648
l4m2

18

32-бітний Excel VBA, 1011 720 байт

Редакція 49; Δ Оцінка = 291 байт

Гольф

Повна Subрутина, яка не потребує введення та виводить Mona Lisa до ActiveSheetоб'єкта на дальність [A1:DX96].

Було багато чорної магію , що бере участь в гольфі це вниз до його поточним станом, - відзначити, деякі з трюків , які беруть участь в пікселі арт підготовчі , біт зрушення кольору неявного перетворення типів , і base64стиснення стиснення байт в якостіString .

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

Примітка. Це рішення було обмежено 32-бітовими версіями Excel VBA, як ^і LongLongбуквальний тип у 64-бітних версіях

Примітка. Друге: рядок у рядку 3 не є коментарем, як і не еквівалент"

Вихідні дані

Gif, що показує вихід на час, ActiveSheetколи Mвикликається у прямому вікні VBE. Зауважте, що через обмеження розміру файлу це малюнок GIF має менше кадрів , ніж фактичними. Мона

Безумовно

Повна subпрограма, яка не приймає зусиль , не бере ніяких даних і виробляє мона-лізу, використовуючи описаний вище метод на ActiveSheetоб'єкті

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
Гей, приємна анімація!
Арнольд

@Arnauld, дякую: P знадобилось більше роботи, ніж треба
Тейлор Скотт

10

HTML + CSS + JavaScript (ES6), 499 байт

  • HTML: 33 байти
  • CSS: 17 байт
  • JS: 678 ... 478 475 473 465 459 455 451 447 449 байт

Це ніде близько 250 байт, але я обов'язково влаштуюся на суму менше 500 байт! Величезне спасибі @Arnauld та @Firefly за те, що вони допомогли мені перемогти цього монстра.

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>

Для збільшення масштабу замініть CSS на наступне:

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

Анотована історія!

У мене був довідковий код Арнаульда, який вибухнув гольф, і ви можете отримати щось тут. Насолоджуйтесь!


3
Приємна робота та спасибі за те, що поділилися історією!
Арнольд

@Arnauld Радий прийняти виклик!
darrylyeo

9

Befunge, 1131 1052 байт

"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#*%#*^#<

Існує ряд питань, які роблять цю проблему в Befunge:

  1. Befunge має лише 2000 байт пам'яті, з якою можна працювати (і це включає вихідний код), тож немає можливості передати ціле зображення в пам'ять перед його виведенням. Мені подобається це, повторюючи алгоритм 96 разів, один раз для кожного рядка. Кожен запуск зберігає лише пікселі, необхідні для поточного рядка, які потім виводяться в кінці виконання. Це дозволяє нам обійтись із піксельним буфером усього 128 байт.

  2. Befunge не має жодних бітних операцій. Багато ANDоперацій можуть бути просто імітовані оператором модуля (наприклад, a AND 0x7Fїх можна замінити a % 0x80). Однак XORпотрібні деякі досить складні бітові маніпуляції, з якими нам доводиться мати справу по одному байту, використовуючи набір нестандартних формул, твердо кодованих для обробки чотирьох потрібних нам байтів. Наприклад, для обчислення a XOR 0xC1ми використовуємо формулу:a + 0xC1 - (a/64%4*64 + a%2)*2

  3. Хоча це не обмеження Befunge per se, інтерфейс TIO не в змозі обробляти розширені символи ASCII у вихідному коді, що було б найпростішим способом зберігання пензлів та кольорових таблиць. Я обіймаю це, генеруючи ці таблиці у вигляді списку чисел на стеку, потім маю невеликий цикл ініціалізації, який копіює значення зі стека в пам'ять. Значну частину мого часу провів на гольфі за цим столом, який займає перші п’ять та половину рядків коду.

На жаль, незважаючи на всі мої зусилля, щоб зробити код сумісним з TIO, і мій вибір формату файлу, який міг би бути витягнутий з TIO ( PPM ), це занадто повільно виконати протягом 60 секундного періоду (запустивши алгоритм 96 разів, ймовірно, не допомагає). Але оскільки воно генерує зображення за рядком, вам все одно слід отримати достатню кількість результатів, щоб відновити майже половину зображення.

Спробуйте в Інтернеті!

Якщо у вас немає локального переглядача файлів PPM, ви можете легко перетворити його в інший формат за допомогою одного з багатьох онлайн-перетворювачів. Одним із прикладів є Конверціо .


Напевно, не найпростіший інструмент для роботи. Молодці!
Арнольд

7

Пітон 3, 544 536 523 519 518 байт

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)

Це ще одна версія покоління CCB60 перекладу на Python із застосуванням посилань. Спочатку я використовував велике шістнадцяткове число для представлення пензля алгоритму, але згодом зрозумів, що моє необґрунтоване припущення про те, що представлення рядків Unicode не працюватиме в Python, було помилковим.

Спочатку я вважав, що кількість байтів значно менша, але лише як ASCII вказував , я не пам'ятаю рахувати символи Unicode як більш, ніж один байт.

Вихід (128 х 96)

Mona Lisa у вікні tk

Ідентично для виходу CCB60.


Це 518 байт, а не 396
лише для ASCII

@ ASCII-тільки я забув рахувати символи Unicode як більш, ніж один байт. Вихід. Недарма кількість байтів здавалася такою низькою ...
Неджаган

7

Java 7, 681 677 675 626 612 610 байт

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

Виводить таке зображення в роздільній здатності 128x96:
введіть тут опис зображення

Я знаю, це навіть не близько 250 байт, але так, це java

-2 байти завдяки Захарі


Ну, здається, що ніхто не вітав вас на PPCG, тож привіт, і ласкаво просимо до PPCG! Хороший пост, у мене є тільки два форматування рекомендації для вас 1, заголовка, для мають лідерів передбачається мати формат #Language, <s>Old Scores</s> Score Bytesі 2 ви можете зробити свій код трохи більш читабельним, додаючи в мові прапорі форми <!-- language-all: lang-java -->перед ваш код коду
Тейлор Скотт

1
Гей, дякую за те, що привітали мене :)! Зараз я відредагував свою публікацію із запропонованими вами покращеннями.
Twometer

2
Без проблем @ Twometer, це чудово виглядає і сподіваюся, що вам сподобається ваш гольф
Тейлор Скотт

1
Два байти можна поголити: 0x04C11DB7=> 0x4C11DB7і 0x7f=> 127. Не сходити з розуму, коли це не потрібно.
Zacharý

1
Мені подобається, що "але ей, це Java"
Джек

4

C #, 960 850 байт

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

Пряма копія псевдо-коду з додаванням деякого гольфу. Є ще багато, що можна пограти в гольф, але я хотів опублікувати свою відповідь, щоб отримати м'яч.

Повна / відформатована версія:

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
калькуляторFeline

2
@CalculatorFeline Я не розумію?
TheLethalCoder

8
Можливо через непотрібні місця?
Zacharý

3

Python 2.7; Всього 880 876 байт (включаючи дані)

-4 байти до 876 завдяки ZacharyT. (Мій перекладач пітонів не сподобався його пропозиції прокинути пробіли між 80-ми та іншими).

Пропозиція Тейлора Скотта поставити пензлик у Базу 10 є чудовою, але Ноджаган (у коментарі) зробив свою пропозицію ще на крок далі, використовуючи розширений цілочисельний формат python у шістнадцятковій формі. Відповідь notjagan є в Python 3, і це таке покращення від того, що я зробив, що він заслуговує на заслугу. Сподіваюся, він опублікує це як окрему відповідь.

Виведіть у вікно Tkinter. Без масштабування зображення дуже мало, але масштабування додає до десятка байтів до рахунку.

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

Тут багато чого не відбувається, окрім перекладу на Python та деякого базового гольфу. Іноді біт-розумні маніпуляції коротші, іноді ціла математика. Я не міг знайти спосіб упакувати більше логіки у списки чи масиви. Основний алгоритм вже досить щільний.

Мона Ліза як вихід Tkinter


1
Тільки порада щодо форматування, ви можете зробити свій код трохи читабельнішим, додавши виділення для мови, використовуючи prettify.js. Для python такий прапор, який слід додати перед тим, як ви блокуєте код, виглядає як<!-- language-all: lang-py -->
Тейлор Скотт

2
Вам не потрібен простір між 80«і else». І, 0x00це те саме, що 0, правда?
Zacharý

2
І ви можете прибрати простір між importі *.
Zacharý

1
Знизив її до 641 байт , перейшовши на Python 3 і зробивши деякі загальні поліпшення в гольфі.
notjagan


2

Tcl / Tk, 805

808 815 816 819 826 839 840 843

Мона

Ще невдаха, але мені довелося це зробити! можливо, я можу пізніше пограти в гольф!

Зараз не програв!

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

Дуже неліточна транслітерація псевдо-коду до того, як розпочалася розвага в гольфі! updateЛінія дає можливість переглянути малюнок робиться поступово!

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

Це зберігає зображення як png-файл "i". Для відображення зображення ви можете замінити imsave на imshow та шоу на 545 байт.

введіть тут опис зображення


2

SmileBASIC, 454 447 444 байт

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

Рядок "x" s мав кілька недійсних символів unicode, тому я не в змозі розмістити його тут. Ось символьні коди у десятковій формі (лише масив BRUSH у зворотному напрямку):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

введіть тут опис зображення


Ви розмістили зображення виводу, чи можна було б розмістити зображення вмісту "xx...xx"рядка?
Тейлор Скотт

1
Більшість символів насправді не визначають символи для них, тому це насправді виглядає як "xxxxxxxxxxx". Я можу отримати список кодів символів.
12Me21

Це насправді може бути корисним - я думаю, що я можу використати подібний метод з yabasic - о, ви це вже зробили - coolio
Тейлор Скотт

Це не надто просторово, оскільки (принаймні, в UTF-8) більшість із них зберігається у вигляді 3 або більше байтів. Але це все-таки краще, ніж шістнадцятковий, і ви, можливо, також зможете скоротити декодер.
12Me21

1

: r4, 764 байт

джерело для запуску : r4 github

введіть тут опис зображення

^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< ;

Я використовую хитрість для того, щоб зробити хід без умовних умов, перетворять біт 8 в знак і зсув з бітом 2. версія з іменами стеків:

| 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

Ябасич, 790 779 байт

відповідь , який не приймає вхідний сигнал і виводить на новий графічний вікні.

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

Вихідні дані

Нижче масштабується коефіцієнт 8

Mona.yab

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.