乌龟一直下来


74

编写一个程序或函数,该程序或函数需要一个正整数,并打印或返回许多ASCII艺术乌龟的堆栈,其中每只乌龟都比上面的乌龟大。

具体来说,如果输入为1,则输出应为:

 __
/,,\o

如果输入是2

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

如果输入是3

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

如果输入是4

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

如果输入是5

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

对于较大的输入,依此类推。

注意:

  • o底部乌龟的头()始终在右侧。然后,上面的海龟头来回交替。
  • 没有行可以有尾随空格。
  • 不允许使用多余的前导空格。(即,底部乌龟的背面应在该行的开头。)
  • 允许使用一个可选的尾随换行符。

以字节为单位的最短代码获胜。


11
trichoplax,我期待使用递归的答案。
El'endia Starman'8/08/

15
,________,当有人说毫无意义的话时。
R. Kap

8
翻转侧面以确保每只向上或向下观看的海龟都能看到一个屁股?
基本

15
我很高兴您指定了ASCII海龟。否则,我将最终提交一个徽标答案,而不必浪费3个字节来隐藏乌龟。
GuitarPicker

4
我喜欢乌龟!
Scotty.NET,

Answers:


31

批处理,256字节

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

请注意,行1具有尾随空格,行4具有两个尾随空格。i因此包含一个echo带有适当缩进量的命令(适用于每只乌龟)。同时u包含备用海龟中的下划线数量。一只特殊的奇特乌龟是特例的,然后其余乌龟成对输出。


25
+1为正好为256个字节。除非您能精确地打一半的长度,否则请勿打高尔夫球!
Rohan Jhunjhunwala

最初,我错过了有关尾随空格的说明,我的大多数编辑器都打算将其删除,而我不知道为什么它不起作用!总是很高兴看到PPCG上的Batch。:)
曼队长

24

C,131字节

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

在线尝试。

定义一个打印海龟的函数。

严重滥用printf的宽度和精度说明符来获取间距并重复下划线。每个海龟都可以通过一次printf调用来打印:

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

我也有一个不同的版本,它删除了144个字节的空白:

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

该死,我正要添加一个C ++

4
+1包含,_,在您的代码中。
R. Kap

14

Ruby,100字节

递归解决方案。在线尝试!

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字节

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

在线尝试


3
我的投票太短了。
jseals

不知道G-loop是否已经在2016年8月的版本中,但是如果已经存在,Lv可以是,G并且y都可N以为-1字节。
凯文·克鲁伊森

12

V57,53 49字节

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

由于其中包含不可打印的字符,因此这里是一个十六进制转储:

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

在线尝试!

说明:

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

输入0及以下的有趣输出。
R. Kap

该代码也不适用于input > 10。附带一提,我不小心将输入内容完全破坏了它0 41c14。不知道我是否破坏了代码,还是亚军。
布兰登·安扎尔迪

1
@ R.Kap是的,我想我知道为什么这样做。V 几乎不能理解整数,因此它只能看作-1一个不能假装为数字的字符串。值得庆幸的是,我不必处理这些。
DJMcMayhem

1
@BrandonAnzaldi啊,我明白为什么这行不通。我待会儿解决。此外,除十进制数字外的任何操作都必然会引起一些奇怪的问题。
DJMcMayhem

1
对!很酷的解决方案。认为修复起来可能会有些简单。我对上述意外键盘混搭的输出非常着迷。前导空格也会产生一些有趣的输出。好像您很好地对V进行了争执!
布兰登·安扎尔迪

11

Perl,92个字节

91个字节,代码为+1 -n

需要-E在不增加成本。

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

用法

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

感谢@Dada -9字节的努力!


1
好东西。另一个版本,相同的字节数:perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'。我也尝试过100岁以下的比赛,但没想到……
达达

@Dada谢谢!更新,非常感谢!
唐·黑斯廷斯

10

切达 105字节

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使用奶酪。您可以使用文字换行符保存字节
Downgoat '16


6

Python 2,116字节

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

我的计数为115字节,您可以使用lambda m:for i in r...而不是input()
wnnmaw

6

R,150字节

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

基本结构递归地调用自己-告诉自己最终要调用的数字和当前级别。从默认值y = 1开始,因此初始调用只需要一个变量。快速定义两个经常使用的值。然后,它仅将所有内容重复必要的次数。

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

这些选项中的每一个都隐式测试是将头添加到右侧还是左侧并适当放置。


#在markdown编辑器中,在标题前使用来像其他答案一样格式化它。
TheBikingViking

道歉–如此编辑
user5957401

6

TSQL,189个字节

现在已接受输入-感谢@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

小提琴



@PatrickRoberts谢谢,不知道那是sql server 2016吗?
t-clausen.dk

@ t-clausen.dk该输入机制特定于data.SE站点,它不是任何版本的SQL的标准功能。
BradC

