Thế hệ nghệ thuật ASCII


13

Bài tập

Viết chương trình hoặc hàm lấy hình ảnh có chiều rộng wvà chiều cao h, hai số nguyên a <= w/2b <= h/2, và đưa ra biểu diễn nghệ thuật ascii của hình ảnh, với kích thước ax b.

Nghệ thuật ascii nên được tạo thông qua các bước sau (hoặc một quy trình khác có cùng đầu ra):

  1. Thay đổi kích thước wx hảnh để 2ax 2b. Màu của pixel (x, y)trong ảnh đã thay đổi kích thước phải bằng mức trung bình của màu của tất cả các pixel từ ảnh gốc bên trong hình chữ nhật với các góc sau:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. Hình ảnh đã thay đổi kích thước phải được khử bão hòa bằng cách lấy trung bình của các thành phần màu đỏ, xanh lục và xanh lam của màu sắc và đặt từng thành phần về mức trung bình này.

  3. Một ký tự phải được xuất ra cho mỗi khối pixel 2x2, theo các quy tắc dưới đây:

    • Đặt e = 3 - floor[color/64], trong đó màu sắc chỉ thành phần màu đỏ của màu của pixel trên cùng bên trái (trong phạm vi 0..255). Hãy f, ghtham khảo giá trị này, nhưng đối với các pixel trên cùng bên phải, dưới cùng bên trái và dưới cùng bên phải.
    • Để cho zlà mức trung bình của e, f, g, h.
    • Xuất ký tự tương ứng với các mục sau (màu trắng đại diện cho pixel trong đó 3 - floor[color/64]bằng 0 và màu xám đại diện cho giá trị khác không).
    • Tất cả các pixel đều bằng không= Xuất ra một khoảng trắng ( )
    • Pixel trên cùng bên trái là kháchoặc Pixel trên cùng bên phải là khác= Đầu ra "nếu e (or f) >= 2'cách khác.
    • Pixel dưới cùng bên trái là kháchoặc Pixel dưới cùng bên phải là khác= Đầu ra ,nếu g (or h) >= 2.cách khác.
    • Các pixel hàng đầuhoặc Pixel dưới không khác= Đầu ra-
    • Các pixel còn lại kháchoặc Các pixel phải khác= Đầu ra;
    • Các pixel trên cùng bên trái, dưới cùng bên phải = Đầu ra \
    • Các pixel trên cùng bên phải, dưới cùng bên trái = Đầu ra /
    • Điểm ảnh trên cùng bên trái = Đầu ra J
    • Điểm ảnh trên cùng bên phải = Đầu ra L
    • Pixel dưới cùng bên trái = Đầu ra 7
    • Pixel dưới cùng bên phải = Đầu ra P
    • Tất cả khác
      • z = 1: đầu ra *.
      • z = 2: đầu ra C.
      • z = 3: đầu ra #.

Lưu ý khác: Tất cả các giá trị trung bình được thực hiện trong các bước trên nên sử dụng phép chia số nguyên (nghĩa là làm tròn về 0).

Bạn có thể sử dụng thư viện để đọc ảnh, nhưng thư viện có thể không được sử dụng cho các bước thay đổi kích thước và giải phóng.

Đầu vào

Chương trình của bạn sẽ lấy ba phần dữ liệu:

  • Một tấm ảnh. Hình ảnh này có thể ở bất kỳ định dạng nào bạn chọn (ví dụ: PNG, PPM)
  • Chiều rộng của nghệ thuật ascii (tính theo số lượng ký tự)
  • Chiều cao của nghệ thuật ascii (về số lượng nhân vật)

Đầu vào có thể được đọc qua STDIN, được truyền dưới dạng đối số dòng lệnh, được lưu dưới dạng biến, v.v.

Đầu ra

Chương trình của bạn sẽ xuất ra nghệ thuật ascii được tạo từ hình ảnh và thông qua quá trình được mô tả ở trên. Mỗi dòng phải có cùng chiều rộng (chiều rộng được chuyển làm đầu vào) và không được thêm hoặc xóa khoảng trắng. Dòng cuối cùng có thể có một dòng mới, nhưng điều này không bắt buộc. Các dòng trống (dòng chỉ có khoảng trắng) không được bỏ qua.

