ASCII Triangle Ripple


12

Ok, la mia prima domanda sul golf. Per favore sii gentile :) So che ci sono troppi puzzle ascii: P ma eccoci.

Il compito è semplice, usa il tuo linguaggio di programmazione preferito per stampare un triangolo ondulato. L'input dovrebbe essere la dimensione dell'ondulazione.

Ogni triangolo è uniformemente distanziato. Fondamentalmente, continui ad aggiungere i triangoli fino a quando non c'è spazio sufficiente per il triangolo più piccolo.

Sono consentiti spazi bianchi ovunque tu voglia purché le increspature siano le stesse dell'esempio con la dimensione corretta.

Esempio

q)g 1
__
\/
q)g 2
____
\  /
 \/
q)g 3
______
\    /
 \  /
  \/
q)g 4
________
\  __  /
 \ \/ /
  \  /
   \/
q)g 5
__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/
q)g 6
____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/
q)g 7
______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/
q)g 8
________________
\  __________  /
 \ \  ____  / /
  \ \ \  / / /
   \ \ \/ / /
    \ \  / /
     \ \/ /
      \  /
       \/

Come al solito, vince il codice più corto :)


2
Pur non essendo un duplicato esatto degli esagoni ASCII concentrici di disegno , non sono sicuro che si aggiunge molto rispetto all'altro.
Geobits,

4
@Geobits IMO è abbastanza diverso: le specifiche di input sono abbastanza diverse, il metodo per capire quante forme disegnare è diverso e triangoli! = Esagoni ;-)
Digital Trauma

@WooiKent Ora sto dubitando di aver capito correttamente la domanda. Che cos'è un'ondulazione? È un insieme concentrico di triangoli o qualcos'altro?
Digital Trauma,

2
bella domanda, ma è sotto specifica. (1) Leggendo il testo letteralmente, quando l'input è 1,2 o 3, dovremmo sempre generare tre triangoli. (2) Darei per scontato che ogni serie di triangoli dovrebbe essere concentrica e (3) sembra che dovrebbero avere anche i loro angoli inferiori sulla stessa linea. (4) La separazione orizzontale deve essere esattamente uno spazio come mostrato, oppure sono consentite altre separazioni? (5) Gli spazi bianchi non necessari sono consentiti alla (a, b, c, d) sinistra, destra, sopra, sotto?
Level River St

Penso che sia piuttosto chiaro, anche se non esplicito. Disegna sempre un triangolo delle dimensioni indicate, con triangoli nidificati delle dimensioni n-3, n-6, n-9, ecc.
Sparr

Risposte:


5

Pyth, 31 byte

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/

Dimostrazione.

Spiegazione:

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/
                                   Implicit: Q = eval(input()), d = ' '
VhQ                                for N in range(Q + 1):
                                   Concatenate:
          *Nd                      N spaces
         +   *N"\ "                N of the string "\ "
        +          d               another space
       +            *Q\_           Q of the string "_"
                                   If N = 2 and Q = 7, the string so far is:
                                   "  \ \  _______" and we want
                                   " \ \  _" as the left half.
      t                            Remove the first character.
     <                  Q          Take the first Q characters remaining.
                                   This is the left half of the triangle ripple.
    J                              Store it in J.
                          XJ"\/    Translate \ to / in J.
                         _         Reverse it.
   +                               Concatenate the left and right halves and print.

7

GNU sed -nr, 210

Un inizio:

s/1/__/g
p
s#_(.*)_#\\\1/#
s#\\__#\\  #
s#__/#  /#
ta
:a
p
s#(.*) _{6}(_*) # \1\\  \2  /#;ta
s#(.*)  (  )# \1\2#;
s#(.*) _(_*)_ # \1\\\2/#
y/_/ /
Tc
:b
p
:c
s#(.*)((\\)  ( *)(/)|()()()\\/)# \1\3\4\5#;tb

L'input è un numero intero unario positivo tramite STDIN, come da questa meta-domanda .

Produzione:

$ for i in 1 11 111 1111 11111 111111 1111111; do sed -rnf triripple.sed <<< $i; done
__
\/

____
\  /
 \/

______
\    /
 \  /
  \/

________
\  __  /
 \ \/ /
  \  /
   \/

__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/

____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/

______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/

$ 

5

C, 165 byte

n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y){for(x=-n;x<n;++x){b=2*n-abs(2*x+1);c=b-2*y+2;b-=6*y;putchar(b>0?95:b<-4&c>0&c%4==1?"/\\"[x<0]:32);}puts("");}}

Prima dei passi del golf che distruggono la leggibilità:

#include <stdio.h>
#include <stdlib.h>

int main(int c, char** v) {
    int n = atoi(v[1]);
    for (int y = 0; y <= n; ++y) {
        for (int x = -n; x < n; ++x) {
            int b = 2 * n - abs(2 * x + 1);
            int c = b - 2 * y + 2;
            b -= 6 * y;
            putchar(b > 0 ? 95 : 
                    b < -4 && c > 0 && c % 4 == 1 ? "/\\"[x<0] : 32);
        }
        puts("");
    }
}

