พิมพ์ชิ้นเลโก้


48

ความท้าทายนี้คือการที่ง่ายหนึ่ง ด้วยอินพุตสองตัวซึ่งอธิบายความสูงและความกว้างของชิ้นเลโก้คุณได้พิมพ์ภาพศิลปะ 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
กรณีพิเศษคือคนเกียจคร้านจริง
Conor O'Brien

47
ในอีกไม่กี่ปีข้างหน้าฉันต้องการเห็นความท้าทาย "พิมพ์ชิ้นส่วนเลโก้" อีกครั้งที่ต้องเขียนรหัสเพื่อบอกเครื่องพิมพ์ 3 มิติเพื่อผลิตเลโก้
Kevin - Reinstate Monica

8
รอ "สิ่งใดก็ตามที่คุณสนับสนุนภาษาจำนวนเต็ม"? นั่นไม่ใช่วิธีของเลโก้ อิฐนั้นมีให้เฉพาะในมิติที่เฉพาะเจาะจงเท่านั้น แม้ว่าคุณจะเพิ่มในจานคุณจะได้รับเพียงไม่กี่ สคริปต์ใด ๆ ที่ไม่ทิ้งอินพุตเช่น (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: วิธีการ Befunge โค้ดไหลไปตามทิศทางของลูกศร


2
โอ้ ของฉัน พระเจ้า. ระเบิดความคิดของฉัน
lukas.pukenis

25

V , 43, 40, 38 36 ไบต์

หนึ่งในคำตอบ V ที่ยาวที่สุดที่ฉันเคยเขียน ...

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

ลองออนไลน์!

เนื่องจากสิ่งนี้มีอักขระ unicode และ unprintable นี่คือ hexdump แบบย้อนกลับได้:

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

ตอนนี้เรามีบรรทัด 'ความสูง' ของช่องว่างระหว่างพวกเขา

ñ                   "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 ไบต์!

คำอธิบายที่สอง:

ddÀP

ซึ่งคือ "ลบบรรทัดและวางเป็นnคูณ" ซึ่งจะถูกแทนที่ด้วยÀÄซึ่งคือ "ทำซ้ำบรรทัดนี้nคูณ" (-2 ไบต์)

óo î½o
u

ซึ่งคือ "แทนที่การจับคู่แรกของ regex นี้เลิกทำ" ถูกแทนที่ด้วย

/o î½o

ซึ่งเป็นเพียง "ค้นหาการจับคู่ของ regex นี้" (-1 ไบต์)

และสุดท้ายÒเป็นเพียงคำพ้องความหมายง่ายๆVrซึ่งทั้งสอง "แทนที่อักขระทุกตัวในบรรทัดนี้ด้วย 'x'" (-2 ไบต์)


ทำไมมันถึงแตกที่ด้านล่างด้วยv.tryitonline.net/
metersk

2
@ meepl ฉันไม่รู้จริงๆ มันใช้งานได้กับ50x959แต่ถ้าคุณเพิ่มความกว้างหรือความสูงมันก็หยุดทำงาน ฉันเดาว่าเป็นไปได้ว่ามีข้อ จำกัด ที่ตั้งใจวางไว้บนเว็บไซต์เพื่อป้องกันไม่ให้โปรแกรมที่มีขนาดใหญ่มากถูกเรียกใช้
DJMcMayhem

1
TIO จำกัด ผลลัพธ์ที่ 100 KBส่วนใหญ่เพื่อป้องกันไม่ให้ส่วนหน้าหยุดทำงานเบราว์เซอร์ของคุณ
Dennis

22

32รหัสเครื่อง 86 x 16 บิตน้อย endian, 57 54 51 ไบต์

ขอบคุณ 3 ไบต์น้อยลงไปที่ @njjj

เขียนรหัสซ้ำอย่างหนักและจัดการเพื่อลบทิ้งอีก 3 ไบต์

ในรูปหกเหลี่ยม

FCBA6F208D48FFE20492AAEB2389D941D1E14151B05FF3AAEB0BB87C20AB89D992F3AB92AAB00AAA4E7DEF59B02DF3AA91AAC3

อินพุต: BX = ความกว้าง SI = ความสูง DI ชี้ไปที่บัฟเฟอร์ที่รับผลลัพธ์เป็นสตริงที่สิ้นสุดด้วยค่า NULL โดยมีบรรทัดคั่นด้วย "\ n"

ถอดชิ้นส่วน:

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 ไบต์สำหรับ 3 นำหน้า 66 ชั่วโมง, +1 ไบต์สำหรับการสิ้นสุดบรรทัด "\ r \ n"
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

ขอบคุณ Lynn และ Chepner สำหรับสองไบต์


lambda x,y:('_'*x*2+'___\n'+ฯลฯ บันทึกเป็นไบต์
ลินน์

1
เราะไบต์อื่นที่มีแทนx*'__' 2*x*'_'
chepner

เพียงแค่เข้าร่วมชุมชนนี้ขอโทษที่ถาม ฉันจะเห็นมันทำงานอย่างไร ฉันวางมันลงในเครื่องและพิมพ์<function <lambda> at 0x......>ออกมา ฉันจะทดสอบสิ่งนี้ได้อย่างไร
Miguel

1
@Miguel กำหนดให้กับตัวแปร มันจะคืนค่าของฟังก์ชั่น:f=lambda x:x+1; print(f(9))
atlasologist

อีกหนึ่งคำถามหากไม่ตอบคำถามที่ซับซ้อน คุณจะติดตามบิตอย่างแม่นยำได้อย่างไร
Miguel

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 ไบต์

บันทึก 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)

อาร์กิวเมนต์บรรทัดคำสั่งสองข้อแรก - ซึ่งเราจะใช้รับขนาด - สามารถใช้ในโปรแกรมเป็นA[0]และA[1](ตามลำดับ)

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

bคือจำนวนคอลัมน์BคือจำนวนแถวและCเป็นตัวแปรเฉพาะสำหรับใช้ในforลูป

cเป็นชิ้นเลโก้ เราจะต่อท้ายแถวแล้วพิมพ์มันในตอนท้าย

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

หากชิ้นส่วนที่จะพิมพ์มีขนาด 1x1 ดังนั้นทั้งสองb(จำนวนคอลัมน์) และB(จำนวนแถว) ควรมีขนาดเล็กกว่า 2 ดังนั้นเราจึงกำหนดcให้เป็นชิ้นเดียว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 += " |";
}

