Tartarughe fino in fondo


74

Scrivi un programma o una funzione che accetta un numero intero positivo e stampa o restituisce una pila di tante tartarughe di arte ASCII , dove ogni tartaruga è più grande di quella sopra di essa.

In particolare, se l'input è 1, l'output dovrebbe essere:

 __
/,,\o

Se l'input è 2:

  __
o/,,\
 ____
/,__,\o

Se l'input è 3:

   __
  /,,\o
  ____
o/,__,\
 ______
/,____,\o

Se l'input è 4:

    __
  o/,,\
   ____
  /,__,\o
  ______
o/,____,\
 ________
/,______,\o

Se l'input è 5:

     __
    /,,\o
    ____
  o/,__,\
   ______
  /,____,\o
  ________
o/,______,\
 __________
/,________,\o

E così via nello stesso schema per input più grandi.

Nota che:

  • La testa (la o) della tartaruga inferiore è sempre sulla destra. Le teste delle tartarughe sopra si alternano avanti e indietro.
  • Nessuna riga può contenere spazi finali.
  • Non sono ammessi spazi iniziali superflui. (cioè la parte posteriore della tartaruga inferiore dovrebbe essere all'inizio della linea.)
  • È consentita una singola riga finale finale facoltativa.

Vince il codice più breve in byte.


11
trichoplax, mi aspetto una risposta che usi la ricorsione.
El'endia Starman,

15
,________,Quando qualcuno dice qualcosa che non ha senso.
R. Kap

8
Lanciando i lati per assicurarsi che ogni tartaruga che guarda in alto o in basso veda un asino?
Base

15
Sono contento che tu abbia specificato le tartarughe ASCII. Altrimenti, avrei finalmente inviato una risposta al logo in cui non dovevo sprecare 3 byte per nascondere la tartaruga.
GuitarPicker il

4
Mi piacciono le tartarughe!
Scotty.NET,

Risposte:


31

Lotto, 256 byte

@set i=echo 
@%i%off
set u=
for /l %%j in (2,2,%1)do call set i=%%i%%  
set/af=%1^&1
if %f%==1 %i% __&%i%/,,\o&set u=__
for /l %%j in (2,2,%1)do call:l
exit/b
:l
set i=%i:~0,-2%
%i%  _%u%_
%i%o/,%u%,\
%i% __%u%__
%i%/,_%u%_,\o
set u=__%u%__

Si noti che la riga 1 ha uno spazio finale e la riga 4 ha due spazi finali. icontiene quindi un echocomando con la quantità appropriata di rientro per ogni tartaruga. Nel frattempo ucontiene il numero di caratteri di sottolineatura nelle tartarughe alternate. Una tartaruga dispari leader è in un involucro speciale e quindi il resto delle tartarughe viene prodotto in coppia.


25
+1 per essere esattamente 256 byte. Non giocare a golf a meno che tu non possa esattamente metà della sua lunghezza!
Rohan Jhunjhunwala il

Inizialmente mi mancava la nota sugli spazi finali, la maggior parte dei miei editor è pronta a tagliare quelli e non riuscivo a capire perché non funzionasse! Sempre felice di vedere Batch su PPCG. :)
Captain Man

24

C, 131 byte

i,j;f(n){char _[3*n];memset(_,95,3*n);for(i=n;i--;printf("%*.*s\n%*s/,%.*s,\\%s\n",j+n+1,j+j,_,i,"o"+1-i%2,j+j-2,_,"o"+i%2))j=n-i;}

Provalo online.

Definisce una funzione che stampa le tartarughe.

Abusa pesantemente degli identificatori di larghezza e precisione di printf per ottenere la spaziatura e ripetere i caratteri di sottolineatura. Ogni tartaruga viene stampata usando una sola printfchiamata:

printf("%*.*s\n%*s/,%.*s,\\%s\n",j+n+1,j+j,_,i,"o"+1-i%2,j+j-2,_,"o"+i%2)

Ho anche una versione diversa di 144 byte con spazio bianco rimosso:

c,i;f(n){for(i=n;i--;){
    char*p=" _\n o/,_,\\o\n";
    int C[]={i+1,c=n+n-i-i,1,i&~1,i%2,1,1,c-2,1,1,1-i%2,1};
    for(c=0;p[c];)C[c]--?putchar(p[c]):++c;
}}

Accidenti, stavo per aggiungere un C ++

4
+1 per avere ,_,nel tuo codice.
R. Kap

14

Rubino, 100 byte

Soluzione ricorsiva. Provalo online!

