Tartarugas até o fim


74

Escreva um programa ou função que receba um número inteiro positivo e imprima ou retorne uma pilha dessas muitas tartarugas de arte ASCII , em que cada tartaruga é maior que a acima.

Especificamente, se a entrada for 1, a saída deve ser:

 __
/,,\o

Se a entrada for 2:

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

Se a entrada for 3:

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

Se a entrada for 4:

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

Se a entrada for 5:

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

E assim por diante no mesmo padrão para entradas maiores.

Observe que:

  • A cabeça (a o) da tartaruga de fundo está sempre à direita. As cabeças das tartarugas acima se alternam.
  • Nenhuma linha pode ter espaços à direita.
  • Espaços à esquerda supérfluos não são permitidos. (ou seja, a parte de trás da tartaruga de fundo deve estar no início da linha.)
  • Uma única nova linha opcional à direita é permitida.

O código mais curto em bytes vence.


11
trichoplax, estou esperando uma resposta que use recursão.
El'endia Starman

15
,________,Quando alguém diz algo que não faz sentido.
R. Kap

8
Virando os lados para garantir que todas as tartarugas olhando para cima ou para baixo vejam uma bunda?
Basic

15
Estou feliz que você especificou tartarugas ASCII. Caso contrário, eu finalmente enviaria uma resposta do logotipo, onde não precisaria desperdiçar 3 bytes para esconder a tartaruga.
GuitarPicker 4/08/16

4
Eu gosto de tartarugas!
Scotty.NET

Respostas:


31

Lote, 256 bytes

@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%__

Observe que a linha 1 tem um espaço à direita e a linha 4 tem dois espaços à direita. iportanto, contém um echocomando com a quantidade apropriada de indentação para cada tartaruga. Enquanto isso, ucontém o número de sublinhados em tartarugas alternativas. Uma tartaruga ímpar líder é de invólucro especial e, em seguida, o restante das tartarugas é produzido em pares.


25
+1 por ter exatamente 256 bytes. Não jogue golfe a menos que você possa exatamente metade do seu comprimento!
Rohan Jhunjhunwala

Originalmente, eu perdi a nota sobre espaços à direita, a maioria dos meus editores está pronta para cortá-los e eu não conseguia descobrir por que não estava funcionando! Sempre feliz em ver o Lote no PPCG. :)
Capitão Man

24

C, 131 bytes

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;}

Experimente online.

Define uma função que imprime as tartarugas.

Abusa fortemente os especificadores de largura e precisão da printf para obter o espaçamento e repetir os sublinhados. Cada tartaruga é impressa usando uma única printfchamada:

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

Eu também tenho uma versão diferente com 144 bytes sem o espaço em branco removido:

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;
}}

Porra, eu estava prestes a adicionar um C ++

4
+1 por ter ,_,em seu código.
R. Kap

14

Ruby, 100 bytes

Solução recursiva. Experimente 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 bytes

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

Experimente online


3
Recebe meu voto por ser tão curto.
jseals

Não tenho certeza se o G-loop já estava na versão de agosto de 2016, mas se estava, Lvpode ser Ge ambos ypodem ter N-1 byte.
Kevin Cruijssen

12

V , 57, 53 49 bytes

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

Como ele contém caracteres não imprimíveis, aqui está um hexdump:

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

Experimente online!

Explicação:

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

Saídas interessantes para entradas 0e abaixo.
R. Kap

Este código também não funciona input > 10. Em uma nota lateral, acidentalmente quebrei completamente com a entrada 0 41c14. Não tenho certeza se eu quebrei o código, ou o corredor.
Brandon Anzaldi

1
@ R.Kap Sim, acho que sei por que isso acontece. V mal consegue compreender números inteiros; portanto, apenas vê -1como uma sequência que não pode fingir que é um número. Felizmente, eu não tenho que lidar com isso.
DJMcMayhem

1
@BrandonAnzaldi Ah, entendo por que isso não funciona. Vou consertar isso em um minuto. Além disso, fazer algo diferente de número decimal provavelmente causará alguns problemas estranhos .
DJMcMayhem

