Những con rùa đều lặn xuống dưới


74

Viết chương trình hoặc hàm lấy số nguyên dương và in hoặc trả về một chồng nhiều rùa nghệ thuật ASCII , trong đó mỗi con rùa lớn hơn con rùa bên trên nó.

Cụ thể, nếu đầu vào là 1, đầu ra phải là:

 __
/,,\o

Nếu đầu vào là 2:

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

Nếu đầu vào là 3:

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

Nếu đầu vào là 4:

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

Nếu đầu vào là 5:

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

Và như vậy trong cùng một mô hình cho đầu vào lớn hơn.

Lưu ý rằng:

  • Đầu (cái o) của con rùa dưới luôn ở bên phải. Đầu của những con rùa ở trên sau đó luân phiên qua lại.
  • Không có dòng có thể có dấu cách.
  • Không gian hàng đầu thừa không được phép. (tức là mặt sau của rùa dưới cùng nên ở đầu dòng.)
  • Một dòng mới tùy chọn duy nhất được cho phép.

Mã ngắn nhất tính bằng byte thắng.


11
trichoplax, tôi đang mong đợi một câu trả lời sử dụng đệ quy.
El'endia Starman

15
,________,Khi ai đó nói điều gì đó vô nghĩa.
R. Kap

8
Lật hai bên để đảm bảo rằng mọi con rùa nhìn lên hoặc xuống đều nhìn thấy một cái mông?
Cơ bản

15
Tôi rất vui vì bạn đã chỉ định rùa ASCII. Mặt khác, cuối cùng tôi đã gửi một câu trả lời Logo mà tôi đã không phải lãng phí 3 byte để ẩn con rùa.
GuitarPicker

4
Tôi thích rùa!
Scotty.NET

Câu trả lời:


31

Hàng loạt, 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%__

Lưu ý rằng dòng 1 có không gian dấu và dòng 4 có hai khoảng trắng ở cuối. ido đó chứa một echolệnh với lượng thụt đầu dòng thích hợp cho mỗi con rùa. Trong khi đó uchứa số lượng dấu gạch dưới trong rùa thay thế. Một con rùa kỳ lạ hàng đầu có vỏ đặc biệt và sau đó những con rùa còn lại được xuất ra theo cặp.


25
+1 cho chính xác là 256 byte. Đừng chơi golf trừ khi bạn có thể chính xác một nửa chiều dài của nó!
Rohan Jhunjhunwala

Ban đầu tôi đã bỏ lỡ ghi chú về dấu cách, hầu hết các biên tập viên của tôi được sắp xếp để loại bỏ chúng và tôi không thể hiểu tại sao nó không hoạt động! Luôn luôn vui khi thấy Batch trên PPCG. :)
Thuyền trưởng 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;}

Hãy thử trực tuyến.

Xác định một chức năng in các con rùa.

Rất lạm dụng các chỉ định độ rộng và độ chính xác của printf để có khoảng cách và lặp lại các dấu gạch dưới. Mỗi con rùa được in bằng một printfcuộc gọi duy nhất :

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

Tôi cũng có một phiên bản khác là 144 byte với khoảng trắng bị xóa:

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

Chết tiệt, tôi chuẩn bị thêm một C ++

4
+1 để có ,_,mã của bạn.
R. Kap


12

05AB1E, 45 byte

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

Dùng thử trực tuyến


3
Được bình chọn của tôi là rất ngắn.
jseals

Không chắc chắn G-loop đã có trong phiên bản tháng 8 năm 2016 chưa, nhưng nếu có, Lvcó thể Gvà cả hai ycó thể Ncho -1 byte.
Kevin Cruijssen

12

V , 57, 53 49 byte

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

Vì phần này chứa các ký tự không thể in được, đây là một 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

Hãy thử trực tuyến!

Giải trình:

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

Đầu ra thú vị cho đầu vào 0và dưới đây.
R. Kap

Mã này cũng không hoạt động input > 10. Bên cạnh đó, tôi vô tình phá vỡ nó hoàn toàn với đầu vào 0 41c14. Không chắc chắn nếu tôi phá vỡ mã, hoặc người chạy.
Brandon Anzaldi

1
@ R.Kap Vâng, tôi nghĩ rằng tôi biết tại sao nó làm điều đó. V hầu như không thể hiểu được các số nguyên, vì vậy nó chỉ xem -1như một chuỗi mà nó không thể giả vờ là một số. Rất may, tôi không phải xử lý chúng.
DJMcMayhem

1
@BrandonAnzaldi Ah, tôi hiểu tại sao điều đó không hiệu quả. Tôi sẽ sửa nó trong một phút nữa. Ngoài ra, làm bất cứ điều gì khác ngoài số thập phân bị ràng buộc gây ra một số vấn đề kỳ lạ .
DJMcMayhem

