Распечатать часть Lego


48

Этот вызов простой . Учитывая два входа, описывающих высоту и ширину фрагмента Lego, вы распечатываете его в 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
Особый случай - настоящий облом.
Конор О'Брайен

47
В ближайшие несколько лет я хочу увидеть еще одну задачу «Распечатать фрагмент Lego», которая потребует написания кода, который скажет 3D-принтеру создать Lego.
Кевин - Восстановить Монику

8
Подождите, "какой диапазон целых чисел поддерживает ваш язык"? Это не то, как работает LEGO. Кирпичи доступны только в нескольких очень специфических размерах. Даже если вы добавите в тарелках, вы получите только пару больше. Любой скрипт, который не отбрасывает ввод, такой как (1,7) или (5,3), является полным мусором.
RegDwight

3
Почему у одного куска (1,1) нет сторон? Это настоящая часть Lego с одним соском сверху куба.
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
ой. мой. Бог.
Удивляет

25

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

Один из самых длинных V ответов, которые я когда-либо писал ...

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

Попробуйте онлайн!

Так как он содержит Unicode и непечатаемые символы, вот обратимый 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

который был "Заменить первый матч этого регулярного выражения; Отменить" был заменен на

/o î½o

Это просто "Поиск совпадений с этим регулярным выражением" (-1 байт).

И, наконец, Òэто просто простой синоним для Vr, который «Заменить каждый символ в этой строке на« х »». (-2 байта)


как же он выглядит сломанным на дне с этой v.tryitonline.net/...
metersk

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

1
TIO ограничивает вывод до 100 КБ , главным образом, чтобы предотвратить сбой вашего браузера.
Деннис

22

32 16-разрядный машинный код с прямым порядком байтов x86, 57 54 51 байт

На 3 байта меньше благодаря @ninjalj.

Тяжело переписал код и сумел сбрить еще 3 байта

В шестнадцатеричном

FCBA6F208D48FFE20492AAEB2389D941D1E14151B05FF3AAEB0BB87C20AB89D992F3AB92AAB00AAA4E7DEF59B02DF3AA91AAC3

Ввод: BX = ширина, SI = высота, DI указывает на буфер, который получает результат в виде строки с нулевым символом в конце со строками, разделенными "\ 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.
ниндзя

Для удобства чтения вы должны поместить пробелы между перечеркнутыми числами и текущими числами в вашем числе байтов.
Стоимость чернил

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*'_'.
chepner

Просто присоединяйтесь к этому сообществу, извините за вопрос. Как я могу увидеть это работает? Я вставляю его в терминал и просто печатаю <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 байтов благодаря Cliffroot !

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это часть Lego. Мы добавим к нему строки, а затем напечатаем его в конце.

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 += " |";
}

Это цикл, в котором мы строим фигуру по одной строке за раз. То, что происходит внутри, невозможно объяснить без примеров. Допустим, что кусок 4х4:

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

И, наконец, мы печатаем кусок!


Вероятно, Редакция 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

Минколанг 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.

Хорошо, это два существенных переписывания объяснения для двух сохраненных байтов. Я не думаю, что смогу или буду играть в гольф что-то еще из этого. :П


3
Первый байт - самый сложный шаг ... начало 1000 байтов начинается с одного бита ...
Конор О'Брайен

8

брейкфук, 391 байт

Я знаю, что это может быть в гольфе больше, но на данный момент я просто рад, что это работает. Я буду продолжать работать, чтобы играть в гольф.

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

Ввод должен быть представлен только двумя цифрами. Как и в, (8, 2)вы бы просто войти 82.

Попробуйте онлайн!

Сломать:

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

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

Затем соберите данные в две ячейки и вычтите 48 из каждой (чтобы получить числовое значение, а не цифровой символ)

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

Далее, проверьте для особого случая (1, 1)(Обратите внимание, что только эта проверка составляет 109 байт кода). Как будто это ifне было достаточно сложно сделать в мозге, у нас есть вложенное if:

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