1
Sim! Solução legal. Achei que provavelmente seria um pouco simples de consertar. Fiquei muito, muito fascinado com a saída do mash acidental de teclado acima mencionado. Os principais espaços também produzem resultados divertidos. Parece que você brigou muito bem com o V!
Brandon Anzaldi

11

Perl, 92 bytes

Código de 91 bytes +1 para -n.

Requer -Esem custo extra.

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

Graças a @Dada por -9 bytes com seu re-trabalho!


1
Agradável. Outra versão, mesmo bytecount: perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Eu tentei ficar abaixo dos 100 também, mas não ...
Dada

@Dada Thanks! Atualizado, muito apreciado!
Dom Hastings

10

Queijo Cheddar , 105 bytes

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 para usar queijo. Você pode usar nova linha literal para salvar bytes
Downgoat


6

Python 2, 116 bytes

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

Eu obter a sua contagem em 115 bytes e você pode salvar um byte usando lambda m:for i in r...em vez deinput()
wnnmaw

6

R , 150 bytes

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

de forma mais limpa (adiciona um 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)
}

A estrutura básica se chama recursivamente - dizendo a si mesmo o número final a ser chamado e o nível atual. Começa com um padrão para y = 1, portanto, ele precisa apenas de uma variável para a chamada inicial. Define rapidamente dois valores usados ​​com freqüência. Depois, repete tudo o número de vezes necessário.

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

Cada um deles testa implicitamente se deve adicionar a cabeça à direita ou à esquerda e colocá-la adequadamente.


Use #antes do título no editor de remarcação para formatá-lo como as outras respostas.
TheBikingViking

desculpas - assim editada
user5957401

6

TSQL, 189 bytes

Agora com aceitação de entrada - graças 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 obrigado, não sabia, um servidor sql 2016?
t-clausen.dk

@ t-clausen.dk Esse mecanismo de entrada é específico do site data.SE, não é um recurso padrão de qualquer versão do SQL.
BradC

@ BradC, você está absolutamente certo, é algum tipo de linguagem de programação e é muito bom finalmente poder adicionar uma entrada de parâmetro. Eu esqueci tudo sobre isso, e considerarei usá-lo no futuro pagando os bytes extras
t-clausen.dk

6

C, 328 238 234 215 bytes:

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

Uma implementação recursiva usando muita formatação de string e a memsetfunção interna . Vou tentar jogar isso mais ao longo do tempo, tanto quanto eu puder.

C It Online! (Ideona)


Por estranho que pareça, a terceira e a quarta tartarugas aparecem quebradas em Ideone ...
Quentin

@ Quentin Na verdade, isso não é Ideone. Isso é culpa do meu programa. Por alguma razão, a entrada minuciosa se aproxima 17e além, a lógica quebra por alguma razão e, portanto, o mesmo acontece com as tartarugas. Atualmente, estou tentando descobrir o que está errado.
R. Kap

Agradável ! Observe que você pode substituir a maioria dos literais de caracteres ( 'c') pelo código ASCII para poupar um carácter cada :)
Quentin

@ Quentin Nice? ... Não funciona muito bem. Como isso é legal?
R. Kap

Oh! Voltei ao Ideone e ele parecia fixo, mas é porque há menos tartarugas, é claro ... Manhã nublada.
Quentin

4

Java 1.7, 238 bytes

Um conjunto de duas funções: primeiro itera sobre a entrada (número de tartarugas), a segunda facilita a construção de uma sequência de caracteres repetidos de forma recursiva (ou seja, os espaços principais, as costas e a barriga das tartarugas).

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

    }

}

Executá-lo! (Ideona)

Supus que não há problema em excluir a definição de classe da contagem de bytes.

Eu posso ser capaz de jogar um pouco mais adiante, revertendo a ordem de iteração do loop (construindo da tartaruga inferior para cima) e / ou indo totalmente recursivo como algumas das outras respostas.