Questo scorre su tutti i caratteri nel rettangolo contenente la figura e valuta le equazioni di linea che separano l'interno del triangolo dall'esterno, nonché quelli che separano le diverse parti del triangolo.


Bel lavoro con la matematica. Dovresti provare questo: codegolf.stackexchange.com/q/51396/21348
edc65

156:n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y)for(x=-n;x<=n;putchar(x++-n?b>6*y?95:b<6*y-4&c>0&c%4==1?"/\\"[x<1]:32:10))c=(b=2*n-abs(2*x+1))-2*y+2;}
edc65,

4

Retina , 182 byte

1
_
^
#$_
((`#([^#]*?)( ?)_(_*)_( ?)([^#]*?)$
$0# $1\$3/$5
+)`\\( ?)_(_*)_( ?)/(?=[^#]*$)
\ $1$2$3 /
#( *(\\ )*\\ *)  ( *(/ )*/)$
$0# $1$3
)`#( *(\\ )*)\\/(( /)*)$
$0# $1$3
# 
#
^#
<empty line>

Accetta input come unario.

Ogni riga dovrebbe andare nel proprio file e #dovrebbe essere cambiata in newline nei file. Ciò non è pratico, ma è possibile eseguire il codice come in un file con il -sflag, mantenendo i #marker. #Se lo si desidera, è possibile modificare le "newline" nell'output per renderle leggibili. Per esempio:

> echo -n 1111|retina -s triangle|tr # '\n'
________
\  __  /
 \ \/ /
  \  /
   \/

Il codice non è troppo ben giocato (ancora).


2

C - 206 byte

i,j,m,k,a,b;main(i,v)char**v;{m=atoi(v[1])*2;while(k<m*(m/2+1)){i=k/m;j=k%m;a=i*3,b=(i+j)%2;putchar("_\\/ "[j>=a&&j<m-a?0:j>i-2&&b&&j<i*3-1&&j<m/2?1:j<=m-i&&!b&&j>m-a&&j>=m/2?2:3]);if(j==m-1)puts("");k++;};}

 x,m,i,j,a,b;
int main(x,v)char**v;{
    m=atoi(v[1])*2;
    for(i=0;i<m/2+1;i++){
        for(j=0;j<m;j++){
            a=i*3,b=(i+j)%2;
            j>=a&&j<m-a?a=0:j>=i-1&&b&&j<i*3-1&&j<m/2?a=1:j<=m-i&&!b&&j>m-a&&j>=m/2?a=2:(a=3);putchar("_\\/ \n"[a]);
        }
        puts("");
    }
}

Esempio di output

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      

1
Puoi ridurlo un po '. Sfruttando il vecchio stile C, puoi dichiarare le variabili senza un tipo, se lo sono int. Inoltre, se li dichiarate nell'ambito globale, vengono automaticamente inizializzati su 0. Invece di avere un sacco di putchar()chiamate in diversi rami, è possibile utilizzare una singola chiamata e sostituire le ifdichiarazioni con operatori ternari. Naturalmente diventa difficile leggere in quel modo, ma è completamente nello spirito di questo sito scrivere brutti codici se è più breve. :)
Reto Koradi,

Grazie @RetoKoradi, l'ho ridotto da 279 a 214 implementando i tuoi suggerimenti :) Penso che dovrei migliorare il mio algoritmo per ottenere ulteriori miglioramenti.
paulvs,

Sì, una volta che vai oltre la meccanica, la chiave è trovare regole che semplifichino il più possibile la logica. Se osservi la mia soluzione, che è fondamentalmente molto simile, ho scoperto che la logica si è semplificata parecchio posizionando l'origine della coordinata orizzontale al centro del triangolo. In questo modo, potrei sfruttare la simmetria. E altri probabilmente hanno trovato approcci ancora migliori. È davvero interessante quanto si possa fare su un problema che sembra così ingannevolmente semplice.
Reto Koradi,

1

JavaScript ( ES6 ) 165 180 204

Esegui lo snippet in Firefox per testare. Se la restituzione della stringa non è sufficiente, l'utilizzo dell'avviso per l'output è di 2 caratteri in più.

// 165 - return the string
F=n=>
  (i=>{
    for(r='__'[R='repeat'](m=n);i<n;)
      r+=`\n`+' '[R](i)
       +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
       +'__'[R](m>3?m-=3:0)
       +(' '+' /'[R](t)).slice(i++-n)
  })(0)||r


// 167 - output the string
A=n=>{
  for(i=0,r='__'[R='repeat'](m=n);i<n;)
    r+=`\n`+' '[R](i)
     +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
     +'__'[R](m>3?m-=3:0)
     +(' '+' /'[R](t)).slice(i++-n);
  alert(r)
}

// TEST
out=x=>O.innerHTML += x+'\n' 

for(k=1;k<13;k++)out(k+'\n'+F(k))
<pre id=O></pre>

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.