텍스트의 원


10

콘솔에서 문자를 사용하여 주어진 반지름의 원을 만드는 방법을 찾으십시오. 글꼴 이름과 크기를 지정하십시오. 또한 출력의 예를 하나 이상 제공하십시오.

예를 들면 다음과 같습니다.

입력:

3

산출:

   ******
 **      **
**        **
*          *
**        **
 **      **
   ******

... 반지름이 3 인 "손으로 그린" "원"보다 더 잘 보이는 것이 있습니다.


보너스 질문 : 타원. :)


흥미롭게도, 내 반지름 -3 원은 시도하지 않고 당신과 정확히 동일합니다 :)
mellamokb


글꼴 부분이 명확 해 질 수 있습니다. 여기에서 복사하면 모든 글꼴이 동일합니다. 글꼴 크기와 동일합니다.
사용자가 알 수 없음

답변:


5

자바 스크립트 (360)

function c(r){var f=1.83;var e=2*Math.PI/(r*r*r*r*r);var s=r*2+1;var g=Array(s);for(var i=0;i<s;i++){g[i]=Array(Math.round(s*f))};for(var i=0;i<=2*Math.PI;i+=e) {var x=Math.round(f*r*Math.cos(i)+f*r);var y=Math.round(r*Math.sin(i))+r;g[y][x]=1;}for(var j=0;j<g.length;j++){for(var i=0;i<g[j].length;i++)document.write((g[j][i]==1)?'*':' ');document.writeln()}}

http://jsfiddle.net/YssSb/3/ ( f행 높이 / 글꼴 너비 비율의 수정 요소입니다. 사각형 글꼴 설정을 사용하는 경우 (예 : line-height = font-size 설정) f = 1이고 "사각형"원을 얻거나 f타원에 임의로 설정 합니다.)

3에 대한 출력 (재미있게 충분하고 실수로 OP와 정확히 동일한 모양), 5, 15 :

   ******    
 **      **  
**        ** 
*          * 
**        ** 
 **      **  
   ******    

     *********      
   ***       ****   
 ***            **  
**               ** 
*                 * 
*                 * 
*                 * 
**               ** 
 ***            **  
   ***       ****   
     *********      

                    ***************                      
               ******             ******                 
            ****                       *****             
          ***                              ***           
        ***                                  ***         
      ***                                      ***       
     **                                          **      
    **                                            **     
   **                                              **    
  **                                                **   
 **                                                  **  
 *                                                    *  
**                                                    ** 
*                                                      * 
*                                                      * 
*                                                      * 
*                                                      * 
*                                                      * 
**                                                    ** 
 *                                                    *  
 **                                                  **  
  **                                                **   
   **                                              **    
    **                                            **     
     **                                          **      
      ***                                      ***       
        ***                                  ***         
          ***                              ***           
            ****                       *****             
               ******             ******                 
                    ***************                      

멋진 서클이 있습니다. ;)
Mateen Ulhaq

6

스칼라의 브레 센햄 서클 (35)

Bresenham-알고리즘에는 2 가지 주요 포인트가 있습니다.

  • 죄 / 코사인없이 작동합니다.
  • ¼ * ½ 원만 계산하고 다른 점은 미러링으로 찾습니다.

그것을하는 방법 :

       2 1  
     DCBABCD
   GFE | EFG
  아이 제이 y | ---- JI
 GJ | / JG
 F | / | F
DE | r / | ED
C | / | 씨
B 4 | / | B 3
A + ------- A
B 4 'x B 3'
CC
드 에드
 FF
 GJ JG
  이지 지
   GFE EFG
     DCBABCD
       2'1 ' 
  • 제니트의 A부터 I까지의 숫자 만 계산합니다.
    • 점 I은 45 °에 있으며 x == y로 정의됩니다.
    • 그라운드 제로는 +가있는 곳입니다.
    • 제니트의 A는 점 (x = 0, y = r), r = 반지름입니다.
    • 닫힌 원을 그리려면 시계 방향 (++ x)으로 오른쪽 (x + = 1) 또는 다음 지점 (y- = 1)으로 이동합니다.
    • 원의 모든 점 (x, y)은 중심에서 r 떨어져 있습니다. 피타고라스는 r² = x² + y²라고 말합니다.
    • 이 솔루션은 제곱근 냄새와 2 가지 해결책이 있지만
    • 우리는 A에서 시작하여 다음 지점 아래 또는 오른쪽 아래 지점을 페인트할지 여부를 알고 싶습니다.
  • 우리는 두 점 (x² + y²)을 계산하고 r² (물론 일정하게 유지됨)과의 차이를 계산합니다.
    • 그 차이는 부정적 일 수 있기 때문에 우리는 그것으로부터 복근을 취합니다.
    • 그러면 우리는 어느 지점이 결과에 더 가까운 지 (r²), 더 작게 볼 수 있습니다.
    • 그에 따라 오른쪽 또는 아래쪽 이웃을 그립니다.
  • 발견 된 요점
    • 1 x, y가 미러링 됨
    • 왼쪽에 2 -x, y
    • 대각선에서 3, x
    • 4 -y, x 왼쪽에서 왼쪽으로
  • 모든 점들이 남쪽으로 다시 미러링됩니다
    • 1 'x, -y
    • 2 '-x, -y
    • 3 'y, -x
    • 4 '-y, -x 완료

