Teraz w Jailhouse

18

Wyzwanie

Biorąc pod uwagę liczbę całkowitą n(gdzie 4<=n<=10**6) jako dane wejściowe, stwórz „więzienne drzwi” sztuki ASCII * mierzące n-1szerokość i nwysokość znaków, używając symboli z poniższego przykładu.


Przykład

╔╦╗
╠╬╣
╠╬╣
╚╩╝

Używane są następujące znaki:

┌───────────────┬─────────┬───────┐
│ Position      │ Symbol  │ Char  │
├───────────────┼─────────┼───────┤
│ Top Left      │    ╔    │ 9556  │
├───────────────┼─────────┼───────┤
│ Top           │    ╦    │ 9574  │
├───────────────┼─────────┼───────┤
│ Top Right     │    ╗    │ 9559  │
├───────────────┼─────────┼───────┤
│ Right         │    ╣    │ 9571  │
├───────────────┼─────────┼───────┤
│ Bottom Right  │    ╝    │ 9565  │
├───────────────┼─────────┼───────┤
│ Bottom        │    ╩    │ 9577  │
├───────────────┼─────────┼───────┤
│ Bottom Left   │    ╚    │ 9562  │
├───────────────┼─────────┼───────┤
│ Left          │    ╠    │ 9568  │
├───────────────┼─────────┼───────┤
│ Inner         │    ╬    │ 9580  │
└───────────────┴─────────┴───────┘

Zasady

  • Możesz przyjmować dane za pomocą dowolnych rozsądnych i wygodnych środków, o ile pozwalają na to standardowe reguły we / wy .
  • Na potrzeby tego wyzwania w językach, w których symbole użyte do zbudowania „drzwi” są znakami wielobajtowymi, można je liczyć do wyniku jako jeden bajt.
  • Wszystkie pozostałe znaki (jedno- lub wielobajtowe) należy liczyć jak zwykle.
  • Dane wyjściowe mogą nie zawierać końcowych spacji, ale końcowy znak nowej linii jest dozwolony, jeśli jest to absolutnie konieczne.
  • To jest więc wygrywa najmniej bajtów.

Przypadki testowe

Input: 4
Output:
╔╦╗
╠╬╣
╠╬╣
╚╩╝

Input: 8
Output:
╔╦╦╦╦╦╗
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╠╬╬╬╬╬╣
╚╩╩╩╩╩╝

Input: 20
Output:
╔╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╗
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╠╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╣
╚╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╝

* Tak, wiem, że im większy, tym mniej wygląda na drzwi więzienia! :RE

Kudłaty
źródło
4
Byłoby dobrze, gdybyś mógł wprowadzić zarówno wymiary x, jak i y
Beta Decay
15
To było wystarczająco długo w piaskownicy, żebyś to zasugerował.
Shaggy
Czy mój program może zawierać nawet koryto, którego nie ma na stronie kodowej? Jeśli nie, to czy jest "'Z“ζdozwolony jako koszt jednego bajtu (lub 2)? (push 9580, konwersja do Unicode)?
dzaima
@dzaima Na potrzeby tego wyzwania, w językach, w których symbole używane dla „drzwi” zajmują wiele bajtów, można je liczyć do wyniku jako jeden bajt każdy.
Okx,
@Okx `╬` - nie do zresetowania w żadnej bajcie, "'Z“ζrówny jednemu bajtowi byłoby jak w javascript "╬"kosztującym 1 bajt
dzaima

Odpowiedzi:

9

Java 8, 156 151 148 118 bajtów

n->{String a="╔",b="╠",c="╚";for(int i=n;i-->3;a+="╦",b+="╬")c+="╩";a+="╗\n";for(b+="╣\n";n-->2;)a+=b;return a+c+"╝";}

-30 bajtów, tworząc port odpowiedzi @raznagul C # (.NET Core) , po tym jak grałem w golfa 5 bajtów.