1
Vâng Dung dịch mát. Hình nó có thể là hơi đơn giản để sửa chữa. Tôi chỉ rất, rất thích thú với đầu ra của bản mash keyboard vô tình đã nói ở trên. Không gian hàng đầu cũng tạo ra một số đầu ra vui vẻ. Có vẻ như bạn quẫy V khá độc đáo!
Brandon Anzaldi

11

Perl, 92 byte

Mã 91 byte +1 cho -n.

Yêu cầu -Ekhông có chi phí thêm.

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

Sử dụng

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

Cảm ơn @Dada cho -9 byte với công việc của anh ấy!


1
Đẹp một. Một phiên bản khác, cùng bytecount : perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Tôi cũng đã cố gắng để có được dưới 100 nhưng không được ...
Dada

@Dada Cảm ơn! Cập nhật, đánh giá cao!
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 để sử dụng phô mai. Bạn có thể sử dụng dòng mới theo nghĩa đen để lưu byte
Downgoat


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

Tôi nhận được số đếm của bạn ở mức 115 byte và bạn có thể lưu một byte bằng cách sử dụng lambda m:for i in r...thay vìinput()
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)}

sạch sẽ hơn (thêm một 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)
}

Cấu trúc cơ bản gọi đệ quy chính nó - bao gồm cả số cuối cùng được gọi và cấp độ hiện tại. Bắt đầu với mặc định cho y = 1, vì vậy nó chỉ cần một biến cho cuộc gọi ban đầu. Nhanh chóng xác định hai giá trị thường được sử dụng. Sau đó, nó chỉ lặp đi lặp lại mọi thứ với số lần cần thiết.

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

Mỗi trong số này đều ngầm kiểm tra xem nên thêm đầu vào bên phải hay bên trái và đặt nó một cách thích hợp.


Sử dụng #trước tiêu đề trong trình chỉnh sửa markdown để định dạng nó giống như các câu trả lời khác.
TheBikingViking

lời xin lỗi - đã được chỉnh sửa
user5957401

6

TSQL, 189 byte

Bây giờ với sự chấp nhận đầu vào - cảm ơn @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

Vĩ cầm



@PatrickRoberts cảm ơn, không biết cái đó là máy chủ sql 2016 phải không?
t-clausen.dk

@ t-clausen.dk Cơ chế nhập liệu đó dành riêng cho trang web data.SE, đây không phải là một tính năng tiêu chuẩn của bất kỳ phiên bản SQL nào.
BradC

@BradC bạn hoàn toàn đúng, nó là một loại ngôn ngữ lập trình và rất hay để cuối cùng có thể thêm một tham số đầu vào. Tôi đã quên tất cả về điều này và tôi sẽ xem xét sử dụng nó trong tương lai trả thêm byte
t-clausen.dk

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

Việc thực hiện đệ quy sử dụng nhiều định dạng chuỗi và memsethàm dựng sẵn . Sẽ cố gắng và chơi golf này theo thời gian nhiều nhất có thể.

C Nó trực tuyến! (Ý)


Thật kỳ lạ, những con rùa thứ ba và thứ tư dường như bị vỡ trên Ideone ...
Quentin

@Quentin Thật ra, đó không phải là Ideone. Đó là lỗi chương trình của tôi. Vì một số lý do, đầu vào phút tiếp cận 17và hơn thế nữa, logic bị phá vỡ vì một số lý do, và do đó, rùa cũng vậy. Tôi hiện đang cố gắng tìm ra những gì sai.
R. Kap

Đẹp ! Lưu ý rằng bạn có thể thay thế hầu hết các ký tự chữ ( 'c') bằng mã ASCII của chúng để thay thế một ký tự mỗi ký tự :)
Quentin

@Quentin Nice? ... Nó không hoạt động tốt. Làm thế nào là tốt đẹp?
R. Kap

Oh! Tôi đã kiểm tra lại Ideone và nó có vẻ đã được sửa, nhưng đó là vì dĩ nhiên có ít rùa hơn ... Buổi sáng nguy hiểm.
Quentin

4

Java 1.7, 238 byte

Một bộ gồm hai chức năng: lần đầu tiên lặp qua đầu vào (# của rùa), lần thứ hai tạo điều kiện cho việc xây dựng một chuỗi các ký tự lặp lại theo cách đệ quy (tức là khoảng trắng đầu, lưng và bụng của rùa).

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

Ung dung:

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

    }

}

Chạy đi! (Ý)

Tôi đã giả sử không sao khi loại trừ định nghĩa lớp khỏi số byte.

Tôi có thể chơi gôn này xa hơn một chút bằng cách đảo ngược thứ tự lặp của vòng lặp (xây dựng từ rùa dưới lên) và / hoặc bằng cách đệ quy hoàn toàn như một số câu trả lời khác.

Lưu ý đến bản thân: Java thực sự thiếu một tốc ký tích hợp để lặp lại n ký tự ...



4

