Tortugas hasta el fondo


74

Escriba un programa o función que tome un número entero positivo e imprima o devuelva una pila de tantas tortugas de arte ASCII , donde cada tortuga es más grande que la que está encima.

Específicamente, si la entrada es 1, la salida debería ser:

 __
/,,\o

Si la entrada es 2:

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

Si la entrada es 3:

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

Si la entrada es 4:

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

Si la entrada es 5:

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

Y así sucesivamente en el mismo patrón para entradas más grandes.

Tenga en cuenta que:

  • La cabeza (la o) de la tortuga inferior siempre está a la derecha. Las cabezas de las tortugas arriba se alternan de un lado a otro.
  • Ninguna línea puede tener espacios finales.
  • No se permiten espacios iniciales superfluos. (es decir, la parte posterior de la tortuga inferior debe estar al comienzo de la línea).
  • Se permite una nueva línea final opcional.

El código más corto en bytes gana.


11
Trichoplax, espero una respuesta que use la recursividad.
El'endia Starman

15
,________,Cuando alguien dice algo que no tiene sentido.
R. Kap

8
¿Voltear lados para asegurarse de que cada tortuga que mira hacia arriba o hacia abajo ve un culo?
Básico

15
Me alegra que hayas especificado tortugas ASCII. De lo contrario, finalmente iba a enviar una respuesta de logotipo donde no tenía que perder 3 bytes para ocultar la tortuga.
GuitarPicker

44
¡Me gustan las tortugas!
Scotty.NET

Respuestas:


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

Tenga en cuenta que la línea 1 tiene un espacio final y la línea 4 tiene dos espacios finales. ipor lo tanto, contiene un echocomando con la cantidad adecuada de sangría para cada tortuga. Mientras tanto, ucontiene el número de guiones bajos en tortugas alternativas. Una tortuga impar principal tiene una carcasa especial y luego el resto de las tortugas salen en parejas.


25
+1 por tener exactamente 256 bytes. ¡No juegues golf a menos que puedas exactamente la mitad de su longitud!
Rohan Jhunjhunwala

Originalmente me perdí la nota sobre los espacios finales, la mayoría de mis editores están listos para cortarlos y no pude entender por qué no funcionaba. Siempre feliz de ver Batch en PPCG. :)
Capitán 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;}

Pruébalo en línea.

Define una función que imprime las tortugas.

Abusa mucho de los especificadores de ancho y precisión de printf para obtener el espacio y repetir los guiones bajos. Cada tortuga se imprime usando una sola printfllamada:

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

También tengo una versión diferente que es 144 bytes con espacios en blanco eliminados:

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

Maldición, estaba a punto de agregar una C ++

44
+1 por tener ,_,en su código.
R. Kap


12

05AB1E, 45 bytes

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

Pruébalo en línea


3
Obtiene mi voto por ser tan breve.
jseals

No estoy seguro si el Gbucle ya estaba en la versión de agosto de 2016, pero si lo era, Lvpuede ser Gy ambos ypueden ser Nde -1 byte.
Kevin Cruijssen

12

V , 57, 53 49 bytes

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

Como esto contiene caracteres no imprimibles, aquí hay un 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

Pruébalo en línea!

Explicación:

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

Productos interesantes para entradas 0y abajo.
R. Kap

Este código tampoco funciona input > 10. En una nota al margen, accidentalmente lo rompí por completo con la entrada 0 41c14. No estoy seguro si rompí el código, o el corredor.
Brandon Anzaldi

1
@ R.Kap Sí, creo que sé por qué hace eso. V apenas puede comprender enteros, por lo que solo ve -1como una cadena que no puede pretender que es un número. Afortunadamente, no tengo que manejar eso.
DJMcMayhem

1
@BrandonAnzaldi Ah, veo por qué eso no funciona. Lo arreglaré en un minuto. Además, hacer algo que no sea un número decimal puede causar algunos problemas extraños .
DJMcMayhem

