レゴピースを印刷する


48

この課題は、単純な課題です。レゴのピースの高さと幅を説明する2つの入力がある場合、そのASCIIアート表現を印刷します。

レゴのピースの外観は次のとおりです。

(4, 2)

___________
| o o o o |
| o o o o |
-----------

(8, 2)

___________________
| o o o o o o o o |
| o o o o o o o o |
-------------------

(4, 4)

___________
| o o o o |
| o o o o |
| o o o o |
| o o o o |
-----------

(3, 2)

_________
| o o o |
| o o o |
---------

(1, 1)

o

テストケースから判断できない場合、上部と下部はwidth*2+3アンダースコアとダッシュであり、各行には側面用パイプo、小さなもの用のパイプがあり、すべてがスペースで区切られています。

これの唯一の例外は(1, 1)、ただ一つoです。

0いずれのディメンションも取得できません。

これはなので、バイト単位の最短コードが勝ちです!


2
幅または高さが10を超える可能性はありますか?どの範囲をサポートする必要がありますか?
DJMcMayhem

29
特別な場合は、本当に残念です。
コナーオブライエン

47
次の数年で、3Dプリンターにレゴを作成するように指示するコードを書くことを必要とする、もう1つの「レゴの作品を印刷する」チャレンジを望んでいます。
ケビン-モニカーの復帰

8
「あなたの言語がサポートしている整数範囲は何でも」待ってください?それはレゴの仕組みではありません。レンガはごく少数の非常に特殊な寸法でのみ入手可能です。プレートを追加しても、さらに2、3個しか取得できません。(1,7)や(5,3)などの入力を破棄しないスクリプトは完全なゴミです。
RegDwight

3
単一のピース(1,1)に側面がないのはなぜですか?キューブの上に単一の乳首が付いた本物のレゴピースがあります。
tcrosley

回答:


53

Befunge、165 227バイト

