Turtles Sepanjang Jalan Turun

74

Tulis program atau fungsi yang mengambil bilangan bulat positif dan mencetak atau mengembalikan setumpuk kura - kura seni ASCII yang banyak itu , di mana masing-masing kura-kura lebih besar daripada yang di atasnya.

Khususnya, jika inputnya adalah 1, outputnya harus:

 __
/,,\o

Jika inputnya adalah 2:

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

Jika inputnya adalah 3:

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

Jika inputnya adalah 4:

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

Jika inputnya adalah 5:

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

Dan seterusnya dalam pola yang sama untuk input yang lebih besar.

Perhatikan bahwa:

  • Kepala okura-kura bawah selalu di sebelah kanan. Kepala kura-kura di atas kemudian bergantian bolak-balik.
  • Tidak ada garis yang memiliki spasi tambahan.
  • Ruang terkemuka berlebihan tidak diizinkan. (Yaitu bagian belakang kura-kura bawah harus di awal garis.)
  • Jalur trailing opsional tunggal diizinkan.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
11
trichoplax, saya mengharapkan jawaban yang menggunakan rekursi.
El'endia Starman
15
,________,Ketika seseorang mengatakan sesuatu yang tidak masuk akal.
R. Kap
8
Membalik sisi untuk memastikan bahwa setiap kura-kura melihat ke atas atau ke bawah melihat keledai
Dasar
15
Saya senang Anda menyebutkan kura-kura ASCII. Kalau tidak, saya akhirnya akan mengirimkan jawaban Logo di mana saya tidak perlu membuang 3 byte untuk menyembunyikan kura-kura.
GuitarPicker
4
Saya suka kura-kura!
Scotty.NET

Jawaban:

31

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

Perhatikan bahwa baris 1 memiliki spasi tambahan dan baris 4 memiliki dua spasi tambahan. iOleh karena itu berisi echoperintah dengan jumlah indentasi yang sesuai untuk setiap kura-kura. Sementara itu uberisi jumlah garis bawah dalam kura-kura alternatif. Kura-kura aneh yang memimpin adalah cased khusus dan kemudian kura-kura yang lain berpasangan.

Neil
sumber
25
+1 untuk tepat 256 byte. Jangan main golf kecuali jika Anda dapat persis setengah panjangnya!
Rohan Jhunjhunwala
Awalnya saya merindukan catatan tentang spasi tambahan, sebagian besar editor saya diatur untuk memotongnya dan saya tidak tahu mengapa itu tidak berhasil! Selalu senang melihat Batch di 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;}

Cobalah online.

Menentukan fungsi yang mencetak kura-kura.

Sangat berat menyalahgunakan lebar dan presisi penentu printf untuk mendapatkan jarak dan mengulangi garis bawah. Setiap kura-kura dicetak menggunakan satu printfpanggilan:

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

Saya juga memiliki versi berbeda yaitu 144 byte dengan spasi kosong dihapus:

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;
}}
orlp
sumber
Sial, saya akan menambahkan C ++ satu
4
+1 karena ada ,_,dalam kode Anda.
R. Kap
14

Ruby, 100 byte

Solusi rekursif. Cobalah 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]}
Nilai Tinta
sumber
12

05AB1E, 45 byte

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

Cobalah online

Emigna
sumber
3
Mendapat suara saya karena begitu singkat.
jseals
Tidak yakin apakah G-loop sudah dalam versi Agustus 2016, tetapi jika itu, Lvbisa Gdan keduanya ybisa Nuntuk -1 byte.
Kevin Cruijssen
12

V , 57, 53 49 byte

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

Karena ini berisi karakter yang tidak patut dicetak, berikut adalah 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

Cobalah online!

Penjelasan:

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
DJMcMayhem
sumber
Output menarik untuk input 0dan di bawah ini.
R. Kap
Kode ini juga tidak berfungsi input > 10. Di samping catatan, saya tidak sengaja memecahkannya sepenuhnya dengan input 0 41c14. Tidak yakin apakah saya memecahkan kode, atau pelari.
Brandon Anzaldi
1
@ R.Kap Ya, saya pikir saya tahu mengapa ia melakukan itu. V nyaris tidak bisa memahami bilangan bulat, jadi itu hanya dilihat -1sebagai string yang tidak bisa dipikirkan adalah angka. Untungnya, saya tidak harus menangani itu.
DJMcMayhem
1
@BrandonAnzaldi Ah, saya mengerti mengapa itu tidak berhasil. Saya akan memperbaikinya dalam satu menit. Juga, melakukan apa pun selain angka desimal pasti akan menyebabkan beberapa masalah aneh .
DJMcMayhem
1
Ya! Solusi keren Kupikir itu mungkin akan agak mudah diperbaiki. Saya sangat, sangat terpesona dengan output dari keyboard mash yang tidak disengaja tersebut. Ruang terdepan juga menghasilkan output yang menyenangkan. Sepertinya Anda bertengkar V dengan cukup baik!
Brandon Anzaldi
11