1
¡Sip! Solución genial Pensé que probablemente sería algo simple de arreglar. Estaba muy, muy fascinado con la salida de la mezcla de teclado accidental antes mencionada. Los espacios iniciales también producen una salida divertida. ¡Parece que peleaste muy bien con V!
Brandon Anzaldi

11

Perl, 92 bytes

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

Requiere -Esin costo adicional.

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

¡Gracias a @Dada por -9 bytes con su retrabajo !


1
Buena esa. Otra versión, la misma ByteCount: perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Traté de llegar a menos de 100 también, pero no pude ...
Dada

@Dada Gracias! Actualizado, muy apreciado!
Dom Hastings

10

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 por usar queso. Puede usar la nueva línea literal para guardar 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

lambda m:for i in r...input()
Obtuve

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

más limpiamente (agrega 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 estructura básica se llama a sí misma recursivamente, diciéndose a sí misma tanto el número final a llamar como el nivel actual. Comienza con un valor predeterminado para y = 1, por lo que solo necesita una variable para la llamada inicial. Define rápidamente dos valores que se usan con frecuencia. Luego simplemente repite todo el número necesario de veces.

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

Cada uno de estos prueba implícitamente si se debe agregar la cabeza a derecha o izquierda y colocarla adecuadamente.


Use #antes del título en el editor de rebajas para formatearlo como las otras respuestas.
TheBikingViking

disculpas - tan editado
user5957401

6

TSQL, 189 bytes

Ahora con aceptación de entrada, gracias 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

Violín



@PatrickRoberts gracias, no sabía eso, ¿es ese servidor SQL 2016?
t-clausen.dk

@ t-clausen.dk Ese mecanismo de entrada es específico del sitio data.SE, no es una característica estándar de ninguna versión de SQL.
BradC

@BradC tiene toda la razón, es una especie de lenguaje de programación, y es muy bueno poder finalmente agregar una entrada de parámetros. Olvidé todo esto, y consideraré usarlo en el futuro pagando los bytes adicionales
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);}

Una implementación recursiva que utiliza mucho formato de cadena y la memsetfunción incorporada . Intentaré jugar más golf con el tiempo tanto como pueda.

¡C en línea! (Ideona)


Curiosamente, las tortugas tercera y cuarta aparecen rotas en Ideone ...
Quentin

@Quentin En realidad, eso no es Ideone. Eso es culpa de mi programa. Por alguna razón, la entrada de minutos se acerca 17y más allá, la lógica se rompe por alguna razón, y por lo tanto, también lo hacen las tortugas. Actualmente estoy tratando de descubrir qué está mal.
R. Kap

Agradable ! Tenga en cuenta que puede reemplazar la mayoría de los literales de caracteres ( 'c') por su código ASCII para ahorrar un carácter cada uno :)
Quentin

@Quentin Nice? ... No funciona muy bien. ¿Cómo es eso lindo?
R. Kap

Oh! Volví a revisar Ideone y parecía arreglado, pero eso es porque hay menos tortugas, por supuesto ... Mañana brumosa.
Quentin

4

Java 1.7, 238 bytes

Un conjunto de dos funciones: primero itera sobre la entrada (# de tortugas), segundo facilita la construcción de una secuencia de caracteres repetidos de forma recursiva (es decir, los espacios iniciales, la parte posterior y el vientre de las tortugas).

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

Sin golf:

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

    }

}

¡Ejecutarlo! (Ideona)

Supuse que está bien excluir la definición de clase del recuento de bytes.

Es posible que pueda jugar un poco más de golf al invertir el orden de iteración del bucle (construir desde la tortuga inferior hacia arriba) y / o volverme completamente recursivo como algunas de las otras respuestas.

Nota personal: Java realmente carece de una taquigrafía incorporada para repetir n caracteres ...


"Escribir un programa o función ..." ¿ Cuándo debo incluir cosas como main static void main de

