Сделать колючую коробку

31

Учитывая два натуральных числа, 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
/\/\/\/\
\      /
/      \
\      /
/      \
\      /
/      \
\      /
/      \
\/\/\/\/

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

Самый короткий код в байтах побеждает.

Кальвин Хобби
источник
Может ли кто-то, кто javascripts сделать фрагмент стека для этого?
FantaC

Ответы:

15

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

BײNײN/\

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

объяснение

B           Box
  ײN       Next input as number * 2
      ײN   Next input as number * 2
          /\ With border "/\"
ASCII-только
источник
3
Конечно, у древесного угля есть встроенный блок для извлечения
бензол
1
@benzene Несколько повезло, что он недавно добавил возможность рисовать произвольную строку вокруг рамки, но даже до этого были ответы, такие как codegolf.stackexchange.com/a/120065
Нил
1
@ Нил, подожди недавно? Когда? (Знаю ли я древесный уголь менее хорошо, спасибо? Ха-ха)
Только для ASCII
@ ASCII-только мой плохой! Я запутался из-за изменений, которые изменили положение курсора. (Изменение, которое ввело произвольную граничную строку, было ca904b0, что было почти год назад.)
Нейл
@benzene Без встроенного блока это все еще только 13 байтов: F²«↷P…\/N»‖M¬(принимает ввод в порядке высоты, ширины).
Нил
11

MATL , 18 байт

'\/',iE:]!+)O6Lt&(

Попробуйте это в 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). Транспонирование последнего и добавление к первому с помощью трансляции дает матрицу

2  3  4  5  6  7  8  9
3  4  5  6  7  8  9 10
4  5  6  7  8  9 10 11
5  6  7  8  9 10 11 12
6  7  8  9 10 11 12 13
7  8  9 10 11 12 13 14

Модульное индексирование в строку \/дает желаемый результат на границе матрицы:

/\/\/\/\
\/\/\/\/
/\/\/\/\
\/\/\/\/
/\/\/\/\
\/\/\/\/

Чтобы удалить значения без границ, мы устанавливаем их в 0(при интерпретации как char они отображаются как пробел):

/\/\/\/\
\      /
/      \
\      /
/      \
\/\/\/\/

Код комментария:

'\/'    % Push this string. Will be indexed into
,       % Do twice
  i     %   Input a number
  E     %   Multiply by 2
  :     %   Range 
]       % End
!       % Transpose
+       % Add
)       % Index
O       % Push 0
6L      % Push [2 -1+1j]. As an index, this means 2:end
t       % Duplicate
&(      % Write 0 into the center rectangle. Implicit display
Луис Мендо
источник
7

Хаскелл , 90 88 87 82 байта

1 6 байт сэкономлено благодаря Линн

a#b=[1..a]>>b
x!y|i<-(x-1)#"  "=x#"/\\":(y-1)#['\\':i++"/",'/':i++"\\"]++[x#"\\/"]

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

Все еще чувствует себя очень долго, я посмотрю, что я могу сделать.

Мастер пшеницы
источник
Определение 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 ~
Линн
@ Линн Спасибо! Вы действительно поймали мою слабину в последнее время.
Пшеничный волшебник
@ Линн Я заставил это работать, но за счет другого байта.
Пшеничный волшебник
5

05AB1E , 14 байтов

„/\|∍`S¦`).B∞∊

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

объяснение

„/\|∍`S¦`).B∞∊   Arguments: x, y
„/\              Push the string "/\"
   |             Push inputs as array: [x,y]
    ∍            Push the string extended/shortened to those lengths
     `           Flatten
      S          Push seperate chars of second string
       ¦`        Remove first char and flatten again
         )       Wrap stack to an array
          .B     Squarify
            ∞∊   Mirror on both axes

Это создает только верхний левый угол, ширину x символов и высоту y символов. Затем он отражает это на обеих осях:

x=3, y=2

/\/|
\  |
---+
kalsowerus
источник
4

JavaScript (ES6), 84 байта

Принимает ввод в синтаксисе карри (w)(h).

w=>h=>'/\\'[R='repeat'](w)+`
${`\\${p='  '[R](w-1)}/
/${p}\\
`[R](h-1)}`+'\\/'[R](w)

демонстрация

Arnauld
источник
3

Swift 3 , 166 байт

func f(a:Int,b:Int){let k=String.init(repeating:count:),n="\n";var r="\\"+k("  ",a-1)+"/";print(k("/\\",a)+n+k(r+n+String(r.characters.reversed())+n,b-1)+k("\\/",a))}

Полный набор тестов.

Закрывающая версия, к сожалению, немного длиннее (175 байт):