Perl, 92 byte

91 byte kode +1 untuk -n.

Membutuhkan -Etanpa biaya tambahan.

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

Pemakaian

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

Berkat @Dada untuk -9 byte dengan re-work-nya!

Dom Hastings
sumber
1
Bagus Versi lain, bytecount yang sama: perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Saya mencoba untuk mendapatkan di bawah 100 juga tetapi tidak bisa ...
Dada
@Dada, Terima kasih! Diperbarui, sangat dihargai!
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
Biarawati Bocor
sumber
2
+1 untuk menggunakan keju. Anda dapat menggunakan baris baru literal untuk menyimpan byte
Downgoat
10

Retina , 97 91 88 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Cobalah online!

Martin Ender
sumber
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
Naveen Arun
sumber
Saya mendapatkan hitungan Anda pada 115 byte dan Anda dapat menghemat satu byte dengan menggunakan lambda m:for i in r...bukaninput()
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)}

lebih bersih (menambahkan satu 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)
}

Struktur dasar secara rekursif menyebut dirinya - memberitahukan nomor terakhir yang akan dipanggil dan level saat ini. Mulai dengan default untuk y = 1, jadi hanya perlu satu variabel untuk panggilan awal. Mendefinisikan dua nilai yang sering digunakan dengan cepat. Maka itu hanya mengulangi semua yang diperlukan beberapa kali.

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

Masing-masing secara implisit menguji apakah akan menambahkan kepala ke kanan atau kiri dan menempatkannya dengan tepat.

pengguna5957401
sumber
Gunakan #sebelum judul di editor markdown untuk memformatnya seperti jawaban lainnya.
TheBikingViking
permintaan maaf - telah diedit
user5957401
6

TSQL, 189 byte

Sekarang dengan penerimaan input - terima kasih kepada @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

Biola

t-clausen.dk
sumber
@ PatrickRoberts terima kasih, tidak tahu itu, apakah itu sql server 2016?
t-clausen.dk
@ t-clausen.dk Mekanisme input itu khusus untuk situs data.SE, ini bukan fitur standar dari versi SQL mana pun.
BradC
@BradC Anda benar sekali, ini adalah semacam bahasa pemrograman, dan sangat bagus untuk akhirnya dapat menambahkan input parameter. Saya lupa semua tentang ini, dan saya akan mempertimbangkan menggunakannya di masa depan membayar ekstra 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);}

Implementasi rekursif menggunakan banyak pemformatan string dan memsetfungsi builtin . Akan mencoba dan golf ini seiring waktu sebanyak yang saya bisa.

C Online! (Ideone)

R. Kap
sumber
Anehnya, kura-kura ketiga dan keempat muncul rusak di Ideone ...
Quentin
@ Quentin Sebenarnya, itu bukan Ideone. Itu salah program saya. Untuk beberapa alasan, input menit mendekati 17dan di luar, logika pecah karena beberapa alasan, dan karena itu, begitu juga kura-kura. Saat ini saya mencoba mencari tahu apa yang salah.
R. Kap
Bagus! Perhatikan bahwa Anda dapat mengganti sebagian besar karakter literal ( 'c') dengan kode ASCII mereka masing-masing untuk satu karakter :)
Quentin
@ Quentin Bagus? ... Tidak berfungsi dengan baik. Bagaimana itu menyenangkan?
R. Kap
Oh! Saya memeriksa kembali pada Ideone dan itu terlihat tetap, tapi itu karena tentu saja ada lebih sedikit kura-kura ... Pagi yang kabur.
Quentin
4

Java 1.7, 238 byte

Satu set dua fungsi: pertama iterasi atas input (# kura-kura), kedua memfasilitasi dalam membangun urutan karakter berulang secara rekursif (yaitu ruang terkemuka, bagian belakang dan perut kura-kura).

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

Tidak Disatukan:

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

    }

}

Menjalankannya! (Ideone)

Saya berasumsi tidak apa-apa untuk mengecualikan definisi kelas dari jumlah byte.

Saya mungkin bisa bermain golf ini sedikit lebih jauh dengan membalikkan urutan iterasi dari loop (membangun dari penyu bawah) dan / atau dengan menjadi sepenuhnya rekursif seperti beberapa jawaban lainnya.

Catatan untuk diri sendiri: Java benar-benar tidak memiliki singkatan untuk mengulang n karakter ...

MH.
sumber
4

Python, 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

Tidak Disatukan:

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

Kepala-kepala itu keras.