@BradC绝对正确,它是某种编程语言,非常高兴能够最终添加参数输入。我忘记了所有这些,将来我会考虑使用它支付额外的字节
t-clausen.dk

6

C,328个 238 234 215字节:

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

使用大量字符串格式和内置memset函数的递归实现。随着时间的推移,我将尽可能多地尝试高尔夫运动。

C在线!(爱迪生)


奇怪的是,第三只和第四只乌龟在艾迪欧尼号上出现了断裂……
昆汀

@Quentin实际上,那不是Ideone。那是我程序的错。由于某些原因,分钟的输入17和以后,逻辑由于某种原因而中断,因此,海龟也是如此。我目前正在尝试找出问题所在。
R. Kap

不错!请注意,您可以将大多数字符文字('c')替换为它们的ASCII代码以分别保留一个字符:)
Quentin

@Quentin好吗?...效果不是很好。那好吗?
R. Kap

哦! 我检查了一下Ideone,它看起来固定了,但这是因为当然没有那么多乌龟了……朦胧的早晨。
昆汀

4

Java 1.7,238个字节

一组两个功能:第一个遍历输入(海龟数),第二个便于递归构造一系列重复字符(即海龟的前部空格,后背和腹部)。

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

取消高尔夫:

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

    }

}

运行!(爱迪生)

我认为可以从字节数中排除类定义。

通过反转循环的迭代顺序(从底部乌龟向上构建)和/或像其他一些答案一样进行完全递归,我也许可以进一步打高尔夫球。

自我注意:Java确实缺少内置的速记来重复n个字符...



4

蟒蛇, 137 120 113 110字节

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

取消高尔夫:

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

头很硬。


相反的('o','')[b],你可以做'o'*(1-b)(和'o'*b('o','')[1-b])。
Mego

@mego哦,对了,我将其更改为一个空字符,可以正常工作。谢谢!
greyShift

'0'*-~-1短于'0'*(1-b)
Destructible Lemon

-〜i短于(i + 1)
破坏的柠檬

3

F#,218个 207 202 196 187字节。

通过内联变量剃光了大多数这些字节

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

从这个Python答案中偷偷地偷走了逻辑

在线尝试。


3

CJam,88个字节

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

首先制造最大的乌龟(因为否则其他所有乌龟都会站立吗?),然后逐渐减小其大小,直到制造最小的乌龟为止。适用于任何大于0的整数。

在线尝试!


2

Python 2.7版,255个 238 236字节

即使这在其他两个Python 2解决方案中都失败了,我还是喜欢我的递归方法:

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:通过消除一些替换删除了几个字节

edit2:通过将下划线另存为变量来剃除2个字节


2

Python 2,147字节

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)

在线尝试


1

Python 2.7版,139个 114 113 130字节

我也喜欢Iguanodon的递归方法,因此这是一个较短的尝试。

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)

编辑

一个强大的25个 26 9字节golfed由于从可破坏西瓜一些奇妙的技巧。非常感谢!认为它现在可能是最短的Python答案:-)

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)可以缩短为-〜a,n-1可以缩短为〜-n,并且b始终为0或1,因此不能将b缩短为-〜-b,并且可以消除i=input();t(i)部分,因为只允许您使用某个功能。
破坏的柠檬

男人感谢@Destructible的一些很好的提示。还可以发现,由于b始终为1或0,因此1-b起作用,并再失去1个字节。
ElPedro '16

除外,这需要parens,因为*的优先级高于二进制-,但一元的-和〜的优先级高于*
Destructible Lemon

现在,我考虑一下,如果n始终> 0,那么如果n> 1可以缩短为〜-n(n-1),这将切断前导空间。同样,(1-b)可以缩短为-〜
Destructible Lemon

这只会越来越好!我对此很
陌生,

1

PowerShell中105个 100 97 87 85 84字节

-21字节感谢疯子mazzy

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

在线尝试!

巧妙地使用$_--来移位变量,以避免使用重复的($_+1)块来节省几个字节。它还将单个参数转换为字符串,当在一定范围内使用以遍历海龟数量时,该字符串将转换为int。现在最大的窍门是使第二级乌龟的间距仅通过$_%2从当前row_count中减去(即,如果为偶数则为0,如果为奇数则为1)来每隔一行增加一次。

否则,将需要大量索引数学来获取正确的数值_计数,包括形式为的滞后计数器$i++,现在只有一个列表索引才能使头部正确。


@mazzy不能有尾随空格,但我确实将其修改了5个字节,谢谢
Veskah,

1
抱歉:) 85个字节
mazzy

@mazzy Double dang,需要做更多的工作。好东西
Veskah,

1
仅此
而已

0

ES6(JavaScript),140个字节

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

测试

console.log(T(5));

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.