นี่คือลูปที่เราสร้างชิ้นส่วนทีละแถว สิ่งที่เกิดขึ้นภายในเป็นไปไม่ได้ที่จะอธิบายโดยไม่มีตัวอย่าง สมมติว่าชิ้นส่วนคือ 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เครื่องหมายขีดคั่นต่อท้าย นี่คือแถวที่ด้านล่างสุดใต้รูทั้งหมด

ชิ้นส่วน 4x4 ที่ฉันใช้อธิบายforวงที่ชิ้นส่วนถูกสร้างจริงตอนนี้มีลักษณะเช่นนี้:

___________\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);

และในที่สุดเราพิมพ์ชิ้น!


Probably Revision 3ทำให้โพสต์นี้เป็นโพสต์ที่ยาวที่สุดที่ฉันเคยทำใน Exchange Exchange
dorukayhan

2
คุณสามารถย้ายCตัวแปรจากลูปfor int b=Byte.valueOf(A[0]),B=Byte.valueOf(A[1]),Cดูเหมือนว่าคุณสามารถใช้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'และวางตรรกะสำหรับอิฐที่แตกต่างกันในบล็อกอื่น จากนั้นมีคำสั่งพิมพ์เดียวและไม่มีผลตอบแทนให้คุณบันทึกไบต์เพิ่มเติมบางอย่าง
user902383

9