Ниже приведена структура для проверки, является ли ячейка х нулевой или ненулевой:

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 1каждой из s ( h+2чтобы мы могли повернуть верх и низ в _и -позже). \GЯкорь требует матча , чтобы начать , где последний остановился. То есть, если нам не удастся сопоставить символ в строке, другие символы тоже не будут совпадать. Мы используем это для сопоставления только 1s in h, но не in, wпотому что регулярное выражение не позволяет найти пространство, разделяющее их. Тем не менее, мы также делаем 1необязательные, так что мы получаем дополнительное пустое совпадение в конце h. Это h+1совпадает. Каждый из них заменяется на весь input ( $_), за которым следует перевод строки.wсам остается нетронутым, что дает нам h+2nd копию. Скажем, ввод был 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 

Мы превратим это в oс позже

.+
|$&|

Это просто оборачивает каждую строку в паре |:

| 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является обычным однострочным режимом (т. е. .соответствует строковым переводам). Если ввод был 1 1результатом, минимальный размер будет 17 символов, поэтому мы можем сопоставить его с ^.{17}$и заменить его o. В противном случае, если это не удастся, мы просто сопоставим все 1s и заменим их на 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утверждение. Поскольку ненулевые значения truthy в PowerShell, что, по меньшей мере , один из , $xи $yне равны 1, то ifбудет верно.

Внутри ifесть ряд умножений строк. Сначала мы строим нашу строку подчеркивания, сохраняя $zдля дальнейшего. Это размещается на конвейере. Затем мы строим нашу строку сторон и колышков (с умноженными колышками $x), делаем $yвремя и объединяем это с нашими штрихами $z. Эта строка затем помещается на конвейер, и мы exit. Трубопровод сбрасывается и печать неявна. Обратите внимание, что мы получаем новую строку между подчеркиванием и первой строкой колышков бесплатно, так как по умолчанию .ToString()для вывода массива используется разделитель `n(и мы выводим массив строк).

Если значение ifравно false, мы находимся в особом 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
}

Примечание: если вам действительно нужно, чтобы в lego были дефисы для последней строки, измените последний printf на

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

и добавить два байта.


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
Если вы используете (), вам не нужно ключевое слово functionдля объявления функции. Существует альтернативный forсинтаксис с помощью фигурных скобок, например: for((j=$1;j--;));{ printf o;}. Как показано в предыдущем примере, вы можете сохранить некоторые символы, уменьшив их и протестировав во forвтором выражении. Вы можете использовать backticks вместо $(cmd).
ниндзя

@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.)
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 вы можете убрать еще один байт, используя слово вместо предупреждения
Каундур

1
Вы можете сделать это и в Perl 5, просто он не включен по умолчанию. Я думаю, что вы можете обойти это в code-golf, вызвав свой скрипт из командной строки -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 байтов!

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);}
Линс Ассассино

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

Обратный удар затем сигнализирует о начале второго этапа; вместо вывода этой строки 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=--%

Редактировать: 2 байта сохранены благодаря @ CᴏɴᴏʀO'Bʀɪᴇɴ @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Я могу сохранить 7 байтов, если предположить, что отложенное расширение включено.


%%o%%вместо %o%?
Эрик Outgolfer

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

Почему бы тебе ... просто do set o=%o% o?
Эрик Outgolfer

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

Почему не do set o=%%o%% oтогда (-5)?
Эрик Outgolfer

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>

Очистите линию и напишите края блока lego

                                          @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ý Эта вертикальная ветвь на первой линии никогда не разветвляется. В этой точке вершина стека всегда равна нулю, так что это ярлык для сбрасывания вершины стека и разветвления одновременно - по сути, это совет .
Джеймс Холдернесс

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

Я заметил, что ваша функция может быть оптимизирована для 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.