Учитывая два натуральных числа, W и H, выведите прямоугольник ASCII-искусства, граница которого состоит из косых черт ( /
и \
) с W «шипами» на верхнем и нижнем краях и H «шипами» на левом и правом краях. Интерьер коробки заполнен пробелами.
«Шип» - это просто две косые черты, объединяющиеся в форму стрелки:
/\ \/
/ \
\ /
Таким образом, выход для W = 4, H = 3
будет
/\/\/\/\
\ /
/ \
\ /
/ \
\/\/\/\/
так как есть 4 шипа вверху, указывающие вверх, 4 внизу, указывающие вниз, 3 слева, указывающие влево, и 3 справа, указывающие вправо.
Вот некоторые другие пары ввода / вывода:
W H
[spiky slash box]
1 1
/\
\/
1 2
/\
\/
/\
\/
2 1
/\/\
\/\/
2 2
/\/\
\ /
/ \
\/\/
1 3
/\
\/
/\
\/
/\
\/
3 1
/\/\/\
\/\/\/
2 3
/\/\
\ /
/ \
\ /
/ \
\/\/
3 2
/\/\/\
\ /
/ \
\/\/\/
10 1
/\/\/\/\/\/\/\/\/\/\
\/\/\/\/\/\/\/\/\/\/
10 2
/\/\/\/\/\/\/\/\/\/\
\ /
/ \
\/\/\/\/\/\/\/\/\/\/
4 5
/\/\/\/\
\ /
/ \
\ /
/ \
\ /
/ \
\ /
/ \
\/\/\/\/
Никакие строки в выходных данных не должны иметь начальных или конечных пробелов. При желании может быть один завершающий символ новой строки.
Самый короткий код в байтах побеждает.
Ответы:
Древесный уголь , 9 байт
Попробуйте онлайн!
объяснение
источник
F²«↷P…\/N»‖M¬
(принимает ввод в порядке высоты, ширины).MATL , 18 байт
Попробуйте это в MATL Online!
объяснение
Рассмотрим входы
W = 4
,H = 3
. Код строит векторы строк[1 2 3 4 5 6 7 8]
(диапазон от1
до2*W
) и[1 2 3 4 5 6]
(диапазон от1
до2*H
). Транспонирование последнего и добавление к первому с помощью трансляции дает матрицуМодульное индексирование в строку
\/
дает желаемый результат на границе матрицы:Чтобы удалить значения без границ, мы устанавливаем их в
0
(при интерпретации как char они отображаются как пробел):Код комментария:
источник
Python 2 ,
6968 байт-1 спасибо Кевину Круйссену
Попробуйте онлайн!
источник
\\%s
может стать\%s
и\\/
может стать\/
.Хаскелл ,
90888782 байта16 байт сэкономлено благодаря ЛиннПопробуйте онлайн!
Все еще чувствует себя очень долго, я посмотрю, что я могу сделать.
источник
a#b=[a..b]
и замена всех вхождений сохраняет один байт:a#b=[a..b];x!y|i<-2#x>>" "=(1#x>>"/\\"):(2#y>>['\\':i++"/",'/':i++"\\"])++[1#x>>"\\/"]
a#b=[1..a]>>b;x!y|i<-(x-1)#" "=x#"/\\":(y-1)#['\\':i++"/",'/':i++"\\"]++[x#"\\/"]
самом деле спасает 6 ~05AB1E , 14 байтов
Попробуйте онлайн!
объяснение
Это создает только верхний левый угол, ширину x символов и высоту y символов. Затем он отражает это на обеих осях:
источник
JavaScript (ES6), 84 байта
Принимает ввод в синтаксисе карри
(w)(h)
.демонстрация
Показать фрагмент кода
источник
Swift 3 , 166 байт
Полный набор тестов.
Закрывающая версия, к сожалению, немного длиннее (175 байт):
Тестовый пакет с закрытой версией.
источник
Retina ,
7773 байтаПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Принимает ввод в формате
<height> <width>
. Объяснение:Преобразуйте входные данные в одинарные.
Умножьте входные данные, но добавьте новую строку, чтобы результат был прямоугольником.
Создайте колючую вершину.
Дублируйте каждый остроконечный ряд, но со смещенными шипами во втором ряду.
Удалить завершающие новые строки.
Удалите внутреннюю часть коробки. (Отметьте пробел в последней строке.)
источник
Excel, 95 байт
источник
APL (Дьялог) ,
4139 байтЗапрашивает список
[H,W]
Попробуйте онлайн!
⎕-1
подсказка для ввода (мнемоника: стилизованная консоль) и вычитание 12×
умножить на два''⍴⍨
используйте это, чтобы изменить пустую строку (пробелы с пробелами)⊢
дать это (служит для отделения его от4
){
…}⍣4
Применить следующую функцию четыре раза:≢⍵
подсчет (длина) аргумента'/\'⍴⍨
циклический г eshape"/\"
к этой длине⍵,
добавить это к правой части аргумента⌽⍉
переставить и отразить (т.е. повернуть на 90 °)¯1⌽1
циклически вращайте 1- й ряд на один шаг вправо⊢
дать это (служит для отделения его от1
)'\'@2@1
поставить обратную косую черту на 2- й позиции 1- го основного предмета.источник
C (gcc) ,
170166158155108105-3 байта благодаря cleblanc
Попробуйте онлайн!
Я думаю, что это можно продвинуть дальше с менее простым подходом, я посмотрю, что я могу сделать, когда найду время.Хорошо, я не могу найти какой-либо другой способ уменьшить количество байтов для этого кода.
Объяснение: простая двойная петля, печатающая коробку char за char
При печати границы: если обе координаты x и y являются четными или нечетными, отображается a
/
, в противном случае\
отображается aЕсли не граница, вместо этого отображается пробел
источник
puts("")
в первый цикл , как этотx,y;f(w,h){for(y=h*=2;y--;puts(""))for(x=w*2;x--;)putchar(!x|x==w*2-1|!y|y==h-1?x&y&1|~x&~y&1?47:92:32);}
/// ,
172117 байтИтак, поскольку выходные данные состоят из
///
s иwhitespace
s, должны быть представления на этих двух языках.Поместите ввод после кода в
W,H
виде унарного числа ( разрешено унарное для /// , спасибо Challenger5 за предложение) (используйте*
для представления цифры, отдельно с,
).Попробуйте онлайн! (с входом
W=4, H=3
)источник
Python 3 ,
8782 байтаИзменить: 5 байтов сохранены благодаря @officialaimm , @ Mr.Xcoder и @tsh
Попробуйте онлайн!
источник
*(b-1)
может быть*~-b
, за -2 байта." "*2*~-a
? Просто"__"*~-a
.J, 48 байтов
ungolfed
объяснение
Попробуйте онлайн!
источник
' '(<,~<<0 _1)}'\/'{~=/&(2|i.)&+:
. Аменд здесь великолепен.'/\ '{~2(<,~<<0 _1)}2|+/&i.&+:
с некоторым рефакторингом05AB1E , 19 байтов
Попробуйте онлайн!
Принимает аргументы в обратном порядке.
источник
Haskell ,
8479 байтовПопробуйте онлайн! Пример использования:
3%6
выдает список строк. Используйте,mapM putStrLn $ 3%6
чтобы красиво напечатать коробку.источник
Java 8, 141 байт
Карри лямбда от ширины к высоте, чтобы вывести.
Попробуйте онлайн (нет,
return t+i+o;
не было намеренно)Неуправляемая лямбда
Это решение нетипично придирчиво к размеру ввода, поскольку
char
для подсчета вводится ширина. К счастью, алгоритм достаточно плох, что при таких размерах завершение программы, вероятно, уже является проблемой. Я решил использовать егоchar
для индекса цикла, чтобы позже использовать его в качестве дешевого псевдонима'\n'
.источник
SOGL V0.12 ,
222113 байтовПопробуй здесь! (ожидает, что оба ввода в стеке
..
(и"
потому что строка не была явно запущена) - ввод числа дважды вводится для простоты использования)Объяснение:
источник
Mathematica, 87 байт
Попробуйте это в Mathics (по какой-то причине он печатает лишние пробелы в начале большинства строк) или в песочнице Wolfram. ! Принимает два целых числа в качестве входных данных.
Это довольно наивное решение, но у всех умных вещей, которые я пробовал, было больше байтов. Что-то, что почти работает
за исключением того, что он потерпит неудачу, если любое измерение равно 1 (входные данные представляют собой список, содержащий измерения).
источник
Pyth ,
40 3938 байтЭто берет два целых числа, разделенных новой строкой.
Полный набор тестов.
источник
Рубин ,
62 6160 байт-1 байт благодаря Арно
Попробуйте онлайн!
источник
На самом деле , 38 байт
Попробуйте онлайн!
источник
J , 39 байт
Попробуйте онлайн!
Принимает два аргумента как
height
на LHS, так иwidth
на RHS.источник
VBA (Excel), 161 байт
источник
Sub b
c=[2*A1]
r=[2*B1]
For i=1To r
For j=1To c
Debug.?IIf(i=1Or j=1Or i=r Or j=c,IIf((i + j)Mod 2,"\","/")," ");
Next
Debug.?
Next
End Sub
c=[2*A1]:r=[2*B1]:For i=1To r:For j=1To c:?IIf(i=1Or j=1Or i=r Or j=c,IIf((i + j)Mod 2,"\","/")," ");:Next:?:Next
R
160 байт152 байтПопробуйте онлайн!
Спасибо BLT за то, что сбрил 8 байтов.
источник
s
функцию?s=
бит. Анонимные функции разрешены.постоянный ток , 123 байта
Это далеко не самое короткое, но, если взять последние две строки и повернуть их
pi/2
радианами по часовой стрелке в «вертикальное» положение, это выглядит как тотемный столб .Принимает ввод как два целых числа через пробел.
Попробуйте онлайн!
источник
Mathematica, 116 байт
источник
Rotate[w,Pi]
эквивалентноw~Rotate~Pi
, какo["/\\",#]
и"/\\"~o~#
V , 18 байт
Ответ не требует,
ll
если<M-h>ollow
оставалось только два столбца символов :(Попробуйте онлайн!
источник
C # (.NET Core) , 188 байт
Количество байтов также включает в себя:
Попробуйте онлайн!
Я начал делать объяснения команда за командой, но на полпути это перестало иметь смысл ... Основная суть заключается в том, чтобы сделать полную колючую коробку, а затем выдолбить середину. Я использовал Linq ради использования Linq, возможно, он может быть короче, используя только стандартные итерации.
Вот объяснение, идущее в середину (сначала самая внутренняя команда):
сначала создайте строки для полного блока и объедините их в одну строку
Затем получите каждый символ в строке, и, если это не контур поля, замените его пробелом, объедините их обратно в одну строку для каждой строки
Наконец, получите каждую строку и объедините их вместе с символами новой строки (включая создание коллекции для строк)
источник
Perl 5 , 83 + 1 (-n) = 84 байта
Попробуйте онлайн!
источник