Disegniamo Monna Lisa


39

Nel 2014, il demoscener Jakub 'Ilmenit' Debski ha rilasciato una demo grafica procedurale da 250 byte (1) per l' Atari XL chiamata Mona . Sta disegnando la seguente immagine (2) :

mona

Il tuo compito è generare esattamente la stessa immagine, usando la lingua che preferisci.


(1) Analisi: 136 byte di dati + 114 byte di codice.
(2) L'immagine originale è 128x96. La versione precedente è stata ingrandita a 256x192. Alcuni pixel differiscono dall'originale, ma questo è l'output previsto con lo pseudo-codice descritto in questa sfida.

Come?

Questo è . Sebbene tu sia autorizzato ad usare qualsiasi metodo, molto probabilmente i migliori risultati saranno raggiunti usando l'algoritmo originale che è descritto di seguito.

NB : questo paragrafo non è una specifica ma piuttosto una descrizione generale. Fare riferimento allo pseudo-codice e all'implementazione di riferimento per i dettagli dell'algoritmo.

L'immagine è composta da 64 pennellate pseudo-casuali ( vedi questo video ), scorrendo i seguenti colori (in formato esadecimale RRGGBB):

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

Lo sfondo viene inizialmente riempito con il 4 ° colore (nero). Ogni colpo è più corto di quello precedente.

Il generatore pseudo-casuale sta utilizzando un registro a spostamento lineare (LFSR) su un numero intero a 32 bit inizialmente impostato su 0x7EC80000e con XOR 0x04C11DB7.

Ogni tratto è inizializzato con un valore a 16 bit che sovrascrive i byte più bassi del seme:

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

Questi valori vengono anche usati per impostare la nuova posizione (bx, by) del pennello all'inizio del tratto: bx è dato dal byte meno significativo e da è dato dal byte più significativo.