4

Pitón, 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

Sin golf:

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

Las cabezas estaban duras.


En lugar de ('o','')[b], puedes hacer 'o'*(1-b)(y 'o'*bpara ('o','')[1-b]).
Mego

@mego oh cierto, cambié eso a un char vacío, eso funciona. ¡Gracias!
greyShift

'0'*-~-1es más corto que'0'*(1-b)
Destructible Lemon

y - ~ i es más corto que (i + 1)
Destructible Lemon

3

F #, 218 207 202 196 187 bytes.

Afeitó la mayoría de estos bytes al incluir variables

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 lógica es robada descaradamente de esta respuesta de Python

Pruébalo en línea.


3

CJam , 88 bytes

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

Primero hace la tortuga más grande (porque de lo contrario, ¿en qué se pararía cualquier otra tortuga?), Luego reduce gradualmente el tamaño hasta que se haga la más pequeña. Funciona para cualquier número entero mayor que 0.

Pruébalo en línea!


2

Python 2.7, 255 238 236 bytes

Aunque esto pierde con las otras dos soluciones de Python 2, me gustó mi enfoque recursivo:

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: eliminó algunos bytes al eliminar algunos reemplazos

edit2: afeitó 2 bytes guardando los guiones bajos como una variable


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)

Pruébalo en línea


1

Python 2.7, 139 114 113 130 bytes

También me gustó el enfoque recursivo de Iguanodon, así que aquí hay un intento un poco más corto.

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

Un poderoso 25 26 9 bytes de golf debido a algunos consejos fantásticos de Destructible Watermelon. ¡Muchas gracias! Piensa que puede ser la respuesta más corta de Python ahora :-)

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) se puede acortar a - ~ a, y n-1 se puede acortar a ~ -n, y b siempre es 0 o 1, por lo que no b se puede acortar a - ~ -b, y puede eliminar el i=input();t(i)parte, porque solo puedes tener una función.
Destructible Lemon

Hombre, gracias por algunas buenas sugerencias @ Destructible. También descubrí que como b siempre es 1 o 0, entonces 1-b funciona y pierde 1 byte más.
ElPedro

excepto que eso requeriría parens, porque * tiene mayor prioridad que binario -, pero unario - y ~ tiene mayor prioridad que *
Destructible Lemon

Ahora que lo pienso, si n es siempre> 0, entonces si n> 1 se puede acortar a ~ -n (n-1), que corta el espacio inicial. Además, nuevamente, (1-b) se puede acortar a - ~ -b sin parens
Destructible Lemon el

¡Esto solo se pone mejor y mejor! Soy bastante nuevo en esto y estoy más acostumbrado a escribir código legible, por lo que tus sugerencias son muy apreciadas :)
ElPedro

1

PowerShell , 105 100 97 87 85 84 bytes

-21 bytes gracias a mazzy, el loco

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

Pruébalo en línea!

Cambia inteligentemente las variables $_--para evitar usar ($_+1)bloques repetidos para guardar varios bytes. También convierte el argumento único en una cadena que luego se convierte en un int cuando se usa en un rango para recorrer el número de tortugas. El mayor truco ahora es que el segundo nivel del espaciado de una tortuga solo aumente cada dos filas restando $_%2(es decir, 0 si es par, 1 si es impar) del conteo de filas actual.

De lo contrario, se trata de una gran cantidad de índice de matemáticas para conseguir adecuada _y cargos, incluyendo un contador de retraso en la forma de $i++, y ahora sólo un único índice de la lista para poner la cabeza en el lado correcto.


@mazzy No puedo tener espacios finales pero lo modifiqué para 5 bytes, gracias
Veskah

1
Lo siento :) 85 bytes
mazzy

@mazzy Double dang, trabajando aún más. Cosas buenas
Veskah

1
Eso es todo :) 84 bytes
mazzy

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

Prueba

console.log(T(5));

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.