Ví dụ

Tất cả các hình ảnh được lấy từ Wikipedia và phát hành vào phạm vi công cộng. Chương trình của bạn dự kiến ​​sẽ hoạt động cho tất cả các hình ảnh và đầu vào hợp lệ.

Hình ảnh của chanh

Chiều rộng = 52, Chiều cao = 25:


            .-- *** - ----.        
          - ********** L .-- .-- 7 ---- P-       
        .J ****** / TÌM HIỂU. .      
       , ****** / TÌM HIỂU L \ J ********** '.     
      - ****** / TÌM HIỂU. J ****** TÌM     
     J ****** / TÌM HIỂU; ./* / TÌM HIỂU.    
    ; ****** / TÌM HIỂU;   
   . ****** / TÌM HIỂU   
   ; ****** / TÌM HIỂU;  
   ****** / TÌM HIỂU;  
   C ****** / TÌM HIỂU C ****** P; *******. **;  
   C ****** / TÌM HIỂU C ****** ******;  
   C ****** / TÌM HIỂU; ****** / TÌM HIỂU. **;  
   ****** / TÌM HIỂU   
  J ****** / TÌM HIỂU   
 . ****** / TÌM HIỂU 7 ******.   
 ; ****** / TÌM HIỂU C "'P ******.   
 "7 ****** / TÌM HIỂU C" '********** P. ** C;    
     '* C ****** / 4'; ****** - J ** CP     
      '* C ********** P 7 ** 7 ** P / - **** P      
        - * CCCCC * P- '7 ******** P'       
          '---' --- '          

Chiều rộng: 70, Chiều cao: 3:

         ---------------------------. .----------------        
    J ****** / TÌM HIỂU *** / J **;   
  ---------- ****** / P --------- '-------------------- - '        

Những quả khoai tây

Chiều rộng: 50, Chiều cao: 25:





        .J ---                                     
      .J * P --- J * L--.          
     J *** 'L -J ****** -        
    J ****; ****** / TÌM       
   ; ***** '.J ****** / TÌM HIỂU     
   J **** 7 ****** / TÌM HIỂU  
   ** CC *; . ****** TÌM HIỂU   
   ** C * P 'J ****** / TÌM HIỂU -    
   7 * C * L ****** / TÌM HIỂU;     
   J * C **; ****** / TÌM HIỂU;     
  JC ** C **. ; ; ******** CCC * C ** CCCC **      
  "7 ***** L. 7 ***** CCCCCC **** CC ** '      
     - *****. -J - ** C * C * CC ****** CC * '       
      ; ** CC ***; '** CCC ***** CCCC *;        
       '- **** - - *** CCCCC *** -         
                               '------'           




Mẫu clipart

Chiều rộng: 26, Chiều cao: 17:

    -, L 
  J - ** L .C # 
 J '; * PL, C # " 
.PP 7. JC7P  
;; * J ;; , C'C;  
J; CC; L C "#   
* L 7-P; *; PC   
7CL *** J * PC '#   
'7 # C * C # P'; P JC # C- 
 J # CCC # L .JC # CJCC ## C;
; # - - #, CCC # CCCCCCCC
; * .- -.C; ; CCCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; ******; 'CCCCCCCCCCCP
'******' CCCCCCCCCCC '
 '* P-7 *' "CCCCP '-  
               '---       

Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng.


2
đó là thử thách làm tê liệt yên tĩnh .... ....
Abr001am

Khi bạn nói đầu vào hình ảnh, bạn có nghĩa là một tên tệp? Hoặc dữ liệu hình ảnh thực tế?
sirpercival

@sirpercival hoặc là tốt
es1024

Câu trả lời:


6

JavaScript 752, 701

function Z(I,a,b){
    var C=document.createElement('canvas')
    var W=C.width=I.width,H=C.height=I.height,X=C.getContext('2d')
    X.drawImage(I,0,0)
    a*=2,b*=2,W/=a,H/=b
    for(var o=a*b,x=0,y=0,T="",S=[],V;--o;){
        var A=~~(x*W),B=~~(y*H)
        var d=X.getImageData(A,B,(((x+1)*W)<<0)-A,(((y+1)*H)<<0)-B).data
        for(var i=0,p=0,L=d.length;i<L;i+=4)p+=(d[i]+d[i+1]+d[i+2])/3
        p/=L/4
        S[x]=3-(p>>6)
        if(x%2&&y%2){
            var e=V[x-1],f=V[x],g=S[x-1],h=S[x],z=(e+f+g+h)>>2,B=0,c
            B|=e>0?8:0,B|=f>0?4:0,B|=g>0?2:0,B|=h>0?1:0
            c=" ..-';\\J'/;L-7P*".charAt(B)
            c=c=="'"&&(e>1||f>1)?'"':c
            c=c=="."&&(g>1||h>1)?",":c
            T+=c=="*"?z>2?"#":z>1?"C":c:c
        }
        if(++x==a)x=0,y++,V=S,T+=y%2?"\n":"",S=[]
    }
    return T
}

Ví dụ:

var items = {
    lemons: {w:52, h:25},
    spuds: {w:50, h:25},
    tux: {w:26, h:17}
};

for(var k in items) {
    var val = items[k];
    var img = new Image();
    img.onload = function() {
        console.log(Z(this,this.w,this.h));
    }
    img.src=k+'.png';
    img.w = val.w;
    img.h = val.h;
}

Chanh:

            .--JJL--                   .---.        
          -**********-.--          .--7----P-       
        .J***************L.       .*********\.      
       .******************L      \J**********'.     
      .********************.     ;***********L/     
     J*********************;   ./*************.L    
    ,*********************P    -**************;7;   
    **********************'   .***************;;*   
   ;**********************    ;***************;;*.  
   ***********************    *******PP*******'J*;  
   ***********************    *******P;*******.**;  
   ***************7*******    J******;J*******;**;  
   **********************;    ****************.**;  
   **********************'    ***************P;**'  
  J*********************P     ***************/***   
 .**********************      7*************'J**P   
 ;*********************"      '\***********PJ***'   
 "7*******************"        '**********P.***;    
     '***************'         ;*********-J***P     
      '************P'           7*-7**P/-****P      
        -*******P-               '7********P'       
          '---                       -----          

