亀はずっと下に


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、私は再帰を使用した答えを期待しています。
エレンディアスターマン

15
,________,誰かが意味をなさない何かを言うとき。
R. Kap

8
見上げたり見下ろしたりするすべてのカメがロバを見られるように、側面を反転させますか?
基本

15
ASCIIタートルを指定してくれてうれしいです。そうでなければ、私は最終的にロゴの回答を提出するつもりでしたが、亀を隠すために3バイトを無駄にする必要はありませんでした。
GuitarPicker

4
私は亀が好きです!
Scotty.NET

回答:


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には2つの末尾スペースがあることに注意してください。iしたがってecho、それぞれのカメに適切な量のインデントを持つコマンドが含まれています。一方u、交互のカメのアンダースコアの数が含まれています。主要な奇数のカメは特別なケースに入れられ、残りのカメはペアで出力されます。


25
正確に256バイトであるために+1。uの長さがちょうど半分にならない限り、ゴルフをしないでください!
ローハンジュンジュンワラ

もともと私は末尾のスペースについてのメモを逃しました、私の編集者のほとんどはそれらを切り落とすように設定されており、なぜそれが機能しなかったのか理解できませんでした!PPCGでバッチを見るのをいつも喜んでいます。:)
キャプテンマン

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の幅と精度の指定子をひどく乱用して、スペースを取得し、アンダースコアを繰り返します。各カメは1回の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 ++の1つを追加しようとしていた

4
,_,コードに含めると+1 。
R.ガプス


12

05AB1E、45バイト

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

オンラインで試す


3
非常に短いために私の票を取得します。
jseals

かどうかわからないG-ループは、2016年8月版ですでにでしたが、それがあった場合は、LvすることができG、両方ともy可能N-1バイトのために。
ケビンクルーッセン

12

V57、53 49バイト

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

これには印刷できない文字が含まれているため、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

オンラインでお試しください!

説明:

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.カップ

このコードはでも機能しませんinput > 10。ちなみに、私は誤ってinputで完全に壊してしまいました0 41c14。コードを破ったのか、ランナーを破ったのかはわかりません。
ブランドンアンサルディ16

1
@ R.Kapええ、なぜそうするのか知っていると思います。Vは整数をほとんど理解-1できないため、数字のふりができない文字列と見なされます。ありがたいことに、それらを処理する必要はありません。
DJMcMayhem

1
@BrandonAnzaldiああ、なぜそれがうまくいかないのかわかります。すぐに修正します。また、10進数以外の操作を行うと、奇妙な問題が発生する可能性があります。
DJMcMayhem

1
うん!クールなソリューション。おそらく修正するのはいくぶん簡単だろうと考えました。私は、前述の偶発的なキーボードマッシュの出力に非常に、非常に魅了されました。先頭のスペースも、楽しい出力を生成します。あなたはVをうまくうまく動かしたようです!
ブランドンアンサルディ16

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

彼のリワークで-9バイトの@Dadaに感謝します!


1
良いですね。別のバージョン、同じバイト数:perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'。私も100未満になろうとしましたが、そうではありません...-
ダダ

@ダダありがとう!更新、大歓迎!
ドムヘイスティングス

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


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バイト、あなたが使用して1つのバイトを保存することができます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のデフォルトで始まるため、最初の呼び出しに必要な変数は1つだけです。頻繁に使用される2つの値をすばやく定義します。次に、必要な回数だけすべてを繰り返します。

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

これらはそれぞれ、頭を右に追加するか左に追加するかを暗黙的にテストし、適切に配置します。


#マークダウンエディターでタイトルの前に使用して、他の回答と同様に書式設定します。
-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 It Online!(イデオン)


不思議なことに、3番目と4番目のカメはイデオネで壊れているように見えます...-
クエンティン

@Quentin実際には、それはIdeoneではありません。それが私のプログラムのせいです。何らかの理由で、微小な入力が近づき17、それ以降、何らかの理由でロジックが壊れるので、カメもそうなります。私は現在、何が間違っているのかを解明しようとしています。
R. Kap

いいね!ほとんどの文字リテラル('c')をASCIIコードに置き換えて、それぞれ1文字を節約できることに注意してください:)
クエンティン

@Quentin Nice?...それはあまりうまくいきません。どうですか?
R.カップ

ああ!イデオネに戻って確認したところ、修正されたように見えましたが、それはもちろんカメの数が少ないためです...朝もやがかかっています。
クエンティン

4

Java 1.7、238バイト

2つの関数のセット:最初に入力(カメの数)を反復処理し、2番目に反復文字のシーケンス(つまり、カメの先頭のスペース、背中、腹)の作成を容易にします。

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文字を繰り返す組み込みの速記が本当にありません...


「プログラムまたは関数を作成...」Javaのpublic static void main

4

Python、 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そうそう、私はそれを空の文字に変更しました、それは動作します。ありがとう!
greyShift

'0'*-~-1より短い'0'*(1-b)
破壊可能なレモン

および-〜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バイト

私はイグアノドンの再帰的アプローチも好きだったので、ここで少し短い試みをします。

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)

編集

Destructible Watermelonからの素晴らしいヒントにより、強力な25 26 9バイトがゴルフされました。どうもありがとう!今では最短の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バイトを失うことを発見しました。
エルペドロ

しかし、単項- - *高いバイナリよりも優先順位を持っているので、括弧している必要があることを除いて、と〜よりも高い優先順位を持っている*
破壊可能なレモン

考えてみると、nが常に0より大きい場合、n> 1の場合は〜-n(n-1)に短縮でき、先頭のスペースが切り取られます。また、(1-b)は、括弧なしで-〜-bに短縮できます。
Destructible Lemon

これはどんどん良くなります!私はこれにかなり慣れていないので、読みやすいコードを書くことに慣れているので、あなたのヒントは大歓迎です:)
ElPedro

1

PowerShell105 100 97 87 85 84バイト

狂気の狂人のおかげで-21バイト

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

オンラインでお試しください!

$_--繰り返し($_+1)ブロックを使用して数バイトを節約するのを避けるために、変数を賢くシフトします。また、単一の引数を文字列に変換します。この文字列は、範囲内で使用されたときにintにキャストされ、タートルの数を反復処理します。最大のトリックは$_%2、現在のrow_countから減算(偶数の場合は0、奇数の場合は1)することで、カメの間隔の第2レベルのみを1行おきに増加​​させることです。

それ以外の場合、適切なカウントを取得するための多くのインデックス計算が_あります。これには、の形式のラグカウンターが含まれ$i++ます。


@mazzyは、末尾のスペースを持つことはできませんが、私は5バイト、感謝のためにそれを修正しなかった
Veskah

1
私は申し訳ありません:)だ85バイト
mazzy

@mazzy Double dang、さらに多くの仕事をしています。良いもの
ベスカ

1
それはすべて:)だ84バイト
mazzy

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.