Зробіть коробку Spiky


31

З урахуванням двох цілих натуральних чисел, W і H, виведіть поле ASCII art, рамка якого складається з косої частини ( /і \) з 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 "/\"

3
Звичайно, у вугіллі є вбудований
бензол

1
@benzene Нещодавно пощастило, що він нещодавно додав можливість намалювати довільну рядок навколо поля, але ще до цього були відповіді, такі як codegolf.stackexchange.com/a/120065
Ніл

1
@Neil чекати нещодавно? Коли? (Чи знаю я вугілля менш добре, дякую? Ха-ха)
лише 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

Haskell , 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 ~
Лінн

@Lynn Дякую! Ви справді ловите мою слабкість останнім часом.
Пшеничний майстер

@Lynn Я змусив його працювати, але ціною іншого байта.
Пшеничний майстер

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 та символів у висоту. Потім він відображає це на обох осях:

x=3, y=2

/\/|
\  |
---+

4

JavaScript (ES6), 84 байти

Здійснює введення в синтаксис currying (w)(h).

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

Демо


3

Швидкий 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)}

Тестовий набір з версією закриття.


3

Сітківка , 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)

3

APL (Dyalog) , 41 39 байт

Підказки до списку [H,W]

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

Спробуйте в Інтернеті!

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

 помножте на два

''⍴⍨ використовуйте це, щоб переробити порожній рядок (колодки з пробілами)

 урожай, який (служить для відділення його від 4)

{}⍣4 Застосувати таку функцію чотири рази:

≢⍵ підрахунок (довжина) аргументу

'/\'⍴⍨ циклічно r- форму "/\"до тієї довжини

⍵, додайте це до правої сторони аргументу

⌽⍉ переміщення та дзеркало (тобто повернути на 90 °)

¯1⌽1 циклічно обертати 1- й ряд на один крок праворуч

 урожай, який (служить для відділення його від 1)

'\'@2@1 поставте зворотний нахил у другому положенні 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.

Під час друку рамки: якщо обидві координати x і y є парними або непарними /, на \екрані відображається a , інакше a

Якщо це не межа, натомість відображається пробіл


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 Дякую!
scottinet

3

/// , 172 117 байт

Отже, оскільки вихід складається з ///s і whitespaces, повинні бути подані на цих 2 мовах.

Введіть після коду вхідний W,Hномер (unary для /// дозволено , завдяки Challenger5 за пропозицію) (використовуйте *для представлення цифр, розділення з ,) формату.

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

Спробуйте в Інтернеті! (із введенням W=4, H=3)


Ви можете пропустити синтаксичний розбір, взявши вхід у 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 байт.
Містер Xcoder

2
@officialaimm Чому " "*2*~-a? Просто "__"*~-a.
tsh

@tsh Так, ви маєте рацію ... Ха - ха , не розуміють , що ...
officialaimm

@officialaimm збереже Python 3, проте врятував деякі байти завдяки вам, Mr.Xcoder і tsh
Халвард Хаммель

2

J, 48 байт

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

неозорий

' '&((< ,~ <<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.)&+:. Поправка тут чудова.
милі

ooooh, дуже приємне поліпшення
Jonah

1
30 байт '/\ '{~2(<,~<<0 _1)}2|+/&i.&+:з деяким рефакторингом
миль


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для гарненького друку поля.



1
@WheatWizard Там ви йдете;)
Laikoni

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

Це рішення нетипово вибагливий щодо розміру вводу, оскільки a charвикористовується для підрахунку до введення ширини. На щастя, алгоритм досить поганий, що при таких розмірах завершення програми, ймовірно, вже є проблемою. Я вирішив використовувати charдля індексу циклу, щоб пізніше його повторно використовувати як дешевий псевдонім '\n'.


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

>: D тут не б'ють деревне вугілля
лише ASCII

@ ASCII тільки тому, що деревне вугілля має для цього вбудований: p (а SOGL справді зроблений для складних та довгих проблем)
dzaima

1

Математика, 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

Гольф Sub (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
Зрозумів. Якщо ви видалите пробіл та s=біт, ви можете опуститися до 152 байт . Анонімні функції дозволені.
BLT

Добре знати, що дозволені функції не допускаються
Марк

0

DC , 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 , і воно довше.
Якоб

0

Математика, 116 байт

(c=Column;o=Table;v=""<>o[" ",2*#-2];w=""<>o["/\\",#];c[{w,c@o[c[{"\\"<>v<>"/","/"<>v<>"\\"}],#2-1],Rotate[w,Pi]}])&

Rotate[w,Pi]еквівалентно w~Rotate~Pi, як o["/\\",#]до"/\\"~o~#
Джонатан Frech

Я знаю нотацію інфіксації, і я завжди користуюся нею, коли мені справді потрібен 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));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.