Lingkaran teks

10

Temukan cara untuk membuat lingkaran dari radius yang diberikan menggunakan karakter di konsol. Silakan tentukan nama dan ukuran font. Juga, tolong berikan setidaknya satu contoh output.

Sebagai contoh:

Memasukkan:

3

Keluaran:

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

... Nah, sesuatu yang lebih tampan dari "lingkaran" "digambar tangan" dengan radius 3.


Pertanyaan bonus: Elips. :)

Mateen Ulhaq
sumber
Cukup menarik, lingkaran radius-3 saya persis identik dengan Anda tanpa mencoba :)
mellamokb
Mungkin bagian font dapat diklarifikasi. Disalin di sini, semua font akan sama; sama untuk ukuran font.
pengguna tidak diketahui

Jawaban:

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/ ( fadalah faktor koreksi untuk rasio garis-tinggi / lebar font. Jika Anda menggunakan pengaturan font persegi, yaitu, mengatur garis-tinggi = ukuran font, Anda dapat mengatur f = 1 dan dapatkan lingkaran "kotak". Atau atur secara facak untuk elips.)

Output untuk 3 (cukup menarik, bentuknya tidak sengaja persis sama dengan OP), 5, 15:

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

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

                    ***************                      
               ******             ******                 
            ****                       *****             
          ***                              ***           
        ***                                  ***         
      ***                                      ***       
     **                                          **      
    **                                            **     
   **                                              **    
  **                                                **   
 **                                                  **  
 *                                                    *  
**                                                    ** 
*                                                      * 
*                                                      * 
*                                                      * 
*                                                      * 
*                                                      * 
**                                                    ** 
 *                                                    *  
 **                                                  **  
  **                                                **   
   **                                              **    
    **                                            **     
     **                                          **      
      ***                                      ***       
        ***                                  ***         
          ***                              ***           
            ****                       *****             
               ******             ******                 
                    ***************                      
mellamokb
sumber
Lingkaran yang tampak bagus. ;)
Mateen Ulhaq
6

a Bresenham circle in Scala (35)

Algoritma Bresenham - memiliki 2 poin utama:

  • bekerja tanpa dosa / cosin.
  • Anda hanya menghitung ¼ * ½ lingkaran, titik-titik lainnya ditemukan dengan mirroring.

Bagaimana cara melakukannya:

       2 1  
     DCBABCD
   GFE | EFG
  IJ y | ---- JI
 GJ | /J G
 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 ' 
  • Kami hanya menghitung angka dari A di zenit hingga I.
    • Titik I pada 45 °, didefinisikan oleh x == y.
    • Ground zero adalah tempat + berada.
    • A dalam zenit adalah titik (x = 0, y = r), r = jari-jari.
    • Untuk menggambar lingkaran tertutup kita bergerak searah jarum jam (++ x), yaitu ke kanan (x + = 1) atau turun ke titik berikutnya, (y- = 1).
    • setiap titik (x, y) pada lingkaran adalah r jauh dari pusat. Pythagoras mengatakan, r² = x² + y².
    • Baunya seperti akar kuadrat dan persamaan dengan 2 solusi, tapi waspadalah!
    • kita mulai dari A dan ingin tahu, apakah kita melukis titik berikutnya di bawah atau titik di bawah kanan.
  • kami menghitung untuk kedua titik (x² + y²) dan membangun untuk kedua perbedaan menjadi r² (yang tetap tentu saja konstan).
    • karena perbedaannya bisa negatif, kami mengambil abs darinya.
    • lalu kita lihat titik mana yang lebih dekat dengan hasil (r²), eo ipso lebih kecil.
    • tergantung pada yang kita gambar tetangga kanan atau bawah.
  • titik yang ditemukan
    • 1 x, kamu dicerminkan
    • 2 -x, y ke kiri
    • 3 y, x di diagonal
    • 4 -y, x dari sana ke kiri
  • semua titik dicerminkan lagi ke selatan
    • 1 'x, -y
    • 2 '-x, -y
    • 3 'y, -x
    • 4 '-y, -x selesai.