f=->n,i=1{f[n-1,i+1]if n>1;puts' '*i+?_*n*2,"%#{i-1}s/,#{?_*2*~-n},\\"%(i<2?'':'o '[i%2])+' o'[i%2]}

12

05AB1E, 45 byte

Lvð¹y-©>ׄ__y×UXJ,„/,X¨¨„,\J'o®ÉiìëJ}ð®®É-×ì,

Provalo online


3
Ottiene il mio voto per essere così breve.
jseals

Non sono sicuro che il G-loop fosse già nella versione di agosto 2016, ma se lo fosse, Lvpuò essere Ged entrambi ypossono essere Nper -1 byte.
Kevin Cruijssen,

12

V , 57, 53 49 byte

i ³_
/,_,\oÀñHyjí_/___
ëPhjI ñdjí___
òkk$x^PXkk

Poiché questo contiene caratteri non stampabili, ecco un dump esadecimale:

00000000: 6920 b35f 0a2f 2c5f 2c5c 6f1b c0f1 4879  i ._./,_,\o...Hy
00000010: 6aed 5f2f 5f5f 5f0a eb50 1668 6a49 20f1  j._/___..P.hjI .
00000020: 646a ed5f 5f5f 0af2 6b6b 2478 5e50 586b  dj.___..kk$x^PXk
00000030: 6b                                       k

Provalo online!

Spiegazione:

i ³_\n/,_,\o<esc>       "Insert the original turtle with one extra underscore

Àñ                      "Arg1 times:
  Hyj                   "  Go the the beginning of the file, and yank a turtle
     í_/___             "  Extend the lenght of every turtle by two
ëP                      "  Move to the beginning of the file again, and paste the turtle we yanked
  <C-v>hjI              "  Move this turtle one to the right
           ñ            "Stop looping.

dj                      "Delete a turtle (since we have one too many)
  í___                  "Make every turtle shorter (since they are all too long)

ò                       "Recursively:
 kk                     "  Move up two lines
   $x                   "  Delete the last character on this line (an 'o')
     ^P                 "  And paste this 'o' at the beginning of the line
       X                "  Remove one space
        kk              "  Move up two lines again

Uscite interessanti per input 0e sotto.
R. Kap

Anche questo codice non funziona input > 10. In una nota a margine, l'ho accidentalmente rotto completamente con l'input 0 41c14. Non sono sicuro se ho rotto il codice o il corridore.
Brandon Anzaldi,

1
@ R.Kap Sì, penso di sapere perché lo fa. V è a malapena in grado di comprendere numeri interi, quindi vede solo -1una stringa che non può pretendere che sia un numero. Per fortuna, non devo gestirli.
DJMcMayhem

1
@BrandonAnzaldi Ah, capisco perché non funziona. Lo riparero 'tra un minuto. Inoltre, fare qualcosa di diverso dal numero decimale è destinato a causare strani problemi.
DJMcMayhem

1
Sì! Soluzione interessante. Ho pensato che probabilmente sarebbe stato in qualche modo semplice da risolvere. Ero solo molto, molto affascinato dall'output del summenzionato mash della tastiera accidentale. Gli spazi principali producono anche output divertenti. Sembra che tu abbia litigato V abbastanza bene!
Brandon Anzaldi,

11

Perl, 92 byte

91 byte codice +1 per -n.

Richiede -Esenza costi aggiuntivi.

