Bütünüyle Kaplumbağalar


74

Olumlu bir tamsayı alan ve her kaplumbağanın üstünde olduğundan daha büyük olduğu ASCII sanat kaplumbağalarının bir yığınını basan veya geri gönderen bir program veya işlev yazın .

Spesifik olarak, eğer girdi ise 1, çıktı şöyle olmalıdır:

 __
/,,\o

Giriş ise 2:

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

Giriş ise 3:

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

Giriş ise 4:

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

Giriş ise 5:

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

Ve böylece daha büyük girişler için aynı düzende.

Bunu not et:

  • oAlt kaplumbağanın başı ( ) daima sağdadır. Daha sonra kaplumbağaların başları ileri geri değişiyor.
  • Hiçbir çizgide sonda boşluk olamaz.
  • Gereksiz ön alanlara izin verilmez. (yani dipteki kaplumbağanın arkası hattın başında olmalıdır.)
  • Tek bir isteğe bağlı izleyen yeni hatta izin verilir.

Bayt cinsinden en kısa kod kazanır.


11
Trichoplax, özyinelemeyi kullanan bir cevap bekliyorum.
El'endia Starman

15
,________,Birisi mantıklı olmayan bir şey söylediğinde.
R. Kap,

8
Her kaplumbağanın yukarı ya da aşağı baktığından emin olmak için kenarları çevirmek ?
Temel

15
ASCII kaplumbağalarını belirttiğine sevindim. Aksi halde, sonunda kaplumbağayı saklamak için 3 bayt harcamak zorunda kalmadığım bir Logo cevabı gönderecektim.
GuitarPicker

4
Kaplumbağaları severim!
Scotty.NET

Yanıtlar:


31

Toplu iş, 256 bayt

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

Satır 1'in bir boşluk ve hat 4'ün iki boşluk olduğunu unutmayın. ibu nedenle, echoher kaplumbağa için uygun miktarda girinti içeren bir komut içerir . Bu arada u, alternatif kaplumbağalardaki alt çizgi sayısını da içerir. Önde gelen bir garip kaplumbağa özel kasalı ve daha sonra kaplumbağaların geri kalanı çiftler halinde çıkar.


25
Tam olarak 256 bayt olduğu için +1. Uzunluğunun yarısını tam olarak bulamazsanız, golf oynamayın!
Rohan Jhunjhunwala

Başlangıçta sondaki boşluklarla ilgili notu kaçırdım, editörümün çoğu bunları kesmek üzere ayarlandı ve neden işe yaramadığını anlayamadım! Batch'i PPCG'de görmek her zaman mutludur. :)
Kaptan Adam

24

C, 131 bayt

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

Çevrimiçi deneyin.

Kaplumbağaları basan bir fonksiyon tanımlar.

Boşlukları almak ve alt çizgi tekrarlamak için printf'in genişlik ve hassasiyet belirticilerini ağır şekilde istismar eder. Her kaplumbağa tek bir printfçağrı kullanılarak yazdırılır :

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

Ayrıca, beyaz boşluk kaldırılmış 144 byte olan farklı bir sürümüm var:

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

Kahretsin, C ++ bir tane eklemek

4
,_,Kodunuzda bulunduğunuz için +1 .
R. Kap,


12

05AB1E, 45 bayt

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

Çevrimiçi deneyin


3
Çok kısa olduğu için oyumu alır.
jseals,

Emin değilim G-loop Ağustos 2016 sürümünde zaten, ama eğer, Lvolabilir Gve her iki yolabilir N-1 byte için.
Kevin Cruijssen

12

V , 57, 53 49 bayt

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

Bu yazdırılamayan karakterler içerdiğinden, burada bir 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

Çevrimiçi deneyin!

Açıklama:

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

Girdiler 0ve altındakiler için ilginç çıktılar .
R. Kap

Bu kod aynı zamanda için çalışmıyor input > 10. Bir yandan notta, yanlışlıkla girdi ile tamamen kırdım 0 41c14. Kodu mu, yoksa koşucuyu mu kırdığımdan emin değilim.
Brandon Anzaldi

1
@ R.Kap Evet, neden böyle yaptığını biliyorum. V, tamsayıları zorlukla anlayabiliyor, bu yüzden -1bir sayı gibi davranamayacağı bir dize olarak görüyor . Neyse ki, bunlarla uğraşmak zorunda değilim.
DJMcMayhem

1
@ BrandonAnzaldi Ah, neden işe yaramadığını anlıyorum. Bunu bir dakika içinde tamir edeceğim. Ayrıca, ondalık sayıdan başka bir işlem yapmanın bazı garip sorunlara neden olması gerekir .
DJMcMayhem

