先端のとがった箱を作る


31

2つの正の整数WとHを指定すると、境界がスラッシュ(/および\)で構成されたASCIIアートボックスが出力されます。ボックスの内部はスペースで満たされています。

「スパイク」とは、2つのスラッシュが一緒になって矢印の形を形成することです。

/\    \/

/      \
\      /

だから、のための出力W = 4, H = 3になります

/\/\/\/\
\      /
/      \
\      /
/      \
\/\/\/\/

上に4つのスパイクがあり、下に4つ、下に3つ、左に3つ、右に3つあります。

他の入力/出力ペアは次のとおりです。

W H
[spiky slash box]

1 1
/\
\/

1 2
/\
\/
/\
\/

2 1
/\/\
\/\/

2 2
/\/\
\  /
/  \
\/\/

1 3
/\
\/
/\
\/
/\
\/

3 1
/\/\/\
\/\/\/

2 3
/\/\
\  /
/  \
\  /
/  \
\/\/

3 2
/\/\/\
\    /
/    \
\/\/\/

10 1
/\/\/\/\/\/\/\/\/\/\
\/\/\/\/\/\/\/\/\/\/

10 2
/\/\/\/\/\/\/\/\/\/\
\                  /
/                  \
\/\/\/\/\/\/\/\/\/\/

4 5
/\/\/\/\
\      /
/      \
\      /
/      \
\      /
/      \
\      /
/      \
\/\/\/\/

出力の行には、先頭または末尾のスペースを含めないでください。オプションで、末尾に改行が1つある場合があります。

バイト単位の最短コードが優先されます。


javascriptを使用する人は、このためにスニペットを作成できますか?
FantaC

回答:


15

、9バイト

BײNײN/\

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

説明

B           Box
  ײN       Next input as number * 2
      ײN   Next input as number * 2
          /\ With border "/\"

3
もちろん、チャコールには「ドローボックス」用のビルトインがあります
ベンゼン

1
@ベンゼン最近彼がボックスの周りに任意の文字列を描画する機能を追加したのは少し幸運でしたが、それ以前にもcodegolf.stackexchange.com/a/120065の
Neil

1
@ニールは最近待つ?いつ?(?私はあまりあなたが母に感謝炭を知っています)
ASCIIのみ

@ASCIIのみ カーソルの位置を変更した変更のため、私は混乱しました。(任意の境界文字列を導入した変更はca904b0であり、ほぼ1年前でした。)
ニール

@benzeneボックスが組み込まれていなくても、まだわずか13バイトですF²«↷P…\/N»‖M¬(高さ、幅の順に入力します)。
ニール

11

MATL、18バイト

'\/',iE:]!+)O6Lt&(

MATL Online試しください

説明

入力を考えてみましょうW = 4H = 3。コードは、行ベクトル構築[1 2 3 4 5 6 7 8](範囲12*W)および[1 2 3 4 5 6](範囲1にします2*H)。後者を転置し、ブロードキャストで前者に追加すると、マトリックスが得られます

2  3  4  5  6  7  8  9
3  4  5  6  7  8  9 10
4  5  6  7  8  9 10 11
5  6  7  8  9 10 11 12
6  7  8  9 10 11 12 13
7  8  9 10 11 12 13 14

文字列へのモジュラーインデックス\/は、マトリックスの境界線に目的の結果を生成します。

/\/\/\/\
\/\/\/\/
/\/\/\/\
\/\/\/\/
/\/\/\/\
\/\/\/\/

境界以外の値を削除するには、次のように設定します0(charとして解釈される場合、スペースとして表示されます)。

/\/\/\/\
\      /
/      \
\      /
/      \
\/\/\/\/

コメントされたコード:

'\/'    % Push this string. Will be indexed into
,       % Do twice
  i     %   Input a number
  E     %   Multiply by 2
  :     %   Range 
]       % End
!       % Transpose
+       % Add
)       % Index
O       % Push 0
6L      % Push [2 -1+1j]. As an index, this means 2:end
t       % Duplicate
&(      % Write 0 into the center rectangle. Implicit display


7

Haskell90 88 87 82バイト

Lynnのおかげで1 6バイト節約

a#b=[1..a]>>b
x!y|i<-(x-1)#"  "=x#"/\\":(y-1)#['\\':i++"/",'/':i++"\\"]++[x#"\\/"]

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

まだ本当に長く感じます。何ができるか見ていきます。


a#b=[a..b]すべてのオカレンスを定義および置換すると、1バイト節約できます。– a#b=[a..b];x!y|i<-2#x>>" "=(1#x>>"/\\"):(2#y>>['\\':i++"/",'/':i++"\\"])++[1#x>>"\\/"]
Lynn

ああ、a#b=[1..a]>>b;x!y|i<-(x-1)#" "=x#"/\\":(y-1)#['\\':i++"/",'/':i++"\\"]++[x#"\\/"]実際に6〜を節約します
Lynn

@Lynnありがとう!あなたは本当に私のスラックを最近キャッチしています。
小麦ウィザード

@Lynn動作するようになりましたが、別のバイトのコストで。
小麦ウィザード

5

05AB1E、14バイト

„/\|∍`S¦`).B∞∊

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