var g:(Int,Int)->String={let k=String.init(repeating:count:),n="\n";var r="\\"+k("  ",$0-1)+"/";return k("/\\",$0)+n+k(r+n+String(r.characters.reversed())+n,$1-1)+k("\\/",$0)}

Тестовый пакет с закрытой версией.

Мистер Xcoder
источник
3

Retina , 77 73 байта

\d+
$*
 1+|1(?=1* (1+))
$1¶
1
/\
.((..)*.)
/$1¶$1/
¶$

(?<=¶.+).(?=.+¶)
 

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Принимает ввод в формате <height> <width>. Объяснение:

\d+
$*

Преобразуйте входные данные в одинарные.

 1+|1(?=1* (1+))
$1¶

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

1
/\

Создайте колючую вершину.

.((..)*.)
/$1¶$1/

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

¶$

Удалить завершающие новые строки.

(?<=¶.+).(?=.+¶)
 

Удалите внутреннюю часть коробки. (Отметьте пробел в последней строке.)

Нил
источник
3

Excel, 95 байт

=REPT("/\",A1)&"
"&REPT("\"&REPT(" ",2*A1-2)&"/
/"&REPT(" ",2*A1-2)&"\
",B1-1)&REPT("\/",A1)
Wernisch
источник
3

APL (Дьялог) , 41 39 байт

Запрашивает список [H,W]

'\'@2@1⊢¯1⌽@1{⌽⍉⍵,'/\'⍴⍨≢⍵}⍣4''⍴⍨2×⎕-1

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

⎕-1 подсказка для ввода (мнемоника: стилизованная консоль) и вычитание 1

 умножить на два

''⍴⍨ используйте это, чтобы изменить пустую строку (пробелы с пробелами)

 дать это (служит для отделения его от 4)

{}⍣4 Применить следующую функцию четыре раза:

≢⍵ подсчет (длина) аргумента

'/\'⍴⍨ циклический г eshape "/\"к этой длине

⍵, добавить это к правой части аргумента

⌽⍉ переставить и отразить (т.е. повернуть на 90 °)

¯1⌽1 циклически вращайте 1- й ряд на один шаг вправо

 дать это (служит для отделения его от 1)

'\'@2@1 поставить обратную косую черту на 2- й позиции 1- го основного предмета.

Адам
источник
3

C (gcc) ,170 166 158 155 108 105

-3 байта благодаря cleblanc

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

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

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

Хорошо, я не могу найти какой-либо другой способ уменьшить количество байтов для этого кода.

Объяснение: простая двойная петля, печатающая коробку char за char

При печати границы: если обе координаты x и y являются четными или нечетными, отображается a /, в противном случае \отображается a

Если не граница, вместо этого отображается пробел

scottinet
источник
1
Вы можете сбрить еще 3 байта, перемещая 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);}
cleblanc
@cleblanc Спасибо!
Скоттинет
3

/// , 172 117 байт

Итак, поскольку выходные данные состоят из ///s и whitespaces, должны быть представления на этих двух языках.

