ASCII 아트 생성


13

직무

폭의 화상을 얻어 프로그램이나 함수 작성 w및 높이 h, 및 두 개의 정수 a <= w/2b <= h/2크기로 된, 상기 이미지의 아스키 아트 표현을 출력 aX가 b.

아스키 아트는 다음 단계 (또는 동일한 출력을 가진 다른 프로세스)를 통해 생성되어야합니다.

  1. 크기 조정 wX의 h이미지 2aX를 2b. 화소의 색 (x, y)해상도 변경은 다음의 모서리 사각형 내부의 원본 이미지의 모든 픽셀의 색상의 평균과 같아야한다 :

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. 색상의 빨강, 녹색 및 파랑 구성 요소의 평균을 취하고 각 구성 요소를이 평균으로 설정하여 크기가 조정 된 이미지의 채도를 낮추어야합니다.

  3. 아래의 규칙에 따라 각 2x2 픽셀 블록에 대해 문자를 출력해야합니다.

    • 하자 e = 3 - floor[color/64]색 (0..255 범위)에서 좌측 상단의 화소의 색의 적색 성분을 지칭하는 경우,. 보자 f, g하고, h이 값을 참조하지만, 오른쪽 상단에 대해, 왼쪽 아래, 각각 오른쪽 아래 픽셀.
    • 하자 z의 평균 수 e, f, g, h.
    • 다음에 해당하는 문자를 출력합니다 (흰색 3 - floor[color/64]은 0 인 픽셀을 나타내고 회색은 0이 아닌 것을 나타냅니다).
    • 모든 픽셀은 0입니다= 공백을 출력합니다 ( )
    • 왼쪽 상단 픽셀이 0이 아닙니다또는 오른쪽 상단 픽셀이 0이 아님= 출력 "하는 경우 e (or f) >= 2'그렇지 않은 경우.
    • 왼쪽 아래 픽셀이 0이 아닙니다또는 오른쪽 아래 픽셀이 0이 아닙니다= 출력 ,하는 경우 g (or h) >= 2.그렇지 않은 경우.
    • 0이 아닌 상단 픽셀또는 아래쪽 픽셀이 아닌 0= 출력-
    • 0이 아닌 왼쪽 픽셀또는 0이 아닌 오른쪽 픽셀= 출력;
    • 왼쪽 상단, 오른쪽 하단 픽셀, 0이 아님 = 출력 \
    • 오른쪽 위, 왼쪽 아래 픽셀이 아닌 0 = 출력 /
    • 왼쪽 상단 픽셀 0 = 출력 J
    • 오른쪽 상단 픽셀 제로 = 출력 L
    • 왼쪽 아래 픽셀 0 = 출력 7
    • 오른쪽 아래 픽셀 0 = 출력 P
    • 0이 아닌 모든
      • z = 1: 출력 *.
      • z = 2: 출력 C.
      • z = 3: 출력 #.

기타 참고 사항 : 위 단계에서 취한 모든 평균은 정수 나누기를 사용해야합니다 (즉, 0으로 반올림).

라이브러리를 사용하여 이미지를 읽을 수 있지만 크기 조정 및 불포화 단계에는 라이브러리를 사용할 수 없습니다.

입력

귀하의 프로그램은 세 가지 데이터를받습니다 :

  • 이미지. 이 이미지는 원하는 형식 (예 : PNG, PPM) 일 수 있습니다.
  • 아스키 아트의 너비 (문자 수)
  • 아스키 아트의 높이 (문자 수)

입력은 STDIN을 통해 읽고 명령 행 인수로 전달하며 변수 등으로 저장 될 수 있습니다.

산출

프로그램은 이미지와 위에서 설명한 프로세스를 통해 생성 된 아스키 아트를 출력합니다. 각 줄은 같은 너비 (입력으로 전달 된 너비) 여야하며 추가 공간을 추가하거나 제거 할 수 없습니다. 마지막 줄에는 줄 바꿈 문자가있을 수 있지만 필수 사항은 아닙니다. 빈 줄 (공백 만있는 줄)은 생략하면 안됩니다.

모든 이미지는 Wikipedia에서 가져와 공개 도메인에 공개되었습니다. 귀하의 프로그램은 모든 이미지와 유효한 입력에서 작동합니다.

레몬 그림

폭 = 52, 높이 = 25 :


            .-- ***-----.        
          -********** L .-- .-- 7 ---- P-       
        .제이****************. . ********* \.      
       ****************** L \ J ********** '.     
      -********************. J *********** L /     
     제이*********************; ./*************.엘    
    ; ********************* PJ **************; 7;   
   . ************************* '. *************** ;; *   
   ;********************** ;***************;제이*.  
   *********************** ******* P ******** '**;  
   C ************************ C ******* P; *******. **;  
   C ********************** J ***************; **;  
   씨*********************; ****************. **;  
   ********************** '*************** P; **   
  J ********************* P P *************** / ***   
 . ********************** 7 ************* 'J **;   
 ; ******************** C " 'P *********** PJ ***'   
 "7 ****************** C" '********** P. ** C;    
     '* C *************'; *********-J ** CP     
      '* C ********** P 7 ** 7 ** P /-**** P      
        -* CCCCC * P- '7 ******** P'       
          '---'--- '          

폭 : 70, 높이 : 3 :

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

감자들

폭 : 50, 높이 : 25 :





        .제이---                                     
      .J * P --- J * L--.          
     J *** 'L -J ***********-        
    J ****; **************** L       
   ;*****' .제이********************     
   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 ***-         
                               '------'           




클립 아트 샘플

폭 : 26, 높이 : 17 :

    -, L 
  J-** L .C # 
 J '; * PL, C # " 
.PP 7. JC7P  
;; * 제이 ;; C'C;  
제이; 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
;*.- -.씨; ; CCCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; *******; 'CCCCCCCCCCCP
'*******'CCCCCCCCCCC '
 '* P-7 *' "CCCCP '-  
               '---       

이것은 이므로 가장 짧은 답변이 이깁니다.


2
그게 전부 조용의 타격 도전 .... ....
Abr001am

이미지 입력을 할 때 파일 이름을 의미합니까? 아니면 실제 이미지 데이터?
sirpercival

@sirpercival 어느 쪽이든 괜찮습니다
es1024

답변:


6

자바 스크립트 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
}

예 :

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

레몬:

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

스 퍼드 :

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

턱시도 :

                       ,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 바이트

나는 당신과 약간 다른 값을 얻고 있습니다. 왜 그런지 모르겠습니다 ... 나는 모든 것에 대해 정수 나누기를했습니다. 그러나 그렇지 않으면 훌륭하게 작동합니다 ...이 결과가 허용됩니까? 어떤 이유로 든 여전히 동일하지는 않지만 지금 훨씬 나아졌습니다.

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

테스트 사례 :

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