Сделай мне забор!


15

Вызов

Это простая задача. Дайте два натуральных числа w и hсоздайте забор ASCII с шириной wи высотой h. Забор должен быть построен по следующим правилам:

  • +Персонаж будет представлять собой пост.
  • Символ -будет использоваться для обозначения ширины забора.
  • |Будет использоваться для обозначения высоты забора.
  • После того, как ровно три -символа были выведены, +символ должен быть выведен позже. За исключением четырех углов, любое другое значение, которое вы выведите +, будет недействительным. Вы можете следовать этому правилу, начиная слева или справа (см. Примеры), но вы должны быть последовательны.
  • После того, как ровно два |символа были выведены, +символ должен быть выведен позже. За исключением четырех углов, любое другое значение, которое вы выведите +, будет недействительным. Вам разрешено следовать этому правилу, начиная сверху или снизу (см. Примеры), но вы должны быть последовательными.
  • Каждый забор будет иметь ровно четыре угла, и каждый угол будет обозначен символом +.

Другими словами: через каждые три -символа вы должны вывести a +. И через каждые два |символа вы должны вывести a +.

Можно предположить, что забор всегда будет прямоугольником и что оба wи hникогда не будут больше 100или меньше чем 1. Конечный и / или предшествующий пробел разрешен.

Примеры / Тестовые случаи

w = 1
h = 1

+-+ 
| |
+-+


w = 3
h = 2

+---+
|   |
|   |
+---+


w = 5
h = 7

+---+--+ or +--+---+
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
+---+--+    +--+---+

w = 10
h = 5

+---+---+---+-+  or +-+---+---+---+
|             |     |             |
|             |     +             +
+             +     |             |
|             |     |             |
|             |     +             +
+             +     |             |
|             |     |             |
+---+---+---+-+     +-+---+---+---+


w = 4
h = 4

+---+-+ or +-+---+
|     |    |     |
|     |    |     |
+     +    +     +
|     |    |     |
|     |    |     |
+---+-+    +-+---+

правила



3
Правильно ли я понимаю, что не может быть двух +трогательных?
xnor

@xnor Да, это правильно.
Кристиан Дин

3
Кстати, отличная первая задача.
xnor

1
@ LeakyNun Ваше право. Это тот случай, который я не имел в виду при разработке своих правил. Я добавил правило, чтобы указать, почему +-+-+-+-+-+недействительно. Извините за путаницу.
Кристиан Дин

Ответы:


9

C, 131 байт

#define L for(i=0,j=w;j;)putchar(i++%4?--j,45:43);puts("+")
f(w,h,i,j,c){L;for(j=1;h;printf("%c%*c\n",c,i,c))c=j++%3?--h,124:43;L;}

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

Объяснение:

// The first and the last line are always similar, so let's use a macro
// to avoid code duplication.
#define L

// Let's initialize 'i' and 'j'. 'i' will be used to keep track of which
// character ('+' or '-') we should print, whereas 'j' starts from the
// input width and the loop terminates when 'j' reaches zero.
for(i=0,j=w;j;)

// We post-increment 'i' and take a modulo 4 of its previous value.
// If i%4 == 0, we print '+' (ASCII 43), otherwise we decrement 'j'
// and print '-' (ASCII 45).
putchar(i++%4?--j,45:43);

// After the loop we print one more '+' and newline.
puts("+")

// The function declaration which takes the two input parameters, and
// also declares three integer variables. These three variables could
// also be declared as global variables with the same bytecount.
f(w,h,i,j,c)

// The start of the function body. We use the macro 'L' to print the 
// first line along with a newline.
{L;

// This loop prints all the lines between the first and the last. 'j'
// keeps track of when we should output a '+' instead of a '|'. 'h',
// which is the input parameter for height, serves as a terminator
// for the loop as it reaches zero.
for(j=1;h;<stuff missing from here>)

// We post-increment 'j' and check if its previous value is divisible
// by three, and if it isn't, we decrement 'h' and assign 124 (ASCII
// value for '|') to 'c'. Otherwise we assign '+' (ASCII 43) to 'c'.
c=j++%3?--h,124:43;

// The following is inside the 'increment' part of the 'for' loop.
// We print the character corresponding to the value of 'c', then
// the same character again, but padded with i-1  spaces before it 
// ('i' hasn't been touched since the first loop, so it still stores
// the length of the first line), then a newline.
printf("%c%*c\n",c,i,c)

// Lastly we print the first line again using the same macro 'L'.
L;}

5

Python 3 , 140 137 128 119 106 105 байт

def f(w,h):a=~-w//3-~w;b=("+---"*w)[:a]+'+';print(b,*[i+' '*~-a+i for i in"||+"*h][:h+~-h//2],b,sep='\n')

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


2
Это дольше, но проблема была исправлена.
GarethPW

1
Вы можете сохранить байт, удалив пробел между inи [w+1+(w-1)//3]]в последней части.
Кристиан Дин

1
Добро пожаловать в PPCG! Вы можете удалить пространство в '\n') for. Кроме того, вы можете изменить (w-1)на ~-wкоторый позволяет убрать скобки, поскольку унарные операторы имеют более высокий приоритет, чем двоичные. То же самое для (h-1)-> ~-hи (a-1)-> ~-a. Попробуйте онлайн - 128 байт
musicman523

1
Кроме того, поскольку все ваши выходные данные печатаются, def f(w,h)имеют одинаковую длину lambda w,h, но позволяют вам использовать несколько строк, если это поможет вам в дальнейшем
улучшить

1
a=~-w//3-~w;сохранить 1 байт
Фелипе Нарди Батиста