이것은 코드 골프가 아니지만 기존 솔루션의 최상위에있는 모든 숫자로 인해 그렇게 생각했기 때문에 솔루션을 골프에 쓸모없는 시간을 보냈습니다. 따라서 상단에도 쓸모없는 숫자를 추가했습니다. 파이가 반올림 된 것은 11 배입니다.

object BresenhamCircle extends App {
    var count = 0
    val r = args(0).toInt
    // ratio > 1 means expansion in horizontal direction
    val ratio = args(1).toInt
    val field = ((0 to 2 * r).map (i=> (0 to 2 * r * ratio).map (j=> ' ').toArray)).toArray
    def square (x: Int, y: Int): Int = x * x + y * y
    def setPoint (x: Int, y: Int) {
        field (x)(y*ratio) = "Bresenham"(count)
        field (y)(x*ratio) = "Bresenham"(count)
    }
    def points (x: Int, y: Int)
    {
        setPoint (r + x, r + y)
        setPoint (r - x, r + y)
        setPoint (r + x, r - y)
        setPoint (r - x, r - y)
    }
    def bresenwalk () {
        var x = 0;
        var y = r;
        val rxr = r * r
        points (x, y);
        do 
        {
            val (dx, dy) = { if (math.abs (rxr - square ((x+1), y)) < math.abs (rxr - square (x, (y-1))))
                (1, 0)
            else
                (0, -1) 
            }
            count = (count + 1) % "Bresenham".length
            x += dx
            y += dy
            points (x, y)
        }while ((x <= y))
    }
    bresenwalk ()
    println (field.map (_.mkString ("")).mkString ("\n"))
}

글꼴 질문은 사이트 웹 서버 및 브라우저 설정에 따라 결정됩니다. 이제 내가보고있는 것은

'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif

글꼴 크기는 12px입니다. 물어 보면 쓸모없는 정보인데 누가합니까?

보너스 : 타원 및 샘플 출력 :

호출은

    scala BresenhamCircle SIZE RATIO

예를 들어

    scala BresenhamCircle 10 2
              s e r B r e s              
          h n e           e n h          
      e m a                   a m e      
    e r                           r e    
    m                               m    
  h a                               a h  
  n                                   n  
s e                                   e s
e                                       e
r                                       r
B                                       B
r                                       r
e                                       e
s e                                   e s
  n                                   n  
  h a                               a h  
    m                               m    
    e r                           r e    
      e m a                   a m e      
          h n e           e n h          
              s e r B r e s           

A ratio of 2 will print a circular shape for most fonts which happen to be about twice as tall than wide. To compensate for that, we widen by 2. 
# As smaller value than 2 only 1 is available: 

scala BresenhamCircle 6 1
    erBre    
  aes   sea  
 ah       ha 
 e         e 
es         se
r           r
B           B
r           r
es         se
 e         e 
 ah       ha 
  aes   sea  
    erBre    

# widening it has more freedom:

scala BresenhamCircle 12 5
                                             s    e    r    B    r    e    s                                             
                              a    h    n    e                             e    n    h    a                              
                         B    m                                                           m    B                         
                    e    r                                                                     r    e                    
               e    s                                                                               s    e               
          B    r                                                                                         r    B          
     a    m                                                                                                   m    a     
     h                                                                                                             h     
     n                                                                                                             n     
s    e                                                                                                             e    s
e                                                                                                                       e
r                                                                                                                       r
B                                                                                                                       B
r                                                                                                                       r
e                                                                                                                       e
s    e                                                                                                             e    s
     n                                                                                                             n     
     h                                                                                                             h     
     a    m                                                                                                   m    a     
          B    r                                                                                         r    B          
               e    s                                                                               s    e               
                    e    r                                                                     r    e                    
                         B    m                                                           m    B                         
                              a    h    n    e                             e    n    h    a                              
                                             s    e    r    B    r    e    s     

Int의 비율 매개 변수를 단순하게 유지하도록 제한했지만 부동 소수점을 허용하도록 쉽게 확장 할 수 있습니다.


