逆さまのテントを出力する


27

整数を指定すると、逆さまのテントを出力します。

入力により、テントのサイズ(絶対値)と、入り口が左側(負の数)か右側(正の数)かが決まります。

If input = -1:
____
\/_/

If input = -2:
________
\  /   /
 \/___/

If input = -3:
____________
\    /     /
 \  /     /
  \/_____/

If input = 1:
____
\_\/

If input = 2:
________
\   \  /
 \___\/

If input = 3:
____________
\     \    /
 \     \  /
  \_____\/

et cetera

テントの上部(最後の行)には2 * abs(input) - 1アンダースコアが付いていることに注意してください。

最初の行がアンダースコアで直接始まるなど、先頭にスペースを入れることできませ

入力がになることはないと仮定します0

コードはできるだけ短くする必要があります。

このチャレンジは、Helka Hombaによるチャットミニチャレンジに基づいています。これは、Calvin's Hobbies Public Licenseの条件下で実際のチャレンジで使用できます。


1
末尾のスペースは大丈夫ですか?つまり、3たとえば入力用に12の長さの4つの文字列(長方形)を出力できますか?
AdmBorkBork

1
彼らが@TimmyD されている許可。
user48538

2
@TimmyD確かに、それはおそらく他の何かのduでもあるので、チェーンがどこから始まるのか本当にわかりません。私はちょうど今までにこれらを十分に見たと思います。
ナサニエル

5
質問がどのように類似しているのかがわかりません。確かに、それらは数字を取り、何かのn番目の反復を出力するという、ASCIIアートの課題ですが、それで類似性は終わります。それがduとして閉じるのに十分であれば、私たちはこれ以上アスキーアートの挑戦をするべきではありません。
DJMcMayhem

2
@Nathaniel 2つの課題が重複していることに対して受け入れられているガイドラインは、一方からの回答をほとんどまたはまったく変更せずに他方で(競合的に)再利用できるかどうかです。課題がテーブルに新しい何かをもたらすかどうかは、そのガイドラインの一部ではありません。落胆させたいチャレンジにはdownvotesを使用するか、面白いと思わない場合は無視して、楽しんでいる人に許可してください。
マーティンエンダー

回答:


11

MATL55 53 52 51バイト

|95cy4*Y"DXytPEt0*yvG0>?P_]!'\/ 'w)95JG|G0<yEq:++&(

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

説明

N入力を示しましょう。コードは3つのステップで進みます。

最初に、4*Nアンダースコアの最初の行が 文字列として作成され、表示されます(スタックから削除されます)。

第二に、テントの「フレーム」は2種類のスラッシュを使用して構築されます。これを行うために、数値的な2次元アレイが含まれて作成され1及び2スラッシュの二種類に応じて、0スペースの。

これは、4つのマトリックスを連結して行われます。

  1. サイズの単位行列abs (N)
  2. 2対角線を含む同じサイズの行列。
  3. 同じサイズのヌル行列。
  4. マトリックス2のコピー。

これら4つの行列を垂直に連結するN=3と、例として次の4*N × N行列が得られます。

1 0 0
0 1 0
0 0 1
0 0 2
0 2 0
2 0 0
0 0 0
0 0 0
0 0 0
0 0 2
0 2 0
2 0 0

(転置されて、テントのように見え始めます)。

ここで、入力の符号を処理します。正の場合、上記の行列とインデックスを文字列に転置するだけ'\/ 'です。インデックス付けは1ベースでモジュール式であるため、に1なり'\'、に2なり'/'、に0なり' '、2D文字配列を生成します

\    /     /
 \  /     / 
  \/     /  

一方、入力が負の場合、4*N × N行列を垂直に反転して算術的に否定し、

-2  0  0
 0 -2  0
 0  0 -2
 0  0  0
 0  0  0
 0  0  0
-2  0  0
 0 -2  0
 0  0 -2
 0  0 -1
 0 -1  0
-1  0  0