Ini bukan kode golf, tetapi semua angka di atas solusi yang ada membuat saya berpikir begitu, jadi saya menghabiskan waktu yang tidak berguna dalam bermain golf solusi saya. Karena itu saya menambahkan nomor yang tidak berguna di bagian atas juga. Ini 11 kali Pi bulat.

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

Pertanyaan font ditentukan oleh server situs dan pengaturan browser Anda. Sekarang, yang saya cari itu

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

Ukuran font adalah 12px. Informasi yang tidak berguna, jika Anda bertanya kepada saya, tetapi siapa yang tahu?

Bonus: elips dan output sampel:

Doa adalah

    scala BresenhamCircle SIZE RATIO

sebagai contoh

    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     

Saya membatasi parameter rasio untuk Int agar tetap sederhana, tetapi dapat dengan mudah diperlebar untuk memungkinkan mengapung.

Pengguna tidak diketahui
sumber
jumlah karakter Anda (tanpa baris baru yang tidak dibutuhkan) sebenarnya adalah 34.557519189487725623089077216075 :) BTW: solusi yang sangat bagus, +1
Cristian Lupascu
4

Python (172)

172 karakter termasuk dua baris berita wajib. Menggunakan algoritma Bresenham untuk kurva berbentuk kerucut (tidak ada divisi atau perkalian); hanya menghasilkan lingkaran untuk font persegi, tetapi harus dibebaskan dari efek tangga ( mis. selalu memiliki lebar yang sama).

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)

Tidak terlalu cantik, tapi yah, saya pikir saya akan mencobanya.

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

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

Sunting : kesalahan ketik, tambahan yang diganti dengan divisi .

sam hocevar
sumber
3

Perl (92)

Aku pergi untuk "pertanyaan bonus" dan membuatnya mengeksploitasi rasio aspek karakter untuk menggambar elips :)

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

Output contoh:

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

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

>perl circle.pl 8
      *****
    **     **
   *         *
  *           *
 *             *
 *             *
*               *
*               *
*               *
*               *
*               *
 *             *
 *             *
  *           *
   *         *
    **     **
      *****
Timwi
sumber
+1 tempat ke-3, tetapi bentuknya tidak terlihat sebagus pada jawaban lainnya. (Masih lebih baik daripada yang bisa saya programkan, tentu saja :))
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

Ini bekerja dengan memeriksa, apakah x² + y² - r² <n untuk semua poin. Semua poin yang benar adalah bintang, semua lainnya kosong.

Contoh:

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

Lihat di sini untuk contoh besar: http://www.ideone.com/t042u

FUZxxl
sumber
3

Python, 180 karakter

Kode ini membuat lingkaran jika font berbentuk bujur sangkar. Sangat mudah untuk memodifikasi untuk menghasilkan elips nominal jika Anda tahu rasio tinggi / lebar font Anda.

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

Contoh:

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

7:
     *****     
   **     **   
  **       **  
 **         ** 
**           **
*             *
*             *
*             *
*             *
*             *
**           **
 **         ** 
  **       **  
   **     **   
     *****     
Keith Randall
sumber
Bisakah Anda memposting sampel?
Mateen Ulhaq
+1 Tapi 2 tempat ... Itu sudah dekat, meskipun.
Mateen Ulhaq
0

C, 127 Bytes, Nama font: 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");}

Hasil:

      *********      
    *************    
   ***************   
  *****************  
 ******       ****** 
 *****         ***** 
*****           *****
****             ****
****             ****
****             ****
****             ****
****             ****
****             ****
****             ****
*****           *****
 *****         ***** 
 ******       ****** 
  *****************  
   ***************   
    *************    
      *********      
Johan du Toit
sumber