1
Evet! Soğuk çözüm Düzeltmesi biraz basit olacağını düşündüm. Yukarıda sözü edilen yanlışlıkla yazılmış klavye püre çıktılarından çok ama çok etkilenmiştim. Önde gelen boşluklar da eğlenceli çıktılar veriyor. Görünüşe göre V oldukça hoş bir şekilde kırıldı!
Brandon Anzaldi

11

Perl, 92 bayt

İçin 91 bayt kodu +1 -n.

-EEk ücret ödemeden gerektirir .

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

kullanım

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

Yeniden çalışmasıyla -9 baytlık @Dada'ya teşekkürler !


1
Güzel. Başka bir sürümü, aynı bytecount: perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Ben de 100 yaşın altına girmeye çalıştım ama başaramadım ...
Dada

@Dada Teşekkürler! Güncelleme, çok takdir!
Dom Hastings,

10

Çedar , 105 bayt

n->(|>n).map(i->(1-i%2)*"o"+"\\,"+(n-i-1)*"__"+",/"+i%2*"o"+i/2*"  "+"\n"+(n-i)*"__"+(i+1)*" ").vfuse.rev

2
Peynir kullanmak için +1. Bayt kurtarmak için değişmez yeni satırı kullanabilirsiniz
Downgoat


6

Python 2, 116 Bayt

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

Ben adresinden sayısı elde 115 byte ve kullanmakta tek bayt kaydedebilirsiniz lambda m:for i in r...yerineinput()
wnnmaw

6

R , 150 bayt

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

daha temiz (bayt ekler)

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

Temel yapı tekrarlı bir şekilde kendisini çağırır - hem aranacak son sayıyı hem de geçerli seviyeyi söyler. Y = 1 için varsayılan değerle başlar, bu nedenle ilk çağrı için yalnızca bir değişkene ihtiyaç duyar. Sık kullanılan iki değeri hızlıca tanımlar. Sonra her şeyi gerekli sayıda tekrarlar.

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

Bunların her biri, kafanın sağa mı yoksa sola mı ekleneceğini ve uygun şekilde yerleştirilip yerleştirilmediğini test eder.


#Diğer cevaplar gibi formatlamak için markdown editöründeki başlığın önünde kullanın .
TheBikingViking,

özür dilerim - yani düzenlenir
user5957401 21

6

TSQL, 189 bayt

Şimdi giriş kabulüyle - @PatrickRoberts sayesinde

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

Keman



@PatrickRoberts teşekkürler, bir tane bilmiyordum, bu sql server 2016 mı?
t-clausen.dk

@ t-clausen.dk Bu giriş mekanizması data.SE sitesine özgüdür, herhangi bir SQL versiyonunun standart bir özelliği değildir.
BradC

@BradC kesinlikle haklısın, bir çeşit programlama dili ve sonunda bir parametre girişi ekleyebilmeniz çok güzel. Bütün bunları unuttum ve gelecekte ekstra bayt ödemeyi kullanmayı düşüneceğim
t-clausen.dk

6

C, 328 238 234 215 bayt:

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

Çok sayıda dize biçimlendirme ve yerleşik memsetişlevi kullanan özyinelemeli bir uygulama . Bu zamana elimden geldiğince daha fazla golf dener ve golf oynayacak.

C Çevrimiçi! (Ideone)


Garip bir şekilde, üçüncü ve dördüncü kaplumbağalar İdeone'de kırılmış görünüyorlar ...
Quentin

@ Quentin Aslında, bu Ideone değil. Bu benim programımın hatası. Bazı nedenlerden dolayı, dakika girişi yaklaşır 17ve öteye giderse, mantık bir sebepten dolayı kırılır ve bu nedenle de kaplumbağalar aynı şekildedir. Şu anda neyin yanlış olduğunu bulmaya çalışıyorum.
R. Kap

Güzel ! 'c'Her biri birer karakteri değiştirmek için çoğu karakter değişmezini ( ) ASCII koduyla değiştirebileceğinizi unutmayın :)
Quentin

@ Quentin Nice? ... Çok iyi çalışmıyor. Bu nasıl güzel
R. Kap

Ah! İdeone tekrar baktım ve sabit görünüyordu, ama bunun sebebi daha az kaplumbağa olduğu için ... Puslu sabah.
Quentin

4

Java 1.7, 238 bayt

İki fonksiyondan oluşan bir set: ilk önce giriş üzerinde yinelenir (kaplumbağa sayısı), ikincisi yinelemeli olarak tekrarlanan karakter dizileri oluşturmayı kolaylaştırır (yani ön boşluklar, kaplumbağaların sırtı ve göbeği).

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

    }

}

Koş! (Ideone)

Sınıf tanımını bayt sayısından dışlamanın tamam olduğunu varsaydım.

Bu döngünün yineleme sırasını tersine çevirerek (alttan kaplumbağadan inşa) ve / veya diğer cevapların bazıları gibi özyinelemeli hale getirerek biraz daha golf oynayabilirim.