&::&*:1` v
v+3*2:\/\_"o",@
v       _$ v<
>"_",1-:^  2
v:,,"| ",*5<
v         _v
>" o",,1-:^$
>*v>\     #\^
5 #|:-1,"|"<
^2$<
v1, *95<
- >2*3+^
>:    #^_@

以前ほどの空白はありませんが、まだギャップがあります。原則は以前のソリューションと同じですが、レイアウトは異なります。今回は、両方の数値が1であるかどうかを確認するために、製品を取得して、結果が1より大きいかどうかを確認しています。


古いソリューション(227バイト)

v           v       <
&   >>\:2*3+>"_",1-:|
>&:1`|v ,,"| ",*52:$<   :\<
    #\v         <
     :>" o",,1-:|
     1          >"|",$\1-:|
    \`            @       $
    ^_"o",@>:!    |       2
           ^-1,*95<+3*2,*5<

もっとゴルフできるかもしれません。すべての空白を見てください!

MSPaintピクチャ形式での説明に対する私の貧弱な試みは次のとおりです。 資金調達方法 コードは矢印の方向に流れます。


2
ああ。僕の。神。私の心を吹く
-lukas.pukenis

25

V43、40、38 36バイト

私が今まで書いた中で最も長いV回答の1つ...

Àio ddÀPñóo î½o
u2Pí.«/| °|
Vr-HVr_

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

これにはユニコードと印刷できない文字が含まれているため、ここにリバーシブルの16進ダンプがあります。

0000000: c069 6f20 1b64 64c0 50f1 f36f 20ee bd6f  .io .dd.P..o ..o
0000010: 0d0a 7532 50ed 2eab 2f7c 20b0 7c0d 0a56  ..u2P.../| .|..V
0000020: 722d 4856 725f                           r-HVr_

この課題はテキストの操作に関するもので、Vに最適です!一方、Vは条件と数学でひどいので、(1、1)の異なる出力は本当にそれを台無しにしました... :(

説明:

À                   "Arg1 times:
 io <esc>           "Insert 'o '
         dd         "Delete this line, and
           À        "Arg2 times:
            P       "Paste it

これで、oの '高さ'行とそれらの間にスペースができました。

ñ                   "Wrap all of the next lines in a macro. This makes it so that if any 
                    "Search fails, execution will stop (to handle for the [1, 1] case)
 ó                  "Search and replace
  o î½o             "'o'+space+0 or 1 newlines+another 'o'

u                   "Undo this last search/replace
 2P                 "Paste twice
   í                "Search and replace on every line
    .«/| °|         "A compressed regex. This surrounds every non-empty line with bars.

Vr-                 "Replace the current (last) line with '-'
   H                "Move to line one
    Vr_             "Replace this line with '_'

非競合バージョン(31バイト):

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

このバージョンでは、このチャレンジよりも5バイト短くなる新しい機能がいくつか使用されています!

2番目の説明:

ddÀP

「行を削除してn回貼り付ける」ÀÄが「この行をn回繰り返す」に置き換えられます。(-2バイト)

óo î½o
u

「この正規表現の最初の一致を置き換える;元に戻す」が置き換えられました

/o î½o

これは「この正規表現の一致を検索する」だけです(-1バイト)

最後に、Òは、の単純な同義語ですVr。これは、「この行のすべての文字を「x」で置き換える」両方です。(-2バイト)



2
@meepl本当にわからない。50x959で動作しますが、幅または高さを大きくすると動作しなくなります。非常に大きなプログラムが実行されるのを防ぐために、Webサイトに意図的に設定された制限である可能性が高いと思います。
DJMcMayhem

1
TIOは、主にフロントエンドがブラウザーをクラッシュさせないように、出力を100 KBに制限します。
デニス

22

32 16ビットリトルエンディアンx86マシンコード、57 54 51バイト

@ninjaljのおかげで3バイト少なくなりました。

コードを大幅に書き直し、さらに3バイトを削減しました。

ヘックスで

FCBA6F208D48FFE20492AAEB2389D941D1E14151B05FF3AAEB0BB87C20AB89D992F3AB92AAB00AAA4E7DEF59B02DF3AA91AAC3

入力:BX = width、SI = height、DIは、「\ n」で区切られた行を含むNULL終了文字列として結果を受け取るバッファを指します

分解:

fc            cld
ba 6f 20      mov    dx,0x206f      ;Storing ' o' in DX for later use
8d 48 ff      lea    cx,[bx+si-0x1] ;CX=width+height-1
e2 04         loop   _main0         ;--CX & brahch if not zero
92            xchg   dx,ax          ;(1,1) case, swap DX & AX
aa            stosb                 ;AL == 'o', CX == 0
eb 23         jmp    _end
_main0:
89 d9         mov    cx,bx
41            inc    cx
d1 e1         shl    cx,1
41            inc    cx           ;Calculate (width+1)*2+1
51            push   cx           ;and save it for future use
b0 5f         mov    al,0x5f      ;'_'
f3 aa         rep    stosb        ;Output the whole line of them
eb 0b         jmp    _loopstart   ;Jump into the loop
_loop:
b8 7c 20      mov    ax,0x207c    ;' |'
ab            stosw               ;Output it once (left bar + space)
89 d9         mov    cx,bx        ;Copy width
92            xchg   dx,ax        ;AX == ' o'
f3 ab         rep    stosw        ;Output it CX times
92            xchg   dx,ax        ;Swap values back, AL == '|'
aa            stosb               ;Output only the right bar
_loopstart:
b0 0a         mov    al,0x0a      ;Newline. Can be replaced with mov ax,0x0a0d for windows newline
aa            stosb               ;convention (at the cost of 1 byte), with stosb replaced with stosw
4e            dec    si           ;Height--
7d ef         jge    _loop        ;Continue if si >= 0 (this accounts for the dummy first pass)
59            pop    cx
b0 2d         mov    al,0x2d      ;'-'
f3 aa         rep    stosb        ;Output bottom line
_end:
91            xchg   cx,ax        ;CX == 0, so swap to get zero in AL
aa            stosb               ;NULL-terminate output
c3            retn

16ビットのように短くなります:3つの66hプレフィックスの場合は-3バイト、「\ r \ n」行の終了の場合は+1バイト。
ninjalj

読みやすくするために、バウンド数のバツ印の数字と現在の数字の間にスペースを入れる必要があります。
値のインク

20

Python 2、75 73 72バイト

lambda x,y:(x*'__'+'___\n'+('| '+'o '*x+'|\n')*y+'-'*(x*2+3),'o')[x<2>y]

1,1ブロックを処理する条件付きの文字列を返します。

2バイトのリンとチェプナーに感謝


lambda x,y:('_'*x*2+'___\n'+などはバイトを保存します。
リン

1
x*'__'代わりにで別のバイトをノックオフします2*x*'_'
-chepner

このコミュニティに参加してください。質問して申し訳ありません。実行を確認するにはどうすればよいですか?ターミナルに貼り付けて印刷するだけ<function <lambda> at 0x......>です。これをどのようにテストできますか?
ミゲル

1
@Miguelはそれを変数に割り当てます。関数の値を返しますf=lambda x:x+1; print(f(9))
。–アトラロジスト

答えるのが複雑でなければ、もう一つ質問があります。どのようにビットを非常に正確にトレースできますか?
ミゲル

13

CJam、34

'_q~'o*"||"\*S*f*f+'-f+zN*_,H='o@?

オンラインで試す

説明:

'_        push a '_' character
q~        read and evaluate the input (height and width)
'o*       repeat the 'o' character <width> times
"||"\*    join the "||" string by the string of o's (putting them in between)
S*        join with spaces (inserting a space between every 2 characters)
f*        repeat each character <height> times, making it a separate string
f+        prepend '_' to each string
'-f+      append '-' to each string
z         transpose the array of strings
N*        join with newlines; lego piece is ready, special case to follow
_,        duplicate the string and get its length
H=        compare with H=17
'o        push 'o' for the true case
@         bring the lego piece to the top for the false case
?         if the length was 17, use 'o' else use the lego piece


11

Java、318 312 297 294 260 258バイト

cliffrootのおかげで15バイト節約されました

interface a{static void main(String[]A){int b=Byte.valueOf(A[0]),B=Byte.valueOf(A[1]),C=3+b*2;String c="";if(b<2&B<2)c="o";else{for(;C-->0;)c+="_";for(;B-->0;){c+="\n|";for(C=b;C-->0;)c+=" o";c+=" |";}c+="\n";for(C=3+b*2;C-->0;)c+="-";}System.out.print(c);}}

コマンドライン引数で動作します。

Ungolfed人間が読める形式では:

interface a {
    static void main(String[] A) {
        int b = Byte.valueOf(A[0]),
            B = Byte.valueOf(A[1]),
            C = 3 + b*2;
        String c = "";
        if (b < 2 & B < 2)
            c = "o";
        else {
            for (; C-- > 0;)
                c += "_";
            for (; B-- > 0;) {
                c += "\n|";
                for (C = b; C-- >0;)
                    c += " o";
                c += " |";
            }
            c += "\n";
            for(C = 3 + b*2; C-- >0;)
                c += "-";
        }
        System.out.print(c);
    }
}

はい、プログラムが無許可であっても、何が起こっているのかを理解することは依然として困難です。そのため、ここでは段階的な説明を行います。

static void main(String[] A)

最初の2つのコマンドライン引数(ディメンションを取得するために使用します)は、プログラムでA[0]and としてA[1](それぞれ)使用できます。

int b = Byte.valueOf(A[0]),
    B = Byte.valueOf(A[1]),
    C = 3 + b*2;
String c = "";

bは列Bの数、行の数でありCforループ専用の変数です。

cレゴの作品です。行を追加して、最後に印刷します。

if (b < 2 & B < 2)
    c = "o";
else {

印刷するピースが1x1の場合、b(列の数)とB(行の数)の両方が2より小さい必要があります。したがって、単純cに1つに設定し、その場合はピースを表すステートメントにoスキップSystem.out.printます。

for (; C-- > 0; C)
    c += "_";

ここでは、(integerValueOfA[0] * 2) + 3アンダースコアをに追加しますc。これは、すべての穴の一番上の行です。

for (; B > 0; B--) {
    c += "\n|";
    for(C = b; C-- > 0;)
        c+=" o";
    c += " |";
}

これは、一度に1行ずつピースを作成するループです。内部で何が起こっているかは、例なしで説明することは不可能です。ピースが4x4であるとしましょう:

Before entering the loop, c looks like this:
___________

After the first iteration (\n denotes a line feed):
___________\n
| o o o o |

After the second iteration:
___________\n
| o o o o |\n
| o o o o |

After the third iteration:
___________\n
| o o o o |\n
| o o o o |\n
| o o o o |

c += "\n";
for (C = 3 + b*2; C-- > 0;)
    c += "-";

ここでは(integerValueOfA[0] * 2) + 3、ピースにハイフンを追加します。これは、一番下の、すべての穴の下の列です。

for実際にピースが構築されるループの説明に使用した4x4ピースは、次のようになります。

___________\n
| o o o o |\n
| o o o o |\n
| o o o o |\n
| o o o o |\n
-----------
System.out.print(c);

そして最後に、作品を印刷します!


おそらくリビジョン3が、これをStack Exchangeで行った史上最長の投稿にしました。
ドルカハンはモニカを

2
ループCから変数を移動できforますint b=Byte.valueOf(A[0]),B=Byte.valueOf(A[1]),C。すべてのあなたが使用できるように、それはまた思わforループでC-->0;チェックを、それ298になり、pastebin.com/uj42JueL
cliffroot

1
いくつかの創造的な使い方for数バイトのためのループが保存- pastebin.com/dhNCpi6n
cliffrootを

1
最初に引数をバイトに変換する場合、チェックはブリックのサイズが1x1でif(b==1&B==1)あるため、20バイト以上を節約できます
-user902383

また、1x1の場合System.out.print('o');return;、代わりにこれを行うc='o'と、elseブロックの異なるブリックのロジックを設定および配置できます。次に、単一の印刷ステートメントを使用し、戻り値がないため、追加のバイトを保存できます
-user902383

9

Minkolang 0.1558の 57 56バイト

はい、そうです。私は1つ2つのスティンキンの小さなバイトをオフにゴルフしました...

nn$d*1-5&"o"O.rd2*3+$z1$([" o"]" ||"2Rlkr$Dlz["-_"0G]$O.

ここで試してみてください!

説明

nn                Take two numbers from input (stack is now [w h])

                  C special case C
  $d              Duplicate stack
    *1-           Multiply and subtract 1
       5&         Jump 5 spaces if truthy
         "o"O.    Top of stack was 1*1-1=0, so output "o" and stop.

                     C precalculates width of top and bottom lines for later use C
         r           Reverse stack (now [h w])
          d          Duplicate top of stack
           2*3+      Multiply top of stack by 2 and add 3
               $z    Pop this and store in register (z = 2*w+3)

                                       C generates the row C
                 1$(                   Open while loop prepopulated with top of stack
                    [" o"]             w times, push "o "
                          " ||"        Push "|| "
                               2R      Rotate twice to the right
                                 l     Push newline (10)
                                  k    Break out of while loop

                                           C duplicates the row h times C
                                   r       Reverse stack
                                    $D     Duplicate whole stack h times
                                      l    Push newline

                     C this is for the top and bottom lines C
        z[           Open for loop that repeats z times
          "-_"       Push "_-"
              0G     Relocate top of stack to bottom of stack
                ]    Close for loop

                 $O.    Output whole stack as characters and stop.

さて、保存された2バイトの説明の2つの重要な書き直しです。これ以上ゴルフをすることができるとは思わない。:P


3
最初のバイトは最も難しいステップです... 1000バイトの始まりは1ビットで始まります...
コナーオブライエン

8

brainfuck、391バイト

私はこれがもっとゴルフできることを知っていますが、この時点でそれがうまくいくことを嬉しく思います。今後もゴルフを続けていきます。

+++++[-<+++[-<+++<++++++<+++++++<++<++++++++>>>>>]<<+<+<<+<++>>>>>>>]<<<<+<++<->>>>>>,<,>>++++++[<--------<-------->>-]<<->>+<<[>>-<<[>>>+<<<-]]>>>[<<<+>>>-]<[<->>>+<<<[>>>-<<<[>>>>+<<<<-]]>>>>[<<<<+>>>>-]<[<<<<<<<.[-].]<<<+>-]<<+>[->++>+<<]>+++[-<<<<.>>>>]>[-<<+>>]<<<<<<<<<.>>>>>>><[->[->+>+<<]<<<<<<.>>>>>>>[<<<<<<.>.>>>>>-]>[-<<+>>]<<<<<<<.<.<.>>>>>>]>[->++>+<<]>+++[-<<<.>>>]>[-<<+>>]<<

入力は、2桁で指定する必要があります。のように、(8, 2)入力するにはを入力し82ます。

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

壊す:

最初に必要な文字をテープに入れます: (newline)| o_-

+++++[-<+++[-<+++<++++++<+++++++<++<++++++++>>>>>]<<+<+<<+<++>>>>>>>]<<<<+<++<->>>>>

次に、入力を2つのセルに収集し、それぞれから48を減算します(数字ではなく数値を取得します)

>,<,>>++++++[<--------<-------->>-]<<

次に、の特殊なケースを(1, 1)確認します(このチェックだけがコードの109バイトを占めていることに注意してください)。ifsがBrainfuckで行うほど難しくないかのように、ネストされていifます:

->>+<<[>>-<<[>>>+<<<-]]>>>[<<<+>>>-]<[<->>>+<<<[>>>-<<<[>>>>+<<<<-]]>>>>[<<<<+>>>>-]<[<<<<<<<.[-].]<<<+>-]<<+

以下は、セルxがゼロか非ゼロかを確認する構造です。

temp0[-]+
temp1[-]
x[
 code1
 temp0-
 x[temp1+x-]
]
temp1[x+temp1-]
temp0[
 code2
temp0-]

ただし、ネストされたにはif、4つの一時的なセルが必要です。

これで、実際の文字の印刷に移ります。

トップバーと改行を印刷します:

>[->++>+<<]>+++[-<<<<.>>>>]>[-<<+>>]<<<<<<<<<.>>>>>>>

|、の行o、別の行|、改行を高さに等しい回数印刷します。

<[->[->+>+<<]<<<<<<.>>>>>>>[<<<<<<.>.>>>>>-]>[-<<+>>]<<<<<<<.<.<.>>>>>>] 

そして、下のバーを印刷します(ここに改行は必要ありません):

>[->++>+<<]>+++[-<<<.>>>]>[-<<+>>]<<

7

網膜、52バイト

バイトカウントはISO 8859-1エンコードを前提としています。6行目には単一のスペースが含まれていることに注意してください。

\G1?
$_¶
1* 



.+
|$&|
\G.
_
r`.\G
-
s`^.{17}$|1
o

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

入力は単項式で1、単項数字として、スペースをセパレーターとして、高さに幅が続きます。

説明

このプログラムのすべてのステージは、場合によっては通常の正規表現修飾子(繰り返しやループなし、その他のタイプのステージなし)を使用した、単なる置換です。改行の通常のエイリアスを除き、Retina固有の置換機能さえ使用しません。

\G1?
$_¶

これの目的は、2つの入力を「乗算」することです。私たちの目標は、作成することであるh+2と行をw 1(それぞれのh+2私たちはに上部と下部を回すことができるようにということ_と、-それ以降)。\Gアンカーは、最後のアンカーが中断したところから開始するための一致を必要とします。つまり、文字列内の文字と一致しなかった場合、それ以降の文字も一致しません。これを使用して1s のみを照合しますhw、正規表現ではそれらを区切るスペースを照合できないため、in では照合しません。ただし、1オプションを作成して、の最後に追加の空の一致を取得しhます。それはh+1一致します。これらはそれぞれ、入力全体($_)とそれに続く改行に置き換えられます。wそれ自体は変更されずに残り、h+2ndコピーが得られます。入力がであったとすると11 1111、次のようになりました。

11 1111
11 1111
11 1111
 1111

それはかなりいいです。余分なものがいくつかありますが、そのh+2コピーwがあります。

1* 

最初の行の最後にスペースがあることに注意してください。これにより、行からこれらのプレフィックスが削除されるため、wその後はs のみになります。



まあ、それはSEのフォーマットでは実際には機能しません...最初の行は空で、2番目の行には単一のスペースが含まれているはずです。これは、可能なすべての位置、つまり各行の先頭と末尾、および1sのすべてのペアの間にスペースを挿入します。

 1 1 1 1 
 1 1 1 1 
 1 1 1 1 
 1 1 1 1 

これらをo後でsに変換します

.+
|$&|

これは、次のペアのすべての行を単純にラップします|

| 1 1 1 1 |
| 1 1 1 1 |
| 1 1 1 1 |
| 1 1 1 1 |

ここで、上部と下部を管理します。

\G.
_

\G再び輝く時間。これは、最初の行の各文字と一致し、に変換し_ます。

r`.\G
-