説明

„/\|∍`S¦`).B∞∊   Arguments: x, y
„/\              Push the string "/\"
   |             Push inputs as array: [x,y]
    ∍            Push the string extended/shortened to those lengths
     `           Flatten
      S          Push seperate chars of second string
       ¦`        Remove first char and flatten again
         )       Wrap stack to an array
          .B     Squarify
            ∞∊   Mirror on both axes

これは、左上隅、幅x文字、高さy文字のみを作成します。次に、これを両方の軸でミラーリングします。

x=3, y=2

/\/|
\  |
---+

4

JavaScript(ES6)、84バイト

カリー化構文の入力を受け取ります(w)(h)

w=>h=>'/\\'[R='repeat'](w)+`
${`\\${p='  '[R](w-1)}/
/${p}\\
`[R](h-1)}`+'\\/'[R](w)

デモ


3

Swift 3、166バイト

func f(a:Int,b:Int){let k=String.init(repeating:count:),n="\n";var r="\\"+k("  ",a-1)+"/";print(k("/\\",a)+n+k(r+n+String(r.characters.reversed())+n,b-1)+k("\\/",a))}

完全なテストスイート。

クロージャーのバージョンは、残念ながら少し長くなっています(175バイト):

var g:(Int,Int)->String={let k=String.init(repeating:count:),n="\n";var r="\\"+k("  ",$0-1)+"/";return k("/\\",$0)+n+k(r+n+String(r.characters.reversed())+n,$1-1)+k("\\/",$0)}

クロージャーバージョンのテストスイート。


3

網膜77 73バイト

\d+
$*
 1+|1(?=1* (1+))
$1¶
1
/\
.((..)*.)
/$1¶$1/
¶$

(?<=¶.+).(?=.+¶)
 

オンラインでお試しください!リンクにはテストケースが含まれます。形式で入力を取ります<height> <width>。説明:

\d+
$*

入力を単項に変換します。

 1+|1(?=1* (1+))
$1¶

入力を乗算しますが、結果が長方形になるように改行を追加します。

1
/\

先端のとがったトップを作成します。

.((..)*.)
/$1¶$1/

各スパイク行を複製しますが、スパイクは2行目にオフセットされます。

¶$

末尾の改行を削除します。

(?<=¶.+).(?=.+¶)
 

ボックスの内側を削除します。(最後の行のスペースに注意してください。)



3

APL(Dyalog)41 39バイト

リストのプロンプト [H,W]

'\'@2@1⊢¯1⌽@1{⌽⍉⍵,'/\'⍴⍨≢⍵}⍣4''⍴⍨2×⎕-1

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

⎕-1 入力のプロンプト(ニーモニック:様式化されたコンソール)および1を引く

 2を掛ける

