Надрукуйте шматок лего


48

Цей виклик є простим . Давши два входи, що описують висоту та ширину лего, ви маєте друк ASCII художнього зображення цього зображення.

Ось як повинні виглядати шматки Lego:

(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
В наступні кілька років я хочу побачити ще одне завдання "Друк шматка Lego", яке вимагає написання коду, щоб повідомити 3D-принтеру, щоб створити Lego.
Кевін - Відновіть Моніку

8
Зачекайте, "який би цілий діапазон підтримувала ваша мова"? Це не так, як працює LEGO. Цегла випускається лише у кількох дуже конкретних розмірах. Навіть якщо ви додасте в тарілки, ви отримаєте лише ще пару. Будь-який сценарій, який не відкидає вхід, наприклад (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
ой. моє. бог.
Дує

25

V , 43, 40, 38 36 байт

Одна з найдовших відповідей V, яку я коли-небудь писав ...

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

Спробуйте в Інтернеті!

Оскільки в ньому є символи unicode та unprint, тут є оборотний шестигранник:

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 байт коротше!

Друге пояснення:

ddÀP

що "Видалити рядок і вставити її n разів" замінено на ÀÄ"Повторити цей рядок n разів". (-2 байти)

óo î½o
u

що було "Замінити перший матч цього регулярного виразу; Скасувати" було замінено на

/o î½o

Що просто "Пошук відповідності цього регексу" (-1 байт)

І нарешті, Òце просто простий синонім Vr, який обидві «Замініть кожен символ у цьому рядку на« x ». (-2 байти)


як це здається зламаним внизу з цим v.tryitonline.net/…
meterk

2
@meepl Я насправді поняття не маю. Він працює на 50x959, але якщо збільшити ширину чи висоту, він перестане працювати. Я здогадуюсь, що це, швидше за все, обмеження, навмисно розміщене на веб-сайті, щоб запобігти запуску надзвичайно великих програм.
DJMcMayhem

1
TIO обмежує вихід на 100 Кб , головним чином, щоб запобігти аварійному обходу веб-переглядача.
Денніс

22

32 16-бітний маленький ендіанічний код версії x86, 57 54 51 байт

На 3 байти менше завдяки @ninjalj.

Сильно переписали код і встигли відтерти ще 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 блоку.

Дякуємо Лінні та Чепнеру за два байти


lambda x,y:('_'*x*2+'___\n'+і т.д. зберігає байт.
Лінн

1
Збийте інший байт, x*'__'а не 2*x*'_'.
чепнер

Просто приєднайтесь до цієї Спільноти, вибачте за запитання. Як я бачу, як він працює? я вставляю його в термінал і просто друкує <function <lambda> at 0x......>. Як я можу це перевірити?
Мігель

1
@ Мігель призначить його змінній. Він поверне значення функції: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 байт

Збережено 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);}}

Він працює з аргументами командного рядка.

Безгольовий у читаному для людини вигляді:

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 {

Якщо фрагмент для друку є 1х1, то обидва 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дефіси до твору. Це ряд в самому дні, під усіма отворами.

Частина 4х4, яку я використав для пояснення 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);

І нарешті, друкуємо твір!


Можливо, Редакція 3 зробила це найдовшим дописом, який я коли-небудь робив на Stack Exchange.
снідакайхан

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
якщо ви перетворите свої аргументи спочатку в байти, то перевірити розмір цегли 1х1 буде, if(b==1&B==1)що дозволяє зберегти понад 20 байт
user902383

також для випадку 1x1 замість цього System.out.print('o');return;ви можете встановити c='o'та розмістити логіку для різних цеглин у блоці else. то один виписка друку та повернення не дозволяють зберегти кілька додаткових байтів
user902383

9

Мінколанг 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 O'Brien

8

мозковий ебать, 391 байт

Я знаю, що це може бути збільшено в гольф, але на даний момент я просто радий, що це працює. Я продовжуватиму працювати над тим, щоб пограти в гольф.

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

Введення потрібно вказати як дві цифри. Як і в, щоб зробити, (8, 2)ви просто увійдете 82.

Спробуйте в Інтернеті!

Зламатися:

Спочатку покладіть на стрічку необхідні символи: (newline)| o_-

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

Потім зібрати вхід у дві комірки і відняти 48 з кожної (щоб отримати числове значення, а не числовий символ)

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

Далі перевірте наявність окремого випадку (1, 1)(Зауважте, що лише на цю перевірку припадає 109 байт коду). Наче ifу нас не було досить важко зробити мозковий епізод, у нас є вкладене if:

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

Далі йде структура, яка перевіряє, чи клітинка x дорівнює нулю чи нуль:

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

Однак у вкладеному ifнам потрібно мати 4 тимчасові комірки.

Тепер ми переходимо до власне друку символів:

Роздрукуйте верхню панель та новий рядок:

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

Друкуйте a |, рядок os, інший |та новий рядок кілька разів, рівний висоті:

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