Wypróbuj online.

Stara 148 bajtowa odpowiedź:

n->{String r="╔";int i=n,j;for(;i-->3;r+="╦");r+="╗\n╠";for(i=n;i-->2;r+="╣\n"+(i>2?"╠":"╚"))for(j=n;j-->3;r+="╬");for(;n-->3;r+="╩");return r+"╝";}

-5 bajtów dzięki @raznagul .

Wyjaśnienie:

Wypróbuj tutaj.

n->{                   // Method with integer parameter and String return-type
  String r="╔";        //  Result String (starting with the top-left corner)
  int i=n,j;           //  Indexes `i` and `j`
  for(;i-->3;          //  Loop (1) `n`-3 times:
      r+="╦"           //   Append result with top edges
  );                   //  End of loop (1)
  r+="╗\n╠";           //  Append result with the top-right corner, new-line and left edge
  for(i=n;i-->2        //  Loop (2) `n`-2 times
      ;                //     After every iteration:
      r+="╣\n"         //   Append result with right edge and new-line
      +(i>2?"╠":"╚"))  //    + either the left edge or bottom-left corner
    for(j=n;j-->3;     //   Inner loop (3) `n`-3 times:
        r+="╬"         //    Append result with middle section
    );                 //   End of inner loop (3)
                       //  End of loop (2) (implicit / single-line body)
  for(;n-->3;          //  Loop (4) `n`-3 times:
    r+="╩"             //   Append result with bottom edges
  );                   //  End of loop (4)
  return r+"╝";        //  Return result with its bottom-right corner
}                      // End of method
Kevin Cruijssen
źródło
Czy możesz zapisać jakieś bajty z kodami Escape / char zamiast kodować na stałe?
TheLethalCoder
@TheLethalCoder Być może, ale ponieważ stan reguły wyzwania możemy liczyć symbole jako 1 bajt każdy, prawdopodobnie jest on tak krótszy (stąd liczba bajtów 156 zamiast rzeczywistej 176). Spróbuj jednak kilku rzeczy, aby skrócić go za pomocą kodów znaków.
Kevin Cruijssen
Ach, tęskniłem za tą częścią zasad.
TheLethalCoder
2
+1 dla -->operatora idzie do ( ).
raznagul
1
Jeśli używasz i-->3, i-->2a j-->3´ you can save 5 bytes by removing the n- = 3` i n+1.
raznagul
7

Węgiel drzewny , 34-5 = 29 bajtów

A⁻N³γUB╬↓×╠γ╠¶╚×╩γ‖BOγ‖BO↑⁺γ

Wypróbuj online! Link jest do pełnej wersji kodu. 5-bajtowa redukcja dotyczy znaków rysujących w ramkach.

ReflectOverlapOverlap(0)powinien być równoważny, ReflectMirror()ale zamiast tego Węgiel po prostu robi ReflectTransform()zamiast tego, w przeciwnym razie to rozwiązanie również działałoby n=3. Oto obejście, które pokazuje, co by się stało n=3dla 38 - 5 = 33 bajtów:

A⁻N³γUB╬↓×╠γ╠¶╚×╩γ¿γ‖BOγ‖M‖BO↑⁺γ¹

Jeszcze lepiej, jeśli ReflectOverlapOverlap(0)zadziałało, ale nie zawracałem sobie głowy wspieraniem n=3, to mogłem to zrobić dla 31 - 4 = 27 bajtów:

A⁻N³γUB╬↓×╠γ╚×╩γ‖BOγ‖BO↑⁻γ¹
Neil
źródło
1
Hmm, nie wiedział Węgiel odzwierciedla również / lusterka do i takie. „ Licznik bajtów Charcoala z jakiegoś powodu nie działa. ” Może Licznik bajtów Charcoala nie działa, ponieważ te znaki nie są częścią strony kodowej? Możesz jednak policzyć je jako 1 bajt zgodnie z regułami wyzwania, więc jest to rzeczywiście 27.
Kevin Cruijssen
@KevinCruijssen To zależy od używanego operatora. (Muszę za każdym razem wracać i sprawdzać dwukrotnie; jest ich kilka i robi się to mylące ...)
Neil
@Neil Oops, to błąd, naprawi jak najszybciej. Dzięki za znalezienie!
Tylko ASCII,
@Neil Również z jakiegoś powodu jest zepsuty, gdy n = 4
tylko ASCII,
1
Daj nam kontynuować tę dyskusję w czacie .
Tylko ASCII,
6

Haskell, 75 bajtów

w i(a:b:c)=a:(b<$[4..i])++c
f n=concat$w(n+1)$w n<$>["╔╦╗\n","╠╬╣\n","╚╩╝"]  

Wypróbuj online!

Funkcja wprzyjmuje liczbę całkowitą ii listę, gdzie ajest pierwszy, bdrugi element i cresztę listy, i tworzy nową listę a, a następnie i-3kopie b, a następnie c. Zastosuj wnajpierw do każdego elementu listy, ["╔╦╗\n","╠╬╣\n","╚╩╝"]a następnie ponownie (z ipowiększeniem o 1) na wynikowej liście. Połącz w jedną listę.

nimi
źródło
Co to jest operator <$? Czy to tylko >> z odrzuconymi argumentami?
Aneesh Durg
@AneeshDurg: <$pochodzi z Data.Functori został wprowadzony Prelude. Jest prawie taki sam jak >>. a <$ bZastępuje każdy element bz a, podczas gdy b >> aoczekuje asię lista i Łączy długość bkopii a. [1,2] >> "aa"-> "aaaa", "aa" <$ [1,2]-> ["aa","aa"]. Uwaga: 'x' <$ [1,2]równa się [1,2] >> "x".
nimi
5

Vim, 29 bajtów

3<C-x>C╔╦╗
╠╬╣
╚╩╝<Esc>h<C-v>kkx@-Pjyy@-p

Ponieważ są znaki kontrolne, oto zrzut xxd:

00000000: 3318 43e2 9594 e295 a6e2 9597 0de2 95a0  3.C.............
00000010: e295 ace2 95a3 0de2 959a e295 a9e2 959d  ................
00000020: 1b68 166b 6b78 402d 506a 7979 402d 70    .h.kkx@-Pjyy@-p

Wypróbuj online! (Wygląda na to, że interpreter V ma problemy z postaciami egzotycznymi, więc link używa bardziej przyziemnych).

Wyjaśnienie

3<C-x>     " Decrement the number by 3
C╔╦╗
╠╬╣
╚╩╝<Esc>   " Cut the number (goes in @- register) and enter the "template"
h<C-v>kkx  " Move to the middle column, highlight and cut it
@-P        " Paste @- copies of the cut column
jyy        " Move to the middle line and copy it
@-p        " Paste @- copies of the copied line
Jordania
źródło
Aby potwierdzić: czy tylko interpreter TIO dusi symbole?
Kudłaty
@Shaggy Tak, generuje błąd Python dotyczący Latin-1, a nie błąd Vima. (Użyłem strony V tylko dlatego, że TIO nie ma zwykłej strony Vima i myślę, że V używa Latin-1.) Vim na moim komputerze nie ma żadnych problemów ze znakami.
Jordan
5

GNU sed, 74 + 1 = 75 bajtów

+1 bajt dla -rflagi. Pobiera dane wejściowe jako liczbę jednoznaczną.

s/1111(1*)/╔╦\1╗\n;\1╠╬\1╣\n╚╩\1╝/
:
s/(.)1/\1\1/
t
s/;([^;\n]+)/\1\n\1/
t

Wypróbuj online!

Wyjaśnienie

To jest całkiem proste. Załóżmy, że wartością wejściową jest 6 (unary 111111). Pierwszy wiersz upuszcza cztery 1si przekształca pozostałe dane wejściowe w to:

╔╦11╗
;11╠╬11╣
╚╩11╝

Trzeci wiersz w pętli zastępuje każdy 1poprzedzającym go znakiem. To tworzy nasze kolumny:

╔╦╦1╗
;11╠╬11╣
╚╩11╝

╔╦╦╦╗
;11╠╬11╣
╚╩11╝

...

╔╦╦╦╗
;;;╠╬╬╬╣
╚╩╩╩╝

Zauważ, że to także zduplikowało ;postać. Wreszcie piąta linia w pętli zastępuje każdy ;znak kopią następującego wiersza:

╔╦╦╦╗
;;╠╬╬╬╣
╠╬╬╬╣
╚╩╩╩╝

╔╦╦╦╗
;╠╬╬╬╣
╠╬╬╬╣
╠╬╬╬╣
╚╩╩╩╝

╔╦╦╦╗
╠╬╬╬╣
╠╬╬╬╣
╠╬╬╬╣
╠╬╬╬╣
╚╩╩╩╝
Jordania
źródło
4

Galaretka , 33 bajty

... czy to 33? - konwersja z jednego bajtu literałów ciągowych (indeksów stron kodowych) na znaki Unicode kosztuje 5.

_2µ“€ðБẋ“¡Ø¤“©ßµ‘js3x€2¦€’+⁽"7ỌY

Pełny program drukujący wynik.

Wypróbuj online!

W jaki sposób?

_2µ“€ðБẋ“¡Ø¤“©ßµ‘js3x€2¦€’+⁽"7ỌY - Main link: n
_2                                - subtract 2
  µ                               - start a new monadic chain with n-2 on the left
   “€ðБ                          - code page indexes [12, 24, 15] (middle row characters)
        ẋ                         - repeat n-2 times (make unexpanded middle rows)
         “¡Ø¤“©ßµ‘                - code page indexes [[0,18,3],[6,21,9]] (top & bottom)
                  j               - join (one list: top + middles + bottom)
                   s3             - split into threes (separate into the unexpanded rows)
                          ’       - decrement n-2 = n-3
                        ¦€        - sparsely apply to €ach:
                       2          -   at index 2
                     x€           -   repeat €ach (expand centre of every row to n-3 chars)
                            ⁽"7   - literal 9556
                           +      - addition (0->9556; 12->9568; etc...)
                               Ọ  - cast to characters (╠; ╔; etc...)
                                Y - join with newlines
                                  - implicit print
Jonathan Allan
źródło
@Shaggy - Używam 9 bajtów do reprezentowania znaków w literałach ciągów - są to indeksy stron kodowych. 5 bajtów przed Ykońcem +⁽"7Ọdodaje do nich 9556, a następnie rzutuje na znaki. Czy są (5) darmowe? Wydaje mi się, że byłoby to tak samo, jakbym mógł bezpośrednio używać znaków Unicode. (Mógłbym również użyć rzeczywistych znaków zamiast indeksów stron kodowych i użyć mapowania dla większej liczby bajtów).
Jonathan Allan
Nie. Po dyskusji stwierdzono, że tylko sam znak zawsze może być liczony jako 1, a nie jakakolwiek inna reprezentacja.
Erik the Outgolfer,
3

Python 3 , 75 bajtów

n=int(input())-3
print("╔"+"╦"*n+"╗\n"+("╠"+"╬"*n+"╣\n")*-~n+"╚"+"╩"*n+"╝")

Wypróbuj online!

Leaky Nun
źródło
Możesz nieco n-3n=int(input())-3;print("╔"+"╦"*n+"╗\n"+("╠"+"╬"*n+"╣\n")*(n+1)+"╚"+"╩"*n+"╝")
zagrać w
Również n+1jest równoważne z -~n.
Leaky Nun
3

Dyalog APL, 71 bajtów

{('╔',('╠'⍴⍨⍵-2),'╚'),((⍵-3)\⍪('╦',('╬'⍴⍨⍵-2),'╩')),'╗',('╣'⍴⍨⍵-2),'╝'}

Wypróbuj online!

Uriel
źródło
Na pewno możesz to zagrać w golfa. Np Zawsze może zastąpić (some expr)f Yz Y f⍨ some expr.
Adám
@ Adám Wiem, jest w toku, nie jestem obecnie przy komputerze
Uriel
3

Japt , 60 52 49 48 36 bajtów

"╔{Uµ3 ç'╦}╗{UÄ ç"
╠{ç'╬}╣"}
╚{ç'╩}╝

Wypróbuj online!

Inna wersja (47 bajtów + -Rflaga)

"8{Uµ3 ç'J};{UÄ ç"D{ç'P}G"}>{ç'M}A"c_+9500ÃòU+2

Potrzebuje -Rflagi (dodanej do pola wprowadzania). Wypróbuj online!

Jak to działa?

Ponieważ początkowo zakładałem, że „drzwiowe znaki” kosztują więcej niż jeden bajt, pomyślałem, że mogę zaoszczędzić sporo bajtów, kodując je. Następnie odjąłem 9500 od kodów znaków, co pozostawiło mnie ze znakami 8J; DPG >MA, które kosztują tylko jeden bajt. Następnie mógłbym dodać 9500 do każdego kodu znaków i wszystko byłoby dobrze.

 "8{   Uµ 3 ç'J}  ;{   UÄ  ç"D{   ç'P}  G"}  >{   ç'M}  A"c_+9500Ã òU+2
 "8"+((U-=3 ç'J)+";"+((U+1 ç"D"+(Uç'P)+"G")+">"+(Uç'M)+"A"c_+9500} òU+2
 "8"+           +";"+                      +">"+      +"A"              # Take this string of characters
     ((U-=3 ç'J)                                                        # Repeat "J" input - 3 times
                     ((    ç              )                             # Repeat the string
                            "D"+(Uç'P)+"G"                              # "D" + input-3 times "P" + "G"
                       U+1                                              # Input - 2 times
                                                (Uç'M)                  # Repeat "M" input - 3 times
                                                          c_     }      # Take the character code of every character
                                                            +9500       # Add 9500 to it
                                                          c_     }      # And convert it back to a character
                                                                   òU+2 # Split this string on every (input)th character
                                                                        # Print the resulting array, joined with newlines.
Łukasz
źródło
O tak, masz rację.
Luke
32 bajty
Kudłaty
2

Szybki, 161 bajtów

let f:(String,Int)->String={String(repeating:$0,count:$1)};var p={i in print("╔\(f("╦",i-3))╗\n\(f("╠\(f("╬",i-3))╣\n",i-2))╚\(f("╩",i-3))╝")}

Bez golfa:

let f:(String,Int)->String = {
    String(repeating:$0,count:$1)
}
var p={ i in
    print("╔\(f("╦",i-3))╗\n\(f("╠\(f("╬",i-3))╣\n",i-2))╚\(f("╩",i-3))╝")
}

Możesz wypróbować tę odpowiedź tutaj

Caleb Kleveter
źródło
2

QBIC , 78 bajtów

[:-3|X=X+@╦`]?@╔`+X+@╗`[b-2|Y=Z[b-3|Y=Y+@╬`]?@╠`+Y+@╣`}[b-3|W=W+@╩`]?@╚`+W+@╝`

Na szczęście wszystkie symbole używane w drzwiach komórki znajdują się na stronie kodowej QBasic.

Wyjaśnienie

            The TOP
[:-3|       FOR a = 1 to n-3 (-1 for the width, -2 for beginning and end)
X=X+@╦`]    Build out X$ with the parts of the middle-top
?@╔`+X+@╗`  Then print that preceded and followed by the corners
┘           Syntactic linebreak

            The MIDDLE
[b-2|       FOR c = 1 to n-2 (all the middle rows)
Y=Z         Reset Y$ to ""
            Build up the middle rows in the same way as the top,
            just with different symbols and once for each middle row
[b-3|Y=Y+@╬`]?@╠`+Y+@╣`
}           Close the FOR loop
            The BOTTOM
            The same as the top, just with different symbols
