Cerchi di testo


10

Trova un modo per creare cerchi di un determinato raggio utilizzando i caratteri in una console. Si prega di specificare il nome e la dimensione del carattere. Inoltre, fornisci almeno un esempio dell'output.

Per esempio:

Ingresso:

3

Produzione:

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

... Beh, qualcosa di più bello di quel "cerchio" "disegnato a mano" con un raggio di 3.


Domanda bonus: ellissi. :)


È interessante notare che il mio cerchio radius-3 è esattamente identico al tuo senza nemmeno provarci :)
mellamokb


Forse la parte del carattere può essere chiarita. Copiato qui, tutti i caratteri saranno uguali; lo stesso per la dimensione del carattere.
utente sconosciuto

Risposte:


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/ ( fè un fattore di correzione per il rapporto altezza-linea / larghezza-carattere. Se si utilizza un'impostazione di carattere quadrata, ovvero impostare altezza-linea = dimensione-carattere, è possibile impostare f = 1 e ottieni cerchi "quadrati". O impostato farbitrariamente per le ellissi.)

Uscita per 3 (abbastanza interessante, accidentalmente esattamente la stessa forma di OP), 5, 15:

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

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

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

Cerchi belli che hai. ;)
Mateen Ulhaq

6

un cerchio di Bresenham in Scala (35)

L'algoritmo di Bresenham ha 2 punti principali:

  • funziona senza peccato / coseno.
  • calcoli solo ¼ * ½ cerchio, gli altri punti si trovano specchiando.

Come farlo:

       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
ATTO
 FF
 GJ JG
  IJ JI
   GFE EFG
     DCBABCD
       2'1' 
  • Calcoliamo solo i numeri da A nello zenit a I.
    • Il punto I è a 45 °, definito da x == y.
    • Ground zero è dove si trova +.
    • La A nello zenit è il punto (x = 0, y = r), r = raggio.
    • Per disegnare un cerchio chiuso ci spostiamo in senso orario (++ x), che è verso destra (x + = 1) o verso il basso al punto successivo, (y- = 1).
    • ogni punto (x, y) sul cerchio è r lontano dal centro. Pitagora dice, r² = x² + y².
    • Questo ha odore di radice quadrata ed equazioni con 2 soluzioni, ma attenzione!
    • iniziamo da A e vogliamo sapere se dipingiamo il prossimo punto in basso o il punto in basso a destra.
  • calcoliamo per entrambi i punti (x² + y²) e costruiamo sia per la differenza che per r² (che rimane ovviamente costante).
    • poiché la differenza può essere negativa, prendiamo gli addominali da essa.
    • quindi osserviamo quale punto è più vicino al risultato (r²), eo ipso più piccolo.
    • a seconda di ciò disegniamo il vicino di destra o in basso.
  • il punto così trovato
    • 1 x, y viene specchiato
    • 2 -x, y a sinistra
    • 3 y, x in diagonale
    • 4 -y, x da lì a sinistra
  • tutti quei punti si rispecchiano di nuovo a sud
    • 1 'x, -y
    • 2 '-x, -y
    • 3 'y, -x
    • 4 '-y, -x fatto.

Questo non è un codice golf, ma tutti quei numeri in cima alle soluzioni esistenti mi hanno fatto pensare che lo sia, quindi ho trascorso del tempo inutile nel golfare la mia soluzione. Pertanto ho aggiunto anche un numero inutile in alto. È 11 volte Pi arrotondato.

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

La domanda del carattere viene decisa dal server web dei siti e dalle impostazioni del browser. Ora, quello che sto guardando lo è

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

La dimensione del carattere è di 12 pixel. Informazioni piuttosto inutili, se me lo chiedi, ma chi lo fa?

Bonus: ellissi e output di esempio:

L'invocazione è

    scala BresenhamCircle SIZE RATIO

per esempio

    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     

Ho limitato il parametro ratio per Int per renderlo semplice, ma può essere facilmente ampliato per consentire i float.


il conteggio dei personaggi (senza nuove righe non necessarie) è in effetti 34.557519189487725623089077216075 :) A proposito: soluzione molto bella, +1
Cristian Lupascu

4

Python (172)

172 caratteri inclusi i due newline obbligatori. Utilizza l'algoritmo di Bresenham per le curve coniche (nessuna divisione o moltiplicazione); produce solo cerchi per i caratteri quadrati, ma dovrebbe essere esente dagli effetti di scala ( cioè ha sempre la stessa larghezza).

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)

Non molto carino, ma beh, ho pensato di provarci.

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

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

Modifica : refuso, sostituita aggiunta con divisione .


3

Perl (92)

Ho scelto la "domanda bonus" e ho sfruttato le proporzioni del personaggio per disegnare ellissi :)

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

Esempi di output:

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

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

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

+1 3 ° posto, ma le forme non sembrano belle come nelle altre risposte. (Ancora meglio di quanto potessi programmare, ovviamente. :))
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

Funziona verificando se x² + y² - r² <n per tutti i punti. Tutti i punti per i quali questo è vero sono stelle, tutti gli altri sono spazi vuoti.

Esempi:

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

Vedi qui per un grande esempio: http://www.ideone.com/t042u


3

Python, 180 caratteri

Questo codice crea cerchi se il carattere è quadrato. È abbastanza facile da modificare per generare ellissi nominali se conosci il rapporto altezza / larghezza del carattere.

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

Esempi:

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

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

Potresti pubblicare un campione?
Mateen Ulhaq,

+1 Ma 2 ° posto ... Era vicino, comunque.
Mateen Ulhaq,

0

C, 127 byte, Nome carattere: 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");}

Risultato:

      *********      
    *************    
   ***************   
  *****************  
 ******       ****** 
 *****         ***** 
*****           *****
****             ****
****             ****
****             ****
****             ****
****             ****
****             ****
****             ****
*****           *****
 *****         ***** 
 ******       ****** 
  *****************  
   ***************   
    *************    
      *********      
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.