ASCII Sanat Üretimi


13

Görev

Genişlik wve yükseklik görüntüsünü hve iki tamsayı alan a <= w/2ve b <= h/2görüntünün ascii art gösterimini ax boyutlarıyla çıkaran bir program veya işlev yazın b.

ASCII sanatı aşağıdaki adımlar (veya aynı çıktıya sahip başka bir işlem) yoluyla oluşturulmalıdır:

  1. Yeniden boyutlandırma wx hgörüntüyü 2ax 2b. Yeniden (x, y)boyutlandırılan görüntüdeki pikselin rengi , aşağıdaki köşelere sahip dikdörtgenin içindeki orijinal görüntüdeki tüm piksellerin renklerinin ortalamasına eşit olmalıdır:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. Yeniden boyutlandırılan görüntü, rengin kırmızı, yeşil ve mavi bileşenlerinin ortalaması alınarak ve her bir bileşenin bu ortalamaya ayarlanmasıyla doygunluğu azaltılmalıdır.

  3. Aşağıdaki kurallara uyarak her 2x2 piksel bloğu için bir karakter çıkarılmalıdır:

    • Let e = 3 - floor[color/64]renk (aralık 0..255 olarak) sol üst pikselin renk kırmızı bileşeni belirtir,. Izin vermek f, gve hbu değere bakın, ancak sırasıyla sağ üst, sol alt ve sağ alt pikseller için.
    • Izin zortalama olmak e, f, g, h.
    • Aşağıdakine karşılık gelen karakteri çıktılayın (beyaz 3 - floor[color/64]sıfır olan bir pikseli ve gri sıfır olmayanı temsil eder).
    • Tüm pikseller sıfır= Boşluk ( ) çıktısı al
    • Sol üst piksel sıfırdan farklıya da Sağ üst piksel sıfırdan farklı= Çıkış "durumunda e (or f) >= 2ve 'başka türlü.
    • Sol alt piksel sıfırdan farklıya da Sağ alt piksel sıfırdan farklı= Çıkış ,durumunda g (or h) >= 2ve .başka türlü.
    • Sıfır olmayan en yüksek piksellerveya Sıfır olmayan alt pikseller= Çıktı-
    • Sıfır olmayan sol piksellerveya Sıfır olmayan sağ pikseller= Çıktı;
    • Sol üst, sağ alt piksel sıfırdan farklı = Çıktı \
    • Sağ üst, sol alt piksel sıfırdan farklı = Çıktı /
    • Sol üst piksel sıfır = Çıktı J
    • Sağ üst piksel sıfır = Çıktı L
    • Sol alt piksel sıfır = Çıktı 7
    • Sağ alt piksel sıfır = Çıktı P
    • Tümü sıfırdan farklı
      • z = 1: çıktı *.
      • z = 2: çıktı C.
      • z = 3: çıktı #.

Diğer notlar: Yukarıdaki adımlarda atılan tüm ortalamalar tamsayı bölümü kullanmalıdır (yani 0'a yuvarlama).

Görüntüleri okumak için kitaplık kullanabilirsiniz, ancak yeniden boyutlandırma ve desatürasyon adımları için kitaplıklar kullanılamaz.

Giriş

Programınız üç veri parçası alacaktır:

  • Bir şekil. Bu resim istediğiniz herhangi bir biçimde olabilir (örn. PNG, PPM)
  • ASCII sanatının genişliği (karakter sayısı olarak)
  • Ascii sanatının yüksekliği (karakter sayısı olarak)

Giriş, STDIN aracılığıyla okunabilir, komut satırı bağımsız değişkeni olarak geçirilebilir, değişken olarak depolanabilir vb.

Çıktı

Programınız, görüntüden ve yukarıda açıklanan işlemle oluşturulan ascii sanatını çıktılar. Her satır aynı genişlikte (giriş olarak geçen genişlik) olmalıdır ve fazladan boşluk eklenemez veya kaldırılamaz. Son satırın sonunda bir satırsonu olabilir, ancak bu zorunlu değildir. Boş satırlar (yalnızca boşluklu satırlar) atlanmamalıdır.

Örnekler

Tüm görüntüler Wikipedia'dan alındı ​​ve kamu malı olarak yayınlandı. Programınızın tüm resimler ve geçerli girişler için çalışması bekleniyor.

Limon resmi

Genişlik = 52, Yükseklik = 25:


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

Genişlik: 70, Yükseklik: 3:

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

Patates

Genişlik: 50, Yükseklik: 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 * Z **; **********************;     
  JC ** C **. ; ; ******** CCC ° C ** CCCC **      
  "7 ***** L. 7 ***** CCCCCC **** CC ** '      
     - *****. -J - ** C * C * CC ****** CC * '       
      ; ** CC ***; '** CCC ***** CCCC *;        
       '- **** - - *** CCCCC *** -         
                               '------'           




Clipart örneği

Genişlik: 26, Yükseklik: 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 '-  
               '---       

Bu , bu yüzden en kısa cevap kazanır.


2
Bu sessiz sakatlama zorluğu .... ....
Abr001am

Görüntü girdisi derken, bir dosya adı mı demek istediniz? Ya da gerçek görüntü verileri?
sirpercival

@sirpercival ya iyi
es1024

Yanıtlar:


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
}

Örnekler:

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

Limonlar:

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

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

2

IDL 8.3, 588 597 588 bayt

Senden biraz farklı değerler alıyorum, neden olduğundan emin değilim ... her şey için tamsayı bölme yaptım. Ama aksi halde harika çalışıyor ... bu sonuçlar kabul edilebilir mi? Bazı nedenlerden dolayı hala aynı olmasa da şimdi çok daha iyi.

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

Test senaryoları:

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 "-"  
                --"       
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.