І надрукуйте нижню панель (тут не потрібен новий рядок):

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

7

Сітківка , 52 байти

Кількість байтів передбачає кодування ISO 8859-1. Зверніть увагу, що шостий рядок повинен містити єдиний пробіл.

\G1?
$_¶
1* 



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

Спробуйте в Інтернеті!

Введення не одинарне, використовуючи 1як одинарну цифру, простір як роздільник і висоту з наступною шириною.

Пояснення

Всі етапи в цій програмі є голими замінами, періодично з регулярним модифікатором регулярних виразів (без повторень чи циклів, без інших типів етапів). Він навіть не використовує специфічні для Retina функції заміни, окрім звичайних псевдонімів для лінійного годування.

\G1?
$_¶

Мета цього - "примножити" два входи. Наша мета - створити h+2рядки з w 1s кожен ( h+2щоб ми могли повернути верх і низ в _і -пізніше). \GЯкір вимагає матчу , щоб почати , де останній зупинився. Тобто, якщо ми колись не зможемо зіставити символ у рядку, подальші символи також не збігаються. Ми використовуємо це для узгодження лише 1s в h, але не в wтому, що регулярний вираз не дозволяє збігати простір, що розділяє їх. Однак ми також робимо 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знову засяяти. Це відповідає кожному символу в першому рядку і перетворює його в a _.

r`.\G
-

Те саме, але завдяки rмодифікатору (режим справа наліво) це відповідає символам в останньому рядку і перетворює їх у -. Отже, тепер ми маємо:

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

Зараз залишилося лише дві речі: перетворити їх 1на os, а якщо вхід був, 1 1то oзамість цього все перетворимо . Ми можемо впоратися з обома з них на одному етапі:

s`^.{17}$|1
o

sрегулярний режим однолінійного режиму (тобто він .відповідає лінійним стрічкам ). Якщо введення було 1 1результатом, то він матиме мінімальний розмір 17 символів, тому ми можемо зіставити його ^.{17}$та замінити його o. В іншому випадку, якщо це не вдасться, ми просто зрівняємо всі 1і замінимо їх на o.


7

Джолф, 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"

Джолф, 24 байти, неконкурентоспроможний

Ну, я зробив кращу коробку вбудований.

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

Джолф, 38 37 байт

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

Прості речі, справді. Збережено байт, зауваживши, що (математичний зета або відхилення стійкості) дорівнює лише 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 байти шляхом псевдоніму 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заяву. Оскільки ненульові значення є надійними в PowerShell, якщо принаймні один із них $xі $yне дорівнює 1, ifволевиявлення буде істинним.

Всередині цього 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

Баш, 186 , 163 , 156 , 148 , 131 , 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
Хіба це не було б трохи коротше, якби воно не було зафіксовано у функції? Крім того, я не є експертом у баші, але схоже, що у нього є додатковий пробіл.
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другому виразі. Ви можете використовувати задні посилання замість $(cmd).
ninjalj

@ninjalj Дякую, я новачок в коді гольфу - що видавлює ще ~ 17 байт, (($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 байт. З деякою допомогою Дома Гастінгса

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 замість попередження
Kaundur

1
Ви також можете це зробити в Perl 5, лише те, що він не включений за замовчуванням. Я думаю, що ви можете обійти це в коді-гольфі, зателефонувавши до свого скрипту з командного рядка, -Eа не -eвключивши всі розширення. Я новачок у цьому місці, тому не знаю, де саме вказано, як рахувати бали.
труба

О, справді, я цього не знав. Я тут і новий, тому я також не впевнений
Каундюр

Я думаю, ви можете скоротити це до 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();}

Дякуємо @Lince Assassino за економію 11 байт!

Безголівки:

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

Тоді 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%?
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ %o%буде замінено початковим значенням oкожного разу, так що воно завжди oбуло б рівним " o". %%o%%проходить в якості аргументу callз %o%, який потім використовує поточне значення o.
Ніл

Чому б ти ... просто do set o=%o% o?
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ %o%розширюється до forрозбору циклу, тому цикл читає, for /l %i in (1,1,8) do call set o= oщо, очевидно, безглуздо.
Ніл

Чому б вам do set o=%%o%% oтоді (-5)?
Ерік Аутгольфер

3

Vim, 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.

Безголівки:

(#) :: 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

Гроовий, 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ý Ця вертикальна гілка на першій лінії ніколи насправді не розгалужується. Верхня частина стека завжди дорівнює нулю в цій точці, тому це ярлик для опускання вершини та одночасного розгалуження внизу - по суті, це підказка .
Джеймс Холдернес

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

швидкий і брудний

Мені довелося написати функцію, що множує рядки

невольф (для пропозицій)

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 () є зайвим, а рядок [] може також бути 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}

Я використовував метод @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?
Луїс Мендо

Також, ймовірно, ви можете залишити це як анонімну функцію (без f=)
pajonk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.