La direzione della corsa è data dai bit n. 1 e n. 7 del seme. (Vedi l'istruzione SWITCH nello pseudo-codice.)

Pseudo-codice

Sotto è l'algoritmo in pseudo-codice, assumendo array 0-indicizzati, dove AND, ORe XORle operazioni medi bit per bit.

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

Implementazione di riferimento

Di seguito è riportata un'implementazione di riferimento non modificata in JavaScript.

Puoi anche vedere una versione animata qui .

Chiarimenti e regole

  • L'output deve essere ritagliato a 128x96, anche se l'algoritmo disegna al di fuori di quest'area.
  • Se la tua lingua / piattaforma non è in grado di produrre esattamente i colori sopra descritti, devi usare colori il più vicini possibile.
  • Se si decide di utilizzare un metodo alternativo, è comunque necessario generare esattamente lo stesso output.
  • Per ogni evenienza: non è consentito inviare il codice assembly 6502 originale o qualsiasi versione leggermente modificata.
  • Riesci a battere 250 byte? Buon disegno!

1
Il "sei incoraggiato a" è problematico, perché se lo fa è in conflitto con il salvataggio dei byte, qualcuno dovrebbe farlo o no? Dovrebbe essere "devi" (fallo anche se costa byte), o "puoi" (fallo solo se salva byte).

1
Di solito penso che sia meglio dividere l'opzione ascii in un'altra sfida, altrimenti ci sono comunque 2 sotto-sfide.
FryAmTheEggman,

1
@FryAmTheEggman Inizialmente doveva essere solo un output grafico e l'aggiunta di questa opzione ASCII era probabilmente una cattiva idea. Spero di non rovinare una risposta WIP rimuovendola ...
Arnauld,

4
@ATaco Paint Starry Nigh è stata una sfida al codice con un obiettivo diverso (riprodurre l'immagine il più vicino possibile). Questa è una semplice complessità kolmogorov con un output costante.
Arnauld,

1
È comprensibile, ridimensionando il mio voto vicino.
ATaco,

Risposte:


7

codice operativo x86, 227 224 223 byte

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

Immagine: enter image description here


1
Ti dispiacerebbe includere una spiegazione di questo e uno screenshot dell'output - in quanto non è autoesplicativo
Taylor Scott,

Dovrei usare una fotocamera o un ambiente virtuale, mentre lo
eseguo


1
0122 6681F7B71DC104 xor edi, 00001DB7bug trovato in 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 hey, una risposta che batte il punteggio nella domanda (presupponendo un conteggio dei byte accurato). Bello!
Draco18s

Benvenuti in PPCG! meraviglioso primo post.
Taylor Scott,

È possibile ridurre a 245 byte se si rimuove inutile xor dx,dxe si mov bp,0xa000; mov es,bppassa a push 0xa000; pop es.
Ruslan,

1
Non è 8086. 8086 non haPUSH imm
l4m2 il

1
Ottimizzazione di base su 240 paste.ubuntu.com/26272648
l4m2

18

Excel VBA a 32 bit, 1011 720 byte

Revisione 49; Δ Punteggio = 291 byte

golfed

Figura Subroutine che non prende in ingresso ed emette la Gioconda al ActiveSheetoggetto sulla gamma [A1:DX96].

C'era un sacco di magia nera coinvolti nel golf questo fino al suo stato attuale, - di nota, alcuni dei trucchi coinvolti sono pixel art di preparazione , il bit spostando i colori conversione di tipo implicita , e base64la compressione comprimendo byte comeString .

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

Nota: questa soluzione è stata limitata alle versioni a 32 bit di Excel VBA così come ^il LongLongtipo letterale nelle versioni a 64 bit

Nota, il secondo: la stringa è la riga 3 non è un commento in quanto non equivalente"

Produzione

Gif che mostra il risultato di ActiveSheetquando Mviene chiamato nella finestra immediata di VBE. Si noti che a causa delle limitazioni di dimensione del file presente fig gif ha meno fotogrammi rispetto effettivamente prodotto. Mona

Ungolfed

Routine completa non golfata subche non accetta input e produce la mona lisa usando il metodo sopra descritto ActiveSheetsull'oggetto

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
Ehi, bella animazione!
Arnauld,

@Arnauld, grazie: P ci è voluto più lavoro di quanto avrebbe dovuto
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

Non è affatto vicino a 250 byte, ma mi accontenterò sicuramente di meno di 500 byte! Grazie mille a @Arnauld e @Firefly per avermi aiutato a giocare a golf con questo mostro.

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>

Per una scala più grande, sostituire il CSS con il seguente:

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

Storia annotata!

Mi sono divertito molto a giocare a golf con il codice di riferimento di Arnauld, e puoi trovarne un po 'qui. Godere!


3
Bel lavoro e grazie per aver condiviso la storia!
Arnauld,

@Arnauld Sono contento di aver accettato la sfida!
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#*%#*^#<

Ci sono una serie di problemi che rendono questo un problema impegnativo in Befunge:

  1. Befunge ha solo 2000 byte di memoria con cui lavorare (e che include il codice sorgente), quindi non c'è modo di rendere l'intera immagine in memoria prima di inviarla. Il modo in cui lavoro intorno a questo è eseguendo ripetutamente l'algoritmo 96 volte, una volta per ogni riga. Ogni corsa memorizza solo i pixel necessari per la linea corrente, che vengono quindi emessi alla fine della corsa. Questo ci consente di cavarcela con un buffer di pixel di soli 128 byte.

  2. Befunge non ha nessun tipo di operazioni. Molte ANDoperazioni possono essere semplicemente emulate con un operatore modulo (ad es. a AND 0x7FPossono essere sostituite con a % 0x80). Tuttavia, XORrichiede una manipolazione dei bit piuttosto complicata, che dobbiamo trattare con un byte alla volta, utilizzando una serie di formule personalizzate codificate per gestire i quattro byte di cui abbiamo bisogno. Ad esempio, per calcolare a XOR 0xC1, usiamo la formula:a + 0xC1 - (a/64%4*64 + a%2)*2

  3. Sebbene non sia una limitazione di Befunge in sé, l'interfaccia su TIO non è in grado di gestire caratteri ASCII estesi nella fonte, il che sarebbe stato il modo più semplice per memorizzare il pennello e le tabelle dei colori. Mi aggiro generando quelle tabelle come un elenco di numeri nello stack, quindi ho un piccolo ciclo di inizializzazione che copia i valori dallo stack in memoria. Una parte significativa del mio tempo è stata trascorsa a giocare a golf con questo tavolo, che occupa le prime cinque e mezza righe di codice.

Sfortunatamente, nonostante tutti i miei sforzi per rendere il codice compatibile con TIO e la mia scelta di un formato di file che potrebbe essere estratto da TIO ( PPM ), è troppo lento per completare entro il limite di 60 secondi (eseguendo l'algoritmo 96 volte probabilmente non aiuta). Ma dal momento che genera l'immagine riga per riga, dovresti comunque ottenere abbastanza dell'output per recuperare quasi metà dell'immagine.

Provalo online!

Se non si dispone di un visualizzatore di file PPM locale, è possibile convertire facilmente in un altro formato utilizzando uno dei molti convertitori online. Un esempio è Convertio .


Probabilmente non è lo strumento più semplice per il lavoro. Molto bene!
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)

Questa è un'ulteriore versione ridotta del CCB60 della traduzione Python dell'implementazione di riferimento. Inizialmente ho usato un grande numero esadecimale per rappresentare il pennello dell'algoritmo, ma in seguito mi sono reso conto che la mia assunzione infondata che una rappresentazione di stringa Unicode non avrebbe funzionato in Python era falsa.

Inizialmente pensavo che il mio conteggio dei byte fosse significativamente inferiore, ma solo come ASCII sottolineato , non mi ricordavo di contare i caratteri Unicode come più di un byte.

Uscita (128 x 96)

Mona Lisa nella finestra di tk

Identico all'output di CCB60.


Sono 518 byte, non 396
solo ASCII il

@ Solo ASCII Ho dimenticato di contare i caratteri Unicode come più di un byte. Oof. Non sorprende che il conteggio dei byte sia sembrato così basso ...
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;}

Emette la seguente immagine con risoluzione 128x96:
inserisci qui la descrizione dell'immagine

So che non è nemmeno vicino a 250 byte ma hey è Java

-2 byte grazie a Zacharý


Bene, ehi, sembra che nessuno ti abbia accolto con PPCG, quindi ciao e benvenuto in PPCG! Bel post, ho solo due consigli per la formattazione per te 1, l'intestazione è, per il gusto di avere classifiche del formato #Language, <s>Old Scores</s> Score Bytese 2 puoi rendere il tuo codice un po 'più leggibile aggiungendo un flag di lingua del modulo <!-- language-all: lang-java -->prima il tuo blocco di codice
Taylor Scott,

1
Ehi, grazie per avermi dato il benvenuto :)! Ora ho modificato il mio post con i miglioramenti che hai proposto.
Twometer,

