Вы знаете те складные полки, которые в основном представляют собой деревянные ящики, которые можно сложить вместе? Мы собираемся смоделировать построение некоторых книжных полок из тех, что с искусством ASCII.
Все наши книги одинаково удобны по размеру и выглядят следующим образом:
|X|
|X|
|X|
Книжные полки представляют собой отдельные коробки, всегда по три символа высотой изнутри (достаточно для размещения книги в вертикальном положении), состоящие из |
символов слева и справа, -
символов сверху и снизу и достаточно широкие для размещения X
книг (где X
вводится целое число). Например, вот книжная полка размера 3
:
|---------|
| |
| |
| |
|---------|
потому что вы можете вписать 3
книги в него так
|---------|
||X||X||X||
||X||X||X||
||X||X||X||
|---------|
Входными данными будут два строго положительных целых числа, X
а Y
где X
ширина имеющихся у нас полок (измеряется в книгах) и Y
сколько книг нам нужно сложить. Если у нас больше книг, чем умещается на одной полке, нам нужно добавить больше полок сверху. Например, здесь ввод 4 wide / 6 books
:
|------------|
||X||X| |
||X||X| |
||X||X| |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
Если Y % X > 0
, имея в виду, что количество книг не является целым числом, кратным размеру полки, остальные книги должны занимать самую верхнюю левую позицию (как в случае с 4 6
выше), а оставшаяся часть этой полки заполняется пространства.
вход
- Два строго положительных целых числа в любом удобном формате , каждое
>0
. - Вы можете использовать входные данные в любом порядке (например, сначала размер полок, затем количество книг или наоборот). Пожалуйста, укажите в заявке порядок ввода.
- Вы можете смело предположить, что ни один из входных данных не будет больше размера вашего языка по умолчанию
[int]
(или эквивалентного).
Выход
В результате ASCII художественное представление книг и книжных полок.
правила
- Начальные или завершающие символы новой строки или пробелы являются необязательными, при условии, что сами символы выстроены правильно.
- Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
- Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Дальнейшие примеры
6 wide / 2 books
|------------------|
||X||X| |
||X||X| |
||X||X| |
|------------------|
2 wide / 6 books
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
4 wide / 9 books
|------------|
||X| |
||X| |
||X| |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
Ответы:
JavaScript (ES6),
1009998 байтПринимает ширину
w
и количество книгb
в карри синтаксисе(w)(b)
.Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
источник
Баш (+ коммунальные услуги),
130,108, 106 байтЕдиный непрерывный конвейер оболочки для отображения ваших книжных полок.
Changelog:
printf + seq
на сыройprintf
, -10 байтGolfed
Попробуйте онлайн!
Как это работает
$./shelf 2 3
printf %$2s\\n
- сгенерировать n пробельных символов, по одному на книгу (показано как_
)___
fold -$1
- сложить их по длине полкиsed "s/ /|X|/g;"
- заменить_
наX
, добавить обложки книг:;/.\{$[$1*3]\}/!s/$/ /;t
- правая панель с пробелами (показана как_
)h;s/./-/gp;x;p;p;p;x
- утроить каждую строку и добавить---
до и после нее.sed 's/.*/|&|/'|tac
- перенос строк в| |
обратном порядке с такисточник
t
вместо негоb
вам не понадобится{}
. Вы можете пропустить,s/./-/g
потому что они уже-
с. Попробуйте онлайн!Python 2
133113105 байтЯ уверен, что есть лучший способ ...
Ввод принят
width, books
-20 байт, спасибо @ovs за то, что он заметил ненужную лямбда-функцию!
-8 байт, спасибо @ovs за сокращение ввода.
источник
X,Y=input()
это более короткий способ принять значения.X, Y
, верно?'|'
в качестве переменной.Пакетный, 261 байт
Использую мой трюк из моего Пакетного ответа « Давайте играть в теннис», чтобы легко печатать множество
|
символов.источник
Haskell , 100 байт
x#y
возвращает строку для шириныx
иy
книг.Попробуйте онлайн!
Основная функция / оператор есть
#
. Когдаx<y
он разбивает книги наy-x
иx
, а затем рекурсивно. Когдаx>=y
,w
иb
являются два типа линии, минус внешние|
s и символ новой строки.Вспомогательный оператор
s?n
объединяетn
копии строкиs
.источник
PowerShell ,
149134 байтаПопробуйте онлайн!
Принимает
$w
idth и$b
ooks. Устанавливает строку$s
как одну из горизонтальных полок. Тогда у нас есть дваif
утверждения.Первый проверяет, есть ли у нас «остатки» книг. Если это так, мы выводим полку, (количество книг плюс количество пробелов)
*3
и другую полку.Далее мы видим, остались ли у нас книги после удаления остатков (
$a
). Такая же настройка, за исключением того, что мы используем$w
количество книг. Поскольку в этот момент$b
гарантируется кратность$w
(поскольку мы удалили остаток$a
), нам не нужно беспокоиться о округлении.Убрал
[math]::Floor()
звонок, сэкономив 15 байтВсе эти строки остаются в конвейере, и неявное
Write-Output
происходит при завершении программы.источник
CJam ,
6261 байтПринимает вход как
width books
Попробуйте онлайн!
объяснение
источник
Python 3, 142 байта
Все еще работаю над этим.
b
для «количества книг» иw
для ширины полки.источник
R=b%w
не перейти к следующей строке. Кроме того, вы должны иметь возможность удалить пробелы вокруг этих трех,=
чтобы сохранить несколько байтов.d+3*p+d if R!=0 else ''
наR and d+3*p+d or''
d+3*p+d
?AHK, 208 байтов
Есть несколько вещей, которые мешают мне играть в гольф дальше:
%1%
&%2%
) в математических функциях, потому что они ожидают ввода переменной или числа, и он будет считать неоткрытый1
номер первым, а не имя переменнойБолее легкая для чтения версия выше выглядит следующим образом:
Если a
Loop
не использует скобки{}
, то только следующая строка является частью цикла. Если:=
вместо переменной установить значение переменной=
, вы можете удалить escape-символы знака процента. Тильда n - символ новой строки.источник
Java 7,
230224222 байтаОбъяснение:
Тестовый код:
Попробуй это здесь.
Выход:
источник
.repeat
действительно помогают в этом вызове .PowerShell, 109 байт
Менее гольф тестовый скрипт:
Выход:
PowerShell, 109 байт, альтернатива
источник
Python 2 ,
120118 байтПопробуйте онлайн!
В течение последних нескольких дней хотел попробовать это. Теперь, когда у меня наконец есть время сделать это, есть уже более короткий ответ Python. Ну да ладно, просто выложили как альтернативу.
Ввод за ширину, книги
источник
SOGL , 64 байта
Пояснение: Первая функция:
вторая функция:
эта функция ожидает число (количество книг) в стеке и выводит книги книжных полок
Далее приведен пример, где e = 3 (ширина книжной полки) и b = 8 (количество книг)
это верхняя / нижняя строка книжной полки и всегда остается в первой части стека (полупустая книжная полка)
Первая основная часть
И последняя часть
источник
Java (JDK) , 124 байта
Попробуйте онлайн!
кредиты
источник
PHP> = 7.1, 138 байт
Онлайн версия
источник
Холст , 33 байта
Попробуй это здесь!
Пояснение (некоторые символы были заменены, чтобы выглядеть более моноширинно):
источник
Пип
-n
, 45 байтПринимает ширину и количество книг, соответственно, в качестве аргументов командной строки. Попробуйте онлайн!
объяснение
Мы запускаем цикл, чтобы напечатать полки одну за другой сверху вниз. На каждой итерации мы обновляем
b
(количество книг для печати), вычитаяy
(количество книг, напечатанных на этой итерации). Когдаb
достигает 0, цикл выходит.Поскольку это немного запутано, вот пример первой итерации, когда
a = 3, b = 8
:который затем печатает как
источник
Pyth , 56 байт
Принимает ширину полки, количество книг в качестве отдельных аргументов в этом порядке. Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
источник
Далее , 622 байта (свернуто (убрать комментарии, отступы, имена из 1 символа) до 303 байтов)
Моя первая игра с Forth :)
Попробуйте онлайн!
Выход
источник