Minkolang 0.15 , 58 57 56 ไบต์

ถูกต้องเลย. ผมแข็งแรงเล่นกอล์ฟออกหนึ่งสองเหม็นไบต์เล็ก ๆ น้อย ๆ ...

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.

โอเคนั่นคือการเขียนคำอธิบายที่สำคัญสองครั้งสำหรับการบันทึกสองไบต์ ฉันไม่คิดว่าฉันจะทำได้หรือจะออกอะไรมากกว่านี้ : P


3
ไบต์แรกเป็นขั้นตอนที่ยากที่สุด ... จุดเริ่มต้นของ 1000 ไบต์ที่เริ่มต้นด้วยบิตเดียว ...
Conor โอไบรอัน

8

brainfuck, 391 ไบต์

ฉันรู้ว่าสิ่งนี้สามารถเล่นกอล์ฟได้มากขึ้น แต่ ณ จุดนี้ฉันแค่ดีใจที่มันได้ผล ฉันจะทำงานต่อไปเพื่อลงสนามกอล์ฟ

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

ต้องป้อนค่าให้เป็นตัวเลขสองหลัก ในขณะที่การทำคุณก็จะป้อน(8, 2)82

ลองออนไลน์!

ชำรุด:

ก่อนอื่นให้ใส่อักขระที่จำเป็นลงในเทป: (newline)| o_-

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

จากนั้นรวบรวมอินพุตเป็นสองเซลล์และลบ 48 จากแต่ละ (เพื่อรับค่าตัวเลขไม่ใช่อักขระตัวเลข)

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

ถัดไปตรวจสอบกรณีพิเศษของ(1, 1)(โปรดทราบว่าเฉพาะการตรวจสอบนี้บัญชีรหัส 109 ไบต์) ราวกับว่าifมันไม่ยากพอที่จะทำใน brainfuck เรามีรังif:

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

ต่อไปนี้เป็นโครงสร้างเพื่อตรวจสอบว่าเซลล์ x เป็นศูนย์หรือไม่เป็นศูนย์:

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

อย่างไรก็ตามในที่ซ้อนกันifเราต้องมี 4 เซลล์ชั่วคราว

ตอนนี้เรามาถึงการพิมพ์ตัวอักษรที่แท้จริง:

พิมพ์แถบด้านบนและขึ้นบรรทัดใหม่:

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

พิมพ์ a |, แถวของอีกแถวoหนึ่ง|และขึ้นบรรทัดใหม่หลายครั้งเท่ากับความสูง:

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

และพิมพ์แถบด้านล่าง (ไม่จำเป็นต้องขึ้นบรรทัดใหม่ที่นี่):

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

7

เรติน่า 52 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1 โปรดทราบว่าบรรทัดที่หกควรมีช่องว่างเดียว

\G1?
$_¶
1* 



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

ลองออนไลน์!

อินพุตมีค่าเป็นยูนารีใช้1เป็นเลขหลักในอวกาศเป็นตัวคั่นและความสูงตามด้วยความกว้าง

คำอธิบาย

ขั้นตอนทั้งหมดในโปรแกรมนี้เป็นการทดแทนแบบเปลือยบางครั้งด้วยตัวดัดแปลง regex ปกติ (ไม่มีการทำซ้ำหรือวนซ้ำไม่มีขั้นตอนประเภทอื่น) มันไม่ได้ใช้ฟีเจอร์การแทนที่เฉพาะ Retina ด้วยนอกเหนือจากฉายาปกติสำหรับ linefeeds

\G1?
$_¶