Kendime Not: Java, n karakteri tekrarlamak için yerleşik bir kısa yoldan yoksundur ...



4

Python, 137 120 113 110 bayt

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

Kafalar zordu.


Bunun yerine, ('o','')[b]yapabilirsiniz 'o'*(1-b)(ve 'o'*biçin ('o','')[1-b]).
Mego

@ mego oh sağ, ben işe yaradı boş bir karaktere değiştirdim. Teşekkürler!
greyShift

'0'*-~-1daha kısadır'0'*(1-b)
Yıkılabilir Limon

ve - p daha kısadır, (i + 1)
tahrip limon

3

F #, 218 207 202 196 187 bayt.

Bu baytların çoğu, değişkenleri satır içine alarak tıraş edildi

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

Mantık utanmadan bu Python cevabından çalındı

Çevrimiçi deneyin.


3

CJam , 88 bayt

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

Öncelikle en büyük kaplumbağayı yapar (aksi halde diğer kaplumbağalar neyin üzerinde dururdu?), Ardından en küçüğü yapılana kadar kademeli olarak küçültülür. 0'dan büyük herhangi bir tam sayı için çalışır.

Çevrimiçi deneyin!


2

Python 2.7, 255 238 236 bayt

Bu, diğer Python 2 çözümlerinin her ikisine de kaybederse de özyinelemeli yaklaşımımı beğendim:

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: bazı değiştirmeleri ortadan kaldırarak birkaç bayt attı

edit2: alt çizgi değişken olarak kaydederek traş 2 bayt


2

Python 2, 147 bayt

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)

Çevrimiçi deneyin


1

Python 2.7, 139 114 113 130 bayt

Ben de Iguanodon'un özyinelemeli yaklaşımını beğendim, bu yüzden işte biraz daha kısa bir girişim.

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)

DÜZENLE

Güçlü 25 26 9 byte, Yıkılabilir Karpuz'dan gelen müthiş ipuçları nedeniyle golf oynuyor. Çok teşekkürler! Şimdi en kısa Python cevabı olabilir bence :-)

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 ile kısaltılabilir ve n-1 ~ -n olarak kısaltılabilir ve b her zaman 0 veya 1'dir, bu nedenle b, - ~ -b olarak kısaltılamaz ve ortadan kaldırabilirsiniz i=input();t(i)çünkü sadece bir işleve sahip olmanıza izin verilir.
Yıkılabilir Limon,

Adam harika ipuçları için teşekkürler @ Yıkılabilir. Ayrıca b'nin her zaman 1 veya 0 olması durumunda 1-b'nin 1 bayt daha kaybolduğunu ve kaybolduğunu tespit edin.
ElPedro

bunun dışında parens gerektirecektir, çünkü * ikilikten daha yüksek önceliğe sahiptir -, ancak unary - ve ~ * 'den daha yüksek önceliğe sahiptir
Yok

Şimdi düşünüyorum da, eğer n daima> 0 ise, o zaman n> 1 ~ -n (n-1) 'e kısaltılabiliyorsa, bu da öndeki alanı keser. Ayrıca, tekrar, (1-b), parens olmadan - ~ -b olarak kısaltılabilir
Yok

Bu gittikçe daha iyi oluyor! Bu konuda oldukça yeniyim ve daha fazla okunabilir kod yazmaya alışkınım, bu nedenle ipuçlarınız çok takdir edilir :)
ElPedro

1

PowerShell , 105 100 97 87 85 84 bayt

-21 bayt, mazzy, deli adam sayesinde

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

Çevrimiçi deneyin!

Birkaç bayttan tasarruf $_--etmek için tekrarlanan ($_+1)blokları kullanmaktan kaçınmak için değişkenleri akıllıca kaydırır . Ayrıca, tek bir argümanı kaplumbağaların sayısı boyunca yinelemek için bir aralıkta kullanıldığında bir int'ye dönüştürülen bir dizgeye dönüştürür. Şimdi en büyük numara, bir kaplumbağanın 2. seviyesine sahip $_%2olmaktır; sadece her diğer satırı mevcut satır_ sayısından çıkartarak (örneğin, eğer 0 ise 1 bile) çıkararak arttırır.

Aksi taktirde, uygun bir şekilde elde etmek için çok fazla indeks matematiği vardır _ve sayıları, şeklinde bir gecikme sayacı dahil $i++, ve şimdi kafasını doğru tarafa koymak için sadece tek bir liste indeksi.


@mazzy Sondaki boşluklara sahip olamıyorum ama 5 bayt için değiştirdim, teşekkürler
Veskah

1
Üzgünüm :) 85 bayt
mazzy

@mazzy Çift dang, daha fazla iş koyarak. İyi şeyler
Veskah

1
Hepsi bu kadar :) 84 bayt
mazzy

0

ES6 (JavaScript), 140 bayt

kod

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

Ölçek

console.log(T(5));

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.