[b-3|W=W+@╩`]?@╚`+W+@╝`

Przykładowe dane wyjściowe

Command line: 7

╔╦╦╦╦╗
╠╬╬╬╬╣
╠╬╬╬╬╣
╠╬╬╬╬╣
╠╬╬╬╬╣
╠╬╬╬╬╣
╚╩╩╩╩╝
Steenbergh
źródło
1
+1 za użycie języka, który faktycznie ma je jako znaki jednego bajtu na domyślnej stronie kodowej.
Joshua
Czy możesz dodać TIO (lub równoważny)?
Kudłaty
1
O tak! W końcu to zapamiętam, obiecuję! : D
Shaggy
@ Dobrze kudłaty, nie przyzwyczajaj się zbytnio do tego pomysłu. Właśnie znalazłem działającą kompilację Emscripten dla Dosbox z QBasic. Spróbuję skierować to w stronę QBIC w nadchodzącym miesiącu, aby środowisko sieciowe mogło jeszcze nadejść ...
steenbergh
2

PHP , 131 bajtów, 113 znaków

for($z=str_split("╔╠╚╦╬╩╗╣╝",3);$i<$a=$argn;)echo str_pad($z[$b=$i++?$i<$a?1:2:0],3*$a-3,$z[$b+3]),$z[$b+6],"\n";

Wypróbuj online!

PHP , 133 bajty, 115 znaków

for(;$i<$a=$argn;)echo str_pad(["╔","╠","╚"][$b=$i++?$i<$a?1:2:0],3*$a-3,["╦","╬","╩"][$b]),["╗","╣","╝"][$b],"\n";

Wypróbuj online!

Jörg Hülsermann
źródło
2

JavaScript (ES6), 86 bajtów

Jest to znacznie dłużej niż w przypadku innej odpowiedzi JS , ale chciałem spróbować z alternatywną metodą.

n=>(g=i=>--i?`╬╣╠╩╝╚╦╗╔
`[(j=i%n)?!--j+2*!(n-j-2)+3*(i<n)+6*(i>n*n-n):9]+g(i):'')(n*n)

W jaki sposób?

Przypisujemy wagę do każdej krawędzi siatki: 1 dla prawej, 2 dla lewej, 3 dla dolnej i 6 dla górnej. Suma wag daje indeks używanego znaku.

8666667    0 1 2 3 4 5 6 7 8
2000001    ╬ ╣ ╠ ╩ ╝ ╚ ╦ ╗ ╔
2000001
2000001
2000001
2000001
2000001
5333334

Próbny

Arnauld
źródło
2

JavaScript (ES6), 80 74 bajtów

n=>`╔${"╦"[a="repeat"](n-=3)}╗${`
╠${"╬"[a](n)}╣`[a](n+1)}
╚${"╩"[a](n)}╝`
Łukasz
źródło
Możesz policzyć symbole jako jeden bajt, co daje 80 bajtów. I powinieneś być w stanie lepiej wykorzystać literały szablonów, aby zaoszczędzić kilka bajtów;)
Shaggy
Symbole można liczyć jako jeden bajt tylko wtedy, gdy można znaleźć implementację ES6, która pobierze dane wejściowe CP437 natywnie.
user5090812
@ user5090812, Jest to dodatek specyficzny dla tego wyzwania.
Shaggy
@ user5090812 Nie ma potrzeby szukania tej implementacji, ponieważ reguły wyzwania stanowią: „ Na potrzeby tego wyzwania, w językach, w których symbole używane do„ drzwi ”zajmują wiele bajtów, można je liczyć do wyniku jako pojedynczy bajt każdy. „Więc to ma liczbę bajtów 80 bajtów zamiast 98 (jeśli poprawnie policzyłem).
Kevin Cruijssen
To zła zasada. Eliminuje wszelkie bodźce do szukania lepszego sposobu przechowywania postaci.
Luke
2

Rubin, 54 52 bajty

-2 bajty dzięki ymbirtt.

->n{?╔+?╦*(n-=3)+"╗
"+(?╠+?╬*n+"╣
")*-~n+?╚+?╩*n+?╝}

Wypróbuj online!

Bez golfa

To jest bardzo nudne:

->n{
   ?╔ + ?╦ * (n-=3) + "╗\n" + 
  (?╠ + ?╬ * n      + "╣\n") * -~n + 
   ?╚ + ?╩ * n      + ?╝
}
Jordania
źródło
Możesz (n+1)trochę skrócić, pisząc -~n- pierwszeństwo operatora również oszczędza nawiasy.
ymbirtt
2

Java 8, 102 + 101 bajtów

java.util.function.BiFunction<String,Integer,String>r=(c,n)->"".valueOf(new char[n]).replace("\0",c);

n->{n-=3;return "╔"+r.apply("╦",n)+"╗\n"+r.apply('╠'+r.apply("╬",n)+"╣\n",-~n)+"╚"+r.apply("╩",n)+"╝";}

To jest kolejny repeater ciągów o tej samej długości:

java.util.function.BiFunction<String,Integer,String>r=(c,n)->{String p=c;for(;--n>0;p+=c);return p;}

Wypróbuj online!

Roberto Graham
źródło
Nieźle, możesz uczynić swoje podejście jeszcze niższym niż moja odpowiedź. Przede wszystkim możesz obniżyć go do 78 + 72 bajtów (łącznie 150), używając metody Java 7 zamiast BiFunction: n->{n-=3;return"╔"+r("╦",n)+"╗\n"+r("╠"+r("╬",n)+"╣\n",-~n)+"╚"+r("╩",n)+"╝";}i String r(String c,int n){return c.valueOf(new char[n]).replace("\0",c);} Wypróbuj online. Druga metoda może być również zmieniona na String r(String c,int n){String r=c;for(;n-->1;r+=c);return r;}(63 bajty), więc staje się w sumie 141 bajtami
Kevin Cruijssen
Korekta, możesz nawet obniżyć ją do 130 bajtów : n->"╔"+r("╦",n-=3)+"╗\n"+r("╠"+r("╬",n)+"╣\n",-~n)+"╚"+r("╩",n)+"╝"i String r(String c,int n){String r=c;for(;n-->1;r+=c);return r;} Wypróbuj online.
Kevin Cruijssen
2

C # (.NET Core) , wynik 123 (141 bajtów) wynik 118 (136 bajtów)

n=>{string a="╔",b="╠",c="╚";for(int i=3;i++<n;a+="╦",b+="╬")c+="╩";a+="╗\n";for(b+="╣\n";n-->2;)a+=b;return a+c+"╝";}

Wypróbuj online!

-5 bajtów dzięki @KevinCruijssen

Wyjaśnienie:

n => 
{
    string a = "╔", b = "╠", c = "╚"; //Initialize the first, last and the middle lines with the starting character.
    for (int i = 3; i++ < n;          //Loop n-3 times
        a += "╦", b += "╬")           //Add the middle character to the first and middle line.
        c += "╩";                     //Add the middle character to the last line.
    a += "╗\n";                       //Add the end character to the first line.
    for (b += "╣\n";                  //Add the end character to the first line.
        n-- > 2;)                     //Loop n-2 times.
        a += b;                       //Add the middle line to the first line.
    return a + c + "╝";               //Add the last line and the final character and return.
}
raznagul
źródło
1
Nice answer, +1 from me. I know it's been a while, but you can golf 5 more bytes by changing b+="╣\n";c+="╝";for(;n-->2;)a+=b;return a+c;}; to for(b+="╣\n";n-->2;)a+=b;return a+c+"╝";} Try it online.
Kevin Cruijssen
@KevinCruijssen: Thank you.
raznagul
2

Stax, 23 bytes

÷ÅoB↔╒╢Fm|╦a⌐á5µ┐»♫÷d╕Ñ

Run and debug it

Here's the ungolfed version. Amusingly, it's actually smaller for stax not to use the literal characters because including them as a literal would prevent source packing.

"2Pfj_EQGG]T"!  packed representation of the 9 characters
3/              split into groups of 3
GG              call into trailing program twice
m               print each row
}               trailing program begins here
1|xv\           [1, --x - 1]; x starts as original input
:B              repeat each element corresponding number of times
                effectively, this repeats the internal row of the matrix
M               transpose door; this way it expands the two dimensions

Run this one

recursive
źródło
1

Mathematica, 106 bytes

(T[a_,b_,c_]:=a<>Table[b,#-3]<>c;w=Column;w[{T["╔","╦","╗"],w@Table[T["╠","╬","╣"],#-2],T["╚","╩","╝"]}])&
J42161217
źródło
Could you add a TIO (or equivalent)?
Shaggy
1
goto sandbox.open.wolframcloud.com/app/objects paste the code(ctrl+v), add [8] at the end and press shift+enter
J42161217
There appears to be an extra line break between each line, would I be right in saying that's a problem with the rendering of the outpu, rather than the output itself?
Shaggy
@Shaggy wolfram cloud displays all characters in a funny-distorted way so it is not the best way to present such tasks.there are no extra lines and everything looks ok on mathematica. copy and paste your test case to check.I did and they look identical
J42161217
1

oK, 38 chars

`0:"╔╠╚╦╬╩╗╣╝"{+x+/:3*0,2_x}@&1,|1,-2+

Try it online.

k does not seem to want to handle unicode well, so I went with oK.

zgrep
źródło
1

Batch, 126 bytes

@set s=
@for /l %%i in (4,1,%1)do @call set s=%%s%%Î
@echo É%s:Î=Ë%»
@for /l %%i in (3,1,%1)do @echo Ì%s%¹
@echo È%s:Î=Ê%¼

Works in CP437 or CP850. Looks like this in those code pages:

@set s=
@for /l %%i in (4,1,%1)do @call set s=%%s%%╬
@echo ╔%s:╬=╦%╗
@for /l %%i in (3,1,%1)do @echo ╠%s%╣
@echo ╚%s:╬=╩%╝
Neil
źródło
1

Retina, 56 50 bytes

.+
$*╬╣
^╬╬╬
╠
.?
$_¶
T`╠╬╣`╔╦╗`^.*
T`╠╬╣`╚╩╝`.*¶$

Try it online! Works by building up a square of ╬s and then fixing up the edges (in particular three colums are deleted when the sides are added).

Neil
źródło
1

PowerShell, 67 bytes

'╔'+'╦'*($x=$args[0]-3)+'╗';,('╠'+'╬'*$x+'╣')*($x+1);'╚'+'╩'*$x+'╝'

Takes input $args[0], subtracts 3, saves that into $x, uses that in the construction of the top of the door to output the appropriate number of middle sections. Then we're outputting the middle rows, of which we have $x+1 of. Finally, the bottom row is similar to the top row. All of those are left on the pipeline, and the implicit Write-Output inserts a newline between elements for free.

Try it online!

AdmBorkBork
źródło
1

Perl 5, 61

60 characters of code (90 including the multibyte door characters) + 1 for -p

$_='╔'.'╦'x($n=$_-3)."╗\n";$_.=y/╔╦╗/╠╬╣/r x++$n.y/╔╦╗/╚╩╝/r

Try it online!

Xcali
źródło