Spuds:

         J---                                     
      .J*P                     .---*L--.          
     J***'                L -J***********-        
    J****                ;****************L       
   ;*****'             .J******************L*     
   J***L7              ************************P  
   **CC*    .         .*********L'***********P-   
   **C*P    '         J**********************-    
   7*C*L              **********************;     
   J*C**.             **********************;     
  JC**C**      .      7********CCC****CCCC**      
  "7*****L     .       7*****CCCCCC****CC**'      
     -****L. .J         -**C*C**C*******C*'       
      ;**CC***;          '**CCC*****CCCC*;        
       '-****-             --**CCCCCC***-         
                               '------'           

Thục:

                       ,L 
  --**L                C#'
 J';*P-L             ,C#" 
 P  7  7.           ,C7P  
;; J J ;;          ,C"C;  
;; C C  L          C" C   
*L 7-P ;*         ;P  #   
;CL***J**         C'  #   
'7#C*C#C'        ,P JC#C- 
 J#CCC#L      .JCCLJCC##C,
.#-   -#,     JCC#CCCCCCCC
;C.- -.*;    .CCCCCCCCCCCC
;L***J**C    ;CCCCCCCCCCCC
;*******P    'CCCCCCCCCCCP
'*******"     CCCCCCCCCCC'
 '*P-7*'      "CCCCP "--  
               '---       

2

IDL 8.3, 588 597 588 byte

Tôi nhận được các giá trị hơi khác so với bạn, tôi không chắc tại sao ... Tôi đã phân chia số nguyên cho mọi thứ. Nhưng nó có tác dụng tuyệt vời ... những kết quả này có được chấp nhận không? Bây giờ tốt hơn nhiều, mặc dù vẫn không giống nhau vì một số lý do.