同じことですが、r修飾子(右から左へのモード)により、これは最後の行の文字に一致し、それらをに変換し-ます。だから今、私たちは持っています:

___________
| 1 1 1 1 |
| 1 1 1 1 |
-----------

今やるべきことが2つあります。それら1osに変換し、入力があった場合、代わりに1 1全体を変換しoます。これらの両方を単一のステージで処理できます。

s`^.{17}$|1
o

s通常の単一行​​モードです(つまり、.改行を一致させます)。入力が1 1結果である場合、17文字の最小サイズになるので、それと一致させ、^.{17}$で置き換えることができoます。それ以外の場合、それが失敗した場合、すべての1sを一致させ、代わりにそれらを置き換えoます。


7

Jolf、36バイト

?w*jJρΡ,a+3ώj+2J'-"-+"d*'_lH"  ' o'o
?w*jJ                             'o   return "o" if j * J - 1
       ,a                              make a box
         +3ώj                           of width +3ώj = 3+2*j
             +2J                        of height +2J = 2+J
                '-                      specifying corners as "-"
      Ρ           "-+"                 replacing the first run of "-"s
                      d*'_lH            with a run of "_"s of equal length
     ρ                      "  '       replacing all "  "
                               ' o      with " o"

Jolf、24バイト、非競合

さて、私はより良いボックスを作りました。

?w*jJ,AhώjJ"_-'_-'|' o'o

Jolf、38 37バイト

?w*jJΆ+*'_γ+3ώjS*JΆ'|*j" o' |
"*'-γ'o

シンプルなもの、本当に。両方の引数が1の場合(数学のゼータ、またはスタンド逸脱)は0のみであり、それ以外の場合は偽であることに注意して、バイトを保存しました(この場合)。


6

05AB1E、33バイト

コード:

*i'oë¹·3+©'_׶²F'|„ o¹×„ |¶}®'-×J

説明:

*i'o                               # If both input equal 1, push "o"
    ë                              # Else, do...
     ¹·3+                          # Push input_1 × 2 + 3
         ©                         # Copy this number to the register
          '_×                      # Multiply by "_"
             ¶                     # Push a newline character
              ²F           }       # Do the following input_2 times:
                '|                 # Push "|"
                  „ o              # Push " o"
                     ¹×            # Multiply this by input_1
                       „ |         # Push " |"
                          ¶        # Push a newline character
                            ®      # Retrieve the value from the register
                             '-×   # Multiply by "-"
                                J  # Join everything and implicitly print.

CP-1252エンコードを使用します。オンラインでお試しください!


6

JavaScript(ES6)、89 86バイト

(x,y,g=c=>c[r=`repeat`](x*2+3))=>x*y-1?g(`_`)+`
`+`| ${`o `[r](x)}|
`[r](y)+g(`-`):`o`

編集:@Shaggyのおかげで3バイト保存されました。


エイリアシングにより3バイトを節約しますrepeat
シャギー

5

Python 2、71バイト

lambda x,y:('o',x*'__'+'___\n'+'| %s|\n'%('o '*x)*y+'-'*(x*2+3))[x+y>2]

1
PPCGへようこそ!素敵な最初の投稿!
Rɪᴋᴇʀ

5

Befunge、144バイト

私はこの投稿にコメントしたいと思っていましたが、まだ評判がありませんので、私は自分の答えを入れています。

&::&*:1`v
v3*2:\/\_"o",@
>+:  v   >52*," |",, v
>,1-:vLEG O MAKERv::\<
^"_" _$\:|<v "o "_v
v52:+3*2$<,>,,1-:^$
>*,v <    ^"|":-1\<
v-1_@,
>:"-"^

