모나리자를 그리자


39

2014 년 데모 씬 Jakub 'Ilmenit'Debski 는 Mona 이라는 Atari XL을 위한 250 바이트 (1)의 절차 적 그래픽 데모를 발표 했습니다 . 다음 그림을 그립니다 (2) .

모나

당신의 임무는 선택한 언어를 사용하여 똑같은 그림을 생성하는 것입니다.


(1) 분석 : 136 바이트의 데이터 + 114 바이트의 코드.
(2) 원본 사진은 128x96입니다. 위 버전은 256x192로 확대되었습니다. 몇 픽셀은 원본과 다르지만 이것은이 문제에서 설명 된 의사 코드의 예상 출력입니다.

어떻게?

이것은 입니다. 모든 방법을 사용할 권한이 있지만 아래 설명 된 원래 알고리즘을 사용하면 최상의 결과를 얻을 수 있습니다.

NB는 :이 단락은 하지 사양이 아니라 일반적인 설명. 알고리즘의 세부 사항은 의사 코드 및 참조 구현을 참조하십시오.

이미지는 64 개의 의사 랜덤 브러시 스트로크 ( 이 비디오 참조 )로 구성되며 다음 색상을 순환합니다 (RGRGBB 16 진 형식).

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

배경은 처음에 4 번째 색 (검정색)으로 채워집니다. 각 스트로크는 이전 스트로크보다 짧습니다.

의사 랜덤 생성기는 초기에로 설정되고 0x7EC80000로 XOR 된 32 비트 정수에서 LFSR (Linear-Feedback Shift Register)을 사용 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)을 스트로크의 시작 부분에 브러시의 : BX는 최하위 바이트에 의해 주어지고 로는 가장 중요한 바이트에 의해 주어진다.

스트로크 방향은 시드의 비트 # 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에서 ungolfed 참조 구현입니다.

여기에서 애니메이션 버전을 볼 수도 있습니다 .

설명 및 규칙

  • 알고리즘이이 영역을 벗어나더라도 출력은 128x96으로 잘 려야합니다.
  • 언어 / 플랫폼이 위에서 설명한 정확한 색상을 출력 할 수없는 경우 가능한 한 가까운 색상을 사용해야합니다.
  • 대체 방법을 사용하기로 결정한 경우에도 여전히 동일한 결과를 생성해야합니다.
  • 만일의 경우 : 원래 6502 어셈블리 코드 또는 약간 편집 된 버전을 제출할 수 없습니다.
  • 250 바이트를 이길 수 있습니까? 행복한 그림!

1
"권장"은 문제가됩니다. 그렇게하면 바이트 저장과 충돌이 발생하면 누군가가 그렇게해야합니까? "필수"(바이트가 필요한 경우에도 수행) 또는 "할 수 있습니다"(바이트를 절약 한 경우에만 수행) 여야합니다.

1
일반적으로 ascii 옵션을 다른 도전으로 나누는 것이 좋습니다. 그렇지 않으면 어쨌든 2 가지 하위 도전이 있습니다.
FryAmTheEggman 2016 년

1
@FryAmTheEggman 원래 그래픽 출력 만을 목적으로했으며이 ASCII 옵션을 추가하는 것은 실제로 나쁜 생각 일 것입니다. 잘만되면 나는 그것을 제거하여 WIP 답변을
망치지

4
@ATaco Paint Starry Nigh는 다른 목표를 가진 코드 도전이었습니다 (가능한 한 이미지를 최대한 가깝게 재생). 이것은 일정한 출력을 가진 일반 kolmogorov 복잡성입니다.
Arnauld

1
이해가 되네요. 제 찬성 투표를 수정했습니다.
ATaco

답변:


7

연산 코드 86, 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
이것에 대한 설명과 출력의 스크린 샷을 포함시켜 주시겠습니까? 자체 설명이 아니기 때문에
Taylor Scott

전체 화면에서 카메라를 실행하고 더 이상 화면 캡처를하지 않기 때문에 카메라 또는 가상 환경을 사용해야합니까
l4m2


1
0122 6681F7B71DC104 xor edi, 00001DB7W32Dasm에서 발견 된 버그
l4m2 17:03의

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 2016 년

PPCG에 오신 것을 환영합니다! 멋진 첫 번째 게시물.
Taylor Scott