2
Nessun problema @ Twometer, sembra fantastico e spero che ti piaccia il tuo golf
Taylor Scott,

1
È possibile radere due byte: 0x04C11DB7=> 0x4C11DB7e 0x7f=> 127. Non impazzire quando non è necessario.
Zacharý,

1
Adoro "ma hey è Java"
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;}

Una semplice copia dello pseudo codice con l'aggiunta di un po 'di golf. C'è ancora molto da giocare a golf, ma volevo pubblicare la mia risposta per far rotolare la palla.

Versione completa / formattata:

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
CalcolatriceFeline

2
@CalculatorFeline Non capisco?
TheLethalCoder,

8
Possibile a causa degli spazi non necessari?
Zacharý,

3

Python 2.7; 880 876 byte totali (compresi i dati)

-4 byte a 876 grazie a ZacharyT. (Il mio interprete di Python non ha gradito il suo suggerimento di abbandonare gli spazi tra gli anni '80 e altri).

Il suggerimento di Taylor Scott di mettere il pennello in Base 10 è eccellente, ma notjagan (in un commento) ha fatto un ulteriore passo avanti con il suo suggerimento, usando il formato intero esteso di Python in esadecimale. La risposta di Notjagan è in Python 3, ed è un tale miglioramento rispetto a quello che ho fatto che merita credito. Spero che lo pubblicherà come una risposta separata.

Uscita in una finestra di Tkinter. Senza ridimensionamento, l'immagine è molto piccola, ma il ridimensionamento aggiunge una dozzina di byte al conteggio.

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

Non c'è molto da fare qui, tranne la traduzione in Python e alcuni giochi di golf di base. A volte le manipolazioni bit-saggio sono più brevi, a volte la matematica intera. Non sono riuscito a trovare un modo per raggruppare più della logica in elenchi o matrici. L'algoritmo di base è già piuttosto denso.

Mona Lisa come uscita di Tkinter


1
Solo un consiglio di formattazione, puoi rendere il tuo codice un po 'più leggibile aggiungendo l'evidenziazione specifica della lingua usando prettify.js. Per python questo flag, che dovrebbe essere aggiunto prima che tu blocchi un codice, assomigli a:<!-- language-all: lang-py -->
Taylor Scott

2
Non è necessario lo spazio tra gli 80'e gli else'. E, 0x00è lo stesso 0, giusto?
Zacharý,

2
E puoi rimuovere lo spazio tra importe *.
Zacharý,

1
È arrivato a 641 byte passando a Python 3 e apportando alcuni miglioramenti generali al golf.
Notjagan,


2

Tcl / Tk, 805

808 815 816 819 826 839 840 843

Mona

Ancora il perdente, ma dovevo farlo! forse posso golf più tardi!

Non il perdente ora!

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

Traslitterazione molto spregiudicata dello pseudo-codice prima dell'inizio della baldoria del golf! La updatelinea consente di visualizzare il disegno in corso progressivamente!

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

Questo salva l'immagine come file png "i". Per visualizzare l'immagine è possibile sostituire imsave con un imshow e uno spettacolo per 545 byte.

inserisci qui la descrizione dell'immagine


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

La stringa di "x" aveva alcuni caratteri Unicode non validi, quindi non sono in grado di pubblicarla qui. Ecco i codici dei caratteri in decimale (solo l'array BRUSH al contrario):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

inserisci qui la descrizione dell'immagine


Hai pubblicato un'immagine dell'output, sarebbe possibile pubblicare un'immagine del contenuto della "xx...xx"stringa?
Taylor Scott,

1
La maggior parte dei personaggi non ha in realtà i simboli definiti per loro, quindi sembra davvero "xxxxxxxxxxx". Posso ottenere un elenco dei codici dei caratteri però.
12Me21

Questo in realtà potrebbe essere utile - Penso che potrei essere in grado di utilizzare un metodo simile con yabasic - oh, l'hai già fatto - coolio
Taylor Scott

Non è molto efficiente in termini di spazio poiché (almeno in UTF-8) la maggior parte di questi sono salvati come 3 o più byte. Ma è ancora meglio di hex e potresti essere in grado di accorciare anche il decoder.
12Me21

1

: r4, 764 byte

la fonte per l'esecuzione : r4 github

inserisci qui la descrizione dell'immagine

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

Uso un trucco per fare la mossa senza condizionali, trasformare il bit 8 in segno e spostare con la versione bit 2. con nomi di 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

Una risposta di che non accetta input e output in una nuova finestra grafica.

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

Produzione

Il seguito è ridimensionato di un fattore 8

Mona.yab

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.