Con trăn 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

Ung dung:

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

Những cái đầu đã cứng.


Thay vì ('o','')[b], bạn có thể làm 'o'*(1-b)(và 'o'*bcho ('o','')[1-b]).
Mego

@mego oh đúng, tôi đã thay đổi nó thành một char trống, nó hoạt động. cảm ơn!
greyShift

'0'*-~-1ngắn hơn'0'*(1-b)
Lemon phá hủy

và - ~ i ngắn hơn (i + 1)
Lemon phá hủy

3

F #, 218 207 202 196 187 byte.

Cạo hầu hết các byte này bằng các biến nội tuyến

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

Logic bị đánh cắp một cách đáng xấu hổ từ câu trả lời Python này

Hãy thử trực tuyến.


3

CJam , 88 byte

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

Làm cho con rùa lớn nhất trước tiên (bởi vì nếu không thì mọi con rùa khác sẽ đứng ở đâu?), Sau đó giảm dần kích thước cho đến khi con nhỏ nhất được tạo ra. Hoạt động cho bất kỳ số nguyên lớn hơn 0.

Hãy thử trực tuyến!


2

Python 2.7, 255 238 236 byte

Mặc dù điều này thua cả hai giải pháp Python 2 khác, tôi vẫn thích cách tiếp cận đệ quy của mình:

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: bỏ một vài byte bằng cách loại bỏ một số thay thế

edit2: cạo 2 byte bằng cách lưu dấu gạch dưới làm biến


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)

Dùng thử trực tuyến


1

Python 2.7, 139 114 113 130 byte

Tôi cũng thích cách tiếp cận đệ quy của Iguanodon vì vậy đây là một nỗ lực ngắn hơn một chút.

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)

BIÊN TẬP

Một 25 26 9 byte mạnh mẽ được chơi golf nhờ một số lời khuyên tuyệt vời từ Dưa hấu phá hủy. Cảm ơn nhiều! Hãy nghĩ rằng nó có thể là câu trả lời Python ngắn nhất bây giờ :-)

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) có thể được rút ngắn thành - ~ a và n-1 có thể rút ngắn thành ~ -n và b luôn là 0 hoặc 1, vì vậy không thể rút ngắn b thành - ~ -b và bạn có thể loại bỏ i=input();t(i)một phần, bởi vì bạn được phép chỉ có một chức năng.
Lemon phá hủy

Man cảm ơn vì một số gợi ý tuyệt vời @Desturationible. Cũng phát hiện ra rằng vì b luôn luôn là 1 hoặc 0 nên 1-b hoạt động và mất thêm 1 byte.
ElPedro

ngoại trừ việc đó sẽ yêu cầu parens, bởi vì * có mức độ ưu tiên cao hơn nhị phân - nhưng đơn nhất - và ~ có mức độ ưu tiên cao hơn *
Lemon

Bây giờ tôi nghĩ về nó, nếu n luôn luôn> 0, thì nếu n> 1 có thể rút ngắn thành ~ -n (n-1), nó sẽ tách ra khỏi không gian hàng đầu. Ngoài ra, một lần nữa, (1-b) có thể được rút ngắn thành - ~ -b mà không có parens
Lemon phá hủy

Điều này trở nên tốt hơn và tốt hơn! Tôi khá mới với điều này và đã quen với việc viết mã dễ đọc hơn nên những gợi ý của bạn được đánh giá rất cao :)
ElPedro

1

PowerShell , 105 100 97 87 85 84 byte

-21 byte nhờ mazzy, người điên

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

Hãy thử trực tuyến!

Khéo léo chuyển các biến bằng cách sử dụng $_--để tránh sử dụng ($_+1)các khối lặp lại để lưu một vài byte. Nó cũng chuyển đổi một đối số thành một chuỗi mà sau đó được chuyển thành int khi được sử dụng trong một phạm vi để lặp lại thông qua số lượng rùa. Thủ thuật lớn nhất hiện nay có khoảng cách thứ 2 của khoảng cách rùa chỉ tăng mỗi hàng khác bằng cách trừ $_%2(tức là 0 nếu chẵn, 1 nếu lẻ) từ hàng hiện tại.

Mặt khác, rất nhiều phép toán chỉ số để có được số đếm _số chính xác, bao gồm cả bộ đếm độ trễ ở dạng $i++, và bây giờ chỉ có một chỉ mục danh sách duy nhất để đặt đầu vào đúng.


@mazzy Không thể có dấu cách nhưng tôi đã sửa đổi nó trong 5 byte, cảm ơn
Veskah

1
Tôi xin lỗi :) 85 byte
mazzy

@mazzy Đôi dang, đưa vào làm việc nhiều hơn. Thứ tốt
Veskah

1
Đó là tất cả :) 84 byte
mazzy

0

ES6 (JavaScript), 140 byte

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

Kiểm tra

console.log(T(5));

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.