วัตถุประสงค์ของสิ่งนี้คือเพื่อ "คูณ" อินพุตทั้งสอง เป้าหมายของเราคือการสร้างh+2แถวที่มีw 1แต่ละแถว ( h+2เพื่อให้เราสามารถเปลี่ยนด้านบนและด้านล่างเป็น_และ-ต่อมา) \Gสมอต้องใช้การแข่งขันจะเริ่มต้นที่คนสุดท้ายซ้ายปิด นั่นคือถ้าเราล้มเหลวในการจับคู่อักขระในสตริงอักขระอื่น ๆ จะไม่ตรงกันเช่นกัน เราใช้สิ่งนี้เพื่อจับคู่เฉพาะ1ในhแต่ไม่ใช่wเพราะ regex ไม่อนุญาตให้มีพื้นที่ที่แยกพวกเขาจะจับคู่ อย่างไรก็ตามเรายังทำให้ตัวเลือกเพื่อที่เราจะได้รับการจับคู่ที่ว่างเพิ่มเติมในตอนท้ายของ1 hนั่นคือการh+1แข่งขัน แต่ละรายการจะถูกแทนที่ด้วยอินพุตทั้งหมด ( $_) ตามด้วยตัวป้อนบรรทัดwตัวเองยังคงไม่มีใครแตะต้องซึ่งให้เราh+2สำเนาที่สอง พูดว่าอินพุตเป็น11 1111ตอนนี้เราได้รับ:

11 1111
11 1111
11 1111
 1111

นั่นเป็นสิ่งที่ดีงาม เรามีสิ่งพิเศษบางอย่าง แต่h+2สำเนาwอยู่ที่นั่น

1* 

โปรดทราบว่ามีช่องว่างที่ท้ายบรรทัดแรก สิ่งนี้จะลบคำนำหน้าเหล่านั้นออกจากบรรทัดเพื่อที่เราจะได้เพียงws หลังจากนั้น



อืมนั่นมันใช้ไม่ได้กับการจัดรูปแบบของ SE ... บรรทัดแรกว่างเปล่าและบรรทัดที่สองควรมีช่องว่างเดียว สิ่งนี้จะแทรกช่องว่างในทุกตำแหน่งที่เป็นไปได้เช่นที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัดและระหว่างทุกคู่ของ1s:

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

เราจะเปลี่ยนสิ่งเหล่านี้เป็นos ในภายหลัง

.+
|$&|

สิ่งนี้จะห่อทุกบรรทัดในคู่ของ|:

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

มีเพียงสองสิ่งที่ต้องทำในขณะนี้: เปลี่ยนสิ่งเหล่านั้น1เป็นos และหากอินพุต1 1นั้นเปลี่ยนทั้งสิ่งให้เป็นoแทน เราสามารถจัดการทั้งสองอย่างด้วยขั้นตอนเดียว:

s`^.{17}$|1
o

sเป็นโหมด singleline ปกติ (เช่นทำให้การ.จับคู่ linefeeds) ถ้าใส่เป็น1 1ผลที่ได้จะมีขนาดต่ำสุด 17 ตัวอักษรเพื่อให้เราสามารถตรงกับและแทนที่ด้วย^.{17}$ oมิฉะนั้นถ้าที่ล้มเหลวเราจะเป็นเพียงแค่ตรงทั้งหมด1และแทนที่ผู้ที่มี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

เรื่องง่าย ๆ จริงๆ บันทึกไบต์โดยสังเกตว่า(math zeta หรือ stand deviance) เป็นเพียง 0 เมื่อทั้งสองอาร์กิวเมนต์มีค่า 1 และเป็นเท็จอย่างอื่น (สำหรับกรณีของเรา)


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`

แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @Shaggy


บันทึก 3 ไบต์โดย repeataliasing
Shaggy


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จะไม่เท่ากันในการ1ที่ifจะเป็นจริง