インデックス-1はを参照するように'/'なり-2ました'\'。つまり、必要に応じて、2種類のスラッシュが交換されています。この場合も、文字列への転置とインデックス付け'\/ 'により、逆のテントが得られます。

\     \    /
 \     \  / 
  \     \/  

3番目に、2D char配列の最後の行の一部にアンダースコアを埋める必要があります。この行の水平位置は入力の符号に依存し、その長さはabs(N)です。

対応するスペースがアンダースコアに置き換えられると、最初のステップですでに表示されていたアンダースコアの最初の行の下に、結果が暗黙的に表示されます。


最初のアンダースコアはスペースにすべきではありませんか?
DJMcMayhem

@DJMcMayhemすみません、どういう意味ですか?
ルイスメンドー

コードを実行すると、最初の行はすべてアンダースコアです。zyabinが出力したものにはそれがありません。
DJMcMayhem

@DJMcMayhem私は従わない。テストケースの最初の行はアンダースコアです。そして、他の答え(あなたではない)もそれをしますか?
ルイスメンドー

1
@DJMcMayhem :-D実に奇妙な。別のブラウザをお試しください?
ルイスメンドー

9

Javascript(ES6)、139バイト

テントを再帰的に構築します。

f=(N,n=N>0?N:-N,i=0,r=(j,i)=>' _'[i||0].repeat(j),a=`\\${r(i)}/`,b=r(n*2+i-1,+!i))=>n--?f(N,n,i+2)+`
`+r(n)+(N<0?a+b+'/':'\\'+b+a):r(i*2,1)

非ゴルフとコメント

f = (
  N,                                  // N is the original parameter (remains unchanged)
  n = N > 0 ? N : -N,                 // n is initialized to abs(N)
  i = 0,                              // i is the row counter (*2)
  r = (j, i) => ' _'[i||0].repeat(j), // helper function to repeat ' ' or '_' j times
  a = `\\${r(i)}/`,                   // a = '\ /' pattern
  b = r(n*2+i-1, +!i)                 // b = padding pattern filled with ' ' or '_'
) =>
  n-- ?                               // if we haven't made it yet to the top row:
    f(N, n, i+2) + `\n` +             //   - compute next row(s) / append line break
    r(n) +                            //   - append leading spaces
    (N < 0 ? a+b+'/' : '\\'+b+a)      //   - append a/b patterns according to N sign
  :                                   // else:
    r(i*2, 1)                         //   - return top row, made of '_' characters

var f=(N,n=N>0?N:-N,i=0,r=(j,i)=>' _'[i||0].repeat(j),a=`\\${r(i)}/`,b=r(n*2+i-1,+!i))=>n--?f(N,n,i+2)+`
`+r(n)+(N<0?a+b+'/':'\\'+b+a):r(i*2,1)

console.log(f(3));
console.log(f(-4));


6

Python 2、143 141139138137バイト