ここでコードをテストできます


4

Reng v.4、82バイト、非競合

自分で上書きされる機能を修正するバグ修正をプッシュしました(尋ねないでください;私のものは幽霊です)

i#wi#hhw+2e1+ø ~*x}o:{"-"ö<
"_"{:o}w2*3+#xx*2ø
"o"o~
ö"|"o"o"{Wo:o}w*"| "ooh1-?^#h

のように、スペースで結合された数値として入力を受け取り4 2ます ここで試してみてください!


8
I pushed a bug fix that fixes functions being overwritten by themselves...まあ、それは興味深いバグです
-MKII

4

PowerShell v2 +、76バイト

param($x,$y)if($x+$y-2){"_"*($z=$x*2+3);"|$(" o"*$x) |`n"*$y+'-'*$z;exit}"o"

入力を受け取り、ifステートメントをチェックします。非ゼロ値があるのでtruthyの少なくとも一つ限り、PowerShellで$x且つ$yに等しくない1if真であろう。

内にはif、一連の文字列の乗算があります。最初に、アンダースコアの文字列を作成し、$z後で使用するために保存します。それはパイプラインに置かれます。次に、サイドとペグの文字列(ペグにを掛けたもの$x)を作成し、$y時間を完了し、ダッシュ$z時間と連結します。その文字列はパイプラインと私たちの上に置かれていますexit。パイプラインがフラッシュされ、印刷が暗黙的に行われます。アンダースコアとペグの最初の行の間の改行は無料で取得されることに注意してください。.ToString()配列出力のデフォルトのセパレータは`n(文字列の配列を出力しているため)です。

場合はiffalseで、我々は特別にいる1 1私達はちょうど置くので、ケース"o"の暗黙的なもう一度印刷して、パイプラインと終了時に、それ自体で。

PS C:\Tools\Scripts\golfing> .\print-a-lego-piece.ps1 1 1
o

PS C:\Tools\Scripts\golfing> .\print-a-lego-piece.ps1 5 3
_____________
| o o o o o |
| o o o o o |
| o o o o o |
-------------

4

バッシュ、186163156148131、130バイト

 ## Arg1 - Lego width
 ## Arg2 - Lego height 
function print_lego() { 
(($1+$2>2))&&{
printf _%.0s `seq -1 $1`
echo
for((i=$2;i--;)){ 
 printf \|
 for((j=$1;j--;)){
  printf o
 }
 echo \| 
}
printf =%.0s `seq -1 $1`
echo 
}||echo o
}

注:最後の行にレゴのハイフンが本当に必要な場合は、最後のprintfを

printf -- -%.0s `seq -1 $1`

2バイトを追加します。


2
関数でラップされていなければ、これはかなり短くないでしょうか?また、私はbashの専門家ではありませんが、余分な空白があるようです。
DJMcMayhem

ワンライナーとしては約170です(($x+$y==2))&&echo o||{ printf _%.0s $(seq -1 $x);echo;for((i=0;i<$y;i++));do printf \|;for((j=0;j<$x;j++));do printf o;done;echo \|;done;printf =%.0s $(seq -1 $x);echo;}

1
を使用する場合、関数を宣言()するためのキーワードは必要ありませんfunctionfor中括弧を使用した代替構文がありますfor((j=$1;j--;));{ printf o;}。例:。前の例で示したように、for2番目の式でデクリメントしてテストすることにより、一部の文字を保存できます。の代わりにバックティックを使用できます$(cmd)
ninjalj

@ninjaljありがとう、私はゴルフをコーディングするのは初めてです-それはもう17バイトを絞って、ワンライナーは現在152です:(($x+$y==2))&&echo o||{ printf _%.0s `seq -1 $x`;echo;for((i=$y;i--;)){ printf \|;for((j=$x;j--;)){ printf o;};echo \|;};printf =%.0s `seq -1 $x`;echo;}

算術コンテキストではドル記号はオプションであるため(($something))((something))全体に変更することでさらに数バイト削ることができます。($1文字通りの1
あいまいさを解消

4

Perl 5-84 77バイト

84バイト

sub l{($x,$y)=@_;$w=3+2*$x;warn$x*$y<2?"o":'_'x$w.$/.('| '.'o 'x$x."|\n")x$y.'-'x$w}

77バイト。Dom Hastingsの助けを借りて

sub l{($x,$y)=@_;$x*$y<2?o:'_'x($w=3+2*$x).('
| '.'o 'x$x."|")x$y.$/.'-'x$w}

最初に、なぜ誰かがwarnゴルフプログラムで使用しようと努力するのか混乱していましたが、それより短いのであなたがそれを使用していることに気付きましたprint。いいね!
パイプ

ええ、Perl 6では、警告の代わりにsayを使用して別のバイトを
削除

1
Perl 5でも同じことができますが、デフォルトでは有効になっていません。私-E-e、すべての拡張機能を有効にする代わりに、コマンドラインからスクリプトを呼び出すことで、コードゴルフでそれを回避できると思います。この場所は初めてなので、スコアのカウント方法がどこで指定されているのか正確にはわかりません。
パイプ

ああ、私はそれを知りませんでした。私もここにいるので、私もわからない
-Kaundur

これを76バイトに短縮できると思います...文字列を返すことが許容できると思う関数を使用している場合(JSの回答を参照して、4バイト節約しますwarn)、引用符は必要ありません"o"(できる別のベアワードを使用する-2)、計算をインライン化する場合、$w別のバイトを保存する必要があります('_'x($w=3+2*$x)$w=3+2*$x;... '_'x$w)、最後に\n、リテラル改行を変更することができます。お役に立てば幸いです!
ドムヘイスティングス

3

C、202の 191バイト

#define p printf
i,w,h;t(char*c){for(i=0;p(c),++i<w*2+3;);p("\n");}f(){t("_");for(i=0;i<w*h;)i%w<1?p("| o "):p("o "),i++%w>w-2&&p("|\n");t("-");}main(){scanf("%d %d",&w,&h);w*h<2?p("o"):f();}

11バイトを節約してくれた@Lince Assassinoに感謝します!

ゴルフをしていない:

#include <stdio.h>
#define p printf

int i, w, h;

void t(char *c)
{
    for(i=0; p(c), ++i<w*2+3;);
    p("\n");
}

void f()
{
    t("_");
    for(i=0; i<w*h;)
    {
        i%w<1 ? p("| o ") : p("o ");
        i++%w>w-2 && p("|\n");
    }
    t("-");
}

int main()
{
    scanf("%d %d", &w, &h);
    w*h<2 ? p("o") : f();
}

1
最初の行を変更できますp(char*A){printf(A);}
Lince Assassino

1
本当にありがとう!しかし、短くすることは可能です#define p printf
マルコ

3

シナモンガム、32バイト

0000000: 6c07 d5f5 7a5d 9cdf 5ae6 52ae 4050 0c35  l...z]..Z.R.@P.5
0000010: 18d9 052f 0082 9b42 e7c8 e422 5fe4 7d9f  .../...B..."_.}.

非競合。オンラインでお試しください。入力は[width,height]、コンマと高さの間にスペースがない正確な形式でなければなりません。

説明

文字列はこれに解凍されます:

l[1,1]&o;?&`p___~__~
%| ~o ~|
%---~--~