Nota para si mesmo: Java realmente não possui uma abreviação incorporada para repetir n caracteres ...



4

Pitão, 137 120 113 110 bytes

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

As cabeças estavam duras.


Em vez de ('o','')[b], você pode fazer 'o'*(1-b)(e 'o'*bpara ('o','')[1-b]).
Mego

@mego oh certo, eu mudei isso para um char vazio, que funciona. obrigado!
precisa saber é o seguinte

'0'*-~-1é menor que'0'*(1-b)
Destructible Lemon

e - ~ i é mais curto que (i + 1)
Destructible Lemon

3

F #, 218 207 202 196 187 bytes.

Raspou a maioria desses bytes inserindo variáveis

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

A lógica é descaradamente roubada desta resposta Python

Experimente online.


3

CJam , 88 bytes

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

Cria a maior tartaruga primeiro (porque, caso contrário, o que todas as outras tartarugas suportariam?), Depois reduz gradualmente o tamanho até que a menor seja feita. Funciona para qualquer número inteiro maior que 0.

Experimente online!


2

Python 2.7, 255 238 236 bytes

Mesmo que isso perca para as outras soluções Python 2, gostei da minha abordagem recursiva:

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: eliminou alguns bytes eliminando algumas substituições

edit2: raspou 2 bytes salvando os sublinhados como uma variável


2

Python 2, 147 bytes

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)

Experimente online


1

Python 2.7, 139 114 113 130 bytes

Eu também gostei da abordagem recursiva do Iguanodon, então aqui está uma tentativa um pouco mais curta.

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)

EDITAR

Um poderoso 25 26 9 bytes jogou devido a algumas dicas fantásticas da Destructible Watermelon. Muito Obrigado! Acho que pode ser a resposta mais curta do Python agora :-)

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) pode ser encurtado para - ~ a, e n-1 pode ser encurtado para ~ -n, e b é sempre 0 ou 1; portanto, não b pode ser encurtado para - ~ -b, e você pode eliminar o i=input();t(i)parte, porque você pode ter apenas uma função.
Destructible Lemon

Cara, obrigado por ótimas dicas @Destructible. Também foi observado que, como b é sempre 1 ou 0, então 1-b funciona e perde mais 1 byte.
ElPedro

exceto que isso exigiria parens, porque * tem prioridade maior do que binário -, mas unário - e ~ tem prioridade maior do que *
Destrutível Lemon

Agora que penso nisso, se n é sempre> 0, então se n> 1 pode ser reduzido para ~ -n (n-1), que corta o espaço principal. Além disso, de novo, (1-b) pode ser encurtado para - ~ -b sem parênteses
destrutível limão

Isso só fica melhor e melhor! Eu sou muito novo para isso e muito mais acostumado a escrever código legível para que seus sugestões são muito apreciados :)
ElPedro

1

PowerShell , 105 100 97 87 85 84 bytes

-21 bytes graças a mazzy, o homem louco

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

Experimente online!

Inteligentemente muda variáveis ​​usando $_--para evitar o uso de ($_+1)blocos repetidos para economizar vários bytes. Ele também converte o argumento único em uma sequência que é convertida em int quando usada em um intervalo para iterar através do número de tartarugas. O maior truque agora é ter o 2º nível de espaçamento de uma tartaruga apenas aumentar todas as outras linhas subtraindo $_%2(ou seja, 0 se for par, 1 se for ímpar) da contagem atual de linhas.

Caso contrário, é bastante matemático de índice se adequar _e contar, incluindo um contador de lag na forma de $i++, e agora apenas um único índice de lista para colocar a cabeça no lado correto.


@mazzy Não pode ter espaços à direita, mas eu o modifiquei por 5 bytes, obrigado
Veskah 10/04

1
Desculpe :) 85 bytes
mazzy 10/04

@mazzy Double dang, colocando ainda mais trabalho. Coisas boas
Veskah 10/04

1
Isso é tudo :) 84 bytes
mazzy 10/04

0

ES6 (JavaScript), 140 bytes

Código

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

Teste

console.log(T(5));

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.