ข้างในifนั้นมีชุดของการคูณสตริง อันดับแรกเราสร้างสตริงของเครื่องหมายขีดล่าง$zเพื่อบันทึกในภายหลัง ที่ได้รับการวางบนท่อ ต่อไปเราสร้างสตริงของด้านและหมุด (ด้วยหมุดคูณด้วย$x), $yเวลาที่ทำและเชื่อมต่อกับ$zเวลาขีดกลางของเรา exitสตริงที่มีอยู่แล้วในท่อและเรา ไปป์ไลน์ถูกฟลัชและการพิมพ์เป็นนัย โปรดทราบว่าเราได้รับการขึ้นบรรทัดใหม่ระหว่างขีดล่างและแถวแรกของหมุดฟรีเนื่องจาก.ToString()ตัวคั่นเริ่มต้นสำหรับเอาต์พุตอาร์เรย์คือ`n(และเรากำลังแสดงอาร์เรย์ของสตริง)

หากifเป็นเท็จเราอยู่ใน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

Bash, 186 , 163 , 156 , 148 , 131 , 130 Bytes

 ## 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
นี่จะไม่สั้นไปสักหน่อยถ้ามันไม่ห่อหุ้มฟังก์ชั่นหรือไม่? นอกจากนี้ฉันไม่ใช่ผู้เชี่ยวชาญด้านทุบตี แต่ดูเหมือนว่ามันมีช่องว่างพิเศษ
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
หากคุณใช้()คุณไม่จำเป็นต้องใช้คำหลักfunctionเพื่อประกาศฟังก์ชัน มีforไวยากรณ์ทางเลือกโดยใช้เครื่องหมายปีกกาเช่น: for((j=$1;j--;));{ printf o;}. ดังที่แสดงในตัวอย่างก่อนหน้านี้คุณสามารถบันทึกอักขระบางตัวโดยการลดและทดสอบในforนิพจน์ที่สองของ คุณสามารถใช้ backticks $(cmd)แทน
ninjalj

@ninjalj ขอบคุณฉันใหม่รหัสกอล์ฟ - ที่บีบอีก ~ 17 bytes หนึ่งซับคือตอนนี้ 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)
tripleee

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 คุณสามารถใช้ไบต์อีกปิดโดยใช้พูดแทนการเตือน
Kaundur

1
คุณสามารถทำได้ใน Perl 5 ด้วยเช่นกันโดยที่ไม่ได้เปิดใช้งานตามค่าเริ่มต้น ฉันคิดว่าคุณสามารถแก้ไขใน code-golf ได้โดยเรียกสคริปต์ของคุณจากบรรทัดคำสั่งด้วย-Eแทนที่จะ-eเปิดใช้งานส่วนขยายทั้งหมด ฉันยังใหม่กับสถานที่แห่งนี้ดังนั้นฉันจึงไม่ทราบแน่ชัดว่าจะระบุคะแนนอย่างไร
ท่อ

โอ้จริงฉันไม่รู้ ฉันใหม่ที่นี่เช่นกันดังนั้นฉันไม่แน่ใจด้วย
Kaundur

ฉันคิดว่าคุณสามารถย่อให้เหลือ 76 ไบต์ ... ถ้าคุณใช้ฟังก์ชั่นฉันเชื่อว่าการคืนค่าสตริงนั้นเป็นที่ยอมรับได้ (ดูคำตอบของ JS ประหยัด 4 ไบต์สำหรับwarn) คุณไม่จำเป็นต้องใส่เครื่องหมายอัญประกาศ"o"(คุณสามารถ ใช้ bareword สำหรับอีก -2) ถ้าคุณอินไลน์การคำนวณของ$wคุณควรบันทึกไบต์อื่น ( '_'x($w=3+2*$x)เทียบกับ$w=3+2*$x;... '_'x$w) และสุดท้ายคุณสามารถเปลี่ยน\nสำหรับขึ้นบรรทัดใหม่ตามตัวอักษร หวังว่าจะช่วย!
Dom Hastings

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

ขอบคุณ@Lince Assassino ที่ ประหยัด 11 ไบต์!

Ungolfed:

#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
Marco

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 ~|
%---~--~

Backtick จะส่งสัญญาณการเริ่มต้นของขั้นตอนที่สอง แทนที่จะเอาท์พุทสตริงนั้น CG ตัดออกจาก backtick และดำเนินการกับสตริง 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=--%

แก้ไข: บันทึก 2 ไบต์ขอบคุณ@ CᴏɴᴏʀO'Bʀɪᴇɴ @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ

ฉันสามารถบันทึกได้ 7 ไบต์หากฉันสามารถสันนิษฐานได้ว่าการเปิดใช้งานการขยายล่าช้า


%%o%%แทน%o%?
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ %o%จะถูกแทนที่ด้วยค่าเดิมของoแต่ละครั้งเพื่อให้เท่านั้นจะเท่ากับที่เคยo ผ่านไปเป็นอาร์กิวเมนต์ไปของซึ่งจากนั้นจะใช้มูลค่าปัจจุบันของ " o"%%o%%call%o%o
Neil

ทำไมคุณไม่ ... เพียงแค่do set o=%o% o?
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ %o%ขยายตัวก่อนที่forลูปจะถูกแจงดังนั้นลูปจะอ่านfor /l %i in (1,1,8) do call set o= oว่าไม่มีจุดหมายอย่างชัดเจน
Neil

ทำไมคุณไม่do set o=%%o%% o(-5)
Erik the Outgolfer

3

เป็นกลุ่ม 56 การกดแป้น

ดูเหมือนว่าจะเป็นงานแก้ไขข้อความดังนั้น Vim จึงเป็นตัวเลือกที่ชัดเจน! ฉันรับอินพุตเป็นไฟล์ข้อความที่มีจำนวนเต็มสองช่องว่างคั่นและส่งคำตอบออกเป็นไฟล์เดียวกัน นอกจากนี้ฉันเกลียดคุณที่มีคดีพิเศษ 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 จำนวนมาก "o" เพื่อให้ได้ส่วนตรงกลางเสร็จ

                                                    yy@bP

ดึงเส้นแล้วสร้าง @b พิเศษ (หนึ่งชุดมากเกินไป)

                                                         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 # 2ให้สตริงหลายบรรทัดสำหรับอิฐ 3 คูณ 2

Ungolfed:

(#) :: 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, 107 , 98 , 70 , 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ý

@ Zacharýสาขาแนวตั้งในบรรทัดแรกไม่เคยแยกออกมาจริงๆ ด้านบนของสแต็กจะเป็นศูนย์เสมอ ณ จุดนั้นดังนั้นจึงเป็นทางลัดสำหรับวางด้านบนสแต็กและแตกแขนงในเวลาเดียวกัน - โดยพื้นฐานแล้วเคล็ดลับนี้
James Holderness

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

ฉันสังเกตเห็นว่าฟังก์ชั่นของคุณสามารถปรับให้เหมาะกับstring s(string m,int u){return string.Join("",new int[u].Select(n => m));}-. ToArray () ซ้ำซ้อนและสตริง [] อาจเป็น int [] แต่แทนที่จะเป็นสตริงเข้าร่วมคุณสามารถใช้การรวม:string s(string m, int u){return new int[u].Aggregate("",(t,i)=>t+m);}
โอลิเวอร์ Hallam

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

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}

ฉันใช้วิธีการ@atlasologistใน Python เพื่อทดสอบ(1, 1):(...,'o')[x<2>y]

ขอบคุณ@Luis Mendoสำหรับการบันทึก 7 ไบต์: a=ones(1,w*2+3)*'_'ถึงa=~(1:w*2+3)+95และa./a*'-'เพื่อ~a+45

ขอบคุณ@pajonkสำหรับการบันทึก 2 ไบต์:f=


1
นี่ไม่ใช่รหัส Matlab ที่ถูกต้อง คุณควรติดป้ายกำกับว่า "คู่" เท่านั้น นอกจากนี้a./a*'-'คุณสามารถใช้แทนได้~~a*'-'หรือไม่ หรือแม้กระทั่ง~a+45 ?
Luis Mendo

นอกจากนี้คุณอาจปล่อยให้มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อ (โดยไม่ต้องใช้f=)
pajonk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.