@ Sp3000のおかげで-2バイト(Python 2でexecを括弧で囲む必要はありません)
@ Sp3000のおかげで-1バイト(使用cmp

def f(n):d=cmp(n,0);a,b='\/'[::-d];s=n*d;x=2*s-1;y=4*s;print'_'*y;i=0;exec"print' '*i+(b+' '*(y-3-x-i-i)+a+'_ '[s-i>1]*x+a)[::d];i+=1;"*s

ideoneでテストする

場合はまず、見n負とメイクでd +1それがあるとあれば-1そうでない場合。
その後、我々は2つのスラッシュを選択し、aそしてb使用して、dそのようにa='\', b='/'するときn正であるとa='/', b='\'するときn負です。
次にs=abs(n)、によって達成される可能性のある設定を行いs=n*dます。
次に_、上部(写真の下部)の数を計算x=2*s-1ます。これは、テントの側面の数でもあります。
次に_、テントの底部(写真の上部)での数を計算しy=4*s、残りのテントを作成するためにループで使用されるため、それを保存します。
次に、を使用してテントのベースを印刷しprint'_'*yます。
次に、各printステートメントごとに増分されるsループ変数をi初期化し0てprintステートメントを実行することにより、テントの残りの部分を印刷します1
10トンの残りの部分は、持っているy-3-x-i-i、ドア内のスペースとxするとき、トップが、到達するまで、体内のスペースをs-i>1falseと評価は、狩り_から'_ '
ポジティブな左ドアのテントの場合、先頭のスペースを除くテント全体が前後に配置されているため、ポジティブな「右ドア」のテントとは反対になり[::d]ます。


@ Sp3000が残念ながらcmp(0,0)戻ってきた0
ジョナサンアラン

5

Python 2、121バイト

def f(n):i=k=abs(n);print'_'*k*4;exec"print' '*(k-i)+r'\\\%%s%\*%c%%*sc/'[n<0::2]%(' _'[i<2]*(2*k-1))%(2*i-1,47);i-=1;"*k

たくさんの文字列フォーマット。


5

C#、215 214バイト

string t(int N){var n=N<0;N=n?-N:N;var t=new string('_',4*N);for(int i=0;i<N;){string f=new string(i<N-1?' ':'_',2*N-1),p=new string(' ',2*N-2*i-2);t+='\n'+new string(' ',i++)+'\\'+(n?p+'/'+f:f+'\\'+p)+'/';}return t;}

using s=string;事前に使用する場合、数バイトを節約する可能性があります。

s t(int N){var n=N<0;N=n?-N:N;var t=new s('_',4*N);for(int i=0;i<N;){s f=new s(i<N-1?' ':'_',2*N-1),p=new s(' ',2*N-2*i-2);t+='\n'+new s(' ',i++)+'\\'+(n?p+'/'+f:f+'\\'+p)+'/';}return t;}

15(使用)+ 184(メソッド)= 199バイトになります。


5
PPCG、BackFromExileへようこそ!
エリックアウトゴルファー16

確かに、PPCGへようこそ!非常に良い最初の答え+1。私はゴルフに何かを見つけようとしました(私はC#でプログラミングしてからしばらくしました)、そして最終的には-1バイトのために1つのものしか見つけることができませんでした:varforループ内の最初のものをに変更stringすると、秒var (バイトを保存するスペースを含む)。にvar fなりstring f、に;var p=なり,p=ます。
ケビンCruijssen

4

TSQL、195バイト

ゴルフ:

DECLARE @ INT=-2
DECLARE @b INT=ABS(@),@i INT=0PRINT REPLICATE('_',4*@b)z:SET @i+=1PRINT SPACE(@i-1)+'\'+STUFF(REPLICATE(IIF(@i<@b,' ','_'),4*@b-2*@i),@b*2-IIF(@<0,@i*2-1,0),1,IIF(@<0,'/','\'))+'/'IF @i<@b GOTO z

ゴルフをしていない:

DECLARE @ INT=-2

DECLARE @b INT=ABS(@),@i INT=0

PRINT REPLICATE('_',4*@b)
z:
  SET @i+=1
  PRINT 
    SPACE(@i-1)+'\'
    +STUFF(REPLICATE(IIF(@i<@b,' ','_'),
      4*@b-2*@i),@b*2-IIF(@<0,@i*2-1,0),1,IIF(@<0,'/','\'))
    +'/'
IF @i<@b GOTO z

フィドル


4

V、66バイト

é /ä
"aDoÀñá_>ñ^hr\A\/ò^hÄX$2é_Ó_/ òÄÒ_ñ/-
ddÍܨ[ _]*©Ü¨ *©/ܲ¯±

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

これはかなり単純なアプローチなので、今日はさらにゴルフをしようと思います。このソリューションには印刷できない文字が含まれているため、hexdumpを次に示します。

0000000: e920 2fe4 0a22 6144 6f1b c0f1 e15f 3ef1  . /.."aDo...._>.
0000010: 5e68 725c 415c 2f1b f25e 68c4 5824 32e9  ^hr\A\/..^h.X$2.
0000020: 5fd3 5f2f 20f2 c4d2 5ff1 2f2d 0a64 64cd  _._/ ..._./-.dd.
0000030: dca8 5b20 5f5d 2aa9 dca8 202a a92f dcb2  ..[ _]*... *./..
0000040: afb1                                     ..

4

05AB1E、52バイト

Ä©'_4®*×,FNð×'\®·<N>®Qi'_ëð}×®N>-·ð×®¹Qi'\ës'/}s'/J,

説明

                                                     # implicit input, call this A
Ä©                                                   # store abs(A) in register for later use
  '_4®*×,                                            # print 4*A underscores (tent floor)
         F                                           # for each non-floor section in range(N)
          Nð×'\                                      # push N spaces at the beginning of the 
                                                     # row followed by a backslash
                  N>®Qi'_ëð}                         # if we're on the last row push an
                                                     # underscore, else a space
               ®·<          ×                        # repeat that char abs(A)*2-1 times
                             ®N>-·ð×                 # push 2*(abs(A)-(N+1)) spaces
                                    ®¹Qi'\ës'/}      # if input is positive push backslash
                                                     # else push a slash
                                               s'/   # move that char between the 2 sections
                                                     # of spaces
                                                  J, # join the row and print

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


4

PowerShellのV2 +、217の 205 190 187 184バイト

param($b)"_"*(($a=[math]::Abs($b))*4);$z,$y='/\'[($b=$b-lt0),!$b]
((($x=1..$a|%{($w=" "*($_-1))+$z+" "*(2*($a-$_))+$y+(' ','_')[$_-eq$a]*($a*2-1)+$y+$w})|%{-join$_[($a*4)..0]}),$x)[$b]

入力$bを整数として受け取ります。$b負の値の場合、適切にキャストするには明示的に括弧で囲む必要があります(例を参照)。そうでない場合、PowerShellはそれを文字列と見なします。

テントの向きに関係なく、最初の行は同じで、下線がたくさんあります。まさに4*abs(input)それらの多くです。その番号は$a、後で使用するために保存されます。また、今、私たちは絶対値があること$bに格納されているが$a、我々はターン$bその符号のためのブールに、そして私たちのスラッシュに格納選ぶ$y$z

次の行は出力の構築と定式化であり、それはすごいことなので、それを分解しましょう。

基本的に、2つの要素の配列、(big long calculations saved into $x)または$xに基づいてインデックスを作成しています$b

計算は、テント本体が構築される場所です。からループし1..$a|%{...}ます。各反復では、テント本体のラインを構築しています。行番号#と同じ数のスペースから始めて、-1適切に左揃えにします。それ$wは後で保存され、適切なスラッシュ($に基づいて$ $b)、スペースのドアフレーム数、他のスラッシュ$y、最後に下線があるかどうかに応じてアンダースコアまたはスペースで連結されます。次に、もう1つのスラッシュ$y、最後に適切な数の後続スペース($w)を使用して、長方形の文字列を作成します。その結果の文字列の配列はに格納され$xます。

アレイの左半分が選択されている場合(すなわち、$bあるFalse入力が陽性であったため)、我々は、をループする必要があり$x、各ラインアイテムを逆-末尾のスペースが場に来る場所です。距離を再計算するのではなく、単に線を逆にすることができます。

場合$bTrueは、配列の右半分が$x代わりに選択されています。

どちらの場合でも、パイプラインには文字列の配列が含まれるようになりました。暗黙的な出力はWrite-Output、要素の間にデフォルトの改行を使用して、プログラムの完了時に行われます。

PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\        /         /
 \      /         / 
  \    /         /  
   \  /         /   
    \/_________/    

PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\       \      /
 \       \    / 
  \       \  /  
   \_______\/   

3

ハスケル、187の 184 183バイト

f x=unlines$[(n*4)%'_']++((' '#)<$>[0..n-2])++['_'#(n-1)]where m#i=i%' '++'\\':m!i++"/";m!i|x>0=(2*n-1)%m++'\\':(2*(n-i-1))%' '|q<-2*(n-i-1)=q%' '++'/':(2*n-1)%m;n=abs x;m%c=c<$[1..m]

これはHaskellにとって素晴らしいスコアではないと思うので、改善のためのアイデアは大歓迎です。

非ゴルフ

tent :: Int -> String
tent x = unlines $ [replicate (n*4) '_'] ++ (row ' '<$>[0..n-2]) ++ [row '_' (n-1)]
    where row m i = replicate i ' ' ++ "\\" ++ dir m i ++ "/"
          -- direction selector
          dir m i | x > 0 = side m ++ "\\" ++ entrance i ' '
                  | 1 > 0 = entrance i ' ' ++ "/" ++ side m
          side = replicate (2*n-1)
          entrance i = replicate (2*(n-i-1))
          n = abs x

投稿しようとしていた290バイトよりも良い
...-Myridium

入力としてmain受け入れるようにaを追加してはいけませんstdinか?
ミリジウム

質問で特に指定されていない限り、1つの関数を投稿できます。回答に関する一般的なルールのメタスレッドがあります。私はあなたのためにそれを見つけようとします。
sudee

1
文字を使用するために単一の文字を追加する場所を変更することにより、2バイトを節約できます:。すなわちに変更"\\" ++ entrance...'\\':entranceます。
ミリジウム

1
「そうでない場合は」ガードを無駄にしないでください:あなたが変更することができます|1>0=(2*(n-i-1))%' '|q<-2*(n-i-1)=q%' '
nimi

2

C、240の 207の 193バイト

#define P putchar
a,j,l,m;g(x,y,z){for(m=y+z+1;m--;P(m^z?l?32:95:x));}f(n){g(32,(a=abs(n))*4,0);for(P(10),j=2*(l=a)-1;l--;){for(m=a;--m>l;P(32));P(92);m=n>0?g(92,j,l*2):g(47,l*2,j);puts("/");}}

今回は、関数g(...)を最適化して、単一のforループを使用します。

#define P putchar
a,j,l,m;g(x,y,z){for(;y--;P(l?32:95));for(P(x);z--;P(l?32:95));}f(n){g(32,(a=abs(n))*4,0);l=a;j=2*a-1;P(10);for(;l--;){for(m=a;--m>l;P(32));P(92);m=n>0?g(92,j,l*2):g(47,l*2,j);puts("/");}}

今回は、マクロXは関数g(...)として優れています。yとzは新しいスコープのパラメーターなので、gのスコープでそれらをデクリメントできます。

#define P putchar
#define X(x,y,z){for(k=0;k++<y;P(l?32:95));P(x);for(k=0;k++<z;P(l?32:95));}
a,i,j,k,l,m;f(n){for(l=a=abs(n);i++<a*4;P(95));j=2*a-1;P(10);while(l--){for(m=a;--m>l;P(32));P(92);if(n>0)X(92,j,l*2)else X(47,l*2,j)puts("/");}}

このメイン関数でテストします。これははるかに小さくゴルフダウンするはずです。

main(c,v)char**v;
{
    f(atoi(v[1]));
}

2

C#241231バイト

@Kevin Cruijssenのおかげで10バイト節約

using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}

古いバージョン:

string f(int N){var f=N<0;N=N>0?N:-N;var o=new string('_',N*4);for(int j=0;j<N;){int z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new string(' ',j)+'\\'+new string(' ',z)+(f?'/':O)+new string(O,j++*2)+(f?O:'\\')+new string(' ',z)+'/';}return o;}

元々はnew string(...)as でしたFunc<char,int,string>が、コンストラクタを使用して1バイトを保存しました。私が望むint-> char暗黙的だった

私の数学もどうにかして修正できると確信していますが、私はそれを見ることができません


1
もっとゴルフできます。まず最初に、for-loopに追加することで、int 以前を削除できます。そして、あなたが使用しているため、非常に多くのことを、あなたがそれを別名設定できる合計になるように:(231バイトz=int j=0,zstringusing s=System.String;using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
ケビンCruijssen

1

Swift 2.2 421バイト

まあ...これは試みでした。

ゴルフ:

let t={(s:String,n:Int)->String in return String(count:n,repeatedValue:Character(s))};let e={(n:Int)in var w=[String]();w.append(t("_",abs(n)*4));let c = abs(n);let d = n>0 ? "/": "\\";let f = n>0 ? "\\": "/";for var i in 0...abs(n)-1 {w.append(t(" ",i)+d+t(" ",c*2-2-(2*i))+f+(i<c-1 ?t(" ",2*c-1)+f:t("_",2*c-1)+f)+(n>0 ?t(" ",i):""));};w=n<0 ?w:w.map(){String($0.characters.reverse())};print(w.joinWithSeparator("\n"))}

UnGolfed:

let t={(s:String,n:Int) -> String in
    return String(count:n,repeatedValue:Character(s))
};
let e={(n:Int) in
    var w=[String]();
    w.append(t("_",abs(n)*4));
    let c = abs(n);
    let d = n>0 ? "/": "\\";
    let f = n>0 ? "\\": "/";
    for var i in 0...abs(n)-1 {
        w.append(t(" ",i)+d+t(" ",c*2-2-(2*i))+f+(i<c-1 ?t(" ",2*c-1)+f:t("_",2*c-1)+f)+(n>0 ?t(" ",i):""));
    };
    w=n<0 ?w:w.map(){String($0.characters.reverse())};
    print(w.joinWithSeparator("\n"))
}

1

PHP、143バイト

$t=str_repeat;echo$t(_,4*$s=$k=abs($n=$argv[1]));for(;$k--;$p.=" "){$f=$t("  ",$k);$r=$t($k?" ":_,2*$s-1);echo"
$p\\",$n<0?"$f/$r/":"$r\\$f/";}

と走る php -r '<code>' <parameter>

壊す

$t=str_repeat;  // function name to variable saves 10-1 bytes
echo$t(_,4*$s=$k=abs($n=$argv[1])); // print bottom
for(
    ;
    $k--;   // $k from abs($n-1) to 0
    $p.=" "                 // create padding
)
{
    $f=$t("  ",$k);         // create front
    $r=$t($k?" ":_,2*$s-1); // create side/roof
    echo"\n$p\\",$n<0
        ?"$f/$r/"   // print, entrance left
        :"$r\\$f/"  // print, entrance right
    ;
}

1

バッチ、289バイト

@echo off
set/pn=
set u=
for /l %%i in (2,1,%n:-=%)do call set u=_%%u%%_
echo _%u%__%u%_
set l=
set m=%u%/_%u%
if %n% gtr 0 set m=%u%_\%u%
set m=%m:_= %
for /l %%i in (2,1,%n:-=%)do call:l
set m=%m: =_%
:l
echo %l%\%m%/
set l= %l%
if %n% gtr 0 set m=  %m:~0,-2%
set m=%m:~2%

STDINで入力を受け取ります。2*(abs(n)-1)アンダースコアの文字列を作成することから始めます。その後、これが繰り返され、さらにテントのベースに4つのアンダースコアが追加されます。テントの残りの部分は、インデント(各行で1ずつ増加)、a \、テントの中央、aで構成され/ます。テントの真ん中は2*(abs(n)-1)スペース、プラス\または/スペース(Markdownでは表現できません)、および別の2*(abs(n)-1)スペースで始まります。アンダースコア文字列を再利用し、便宜上スペースに変更しますが、最後の行のスペースをアンダースコアに戻します。各行は、テントの中央の片側から2つのスペースを削除しますが、必要に応じて最初に2つのスペースを文字列の先頭に移動すると少しゴルファーになります。


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