Generasi Seni ASCII

13

Tugas

Tulis sebuah program atau fungsi yang mengambil gambar lebar wdan tinggi h, dan dua bilangan bulat a <= w/2dan b <= h/2, dan menampilkan representasi seni gambar ascii, dengan dimensi ax b.

Seni ascii harus dihasilkan melalui langkah-langkah berikut (atau proses lain dengan output yang sama):

  1. Mengubah ukuran wx hgambar untuk 2ax 2b. Warna piksel (x, y)dalam gambar yang diubah ukurannya harus sama dengan rata-rata warna semua piksel dari gambar asli di dalam persegi panjang dengan sudut-sudut berikut:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. Gambar yang diubah ukurannya harus dideaturasi dengan mengambil rata-rata komponen warna merah, hijau, dan biru, dan mengatur setiap komponen dengan rata-rata ini.

  3. Karakter harus dikeluarkan untuk setiap blok 2x2 piksel, mengikuti aturan di bawah ini:

    • Biarkan e = 3 - floor[color/64], di mana warna merujuk ke komponen merah dari warna piksel kiri atas (dalam kisaran 0..255). Biarkan f,, gdan hlihat nilai ini, tetapi masing-masing untuk piksel kanan atas, kiri bawah, dan kanan bawah.
    • Membiarkan zmenjadi rata-rata e, f, g, h.
    • Keluarkan karakter yang sesuai dengan yang berikut ini (putih mewakili piksel di mana 3 - floor[color/64]nol, dan abu-abu mewakili bukan nol).
    • Semua piksel adalah nol= Keluarkan spasi ( )
    • Pixel kiri atas adalah bukan nolatau Pixel kanan atas adalah bukan nol= Keluaran "jika e (or f) >= 2dan 'sebaliknya.
    • Pixel kiri bawah adalah bukan nolatau Pixel kanan bawah adalah bukan nol= Keluaran ,jika g (or h) >= 2dan .sebaliknya.
    • Piksel teratas bukan nolatau Pixel bawah bukan nol= Output-
    • Pixel kiri tidak nolatau Pixel kanan bukan nol= Output;
    • Kiri atas, piksel kanan bawah bukan nol = Keluaran \
    • Pixel kanan atas, kiri bawah bukan nol = Keluaran /
    • Pixel kiri atas nol = Keluaran J
    • Nol piksel kanan atas = Keluaran L
    • Pixel kiri bawah nol = Keluaran 7
    • Pixel kanan bawah nol = Keluaran P
    • Semua bukan nol
      • z = 1: output *.
      • z = 2: output C.
      • z = 3: output #.

Catatan lain: Semua rata-rata yang diambil dalam langkah-langkah di atas harus menggunakan pembagian integer (yaitu pembulatan ke 0).

Anda dapat menggunakan perpustakaan untuk membaca gambar, tetapi perpustakaan mungkin tidak digunakan untuk langkah-langkah mengubah ukuran dan desaturasi.

Memasukkan

Program Anda akan mengambil tiga bagian data:

  • Sebuah gambar. Gambar ini mungkin dalam format apa pun pilihan Anda (mis. PNG, PPM)
  • Lebar seni ascii (dalam jumlah karakter)
  • Ketinggian seni ascii (dalam jumlah karakter)

Input dapat dibaca melalui STDIN, diteruskan sebagai argumen baris perintah, disimpan sebagai variabel, dll.

Keluaran

Program Anda akan menampilkan seni ascii yang dihasilkan dari gambar dan melalui proses yang dijelaskan di atas. Setiap baris harus memiliki lebar yang sama (lebar dilewatkan sebagai input), dan tidak ada spasi tambahan yang dapat ditambahkan atau dihapus. Baris terakhir mungkin memiliki baris tambahan, tetapi ini tidak wajib. Garis kosong (garis dengan spasi saja) tidak boleh dihilangkan.

Contohnya

Semua gambar diambil dari Wikipedia dan dirilis ke domain publik. Program Anda diharapkan bekerja untuk semua gambar dan input yang valid.

Gambar lemon

Lebar = 52, Tinggi = 25:


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

Lebar: 70, Tinggi: 3:

         ---------------------------. .----------------        
    J ***************************** P-J ***************** *** / J **;   
  ---------- ********* P --------- '-------------------- - '        

Kentang

Lebar: 50, Tinggi: 25:





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




Sampel clipart

Lebar: 26, Tinggi: 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; ; CCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; *******; 'CCCCCCCCCCCPP
'*******' CCCCCCCCCCC '
 '* P-7 *' "CCCCP '-  
               '---       

Ini , jadi jawaban terpendek menang.

es1024
sumber
2
itu tantangan melumpuhkan yang tenang .... ....
Abr001am
Ketika Anda mengatakan input gambar, maksud Anda nama file? Atau data gambar aktual?
sirpercival
@sirpercival juga baik
es1024

Jawaban:

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
}

Contoh:

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

Jeruk lemon:

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

Kentang:

         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***-         
                               '------'           

Tux:

                       ,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 "--  
               '---       
wolfhammer
sumber
2

IDL 8.3, 588 597 588 byte

Saya mendapatkan nilai yang sedikit berbeda dari Anda, saya tidak yakin mengapa ... Saya melakukan pembagian integer untuk semuanya. Tetapi jika tidak berfungsi dengan baik ... apakah hasil ini dapat diterima? Jauh lebih baik sekarang, meskipun masih belum identik untuk beberapa alasan.

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

Kasus uji:

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 "-"  
                --"       
Sirpercival
sumber