最初のl段階は(特別な場合)にマッピング[1,1]o、その他はすべて文字列にマッピングします

`p___~__~
%| ~o ~|
%---~--~

その後、バックティックは第2ステージの開始を通知します。その文字列を出力する代わりに、CGはバックティックを切り取り、文字列を実行します。pモードは、次にチルダ最初のパラメータ(幅)時間内のすべての文字を繰り返し、次いで、その後パーセント記号第二パラメータ(高さ)回内部文字を繰り返します。だから[4,2]それはこれに変わります:

___________
%| o o o o |
%-----------

そして次に:

___________
| o o o o |
| o o o o |
-----------

3

バッチ、172 170バイト

@echo off
if "%*"=="1 1" echo o&exit/b
set o=
for /l %%i in (1,1,%1)do call set o=%%o%% o
echo ---%o: o=--%
for /l %%i in (1,1,%2)do echo ^|%o% ^|
echo ---%o: o=--%

編集:@CᴏɴᴏʀO'Bʀɪᴇɴ @EʀɪᴋᴛʜᴇGᴏʟғᴇʀのおかげで2バイト保存されました。

遅延拡張が有効になっていると想定できる場合、7バイトを節約できます。


%%o%%代わりに%o%
エリックアウトゴルファー

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ %o%は、o毎回の元の値に置き換えられるため、o等しいだけになり" o"ます。%%o%%引数として経由するcall%o%、その後の現在の値を使用しています、o
ニール

どうして...ただdo set o=%o% o
エリックアウトゴルファー16

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ %o%は、forループが解析される前に展開されるため、ループfor /l %i in (1,1,8) do call set o= oは明らかに無意味です。
ニール

なぜそうしないのですdo set o=%%o%% oか(-5)?
エリックアウトゴルファー16

3

Vim、56キーストローク

これはテキスト編集タスクのように見えるので、Vimは当然の選択です。2つのスペースで区切られた整数を持つテキストファイルとして入力を受け取り、同じファイルに回答を出力します。また、1x1の特別なケースがあることを嫌います...とにかく:

"adt l"bDro:if@a*@b==1|wq|en<cr>Di| |<esc>@aio <esc>yy@bPVr_GpVr-ZZ

特別なケースがなかった場合、35回のキーストローク

"adt x"bDi| |<esc>@aio <esc>yy@bPVr_GpVr-ZZ

健全な人々の内訳:

"adt l"bD

バッファから@aと@bに数字を削除します(スペース文字は保持されます)

         ro:if@a*@b==1|wq|en<cr>

スペースを「o」に置き換え、特殊な場合は保存して終了

                                Di| |<esc>

ラインをクリアし、レゴブロックのエッジを書き込みます

                                          @aio <esc>

@aをたくさん挿入して、完成した中間部分を取得します

                                                    yy@bP

行をヤンクし、@ bの余分なコピーを作成します(1つが多すぎます)

                                                         Vr_

バッファーの先頭にあり、余分な行をアンダースコアに置き換えます

                                                            Gp

バッファの一番下にジャンプし、先ほどヤンクした行を引きます

                                                              Vr-ZZ

行をダッシュ​​で置き換え、保存して終了



2

Haskell、76バイト

1#1="o"
w#h|f<-w*2+3=f!"_"++'\n':h!('|':w!" o"++" |\n")++f!"-"
n!s=[1..n]>>s

使用例:3 # 23行2列のブリックに複数行の文字列を提供します。

ゴルフをしていない:

(#) :: Int -> Int -> String
1     #   1    = "o"
width # height = let longWidth = 2 * width + 3 in -- golfed as 'f'
                      (        longWidth `times` "_"  ++   "\n" )
  ++ height   `times` ( "|" ++     width `times` " o" ++ " |\n" )
  ++                  (        longWidth `times` "-"            )

-- | golfed as (!)
times :: Int -> [a] -> [a]
times n s = concat $ replicate n s

一見、で短くなるように見えましたが、そうではありunlinesません。
ballesta25

2

Groovyの、1079870、64

{x,y->t=x*2+3;x<2&&y<2?"o":'_'*t+"\n"+"|${' o'*x} |\n"*y+'-'*t}

テスト:

(2,2)
(1,1)
(8,2)
(1,4)
_______
| o o |
| o o |
-------
o
___________________
| o o o o o o o o |
| o o o o o o o o |
-------------------
_____
| o |
| o |
| o |
| o |
-----

2

Befunge、114の 113 108 101バイト

Befungeのソリューションはすでに数多くあることは知っていますが、コードのレイアウトに異なるアプローチを採用することで改善できると確信していました。この答えはさらにゴルフにかけることができると思いますが、すでに以前のエントリのいずれよりもかなり小さくなっています。

&::&+:2`^|,+55_"_",^
-4:,,"| "<\_|#:+1\,,"|"+55$_2#$-#$" o",#!,#:<
  ,"-"_@#:-1<
 :*2+2\-_"o",@v!:-1<

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