Поместите ввод после кода в W,Hвиде унарного числа ( разрешено унарное для /// , спасибо Challenger5 за предложение) (используйте *для представления цифры, отдельно с ,).

/W/VV//V/\\\///`/\\\\\\\\\\\\\V/,/W>+  V`/`\>+W  !V!``WV>+WV-  V`\
`\W+  V`/
`/W-!V`\
W``\\V`\V>!//!*/+%-%!//*/  //%/

Попробуйте онлайн! (с входом W=4, H=3)

user202729
источник
Вы можете пропустить синтаксический анализ, взяв ввод в Unary .
Esolanging Fruit
Кроме того, я должен отметить, что это очень впечатляет! Отличная работа!
Esolanging Fruit
2

Python 3 , 87 82 байта

Изменить: 5 байтов сохранены благодаря @officialaimm , @ Mr.Xcoder и @tsh

def f(a,b,n="\n"):r="\\"+"  "*~-a+"/";print("/\\"*a+n+(r+n+r[::-1]+n)*~-b+"\\/"*a)

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

Халвард Хаммель
источник
Если вы хотите сохранить его в Python 3, *(b-1)может быть *~-b, за -2 байта.
Мистер Кскодер
2
@officialaimm Почему " "*2*~-a? Просто "__"*~-a.
17
@tsh Да, вы правы ... Хаха, не осознавал этого ...
officialaimm
@officialaimm сохранит его Python 3, однако сэкономил несколько байтов благодаря вам, Mr.Xcoder и tsh
Hummel
2

J, 48 байтов

' '&((<,~<<0 _1)})@(+:@[$(1&|.,:])@('\/'$~+:)@])

ungolfed

' '&((< ,~ <<0 _1)}) @ (+:@[ $ (1&|. ,: ])@('\/' $~ +:)@])

объяснение

                       (+:@[ $ (1&|. ,: ])@('\/' $~ +:)@])    creates box, but interior filled with slashes
                                           ('\/' $~ +:)@]       take right arg, W, doubles it, then fills that
                                          @                       many characters with '\/' repeating
                               (1&|. ,: ])                      stacks (,:) the above on top of itself rotated 
                                                                  by one char, producing top and bottom spikes
                              $                                 reshape to..
                       (+:@[                                    double the length of the left arg, height
                                                                  this creates the sides, as well as a filled interior
                     @                                    
' '&((< ,~ <<0 _1)})                                          removes slashes from interior by using the complement               
                                                                form of amend }.  ie, replace everything but the first
                                                                and last row and first and last col with a space

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

Ион
источник
1
33 байта ' '(<,~<<0 _1)}'\/'{~=/&(2|i.)&+:. Аменд здесь великолепен.
мили
оооо, очень хорошее улучшение
Иона
1
30 байтов '/\ '{~2(<,~<<0 _1)}2|+/&i.&+:с некоторым рефакторингом
мили
2

05AB1E , 19 байтов

4FNÈi¹}·„\/NÉiR}N·Λ

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

Принимает аргументы в обратном порядке.

Эрик Outgolfer
источник
Хм, я чувствую запах ... Режим холста ?
г-н Xcoder
2

Haskell , 84 79 байтов

w%h=[[last$"/\\"!!mod(x+y)2:[' '|x>1,y>1,x<2*w,y<2*h]|x<-[1..2*w]]|y<-[1..2*h]]

Попробуйте онлайн! Пример использования: 3%6выдает список строк. Используйте, mapM putStrLn $ 3%6чтобы красиво напечатать коробку.

Laikoni
источник
Я получил свой ответ ниже твоего с помощью Линн , но я бы хотел, чтобы ты снова победил.
Пшеничный волшебник
1
@WheatWizard Вот и все;)
Лайкони
2

Java 8, 141 байт

Карри лямбда от ширины к высоте, чтобы вывести.

w->h->{String f="/",b="\\",t=f,o=b,p="";char i=1;for(;i++<w;t+=b+f,o+=f+b)p+="  ";t+=b;o+=f;for(i=10;--h>0;)t+=i+b+p+f+i+f+p+b;return t+i+o;}

Попробуйте онлайн (нет, return t+i+o;не было намеренно)

Неуправляемая лямбда

w ->
    h -> {
        String
            f = "/",
            b = "\\",
            t = f,
            o = b,
            p = ""
        ;
        char i = 1;
        for (; i++ < w; t += b + f, o += f + b)
            p += "  ";
        t += b;
        o += f;
        for (i = 10; --h > 0; )
            t += i + b + p + f + i + f + p + b;
        return t + i + o;
    }

Это решение нетипично придирчиво к размеру ввода, поскольку charдля подсчета вводится ширина. К счастью, алгоритм достаточно плох, что при таких размерах завершение программы, вероятно, уже является проблемой. Я решил использовать его charдля индекса цикла, чтобы позже использовать его в качестве дешевого псевдонима '\n'.

Jakob
источник
2

SOGL V0.12 , 22 21 13 байтов

/\”m;HΙ»mč+╬¡

Попробуй здесь! (ожидает, что оба ввода в стеке .."потому что строка не была явно запущена) - ввод числа дважды вводится для простоты использования)

Объяснение:

/\”            push "/\"
   m           mold to the 1st inputs length
    ;          get the other input ontop of stack
     H         decrease it
      Ι        push the last string - "/\"
       »       rotate it right - convert to "\/"
        m      mold "\/" to the length of 2nd input - 1
         č     chop into characters
          +    prepend the 1st molded string to the character array of the 2nd
           έ  quad-palindromize
dzaima
источник
>: D это не бьет древесный уголь здесь
только ASCII
@ ASCII-only, потому что у древесного угля есть встроенное для этого: p (и SOGL действительно созданы для сложных и длительных задач в любом случае)
dzaima
1

Mathematica, 87 байт

Table[Which[1<i<2#2&&1<j<2#," ",OddQ[i+j],"\\",1>0,"/"],{i,2#2},{j,2#}]~Riffle~"
"<>""&

Попробуйте это в Mathics (по какой-то причине он печатает лишние пробелы в начале большинства строк) или в песочнице Wolfram. ! Принимает два целых числа в качестве входных данных.

Это довольно наивное решение, но у всех умных вещей, которые я пробовал, было больше байтов. Что-то, что почти работает

ArrayPad[Array[" "&,2#-2],1,{{"/",s="\\"},{s,"/"}}]~Riffle~"\n"<>""&

за исключением того, что он потерпит неудачу, если любое измерение равно 1 (входные данные представляют собой список, содержащий измерения).

Не дерево
источник
1

J , 39 байт

(' \/'{~=/&(2&|)(*>:)~0=*/&(*|.))&i.&+:

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

Принимает два аргумента как heightна LHS, так и widthна RHS.

миль
источник
Хорошая работа, как обычно. Интересный подход тоже.
Иона
@Jonah Нет, твоя идея намного лучше с использованием поправок. Если в сочетании с половиной моего ...
миль
1

VBA (Excel), 161 байт

Sub a()
c=[A2]*2
r=[B2]*2
For i=1To r
For j=1To c
b=IIf(i=1 Or j=1 Or i=r Or j=c,IIf((i+j) Mod 2,"\","/")," ")
d=d & b
Next
d=d & vbCr
Next
Debug.Print d
End Sub
remoel
источник
Гольф-саб (139 байт):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
Тейлор Скотт
Анонимная немедленная версия оконной функции выше (113 байт):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
Тейлор Скотт
1

R 160 байт 152 байт

p=function(x,n){paste(rep(x,n),collapse='')}
function(w,h){f=p(' ',w*2-2)
cat(paste0(p('/\\',w),'\n',p(paste0('\\',f,'/\n/',f,'\\\n'),h-1),p('\\/',w)))}

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

Спасибо BLT за то, что сбрил 8 байтов.

отметка
источник
Вы когда-нибудь использовали эту sфункцию?
BLT
Функция s - это то, что вы вызываете, чтобы создать коробку spikey
Марк
1
Понял. Вы можете получить 152 байта, если уберете пробел и s=бит. Анонимные функции разрешены.
BLT
Полезно знать, что любые функции разрешены
Марк
0

постоянный ток , 123 байта

?1-sesf[/\]su[lfsh[lunlh1-dsh0<q]dsqx]dsrx[[
\]P[lf2*2-st[32Plt1-dst0<z]dszx]dsmx[/
/]Plmx92Ple1-dse0<l]slle0<l10P[\/]sulrx

Это далеко не самое короткое, но, если взять последние две строки и повернуть их pi/2 радианами по часовой стрелке в «вертикальное» положение, это выглядит как тотемный столб .

Принимает ввод как два целых числа через пробел.

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

Р. Кап
источник
1
На данный момент самый длинный ответ здесь. Я думал, что это работа Java ...
Р. Кап
Не волнуйтесь, теперь есть решение Java , и оно стало длиннее.
Якоб
0

Mathematica, 116 байт

(c=Column;o=Table;v=""<>o[" ",2*#-2];w=""<>o["/\\",#];c[{w,c@o[c[{"\\"<>v<>"/","/"<>v<>"\\"}],#2-1],Rotate[w,Pi]}])&
J42161217
источник
Rotate[w,Pi]эквивалентно w~Rotate~Pi, как o["/\\",#]и"/\\"~o~#
Джонатан Фрех
Я знаю инфиксную нотацию и всегда использую ее, когда мне действительно нужен 1 байт. В этом случае я просто ее отпускаю ... ;-)
J42161217
2
Я не сомневался в твоих знаниях инфиксной нотации; Я просто хотел уменьшить количество байтов. Вы знаете, в духе игры в гольф и тому подобное.
Джонатан Фрех
0

C # (.NET Core) , 188 байт

a=>b=>string.Join("\n",new int[2*b].Select((x,i)=>string.Concat(string.Concat(new int[a].Select(y=>i%2==0?"/\\":"\\/")).Select((y,j)=>i>0&i<2*b-1&j>0&j<2*a-1?" ":""+y))))

Количество байтов также включает в себя:

using System.Linq;

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

Я начал делать объяснения команда за командой, но на полпути это перестало иметь смысл ... Основная суть заключается в том, чтобы сделать полную колючую коробку, а затем выдолбить середину. Я использовал Linq ради использования Linq, возможно, он может быть короче, используя только стандартные итерации.

Вот объяснение, идущее в середину (сначала самая внутренняя команда):
сначала создайте строки для полного блока и объедините их в одну строку

string.Concat(new int[a].Select(y => i % 2 == 0 ? "/\\" : "\\/"))

Затем получите каждый символ в строке, и, если это не контур поля, замените его пробелом, объедините их обратно в одну строку для каждой строки

string.Concat(PREVIOUS_STEP.Select((y, j) => i > 0 & i < 2 * b - 1 & j > 0 & j < 2 * a - 1 ? " " : "" + y))

Наконец, получите каждую строку и объедините их вместе с символами новой строки (включая создание коллекции для строк)

string.Join("\n", new int[2 * b].Select((x, i) => PREVIOUS_STEP));
Гжегож Пулавски
источник