for$i(1..$_){say$"x$_._,$v=_ x(--$i*2),_.$/.$"x(--$_-1),$_%2?o:$"x!!$_,"/,$v,\\",$_%2?"":o}

uso

perl -nE 'for$i(1..$_){say$"x$_._,$v=_ x(--$i*2),_.$/.$"x(--$_-1),$_%2?o:$"x!!$_,"/,$v,\\",$_%2?"":o}' <<< 3
   __
  /,,\o
  ____
o/,__,\
 ______
/,____,\o

Grazie a @Dada per -9 byte con la sua rielaborazione!


1
Ben fatto. Un'altra versione, stessa ByteCount: perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Ho provato anche a superare i 100 ma non posso ...
Dada,

@Dada Grazie! Aggiornato, molto apprezzato!
Dom Hastings,

10

Cheddar , 105 byte

n->(|>n).map(i->(1-i%2)*"o"+"\\,"+(n-i-1)*"__"+",/"+i%2*"o"+i/2*"  "+"\n"+(n-i)*"__"+(i+1)*" ").vfuse.rev

2
+1 per l'utilizzo del formaggio. Puoi usare letteralmente newline per salvare byte
Downgoat

10

Retina , 97 91 88 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

.+
  $&$*_$&$*_o
+`^( *?)(.)__(_+)(.)
$1 $4$3$2¶$&
 (.)__(_*) ?
  __$2¶$%`$1/,$2,\
Rm`^ 

Provalo online!


6

Python 2, 116 byte

m=input()
for i in range(m):r=m-i;b=r%2;h='o';a='__';u=i*a;s=' '*r;print s+u+a+'\n'+s[:b-2]+h*-~-b+"/,"+u+",\\"+b*h

Ottengo il tuo conteggio a 115 byte e puoi salvare un byte usando lambda m:for i in r...invece diinput()
wnnmaw

6

R , 150 byte

a=function(x,y=1){d=x-y;t=d%%2;cat(rep(" ",d+1),rep("_",2*y),"\n",rep(" ",d-t),"o"[t],"/,",rep("_",2*y-2),",\\","o"[!t],"\n",sep="");if(y<x)a(x,y+1)}

più pulito (aggiunge un byte)

a=function(x,y=1){
     d=x-y
     t=d%%2
     cat(rep(" ",d+1),rep("_",2*y),"\n",rep(" ",d-t),"o"[t],"/,",rep("_",2*y-2),",\\","o"[!t],"\n",sep="")
     if(y<x)a(x,y+1)
}

La struttura di base chiama ricorsivamente se stessa, indicando sia il numero finale da chiamare sia il livello corrente. Inizia con un valore predefinito per y = 1, quindi necessita solo di una variabile per la chiamata iniziale. Definisce rapidamente due valori utilizzati di frequente. Quindi ripete tutto il numero necessario di volte.

"o"[t],"o"[!t]

Ognuno di questi implica implicitamente se aggiungere la testa a destra o sinistra e posizionarla in modo appropriato.


Usa #prima del titolo nell'editor di markdown per formattarlo come le altre risposte.
TheBikingViking

scuse - così modificato
user5957401

6

TSQL, 189 byte

Ora con accettazione dell'input - grazie a @PatrickRoberts

DECLARE @i INT=##i##,@ INT=0a:PRINT SPACE(@i-@)+REPLICATE('__',@+1)+'
'+SPACE((@i-@-1)/2*2)+IIF((@i-@-1)%2=1,'o/,','/,')+REPLICATE('__',@)+IIF((@i-@-1)%2=0,',\o',',\')SET
@+=1IF @i>@ GOTO a

Violino



@PatrickRoberts grazie, non lo sapevo, quel SQL Server 2016?
t-clausen.dk il

@ t-clausen.dk Quel meccanismo di input è specifico per il sito data.SE, non è una funzionalità standard di nessuna versione di SQL.
BradC,

@BradC hai perfettamente ragione, è una sorta di linguaggio di programmazione e molto bello poter finalmente aggiungere un parametro di input. Ho dimenticato tutto questo e
prenderò in

6

C, 328 238 234 215 byte:

B;M(w,j,R){j=w;if(j<=B){char b[j*2-1],k[j*2+1];b[j*2-2]=k[j*2]=0;memset(b,95,j*2-2);memset(k,95,j*2);R=(B+1-j)%2;printf("%*s\n%*s/,%s,\\%s\n",j*2+B+1-j,k,B-j,R?"":"o",b,R?"o":"");j++;M(j);}}main(){scanf("%d",&B);M(1);}

Un'implementazione ricorsiva che utilizza molta formattazione di stringhe e la memsetfunzione integrata. Cercherò di giocare a golf più nel tempo che posso.

C Online! (Ideone)


Stranamente, la terza e la quarta tartaruga sembrano rotte su Ideone ...
Quentin

@Quentin In realtà, non è Ideone. Questo è colpa del mio programma. Per qualche motivo, l'input dei minuti si avvicina 17e oltre, la logica si interrompe per qualche motivo, e quindi anche le tartarughe. Attualmente sto cercando di capire cosa c'è che non va.
R. Kap

Bello ! Nota che puoi sostituire la maggior parte dei letterali di caratteri ( 'c') con il loro codice ASCII per risparmiare un carattere ciascuno :)
Quentin

@Quentin Nice? ... Non funziona molto bene. Com'è bello?
R. Kap

Oh! Ho ricontrollato Ideone e sembrava fisso, ma è perché ci sono meno tartarughe ovviamente ... Mattina nebbiosa.
Quentin,

4

Java 1.7, 238 byte

Un insieme di due funzioni: la prima scorre sull'input (numero di tartarughe), la seconda facilita la costruzione ricorsiva di una sequenza di caratteri ripetuti (ovvero gli spazi iniziali, la parte posteriore e il ventre delle tartarughe).

String f(int n){String s="";for(int i=-1,x=-2;++i<n;){int m=(i+n)%2;s+=r(' ',n-i)+r('_',i*2+2)+"\n"+r(' ',n-i-(m==1?1:2))+(m==0?"o":"")+"/,"+r('_',x+=2)+",\\"+(m==1?"o":"")+"\n";}return s;}String r(char c,int n){return n>0?c+r(c,--n):"";}

Ungolfed:

class C {
    public static void main(String[] a) {
        System.out.println(new T().f(1));
        System.out.println(new T().f(2));
        System.out.println(new T().f(3));
        System.out.println(new T().f(4));
        System.out.println(new T().f(5));
    }

    static class T {

        String f(int n) {
            String s = "";
            for (int i = -1, x = 0; ++i < n; x+=2) {
                int m = (i + n) % 2;
                s += r(' ', n - i) + r('_', i * 2 + 2) + "\n" + r(' ', n - i - (m == 1 ? 1 : 2)) + (m == 0 ? "o" : "") + "/," + r('_', x) + ",\\" + (m == 1 ? "o" : "") + "\n";
            }
            return s;
        }

        String r(char c, int n) {
            return n > 0 ? c + r(c, --n) : "";
        }

    }

}

Eseguirlo! (Ideone)

Ho pensato che fosse giusto escludere la definizione della classe dal conteggio dei byte.

Potrei essere in grado di giocare a golf un po 'più invertendo l'ordine di iterazione del loop (costruendo dalla tartaruga inferiore in alto) e / o andando completamente ricorsivo come alcune delle altre risposte.

Nota per sé: Java non ha davvero una scorciatoia integrata per ripetere n caratteri ...



4

Pitone, 137 120 113 110 byte

m=input()
for i in range(m):p=m-i;b=p%2;print' '*p+'__'*-~i+'\n'+' '*(p-2+b)+'o'*-~-b+'/,'+'__'*i+',\\'+'o'*b

Ungolfed:

m=input()
for i in range(m):
  p=m-i                              // Abstract m-i for a few bytes
  b=p%2                              // Determines every other turtle from bottom

  print' '*p + '__'*-~i + '\n' +    // The top of the turtle
       ' '*(p-2+b) +                // Leading spaces (-1 for every other turtle)
       '0'*-~-b +                   // Add a leading head to every other turtle
       '/,'+'__'*i +                // Body of the turtle
       ',\\'+'0'*b                  // Add a trailing head to every other turtle

Le teste erano dure.


Invece di ('o','')[b], puoi fare 'o'*(1-b)(e 'o'*bper ('o','')[1-b]).
Mego

@mego oh giusto, l'ho cambiato in un carattere vuoto, che funziona. Grazie!
greyShift

'0'*-~-1è più corto di'0'*(1-b)
Limone distruttibile

e - ~ i è più corto di (i + 1)
Limone distruttibile

3

F #, 218 207 202 196 187 byte.

Rasato la maggior parte di questi byte incorporando le variabili

let R=String.replicate
let t n=let rec L i r k=if i<n then L(i+1)(R(k+i%2+1)" "+R((n-i)*2)"_"+"\n"+R k" "+R(i%2)"o"+"/,"+R(n*2-i*2-2)"_"+",\\"+R(1-i%2)"o"+"\n"+r)(k+i%2*2)else r in L 0""0

La logica è spudoratamente rubata da questa risposta di Python

Provalo online.


3

CJam , 88 byte

ri_[S\_'_*_+N+\O\"/,"\('_*_++','\+'o]\({_[(S+\(2>\(S\+)'O^c+\(-2<\(\('o\{;O}&\;]}*]-1%N*

Crea prima la tartaruga più grande (perché altrimenti cosa starebbe su ogni altra tartaruga?), Quindi riduce gradualmente le dimensioni fino a quando non viene creata quella più piccola. Funziona con qualsiasi numero intero maggiore di 0.

Provalo online!


2

Python 2.7, 255 238 236 byte

Anche se questo perde in entrambe le altre soluzioni Python 2, mi è piaciuto il mio approccio ricorsivo:

def r(s,p):
 for(a,b)in p:s=a.join(s.split(b))
 return s
def t(w):
 i='_'*2*w;s='\n __%s\n/,%s,\o'%(i,i)
 if w:s=r(t(w-1),[('\n ','\n'),('Z/',' /'),('\\Z\n','\\\n'),(' /','o/'),('\\','\\o'),('o','Z')])+s
 return s
print t(input()-1)[1:]

edit1: eliminato alcuni byte eliminando alcune sostituzioni

edit2: rasato 2 byte salvando i trattini bassi come variabile


2

Python 2, 147 byte

n=input()
s=' ';r=[];i=k=0
while i<n:a=i%2;r=[s*k+s*a+s+'_'*(n-i)*2+s,s*k+'o'*a+'/,'+'_'*(n-i-1)*2+',\\'+'o'*(1-a)]+r;k+=a*2;i+=1
print'\n'.join(r)

Provalo online


1

Python 2.7, 139 114 113 130 byte

Mi è piaciuto anche l'approccio ricorsivo di Iguanodon, quindi ecco un tentativo leggermente più breve.

def t(n):
 if n>1:t(n-1)
 a=i-n;b=(a+1)%2;print' '*(a+1)+'__'*n+'\n'+' '*(a-1+b)+'o'*(not b)+'/,'+'__'*(n-1)+',\\'+'o'*b
i=input()
t(i)

MODIFICARE

Un potente 25 26 9 byte ha giocato a golf a causa di alcuni fantastici consigli di Anguria distruttibile. Grazie molto! Pensa che potrebbe essere la risposta più breve di Python ora :-)

def t(n):
 if n>1:t(n-1)
 a=i-n;b=-~a%2;print' '*-~a+'__'*n+'\n'+' '*(a-1+b)+'o'*-~-b+'/,'+'__'*~-n+',\\'+'o'*b
i=input()
t(i)

(a + 1) può essere abbreviato in - ~ a, e n-1 può essere abbreviato in ~ -n, e b è sempre 0 o 1, quindi non b può essere abbreviato in - ~ -b, ed è possibile eliminare il i=input();t(i)parte, perché ti è permesso avere solo una funzione.
Limone distruttibile

Amico, grazie per alcuni ottimi suggerimenti @Distruttibile. Ho anche notato che come b è sempre 1 o 0, allora 1-b funziona e perde 1 byte in più.
ElPedro,

tranne che ciò richiederebbe parentesi, perché * ha una priorità più alta di binaria -, ma unaria - e ~ ha una priorità più alta di *
Limone distruttibile

Ora che ci penso, se n è sempre> 0, allora se n> 1 può essere abbreviato in ~ -n (n-1), che taglia lo spazio iniziale. Inoltre, (1-b) può essere abbreviato in - ~ -b senza parentesi
Limone distruttibile

Questo migliora e migliora! Sono abbastanza nuovo per questo e più abituato a scrivere codice leggibile, quindi i tuoi suggerimenti sono molto apprezzati :)
ElPedro

1

PowerShell , 105 100 97 87 85 84 byte

-21 byte grazie a mazzy, l'uomo pazzo

"$args"..1|%{' '*$_--+($m='__'*$i++)+'__'
' '*($_-$_%2)+("/,$m,\o","o/,$m,\")[$_%2]}

Provalo online!

Sposta abilmente le variabili usando $_--per evitare l'uso di ($_+1)blocchi ripetuti per salvare diversi byte. Converte anche il singolo argomento in una stringa che viene quindi lanciata in un int quando utilizzato in un intervallo per scorrere il numero di tartarughe. Il trucco più grande ora sta avendo il 2 ° livello di spaziatura di una tartaruga solo aumentare ogni altra riga sottraendo $_%2(cioè 0 se pari, 1 se dispari) dall'attuale row_count.

Altrimenti, è un sacco di matematica dell'indice da ottenere corretta _e conta, incluso un contatore di ritardo nella forma di $i++, e ora solo un singolo indice di lista per mettere la testa dalla parte giusta.


@mazzy Non posso avere spazi finali ma l'ho modificato per 5 byte, grazie
Veskah

1
Mi dispiace :) 85 byte
mazzy

@mazzy Double dang, mettendo ancora più lavoro. Roba buona
Veskah,

1
Questo è tutto :) 84 byte
mazzy

0

ES6 (JavaScript), 140 byte

Codice

T=(i,h=0,p=1,R="repeat")=>(i>1?T(i-1,~h,p+1)+"\n":"")+" "[R](p)+'--'[R](i)+"\n"+" "[R](p-1+h)+(h?"o":"")+"/,"+'__'[R](i-1)+",\\"+(!h?"o":"")

Test

console.log(T(5));

     --
    /,,\o
    ----
  o/,__,\
   ------
  /,____,\o
  --------
o/,______,\
 ----------
/,________,\o

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.