文字列:<|が必要な理由を説明できますか?
ザカリー

@Zacharý最初の行の垂直分岐は実際には分岐しません。スタックの最上部はその時点では常にゼロであるため、スタックの最上部をドロップし、同時に分岐するためのショートカットです-基本的にはこのtipです。
ジェームズホルダーネス

1

APL、46バイト

{⍵≡1 1:'o'⋄'-'⍪⍨'_'⍪'|',' ','|',⍨'o '⍴⍨1 2×⌽⍵}

ガード:⍵≡1 1:'o'特別な場合。それ以外の場合'o '⍴⍨1 2×⌽⍵、コンテンツをビルドします。そして残りはただのボクシングです。


1

C#、198バイト

void f(int x,int y){int l=x*2+3;Console.Write(y==x&&x==1?"o":s("_",l)+"\n"+s("|"+s(" o",x)+" |\n",y)+s("-",l));}string s(string m,int u){return string.Join("",new string[u].Select(n=>m).ToArray());}

早くて汚い

文字列を乗算する関数を書く必要がありました

ungolfed(提案用)

public static void f(int x,int y)
{
    int l=x*2+3;
    Console.Write(y == x && x == 1 ? "o" : s("_",l)+"\n"+ s("|" + s(" o", x) + " |\n", y) + s("-",l));

}
public static string s(string m,int u)
{
    return string.Join("", new string[u].Select(n => m).ToArray());
}