greyShift
sumber
Alih-alih ('o','')[b], Anda bisa melakukan 'o'*(1-b)(dan 'o'*buntuk ('o','')[1-b]).
Mego
@ego oh benar, saya mengubahnya menjadi char kosong, itu berfungsi. Terima kasih!
greyShift
'0'*-~-1lebih pendek dari'0'*(1-b)
Lemon Destructible
dan - ~ i lebih pendek dari (i + 1)
Destructible Lemon
3

F #, 218 207 202 196 187 bytes.

Mencukur sebagian besar byte ini dengan memasukkan variabel

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

Logikanya dicuri tanpa malu-malu dari jawaban Python ini

Cobalah online.

asibahi
sumber
3

CJam , 88 byte

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

Jadikan kura-kura terbesar terlebih dahulu (karena jika tidak, apa yang akan dilakukan oleh setiap kura-kura lainnya?), Kemudian secara bertahap mengurangi ukurannya sampai yang terkecil dibuat. Bekerja untuk bilangan bulat apa pun yang lebih besar dari 0.

Cobalah online!

CJ Dennis
sumber
2

Python 2.7, 255 238 236 byte

Meskipun ini kalah dari kedua solusi Python 2 lainnya, saya menyukai pendekatan rekursif saya:

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:]

sunting1: turun beberapa byte dengan menghilangkan beberapa penggantian

sunting2: mencukur 2 byte dengan menyimpan garis bawah sebagai variabel

Iguanodon
sumber
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)

Cobalah online

Mego
sumber
1

Python 2.7, 139 114 113 130 byte

Saya juga menyukai pendekatan rekursif Iguanodon jadi inilah upaya yang sedikit lebih pendek.

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)

SUNTING

Sebuah 25 26 9 byte perkasa golf karena beberapa tips fantastis dari Destructible Semangka. Terimakasih banyak! Pikirkan itu mungkin jawaban Python terpendek sekarang :-)

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)
ElPedro
sumber
(a + 1) dapat disingkat menjadi - ~ a, dan n-1 dapat disingkat menjadi ~ -n, dan b selalu 0 atau 1, jadi b tidak dapat disingkat menjadi - ~ -b, dan Anda dapat menghilangkan i=input();t(i)sebagian, karena Anda diizinkan untuk hanya memiliki fungsi.
Destructible Lemon
Man terima kasih untuk beberapa petunjuk @Destructible. Juga melihat bahwa sebagai b selalu 1 atau 0 maka 1-b berfungsi dan kehilangan 1 byte lebih.
ElPedro
kecuali bahwa itu akan memerlukan parens, karena * memiliki prioritas lebih tinggi daripada biner -, tetapi unary - dan ~ memiliki prioritas lebih tinggi dari *
Destructible Lemon
Sekarang saya berpikir tentang itu, jika n selalu> 0, maka jika n> 1 dapat disingkat menjadi ~ -n (n-1), yang memotong ruang terdepan. Juga, sekali lagi, (1-b) dapat disingkat menjadi - ~ -b tanpa paren
Destructible Lemon
Ini semakin baik dan lebih baik! Saya cukup baru dalam hal ini dan lebih terbiasa menulis kode yang dapat dibaca sehingga petunjuk Anda sangat dihargai :)
ElPedro
1

PowerShell , 105 100 97 87 85 84 byte

-21 byte berkat mazzy, si lelaki gila

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

Cobalah online!

Secara cerdik menggeser variabel yang digunakan $_--untuk menghindari penggunaan ($_+1)blok berulang untuk menghemat beberapa byte. Ini juga mengubah argumen tunggal menjadi string yang kemudian dilemparkan ke int ketika digunakan dalam rentang untuk beralih melalui jumlah kura-kura. Trik terbesar sekarang adalah tingkat ke-2 dari jarak penyu hanya menambah setiap baris lainnya dengan mengurangi $_%2(yaitu 0 jika genap, 1 jika aneh) dari row_count saat ini.

Kalau tidak, itu banyak indeks matematika untuk mendapatkan yang tepat _dan diperhitungkan, termasuk penghitung lag dalam bentuk $i++, dan sekarang hanya indeks daftar tunggal untuk menempatkan kepala di sisi yang benar.

Veskah
sumber
@ Mazzy Tidak dapat memiliki spasi tambahan tapi saya memodifikasinya selama 5 byte, terima kasih
Veskah
1
Maafkan aku :) 85 byte
mazzy
@ Malzy Double dang, melakukan lebih banyak pekerjaan. Barang bagus
Veskah
1
Itu saja :) 84 byte
mazzy
0

ES6 (JavaScript), 140 byte

Kode

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

Uji

console.log(T(5));

     --
    /,,\o
    ----
  o/,__,\
   ------
  /,____,\o
  --------
o/,______,\
 ----------
/,________,\o
zeppelin
sumber
0

Kanvas , 26 byte

╷_×,×l_×∔/×║o×⇵↔⁸¹-[  ×↔}]

Coba di sini!

dzaima
sumber