''⍴⍨ それを使用して空の文字列を変更します(スペースで埋めます)

 それを生み出す(から分離するのに役立つ4

{}⍣4 次の機能を4回適用します。

≢⍵ 引数の集計(長さ)

'/\'⍴⍨ 周期的にrを eshapeを"/\"その長さに

⍵, 引数の右側に追加します

⌽⍉ 転置および鏡映(すなわち、90°回転)

¯1⌽11行目を右に1ステップ 循環的に回転させる

 それを生み出す(から分離するのに役立つ1

'\'@2@1 2でバックスラッシュを置くND 1つの位置ST大項目。


3

C(gcc)170 166 158 155 108 105

cleblancのおかげで-3バイト

x,y;f(w,h){for(y=h*=2;y--;puts(""))for(x=w*2;x--;)putchar(!x|x==w*2-1|!y|y==h-1?x&y&1|~x&~y&1?47:92:32);}

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

これはもっと単純なアプローチでさらにゴルフできると思います。時間を見つけたときに何ができるかを見ていきます。

OKそのコードのバイト数を減らす他の方法は見つかりません。

説明:ボックスを文字ごとに印刷する単純な二重ループ。

境界線を印刷する場合:x座標とy座標の両方が偶数または奇数の/場合、a \が表示され、そうでない場合はa が表示されます

ボーダーでない場合、代わりにスペース文字が表示されます


1
puts("")このように最初のforループに移動することで、さらに3バイトを削ることができますx,y;f(w,h){for(y=h*=2;y--;puts(""))for(x=w*2;x--;)putchar(!x|x==w*2-1|!y|y==h-1?x&y&1|~x&~y&1?47:92:32);}
-cleblanc

@cleblancありがとう!
スコッティネット

3

///172 117バイト

したがって、出力は///sと whitespacesで構成されるため、これらの2つの言語で提出する必要があります。

コードの後に​​入力W,Hを単項数として入力します(提案のためのChallenger5のおかげで、///の単項が許可されます)(*数字を表すために使用し、で区切り,ます)形式。

/W/VV//V/\\\///`/\\\\\\\\\\\\\V/,/W>+  V`/`\>+W  !V!``WV>+WV-  V`\
`\W+  V`/
`/W-!V`\
W``\\V`\V>!//!*/+%-%!//*/  //%/

オンラインでお試しください!(入力ありW=4, H=3


Unaryで入力を取得することで、解析をスキップできます。
エソランジングフルーツ

また、これは非常に印象的です!よくやった!
エソランジングフルーツ

2

Pythonの387の 82バイト

編集:保存された5のおかげでバイト@officialaimm@ Mr.Xcoder@tsh

def f(a,b,n="\n"):r="\\"+"  "*~-a+"/";print("/\\"*a+n+(r+n+r[::-1]+n)*~-b+"\\/"*a)

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



Python 3で保持したい場合は、-2バイトに*(b-1)することができ*~-bます。
ミスターXcoder

2
@officialaimmなぜ" "*2*~-a?ただ"__"*~-a
tsh

@tshはい、あなたは正しいです。母はそれを認識しませんでした...-
officialaimm

@officialaimmはPython 3を維持しますが、あなた、Mr.Xcoderおよびtshのためにいくつかのバイトを節約しました
Halvard Hummel

2

J、48バイト

' '&((<,~<<0 _1)})@(+:@[$(1&|.,:])@('\/'$~+:)@])

食べない

' '&((< ,~ <<0 _1)}) @ (+:@[ $ (1&|. ,: ])@('\/' $~ +:)@])

説明

                       (+:@[ $ (1&|. ,: ])@('\/' $~ +:)@])    creates box, but interior filled with slashes
                                           ('\/' $~ +:)@]       take right arg, W, doubles it, then fills that
                                          @                       many characters with '\/' repeating
                               (1&|. ,: ])                      stacks (,:) the above on top of itself rotated 
                                                                  by one char, producing top and bottom spikes
                              $                                 reshape to..
                       (+:@[                                    double the length of the left arg, height
                                                                  this creates the sides, as well as a filled interior
                     @                                    
' '&((< ,~ <<0 _1)})                                          removes slashes from interior by using the complement               
                                                                form of amend }.  ie, replace everything but the first
                                                                and last row and first and last col with a space

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


1
33バイト' '(<,~<<0 _1)}'\/'{~=/&(2|i.)&+:。ここで修正は素晴らしいです。
マイル

ooooh、非常に素晴らしい改善
ジョナ

1
'/\ '{~2(<,~<<0 _1)}2|+/&i.&+:リファクタリングを伴う30バイト
マイル


2

Haskell84 79バイト

w%h=[[last$"/\\"!!mod(x+y)2:[' '|x>1,y>1,x<2*w,y<2*h]|x<-[1..2*w]]|y<-[1..2*h]]

オンラインでお試しください!使用例:3%6行のリストを生成します。mapM putStrLn $ 3%6ボックスをきれいに印刷するために使用します。


私はLynnの助けを借りてあなたの答えを下に書きましたが、もう一度あなたがそれを打つのを楽しみにしています。
小麦ウィザード

1
@WheatWizardそこに行く;)
ライコニ

2

Java 8、141バイト

出力から幅、高さまでのカリー化されたラムダ。

w->h->{String f="/",b="\\",t=f,o=b,p="";char i=1;for(;i++<w;t+=b+f,o+=f+b)p+="  ";t+=b;o+=f;for(i=10;--h>0;)t+=i+b+p+f+i+f+p+b;return t+i+o;}

オンラインで試す(いいえ、return t+i+o;意図的ではありませんでした)

ゴルフされていないラムダ

w ->
    h -> {
        String
            f = "/",
            b = "\\",
            t = f,
            o = b,
            p = ""
        ;
        char i = 1;
        for (; i++ < w; t += b + f, o += f + b)
            p += "  ";
        t += b;
        o += f;
        for (i = 10; --h > 0; )
            t += i + b + p + f + i + f + p + b;
        return t + i + o;
    }

a charは入力幅までカウントするために使用されるため、このソリューションは通常、入力サイズについて慎重です。幸いなことに、これらのサイズでは、プログラムの完了がすでに問題になるほどアルゴリズムが十分に悪いです。charループインデックスに使用することを選択したため、後でそれを安価なエイリアスとして再利用でき'\n'ます。


2

SOGL V0.1222の 21 13 バイト

/\”m;HΙ»mč+╬¡

ここで試してみてください!(両方の入力がスタック上にあることを期待します..(また"、文字列が明示的に開始されていないため)-使いやすいように、数値入力を2回追加します)

説明:

/\”            push "/\"
   m           mold to the 1st inputs length
    ;          get the other input ontop of stack
     H         decrease it
      Ι        push the last string - "/\"
       »       rotate it right - convert to "\/"
        m      mold "\/" to the length of 2nd input - 1
         č     chop into characters
          +    prepend the 1st molded string to the character array of the 2nd
           έ  quad-palindromize

>:Dここは炭を破っていない
ASCIIのみ

@ ASCIIのみの炭が内蔵されており、このための理由:P(とSOGLsが本当にとにかく複雑&長い挑戦のために作ら)
dzaima

1

Mathematica、87バイト

Table[Which[1<i<2#2&&1<j<2#," ",OddQ[i+j],"\\",1>0,"/"],{i,2#2},{j,2#}]~Riffle~"
"<>""&

Mathics(何らかの理由でほとんどの行の先頭に余分なスペースが表示される)またはWolframサンドボックスで試してください!入力として2つの整数を受け取ります。

これはかなり単純な解決策ですが、私が試したすべての賢いことには、より多くのバイトがありました。ほとんど機能するものは

ArrayPad[Array[" "&,2#-2],1,{{"/",s="\\"},{s,"/"}}]~Riffle~"\n"<>""&

ただし、いずれかのディメンションが1の場合は失敗します(入力はディメンションを含むリストです)。





1

J、39バイト

(' \/'{~=/&(2&|)(*>:)~0=*/&(*|.))&i.&+:

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

heightLHSとwidthRHS に関する2つの議論を取ります。


いつものようにすてきな仕事。興味深いアプローチも。
ジョナ

@ジョナいいえ、あなたのアイデアは修正を使用する方がはるかに優れています。私の半分と組み合わせると
マイル

1

VBA(Excel)、161バイト

Sub a()
c=[A2]*2
r=[B2]*2
For i=1To r
For j=1To c
b=IIf(i=1 Or j=1 Or i=r Or j=c,IIf((i+j) Mod 2,"\","/")," ")
d=d & b
Next
d=d & vbCr
Next
Debug.Print d
End Sub

ゴルフサブ(139バイト):Sub b c=[2*A1] r=[2*B1] For i=1To r For j=1To c Debug.?IIf(i=1Or j=1Or i=r Or j=c,IIf((i + j)Mod 2,"\","/")," "); Next Debug.? Next End Sub
テイラースコット

上記の匿名イミディエイトウィンドウ関数バージョン(113バイト):c=[2*A1]:r=[2*B1]:For i=1To r:For j=1To c:?IIf(i=1Or j=1Or i=r Or j=c,IIf((i + j)Mod 2,"\","/")," ");:Next:?:Next
テイラースコット

1

R、160バイト 152バイト

p=function(x,n){paste(rep(x,n),collapse='')}
function(w,h){f=p(' ',w*2-2)
cat(paste0(p('/\\',w),'\n',p(paste0('\\',f,'/\n/',f,'\\\n'),h-1),p('\\/',w)))}

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

8バイトを削ってくれたBLTに感謝します。


このs機能を使用したことがありますか?
BLT

sの機能を使用すると、フック側のボックスにするために呼んで
マーク・

1
とった。空白とs=ビットを削除すると、152バイトまで減ることができます。無名関数が許可されます。
BLT

アノンの機能を知るには良いが許可されている
マーク・

0

dc、123バイト

?1-sesf[/\]su[lfsh[lunlh1-dsh0<q]dsqx]dsrx[[
\]P[lf2*2-st[32Plt1-dst0<z]dszx]dsmx[/
/]Plmx92Ple1-dse0<l]slle0<l10P[\/]sulrx

最短距離からはほど遠いですが、最後の2行を取り、pi/2ラジアンを時計回りに「直立」位置まで回転させると、トーテムポールのように見えます

入力をスペースで区切られた2つの整数として受け取ります。

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


1
現在、ここで最も長い回答です。私は...それは、Javaの仕事だと思った
R.ガプス

ない心配を行い、そこに今だJavaソリューション、それが長いのです。
ヤコブ

0

Mathematica、116バイト

(c=Column;o=Table;v=""<>o[" ",2*#-2];w=""<>o["/\\",#];c[{w,c@o[c[{"\\"<>v<>"/","/"<>v<>"\\"}],#2-1],Rotate[w,Pi]}])&

Rotate[w,Pi]相当しw~Rotate~Piているとして、o["/\\",#]"/\\"~o~#
ジョナサンFRECH

私は中置記法を知っていて、本当に1バイトが必要なときはいつもそれを使用します。この場合、私はそれを手放します...
;

2
挿入記法の知識を疑いませんでした。バイト数を減らしたいだけです。ご存知のように、ゴルフなどの精神で。
ジョナサンフレッチ


0

C#(.NET Core)、188バイト

a=>b=>string.Join("\n",new int[2*b].Select((x,i)=>string.Concat(string.Concat(new int[a].Select(y=>i%2==0?"/\\":"\\/")).Select((y,j)=>i>0&i<2*b-1&j>0&j<2*a-1?" ":""+y))))

バイト数には以下も含まれます。

using System.Linq;

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

私はコマンドごとに説明を始めましたが、それは途中で意味をなさない... 私はLinqを使用するためにLinqを使用しました。おそらく、標準の反復を使用するだけでより短くなる可能性があります。

ミドルアウトの説明を次に示します(最も内側のコマンドが最初):
最初に、フルボックスの行を作成し、単一の文字列に連結します

string.Concat(new int[a].Select(y => i % 2 == 0 ? "/\\" : "\\/"))

次に、行の各文字を取得し、それがボックスの輪郭でない場合は、スペースに置き換え、それらを連結して各行の1つの文字列に戻します

string.Concat(PREVIOUS_STEP.Select((y, j) => i > 0 & i < 2 * b - 1 & j > 0 & j < 2 * a - 1 ? " " : "" + y))

最後に、各行を取得し、改行で連結します(行のコレクションの生成も含まれます)

string.Join("\n", new int[2 * b].Select((x, i) => PREVIOUS_STEP));

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