s関数を最適化できることに気付きましstring s(string m,int u){return string.Join("",new int[u].Select(n => m));}た-.ToArray()は冗長であり、string []はint []でもあります。しかし、その代わりにstring.Joinのあなたは使用することができ、集約:string s(string m, int u){return new int[u].Aggregate("",(t,i)=>t+m);}
オリバー・ハラム

1
次のように数バイト削ることができます...(191)void f(int x,int y){Func<char,int,string>s=(c,i)=>new string(c,i);int l=x*2+3;Console.Write((y&x)==1?"o":s('_',l)+"\n"+s('y',y).Replace("y","| "+s('x', x)+"|\n").Replace("x","o ")+s('-',l));}
マシュー・

1

オクターブ、97 95 86バイト

@(w,h){[a=~(1:w*2+3)+95;repmat(['| ' repmat('o ',1,w) '|'],h,1);~a+45],'o'}{(w*h<2)+1}

Pythonで@atlasologistのメソッドを使用してテストしました(1, 1)(...,'o')[x<2>y]

おかげ@Luis Mendo:7つのバイトを保存するためa=ones(1,w*2+3)*'_'a=~(1:w*2+3)+95a./a*'-'~a+45

2バイトを節約してくれた@pajonkに感謝します。f=


1
これは有効なMatlabコードではありません。「オクターブ」のみのラベルを付ける必要があります。また、代わりにa./a*'-'使用できます~~a*'-'か?それとも~a+45
ルイスメンドー

また、おそらく匿名関数(なしf=)として残すことができます
-pajonk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.