당신은 쓸모없는 제거 할 경우 245 바이트로 줄일 수 xor dx,dx변화 mov bp,0xa000; mov es,bp에를 push 0xa000; pop es.
Ruslan

1
그것은 더하지 8086 8086있다 없다PUSH imm
l4m2

1
240 기본 최적화 paste.ubuntu.com/26272648
l4m2

18

Excel VBA 32 비트, 1011720 바이트

개정 49; Δ 점수 = 291 바이트

골프

Sub입력을받지 않고 범위 의 객체에 Mona Lisa 를 출력하는 전체 루틴 .ActiveSheet[A1:DX96]

있었다 많은 현재의 상태로이 아래로 골프에 관련된 마술의이 - 참고로, 관련된 몇 가지 트릭은 픽셀 아트 준비 , 색상 변화 비트 묵시적 타입 변환을 , 그리고 base64압축이 A와 바이트를 압축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

참고로 :이 솔루션은 엑셀 VBA의 32 비트 버전에 제한되었습니다 ^는 IS LongLong형 리터럴 64 비트 버전이

참고 : 두 번째 : 문자열은 3 행은 주석 이 아닙니다."

산출

VBE 즉시 창에서 호출 ActiveSheet시점 을 나타내는 GIF M가 호출됩니다. 파일 크기 제한으로 인해이 그림 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 2016 년

@Arnauld, 고마워요 : P 필요한 것보다 많은 작업이 필요했습니다
Taylor Scott

10

HTML + CSS + 자바 스크립트 (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 }

주석이 달린 역사!

나는 폭발적인 Arnauld의 참조 코드를 가지고 있었고 여기에서 그 중 일부를 얻을 수 있습니다. 즐겨!


3
역사를 공유해 주셔서 감사합니다.
Arnauld

@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필요한 약간의 비트 조작 이 필요 하며, 필요한 4 바이트를 처리하기 위해 하드 코딩 된 일련의 사용자 지정 수식을 사용하여 한 번에 1 바이트를 처리해야합니다. 예를 들어,를 계산 a XOR 0xC1하기 위해 다음 공식을 사용합니다.a + 0xC1 - (a/64%4*64 + a%2)*2

  3. Befunge 자체의 제한은 없지만 TIO의 인터페이스는 소스에서 확장 ASCII 문자를 처리 할 수 ​​없으며 브러시 및 색상 표를 저장하는 가장 쉬운 방법이었습니다. 이 테이블을 스택의 숫자 목록으로 생성 하여이 문제를 해결 한 다음 값을 스택에서 메모리로 복사하는 초기화 루프가 약간 있습니다. 내 시간 중 상당 부분 이이 테이블을 골프로 소비하는 데 사용되었습니다.이 테이블은 처음 5-5 줄의 코드를 차지합니다.

불행히도 코드가 TIO와 호환되도록 노력하고 TIO ( PPM ) 에서 추출 할 수있는 파일 형식을 선택 했지만 60 초 제한 시간 내에 알고리즘을 96 번 실행하는 것이 너무 느립니다. 도움이되지 않습니다). 그러나 이미지가 한 줄씩 생성되므로 이미지의 거의 절반을 복구하기에 충분한 출력을 확보해야합니다.

온라인으로 사용해보십시오!

로컬 PPM 파일 뷰어가없는 경우 많은 온라인 변환기 중 하나를 사용하여 다른 형식으로 쉽게 변환 할 수 있습니다. 하나의 예는 Convertio 입니다.


아마도 가장 쉬운 도구는 아닙니다. 잘 했어!
Arnauld

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)

이것은의 추가 golfed 다운 버전입니다 CCB60 참조 구현의 파이썬 번역. 원래 알고리즘의 브러시를 나타 내기 위해 큰 16 진수를 사용했지만 나중에 유니 코드 문자열 표현이 파이썬에서 작동하지 않는다는 근거없는 가정은 거짓이라는 것을 깨달았습니다.

원래 바이트 수는 크게 줄었다 고 생각했지만 ASCII만으로 유니 코드 문자를 2 바이트 이상으로 계산하는 것을 기억하지 못했습니다.

출력 (128 x 96)

tk 창에서 모나리자

CCB60의 출력과 동일합니다.


이것은 396이 아닌 518 바이트입니다.
ASCII 전용