pro c,m,a,b
e=2*a
f=2*b
s=size(m,/d)/[1.,e,f]
g=intarr(3,e,f)
u=floor([0:e-1]*s[1])
x=ceil([1:e]*s[1])-1
v=floor([0:f-1]*s[2])
y=ceil([1:f]*s[2])-1
n=(x-u)#(y-v)
for k=0,2 do for i=0,e-1 do for j=0,f-1 do g[k,i,f-j-1]=total(m[k,u[i]:x[i],v[j]:y[j]],/i)/n[i,j]
g=3-total(g/192,1,/i)
t=intarr(4,a,b)
for i=0,3 do t[i,*,*]=g[rebin([0:a-1]*2+i mod 2,a,b),rebin(2#[0:b-1]+i/2,a,b)]
w=total((t ne 0)*rebin(2^[0:3],4,a,b),1,/i)
for i=0,3 do w+=(w eq 2^i)*(t ge 2)[i,*,*]*(18-2^i+i/2)
w+=(w eq 15)*(total(t,1,/i)/4-1)
print,strmid(' '+"''"+'-.;/P.\;7-LJ*C#",',w[*],1),f='('+strtrim(a,2)+'A1)'
end

Các trường hợp thử nghiệm:

IDL> c,read_png('lemons.png'),52,25


            .-J***L-.                 .----.        
          -**********L.--          .J-*LJJ**-       
        .J****************.       J*********J.      
       ,*******************      /J**********7.     
      J********************.    ;J***********L*     
     J*********************;   .\*************/L    
    ;*********************P    ***************;*;   
   .C*********************'   ;***************;**   
   J**********************    J***************;**.  
   ***********************    ****************'**;  
   C*********************C    ********J*******;**;  
   C**********************    *******************;  
   C*********************P   ;****************7**;  
  .**********************'    ***************PJ**'  
  J*********************P     ***************\***   
 .**********************      7*************'***P   
 ;********************C"      ;************PJ**C'   
 "7******************C"        ***********PJ***;    
     '*C*************"         ;*********7J**CP     
      '*C*********CP'           7*****P\-***CP      
        -*CCCCC*P-               '7********P"       
          '---                       -----          

IDL> c,read_png('lemons.png'),70,3
        --------J**********L--------.       .-----------------        
   .J*****************************P'    -*************************;   
  ---------*************P-------         '------7**********P-----  
IDL> c,read_png('potatoes.png'),50,25





         J-"-                                     
      .J*'                     ----JL--           
     -*C*                 * -J***********-        
    J*C*L                ;****************L       
   .*C*-*              .J********************     
   J*CC;-              ********************C**CP  
   *CC#*    7         .**********************P-   
   *CCC;    '         J**********************-    
   7CCCL              **********************;     
   JCCC*.             ****C*C*****CCCC*CC***;     
  ;C*CCCL      .      ;***CC*CCCCCCCCCCCCC**      
  "--*CCC;             7***CCCCCCCCCCCCCCC*'      
     '7CC*L.  .         -*CCCCCCCCCCCCCCCP'       
       7CCCCC*'           7CC#CCCCCCC###P         
        '-7P-'             '-7CC######C-          
                                 '-'              




IDL> c,read_png('penguin.png'),26,17
                       ,L 
      ,                C# 
 "  #- ;             ,##" 
 ;  -  ;            ,#7;  
;" - - ";          ,#"J"  
;  # #  ;          #" #   
;; .-. ,;         ;;  #   
;#-***-#;         #   #   
 7#C*C#P         ,P -C#C, 
 J##-##L       JCCL-CC#CC,
,#"   "#,     JCC#CCCCCCCL
;L.- -.C;    ,CCCCCCCCCCCC
;***L***;    ;CCCCCCCCCCCC
;*******;     CCCCCCCCCCC;
 *** ***"     CCCCCC7CCCP 
 '*P--*'      "CCCCP "-"  
                --"       
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.