당신의 문자 수 (불필요한 줄 바꿈 없음)는 실제로 34.557519189487725623089077216075 :) BTW : 아주 좋은 해결책, +1
Cristian Lupascu

4

파이썬 (172)

2 개의 필수 개행을 포함하여 172 자. 원뿔형 곡선 (분할 또는 곱셈 없음)에 Bresenham 알고리즘을 사용합니다. 정사각형 글꼴의 경우에만 원을 출력하지만 계단 효과는 제외해야합니다 ( 즉, 항상 같은 너비를 가짐).

y=input();t=[y*[' ']for x in range(y)];x=0;y-=1;p=3-2*y
while x<=y:t[x][y]=t[y][x]='*';n,y=((x-y+1,y-1),(x,y))[p<0];p+=4*n+6;x+=1
for s in t[::-1]+t:print"".join(s[::-1]+s)

아주 예쁘지는 않지만 글쎄, 나는 그것을 줄 것이라고 생각했다.

  ****
 *    *
*      *
*      *
*      *
*      *
 *    *
  ****

          ********
       ***        ***
      *              *
     *                *
    *                  *
   *                    *
  *                      *
 *                        *
 *                        *
 *                        *
*                          *
*                          *
*                          *
*                          *
*                          *
*                          *
*                          *
*                          *
 *                        *
 *                        *
 *                        *
  *                      *
   *                    *
    *                  *
     *                *
      *              *
       ***        ***
          ********

편집 : 오타, 더하기나누기 로 대체했습니다 .


3

펄 (92)

나는 "보너스 질문"으로 가서 타원을 그리는 캐릭터 종횡비를 활용했습니다 :)

($w)=@ARGV;for$x(-$w..$w){$p.=abs($x*$x+$_*$_-$w*$w)<$w?'*':$"for(-$w..$w);$p.=$/;}print $p;

출력 예 :

>perl circle.pl 3
  ***
 *   *
*     *
*     *
*     *
 *   *
  ***

>perl circle.pl 5
   *****
  *     *
 *       *
*         *
*         *
*         *
*         *
*         *
 *       *
  *     *
   *****

>perl circle.pl 8
      *****
    **     **
   *         *
  *           *
 *             *
 *             *
*               *
*               *
*               *
*               *
*               *
 *             *
 *             *
  *           *
   *         *
    **     **
      *****

+1 3 위이지만 다른 답변만큼 모양이 좋지 않습니다. (물론 내가 프로그래밍 할 수있는 것보다 낫습니다. :))
Mateen Ulhaq

3

하스켈 ( 112 109)

g n=map(zipWith(?)f.repeat)f where x?y|abs(x^2+y^2-n^2)<n='*'|0<1=' ';f=[-n..n]
main=interact$unlines.g.read

이것은 모든 점에 대해 x² + y²-r² <n인지 여부를 확인하여 작동합니다. 이것이 사실 인 모든 포인트는 별이며, 다른 모든 포인트는 공백입니다.

예 :

$ 에코 3 | runhaskell circ.hs
  ***  
 * * 
* *
* *
* *
 * * 
  ***  
$ 에코 10 | runhaskell circ.hs
       *******       
     ** **     
    * *    
   * *   
  * *  
 * * 
 * * 
* *
* *
* *
* *
* *
* *
* *
 * * 
 * * 
  * *  
   * *   
    * *    
     ** **     
       *******       

큰 예를 보려면 여기를 참조하십시오 : http://www.ideone.com/t042u


3

파이썬, 180 자

이 코드는 글꼴이 정사각형 인 경우 원을 만듭니다. 서체 높이 / 너비 비율을 알고 있으면 공칭 타원을 생성하도록 수정하는 것은 매우 쉽습니다.

import math
r=input()
d=2*r+1
c=[' '*d]*d
for a in xrange(9*d):f=math.pi*a/r/9; x=int(r+r*math.sin(f)+.5);y=int(r+r*math.cos(f)+.5);c[y]=c[y][:x]+'*'+c[y][x+1:]
for s in c:print s

예 :

4:
  *****  
 **   ** 
**     **
*       *
*       *
*       *
**     **
 **   ** 
  *****  

7:
     *****     
   **     **   
  **       **  
 **         ** 
**           **
*             *
*             *
*             *
*             *
*             *
**           **
 **         ** 
  **       **  
   **     **   
     *****     

샘플을 올릴 수 있습니까?
Mateen Ulhaq

+1 그러나 2 위 ... 근사했습니다.
Mateen Ulhaq

0

C, 127 바이트, 글꼴 이름 : Arial Super Bold

#include<math.h>
main(){int r=10,c=r*2+1,q=c*c,d;for(;q--;)d=hypot(r-q%c,r-q/c),printf("%c%s",d>r-4&&d<=r?42:32,q%c?"":"\n");}

결과:

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