@ASCII 전용 유니 코드 문자를 2 바이트 이상으로 계산하는 것을 잊었습니다. 돈. 당연히 바이트 카운트가 너무 낮은 것 같았다 ...
notjagan

7

자바 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 바이트에 가깝지 않다는 것을 알고 있지만 야 자바이다.

Zacharý 덕분에 -2 바이트


PPCG에 오신 것을 환영하는 사람은 아무도 없습니다. 안녕하세요, PPCG에 오신 것을 환영합니다! 좋은 게시물, 난 단지 당신이 한 두 가지 포맷 권장 사항이, 헤더 형식의 있어야 가진 리더의 이익을 위해,이다 #Language, <s>Old Scores</s> Score Bytes양식의 언어 플래그를 추가하여 코드를 좀 더 읽기 쉽게 만들 수 2 <!-- language-all: lang-java -->전 코드 블록
Taylor Scott

1
저를 환영 해 주셔서 감사합니다 :)! 제안한 개선 사항으로 게시물을 수정했습니다.
Twometer

2
@Twometer 문제 없음, 멋져 보이고 골프를 즐기시기 바랍니다
Taylor Scott

1
0x04C11DB7=> 0x4C11DB70x7f=> 두 바이트를 면도 할 수 있습니다 127. 불필요하게 16 진수를하지 마십시오.
Zacharý

1
나는 "하지만 이건 자바 야"를 좋아합니다
Jack

4

C #, 960850 바이트

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
CalculatorFeline

2
@CalculatorFeline 이해가 안되나요?
TheLethalCoder

8
불필요한 공간 때문에 가능합니까?
Zacharý

3

파이썬 2.7; 총 880 876 바이트 (데이터 포함)

ZacharyT 덕분에 -4 바이트에서 876 (파이썬 인터프리터는 80 년대 사이의 공백을 떨어 뜨라는 그의 제안을 좋아하지 않았습니다).

브러쉬를 Base 10에 넣는 Taylor Scott의 제안은 훌륭하지만 python의 확장 정수 형식을 16 진수로 사용하여 notjagan (의견에서)이 한 단계 더 나아갔습니다. 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()

파이썬으로의 번역과 기본 골프를 제외하고는 여기서 많이 진행되지 않습니다. 때때로 비트 단위 조작은 더 짧고 때로는 정수 수학입니다. 더 많은 논리를 목록이나 배열로 묶을 수있는 방법을 찾지 못했습니다. 기본 알고리즘은 이미 매우 밀집되어 있습니다.

Tkinter 출력으로서의 모나리자


1
서식 팁만으로 prettify.js를 사용하여 언어 별 강조 표시를 추가하여 코드를 좀 더 읽기 쉽게 만들 수 있습니다. 파이썬의 경우이 플래그는 블록을 코딩하기 전에 추가되어야합니다.<!-- language-all: lang-py -->
Taylor Scott

2
80와 사이에 공백이 필요하지 않습니다 else. 그리고 0x00같은 것 0입니까?
Zacharý

2
그리고 당신은 사이의 공간을 제거 할 수 있습니다 import*.
Zacharý

1
Python 3으로 전환하고 일반적인 골프 개선 을 통해 641 바이트줄었습니다 .
notjagan

1
1 바이트 를 640으로
줄였습니다.

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

파이썬 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 바이트 용 show로 바꿀 수 있습니다.

여기에 이미지 설명을 입력하십시오


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"문자열에 잘못된 유니 코드 문자가 있으므로 여기에 게시 할 수 없습니다. 다음은 문자 코드를 10 진수로 나타낸 것입니다 (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"문자열 내용의 이미지를 게시 할 수 있습니까?
Taylor Scott

1
대부분의 문자에는 실제로 정의 된 기호가 없으므로 "xxxxxxxxxxx"처럼 보입니다. 그래도 문자 코드 목록을 얻을 수 있습니다.
12Me21

그것은 실제로 도움이 될 것입니다-나는 yabasic과 비슷한 방법을 사용할 수 있다고 생각합니다-오, 당신은 이미 그것을했습니다-coolio
Taylor Scott

(최소 UTF-8에서는) 대부분이 3 바이트 이상으로 저장되므로 공간 효율적이지 않습니다. 그러나 여전히 16 진수보다 낫고 디코더를 줄일 수도 있습니다.
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

Yabasic, 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.