Metin çevreleri


10

Bir konsoldaki karakterleri kullanarak belirli bir yarıçapı çevreler oluşturmanın bir yolunu bulun. Lütfen yazı tipi adını ve boyutunu belirtin. Ayrıca, lütfen çıktıya en az bir örnek verin.

Örneğin:

Giriş:

3

Çıktı:

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

... Yarıçapı 3 olan "elle çizilmiş" daire "den daha iyi görünen bir şey.


Bonus soru: Elipsler. :)


İlginç bir şekilde, yarıçapı-3 çemberi bile denemeden seninkiyle tamamen aynı :)
mellamokb


Belki yazı tipi açıklığa kavuşturulabilir. Burada kopyalandığında, tüm yazı tipleri aynı olacaktır; aynı yazı tipi boyutu için.
kullanıcı bilinmiyor

Yanıtlar:


5

Javascript (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/ ( fsatır yüksekliği / yazı tipi genişliği oranı için bir düzeltme faktörüdür. Kare yazı tipi ayarı kullanıyorsanız, yani satır yüksekliği = yazı tipi boyutunu ayarlayabilirsiniz. f = 1 ve "kare" daireler elde edin. Veya felipsler için keyfi olarak ayarlayın .)

3 için çıktı (ilginç bir şekilde, yanlışlıkla OP ile aynı şekilde), 5, 15:

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

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

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

Hoş görünümlü çevreleriniz var. ;)
Mateen Ulhaq

6

Scala'da bir Bresenham dairesi (35)

Bresenham algoritmasının 2 ana noktası vardır:

  • günah / cosin olmadan çalışır
  • sadece ¼ * ½ daireyi hesaplarsanız, diğer noktalar yansıtma ile bulunur.

Nasıl yapılır:

       2 1  
     DCBABCD
   GFE | EFG
  IJ y | ---- JI
 GJ | / JG
 F | / | F
DE | r / | ED
C | / | C
B 4 | / | B 3
A + ------- A
B 4 'x B 3'
CC
DE ED
 FF
 GJ JG
  IJ JI
   GFE EFG
     DCBABCD
       2'1' 
  • Sadece zenit'teki A'dan I'ye kadar olan sayıları hesaplıyoruz.
    • I noktası 45 ° 'dir, x == y ile tanımlanır.
    • Sıfır noktası + işaretinin bulunduğu yerdir.
    • Zenit içindeki A noktası (x = 0, y = r), r = yarıçaptır.
    • Kapalı bir daire çizmek için sağa (x + = 1) veya bir sonraki noktaya (y- = 1) doğru saat yönünde (++ x) hareket ederiz.
    • çember üzerindeki her nokta (x, y) merkezden r. Pisagor diyor ki, r² = x² + y².
    • Bu karekök ve 2 çözüm ile eşitlik gibi kokuyor, ama dikkat!
    • A'dan başlıyoruz ve aşağıdaki noktayı mı yoksa sağdaki noktayı mı boyadığımızı bilmek istiyoruz.
  • her iki noktayı (x² + y²) hesaplıyoruz ve her ikisi de r² (elbette sabit kalır) farkı için inşa ediyoruz.
    • fark negatif olabileceğinden, abs'i ondan alırız.
    • o zaman sonuca (r²) daha yakın, eo ipso daha küçük görünüyoruz.
    • buna bağlı olarak sağ veya alt komşuyu çiziyoruz.
  • Bulunan nokta
    • 1 x, y yansıtılır
    • 2 -x, y sola
    • Çaprazda 3 y, x
    • 4 -y, x oradan sola
  • tüm bu noktalar tekrar güneye yansıtılır
    • 1 'x, -y
    • 2 '-x, -y
    • 3 'y, -x
    • 4 '-y, -x bitti.

Bu kod golf değil, ama mevcut çözümlerin üstündeki tüm bu sayılar bana öyle olduğunu düşündürdü, bu yüzden çözümümü golf yapmak için gereksiz zaman geçirdim. Bu yüzden üstüne de işe yaramaz bir sayı ekledim. Pi yuvarlanmasının 11 katı.

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"))
}

Yazı tipi sorusu, siteler web sunucusu ve tarayıcı ayarlarınız tarafından belirlenir. Şimdi, bakıyorum ki

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

Yazı tipi boyutu 12 pikseldir. Bana sorarsanız oldukça işe yaramaz bilgi, ama kim yapar?

Bonus: elipsler ve örnek çıktı:

Çağrı

    scala BresenhamCircle SIZE RATIO

Örneğin

    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 için oran parametresini basit tutmak için kısıtladım, ancak şamandıralara izin vermek için kolayca genişletilebilir.


karakter sayınız (gereksiz satırlar olmadan) aslında 34.557519189487725623089077216075 :) BTW: çok güzel bir çözüm, +1
Cristian Lupascu

4

Python (172)

İki zorunlu yeni satır dahil 172 karakter. Konik eğriler için Bresenham algoritmasını kullanır (bölme veya çarpma olmadan); yalnızca kare fontlar için daireler çıkarır, ancak merdiven efektlerinden muaf tutulmalıdır ( yani her zaman aynı genişliğe sahiptir).

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)

Çok hoş değil, ama iyi, denemek istedim.

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

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

Düzenleme : yazım hatası, ekleme bölümü ile değiştirildi .


3

Perl (92)

"Bonus soru" için gittim ve elips çizmek için karakter en boy oranını sömürdüm :)

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

Örnek çıktılar:

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

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

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

+1 3. sırada, ancak şekiller diğer cevaplardaki kadar güzel görünmüyor. (Tabii ki programlayabildiğimden daha iyi. :))
Mateen Ulhaq

3

Haskell ( 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

Bu, tüm noktalar için x² + y² - r² <n olup olmadığını kontrol ederek çalışır. Bunun doğru olduğu tüm noktalar yıldızlar, diğerleri boşluktur.

Örnekler:

$ echo 3 | runhaskell circ.hs
  ***  
 * * 
* *
* *
* *
 * * 
  ***  
yankı 10 $ | runhaskell circ.hs
       *******       
     ** **     
    * *    
   * *   
  * *  
 * * 
 * * 
* *
* *
* *
* *
* *
* *
* *
 * * 
 * * 
  * *  
   * *   
    * *    
     ** **     
       *******       

Büyük örnek için buraya bakın: http://www.ideone.com/t042u


3

Python, 180 karakter

Yazı tipi kare ise bu kod daireler yapar. Yazı tipi yükseklik / genişlik oranınızı biliyorsanız nominal elips oluşturmak için değiştirmek oldukça kolaydır.

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

Örnekler:

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

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

Bir örnek gönderebilir misiniz?
Mateen Ulhaq

+1 Ama 2. sırada ... Ama yakındı.
Mateen Ulhaq

0

C, 127 Bayt, Font adı: 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");}

Sonuç:

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