4

Mathematica, 165 байт

v=Column;d[w_,y_,m_,n_]:=Table[If[Mod[i,y]==0&&i!=w,m,n],{i,w}];(a="+"<>d[#,3,"-+","-"]<>"+";b=v@d[#2,2,"|\n+","|"];v[{a,Row[{b,""<>Table[" ",#+Floor[#/3]],b}],a}])&

4

Пип , 38 байт

37 байт кода, +1 за -nфлаг.

Ph:'-Xa<>3JW'+PsX#h-2WR:'|Xb<>2J'+^xh

Принимает ширину и высоту в качестве аргументов командной строки. Попробуйте онлайн!

объяснение

                         a,b are cmdline args; s is space; x is empty string (implicit)
Ph:'-Xa<>3JW'+
   '-Xa                  String of hyphens of length a
       <>3               grouped into substrings of (maximum) length 3
          JW'+           Join on +, also wrapping the result in +
 h:                      Assign that string to h (mnemonic: "header")
P                        and print it (with newline)

PsX#h-2WR:'|Xb<>2J'+^xh
          '|Xb           String of pipes of length b
              <>2        grouped into substrings of (maximum) length 2
                 J'+     joined on +
                    ^x   and split on empty string (i.e. converted to list of chars)
 sX#h-2                  String of len(h)-2 spaces
       WR:               Wrap the spaces with the list of chars
                         Note 1: WR operates itemwise on lists, so the result is a list,
                          each item of which consists of the spaces wrapped in an item
                          from the list of chars
                         Note 2: the : compute-and-assign meta-operator is here abused
                          to give WR: lower precedence than J and ^ and avoid parentheses
P                        Print that list, newline-separated (-n flag)
                      h  Autoprint the header a second time as the footer

4

Древесный уголь, 47 45 40 байт

F⁴«¿﹪ι³FIη↓⁺×+¬﹪κ²|FIθ⁺×+¬﹪κ³-P+¿⁼ι¹J⁰¦⁰

Объяснение: Работы по разработке каждой стороны -s / |s , в свою очередь, вставляя +s , где это необходимо, а затем отделка с +. После рисования верхней и правой сторон, отскакивает назад к началу, чтобы нарисовать их в обратном порядке, эффективно рисуя левую и нижнюю стороны. Я не знаю, разрешена ли вращательная симметрия, но если это так, то для 27 25 байтов:

F⁴«FI⎇﹪ι²ηθ⁺×+¬﹪κ⁻³﹪ι²-⟲T

Приводит вышеуказанную идею в крайнее положение, рисуя верхнюю сторону, поворачивая влево, рисуя правую сторону, снова вращая, а затем повторяя, чтобы нарисовать нижнюю и левую стороны в обратном порядке.


1
@LeakyNun В прошлый раз, когда я победил Пита, он удвоил бриллианты, и даже тогда он был только короче.
Нил

4

JavaScript (ES6), 133 132 байта

w=>h=>(a="-".repeat(w).replace(/--?-?/g,"+$&")+`+`)+(`
|`.padEnd(a.length)+`|`).repeat(h).replace(/(\|( +)\|\n)\1/g,`$&+$2+
`)+`
`+a

Принимает ввод в синтаксисе Карринг: f(width)(height).

Тестовый фрагмент

f=
w=>h=>(a="-".repeat(w).replace(/--?-?/g,"+$&")+`+`)+(`
|`.padEnd(a.length)+`|`).repeat(h).replace(/(\|( +)\|\n)\1/g,`$&+$2+
`)+`
`+a
O.innerHTML=f(W.value=5)(H.value=10)
<div oninput="O.innerHTML=f(+W.value)(+H.value)">
W <input id=W type=number min=1> H <input id=H type=number min=1>
</div>
<pre id=O>



2

Java (OpenJDK 8) , 178 177 байт

w->h->{int i=0;String t="",m,r;for(;i<w;)t+=i++%3<1?"+-":"-";r=t+="+\n";m=t.format("|%"+(t.length()-3)+"s|\n","");for(i=0;i<h;)r+=i++%2<1&i>1?m.replace("|","+")+m:m;return r+t;}

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

-1 байт благодаря @KevinCruijssen


Вы можете сохранить байт, используя параметры: w->h-> попробуйте здесь.
Кевин Круйссен

Да, я постоянно забываю о карри ... Это не то, что я нахожу естественным: s
Оливье Грегуар

1

Древесный уголь , 47 45 37 байт

A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β

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

  • 2 байта сохраняются после игры со знаками в создании строки.
  • Благодаря Нилу, сэкономившему 8 байт, он придумал гораздо более простой способ расчета длины заборов.

Другой подход от @ Нила : первый я создаю строки αи βсодержащие символы в горизонтальных и вертикальных границах, с помощью Rangeоператора , который создает повторение строки до заданной длина не будет достигнут. Затем я печатаю их в правильном порядке:

  • Напечатайте α без перемещения курсора.
  • Выведите β вниз.
  • Распечатать α.
  • Выведите «+».
  • Переместите курсор вверх и влево.
  • Печать β вверх, в обратном порядке.

Ссылка на подробную версию .


1
Спасибо за напоминание о том Range, что при втором подходе экономится 3 байта!
Нил

@ Нейл, это хорошо, потому что я только что перехитрил тебя и просто не могу в это поверить. :-)
Чарли

1
А еще лучше, мне удалось оптимизировать выражения, экономя 8 байт: A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β.
Нил

@ Нил Вау. Такая оптимизация. Очень древесный уголь.
Чарли

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.