Gambarlah persegi berongga dari # dengan lebar yang diberikan


21

Saya mendapat tantangan ini dari Codingame dan saya ingin tahu tentang solusi yang lebih baik daripada saya:

Diberi lebar melalui input standar gambarlah sebuah persegi berongga '#' dalam lebar dan panjang yang diberikan.

Contoh:

5 hasil

#####
#   #
#   #
#   #
#####

Saya menggunakan python untuk menyelesaikan ini jadi saya khususnya tertarik pada kode python lainnya. Tapi tolong kirimkan solusi Anda dalam bahasa apa pun yang Anda inginkan.


7
Bagaimana jika inputnya 0 atau 1?
Karl Napf

8
Terkait , meskipun ini mungkin cukup berbeda untuk tidak menjadi korban penipuan.
AdmBorkBork

3
Selamat datang di PPCG! Untuk pertanyaan di masa mendatang, saya mendorong Anda untuk menggunakan Sandbox di mana Anda bisa mendapatkan umpan balik yang berarti tentang tantangan sebelum mempostingnya ke halaman utama.
AdmBorkBork

4
Membaca jawaban, saya tidak yakin itu tipuan. Sebagian besar jawaban di sini (golf dan bahasa reguler) kira-kira setengah dari ukuran jawaban pada "Print N Squared."
AdmBorkBork

1
Ini benar-benar duplikat. Solusi dari tantangan lain dapat dimodifikasi untuk menjadi sah dan kompetitif di sini.
Mego

Jawaban:



12

Arang , 6 byte

Kode:

NβBββ#

Penjelasan:

Nβ        # Get input from the command line and store into β
   B      # Draw a hollow box with...
     β     #  Width β
      β    #  Height β
       #   #  Filled with the character '#'
           # Implicitly output the box

Cobalah online!


1
Saya mencoba mencari cara membaca input di Charcoal. Sekarang saya tahu :)
Emigna

1
@Emigna Catatan yang juga bisa digunakan dalam ekspresi, seperti int(input())pada Python. Jika tantangan ini adalah "menggambar persegi panjang berongga dengan lebar dan tinggi yang diberikan," solusinya bisa BNN#.
DLosc

Apakah Charcoal menggunakan charset non-UTF8?
OldBunny2800

Itu terlihat seperti 6 karakter, bukan 6 byte. β ada dalam banyak rangkaian karakter 8-bit alternatif, tapi saya meragukan tentang N (yang bukan N)
Sparr

3
@Sparr Charcoal menggunakan codepage sendiri.
Conor O'Brien

8

MATL , 12 byte

:G\1>&*~35*c

Cobalah online!

Penjelasan

:     % Input n implicitly. Push range [1 2 ... n]
      % STACK: [1 2 3 4 5]
G     % Push n again
      % STACK: [1 2 3 4 5], 5
\     % Modulo
      % STACK: [1 2 3 4 0]
1>    % Does each entry exceed 1?
      % STACK: [0 1 1 1 0]
&*    % Matrix with all pair-wise products
      % STACK: [0 0 0 0 0;
                0 1 1 1 0;
                0 1 1 1 0;
                0 1 1 1 0;
                0 0 0 0 0]
~     % Negate
      % STACK: [1 1 1 1 1;
                1 0 0 0 1;
                1 0 0 0 1;
                1 0 0 0 1;
                1 1 1 1 1]
35*   % Multiply by 35
      % STACK: [35 35 35 35 35;
                35  0  0  0 35;
                35  0  0  0 35;
                35  0  0  0 35;
                35 35 35 35 35]
c     % Convert to char. 0 is interpreted as space. Display implicitly
      % STACK: ['#####';
                '#   #';
                '#   #';
                '#   #';
                '#####']

6

Jolf, 8 byte

,ajj"###
,ajj      draw a box with height (input) and width (input)
    "###  with a hash border

Alat yang tepat untuk pekerjaan itu :)
Emigna

Karena penasaran, mengapa tiga #diperlukan?
Kevin Cruijssen

3
@KevinCruijssen Masing-masing menentukan struts horizontal, struts vertikal, dan potongan sudut.
Conor O'Brien

6

Python 2, 62 54 byte

f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+'\n'+'#'*n

Kembali #\n#ketika input1

Versi 55 Bytes yang dicetak

def f(n):a=n-2;print'#'*n,'\n#%s#'%(' '*a)*a,'\n'+'#'*n

Versi 62 Bytes yang berfungsi untuk input apa pun:

f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+('\n'+'#'*n)*(n>1)

2
Anda tidak perlu mengatakan f=kecuali Anda menggunakannya –– yang tidak Anda lakukan.
Daniel

@Dappapp saya tahu, tapi saya pikir itu lebih adil seperti itu (dibandingkan dengan fungsi / program lengkap)
Rod

@Rod Pilihan Anda, tetapi kami memiliki kebijakan tentang fungsi anonim yang memungkinkannya.
Erik the Outgolfer

5

SAP , 426 405 348 330 byte

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo

Cobalah online! Ubah nomor pada baris kedua ke nomor apa saja untuk mengubah output.

Penerjemah COW yang saya gunakan di sini ditulis dalam Perl (dan lebih baru dari tantangan ini), tetapi Anda masih bisa mendapatkan hasil yang sama dengan memasukkan kode di sini .

Penjelasan

; Note: [n] means "value stored in the nth block of memory".
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoO                                                  ;Stores 10 in [0].  10 is the code point for carriage return
MMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoO     ;Stores 32 in [1].  32 is the code point for whitespace
MMMmoOMMMMoOMoOMoO                                                              ;Stores 35 in [2].  35 is the code point for #
moOoom                                                                          ;Reads STDIN for an integer, and stores it in [3]
MMMmoOMMM                                                                       ;Copies [3] into [4] 
MOO                                                                             ;Loop as long as [4] is non-zero
    mOomOoMoo                                                                   ;Navigate to [2] and print the character with that code point
    moOmoOMOo                                                                   ;Navigate to [4] and decrement
moo                                                                             ;End loop
mOoMMMmoOMMMMOoMOo                                                              ;Copy [3] into [4] and decrement [4] twice
MOO                                                                             ;Loop as long as [4] is non-zero
    mOomOomOomOoMoo                                                             ;Navigate to [0] and print the character with that code point
    moOmoOMoo                                                                   ;Navigate to [2] and print the character with that code point
    moOMMMmoOmoOMMMMOoMOo                                                       ;Navigate to [3] and copy it into [5], then decrement [5] twice
    MOO                                                                         ;Loop as long as [5] is non-zero
        mOomOomOomOoMoo                                                         ;Navigate to [1] and print the character with that code point
        moOmoOmoOmoOMOo                                                         ;Navigate to [5] and decrement
    moo                                                                         ;End loop
    mOomOomOoMoo                                                                ;Navigate to [2] and print the character with that code point
    moOmoOMOo                                                                   ;Navigate to [4] and decrement
moo                                                                             ;End loop
mOomOomOomOoMoo                                                                 ;Navigate to [0] and print the character with that code point
moOmoOmoO                                                                       ;Navigate to [3]
MOO                                                                             ;Loop as long as [3] is non-zero
    mOoMoo                                                                      ;Navigate to [2] and print the character with that code point
    moOMOo                                                                      ;Navigate to [3] and decrement
moo                                                                             ;End loop

4

Python 2, 59 58 byte

n=i=input()
while i:print'#%s#'%((' #'[i%n<2])*(n-2));i-=1

repl.it

Catatan: Input 1menghasilkan output ##, tetapi kotak kosong tidak akan pernah diproduksi untuk input kurang dari 3, jadi saya kira ini baik-baik saja.


4

Java 7, 113 112 110 byte

String c(int n){String r="";for(int i=n,j;i-->0;r+="\n")for(j=0;j<n;r+=i*j<1|n-i<2|n-j++<2?"#":" ");return r;}

1 byte disimpan berkat @ OlivierGrégoire ;
2 byte disimpan berkat @cliffroot .

Solusi turunan berdasarkan pada jawaban saya pada Create a Crossed Square .

Coba di sini.


1
Bisakah Anda mencukur satu byte dengan melakukan hal berikut for(int i=n,j;i-->0;r+="\n")? Karena kita tidak peduli yang mana yang merupakan garis bawah atau yang teratas, tidak masuk akal untuk menjaga ketertiban itu, kan?
Olivier Grégoire

1
@ OlivierGrégoire Terima kasih! Saya juga telah mengeditnya dalam jawaban Creating a Crossed Square , karena di sana hal yang sama dapat dilakukan.
Kevin Cruijssen

4

PowerShell v2 +, 48 47 byte

param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z

-1 byte terima kasih kepada JohnLBevan

Mengambil input $n, ditetapkan $zsebagai $ntanda pagar, dengan $npost-decremented. Meringkas bahwa dalam parens untuk menempatkan salinan pada pipa. Kemudian gunakan operator koma untuk membuat larik $ngaris #, spasi,, yang telah ditentukan sebelumnya #. Itu dibiarkan di dalam pipa. Kemudian tempatkan $zlagi di saluran pipa. Output melalui implisit Write-Outputpada akhirnya memperkenalkan garis baru antar elemen, jadi kami mendapatkannya secara gratis.

Karena kode OP tidak berfungsi untuk input n <= 1, saya menganggap itu berarti kita juga tidak perlu mendukung input 1.

Contohnya

PS C:\Tools\Scripts\golfing> 2..6|%{"$_";.\draw-a-hollow-square.ps1 $_;""}
2
##
##

3
###
# #
###

4
####
#  #
#  #
####

5
#####
#   #
#   #
#   #
#####

6
######
#    #
#    #
#    #
#    #
######

Anda dapat mematikan byte lain:param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
JohnLBevan

1
@ JohnLBevan Ide bagus dengan blok skrip. Terima kasih!
AdmBorkBork

3

C, 98 byte

f(n,i){i=n*(n+1);while(i--){putchar(i%(n+1)==n?10:i<n||i>n*n-1||i%(n+1)==0||i%(n+1)==n-1?35:32);}}

Pemakaian:

f(5)


3

WinDbg, 206 200 182 170 byte

.if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}

-6 byte dari menghapus parens dari .ifdan menggunakan jbukan yang kedua.if

-18 byte dengan menggunakan falih-alih .foruntuk membangun string.

-12 byte oleh bukan string NULL-mengakhiri, bukannya melewati panjang ke da

Input diteruskan melalui register semu $t0(mis r $t0 = 5; {above-code}.).

Penjelasan:

.if @$t0                                                *Verify width($t0) at least 1 
{                                                       *(registers have unsigned values) 
    r $t3 = 2000000;                                    *Set $t3 to address where the 
                                                        *string will be constructed
    f @$t3 L@$t0 23;                                    *Put width($t0) '#' at 2000000($t3)
    f 2 * @$t3 L@$t0 20;                                *Put width($t0) ' ' at 4000000(2*$t3)
    eb 2 * @$t3 23;                                     *Put '#' on left of ' ' string
    eb 2 * @$t3 + @$t0 - 1 23;                          *Put '#' on right of ' ' string
    da @$t3 L@$t0;                                      *Print the top of the box
    j 1 < @$t0                                          *If width($t1) at least 2
    '
        .for (r $t1 = @$t0 - 2; @$t1; r $t1 = @$t1 - 1) *Loop width($t0)-2 times to...
        {
            da 2 * @$t3 L@$t0                           *...print the sides of the box
        };
        da @$t3 L@$t0                                   *Print the bottom of the box
    '
}

Output sampel:

0:000> r$t0=0
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}

0:000> r$t0=1
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x1 bytes
Filled 0x1 bytes
02000000  "#"

0:000> r$t0=2
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x2 bytes
Filled 0x2 bytes
02000000  "##"
02000000  "##"

0:000> r$t0=5
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x5 bytes
Filled 0x5 bytes
02000000  "#####"
04000000  "#   #"
04000000  "#   #"
04000000  "#   #"
02000000  "#####"

3

JavaScript, 61 58 byte

Disimpan 3 byte berkat @lmis !

n=>(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b

(Tidak menangani 0atau 1)

Untuk 13 byte tambahan ( 71 byte ), Anda bisa!

n=>n?n-1?(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b:'#':''

Solusi ini cukup sederhana: mereka melakukan banyak penyimpanan untuk tidak mengulangi sendiri untuk menghemat beberapa byte. Tanpa tanda kutip tanpa variabel, akan terlihat seperti:

n => // Anonymous function definition (Param `n` is the size)
    '#'.repeat(n) +      // # `n` times to form the top
    `
#${' '.repeat(n - 2)}#`  // Followed by a newline followed by a hash and `n` - 2 spaces and
                         // another hash to make one of the middle lines
    .repeat(n - 2) +     // The above middle lines repeated `n` - 2 times
    '#'.repeat(n)        // Followed by the top line again

Cobalah!

<script type="text/babel">var f=n=>n?n-1?(b='#'[r='repeat'](n))+`\n#${' '[r](n-=2)}#`[r](n)+`\n`+b:'#':'',b,r;function c(){document.getElementById('pre').textContent = f(+document.getElementById('input').value);}</script><input id="input" onkeydown="c();" onkeyup="c();" onchange="c();" onclick="c();" placeholder="Size"><pre id="pre"></pre>


Dengan menambahkan !n?'':n==1?'#':, 15 byte tambahan di awal badan fungsi, Anda dapat menangani input 0dan 1.
Kayla

1
n=>(b='#'[r='repeat'](n))dan kemudian #${" "[r](n-=2)}dll. menghemat 3 byte dengan menghindari pengulangan repeat:)
Lmis

2

Python, 109 byte

n=int(input())
for x in range(n):
 r=list(' '*n);r[0]=r[-1]='#'
 if x%(n-1)==0:r='#'*n
 print("".join(r))

1
Anda bisa menggantinya list(' '*n)dengan [' ']*n. Anda juga dapat mengganti x%(n-1)denganx%~-n
Wheat Wizard

juga, jika Anda mengubah forblok menjadi daftar pemahaman Anda dapat menyimpan lebih dari 20 byte
Rod

Juga, swith ke Python 2, jatuhkan int()dan kurung di sekitar print.
Artyer

Gunakan <1sebagai ganti ==0.
mbomb007

2

Ruby, 39 byte

->n{puts a=?#*n,[?#+' '*(n-=2)+?#]*n,a}

Ternyata menjadi lebih pendek dengan cara ini daripada semua hal mewah yang saya coba. Harap diperhatikan bahwa ini tidak menangani 0 atau 1 sama sekali.


2

Python 2, 50 byte

m=input()-2
for c in'#'+' '*m+'#':print'#'+m*c+'#'

Bekerja untuk n>=2 . Mencetak setiap baris dengan tanda pon, n-2simbol yang sesuai, lalu tanda pon lain.

Simbol Aliasing the pound memberikan panjang yang sama:

m=input()-2;p='#'
for c in p+' '*m+p:print p+m*c+p

Upaya lain:

lambda n:'#'*n+('\n#'+' '*(n-2)+'#')*(n-2)+'\n'+'#'*n

lambda n:'#'*n+'\n#%s#'%((n-2)*' ')*(n-2)+'\n'+'#'*n

lambda n:'\n'.join(['#'*n]+['#'+' '*(n-2)+'#']*(n-2)+['#'*n])

n=input();s='#'+' '*(n-2)+'#'
for c in s:print[s,'#'*n][c>' ']

s='##'+' #'*(input()-2)+'##'
for c in s[::2]:print s[c>' '::2]

s='#'+' '*(input()-2)+'#'
for c in s:print s.replace(' ',c)

2

Haskell, 49 byte

n%b='#':(b<$[3..n])++"#\n"
f n=(n%)=<<init(n%' ')

Bekerja untuk n>=2. Menentukan operasi penyisipan karakter antara #untuk nstring -character newline-terminated, kemudian menerapkannya dua kali untuk membuat kisi 2D.

Sebut seperti:

*Main> putStrLn$ f 5
#####
#   #
#   #
#   #
#####

2

C, 83 82 80 78 77 Bytes

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i*j&&i^n-1&&j^n-1?32:35));}

Menyelinap dalam multiply dan menyimpan ...

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i&&j&&i^n-1&&j^n-1?32:35));}

Hitung mundur j dan simpan beberapa ...

i,j;f(n){for(i=n;i--;puts(""))for(j=0;j++<n;putchar(i&&j^1&&i^n-1&&j^n?32:35));}

Hitung mundur saya dari n ke nol dan simpan beberapa byte ...

i,j;f(n){for(i=0;i++<n;puts(""))for(j=0;j++<n;putchar(i^1&&j^1&&i^n&&j^n?32:35));}

Sedikit lebih mudah dimengerti dan 1 byte lebih

i,j;f(n){for(i=0;i++<n;puts(""))for(j=0;j++<n;putchar(i==1|i==n|j==1|j==n?35:32));}

Apakah Anda perlu, &&bukan &?
corvus_192

Ya, itu harus logis &. Saya dapat menggunakan multiply tetapi membutuhkan terlalu banyak tanda kurung ...
cleblanc


1

PHP, 81 69 byte

for($n=-1+$i=$argv[1];$i--;)echo str_pad("#",$n," #"[$i%$n<1]),"#\n";

Jalankan dengan -r; memberikan input sebagai argumen.

Melempar DivisionByZeroErrorinput untuk = 1.


1

R, 68 70 byte

Berfungsi untuk n> 1. Terima kasih kepada @Billywob untuk beberapa byte yang menukar array untuk sebuah matriks.

cat(rbind(b<-'#',cbind(b,matrix(' ',n<-scan()-2,n),b),b,'
'),sep='')

Menggunakan rbind dan cbind untuk meletakkan baris dan kolom #di sekitar n-2 matriks ruang. Baris baru terikat ke baris juga. Baris baru di sumbernya signifikan. Masukan dari STDIN


Bagus! Saya tidak tahu bahwa baris baru dalam string secara implisit ditambahkan \n. Anda bisa menyimpan dua byte dengan menggunakan matrixbukan array.
Billywob

1

Common Lisp, 150 130 byte

-20 terima kasih kepada @Cyoce dan @AlexL.

(defun s(v)(format t"~v,,,vA~%"v #\# #\#)(dotimes(h(- v 2))(format t"~v,,,vA~A~%"(- v 1)#\  #\# #\#))(format t"~v,,,vA"v #\# #\#))

Pemakaian:

* (s 5)
#####
#   #
#   #
#   #
#####

Pada dasarnya menggunakan formatdua kali untuk bagian atas dan bawah dan satu lingkaran untuk baris di antaranya. Panggilan format untuk bagian atas dan bawah menghasilkan garis yang dimulai dengan #dan diisi dengan lebar yang sesuai dengan #s. Panggilan format untuk baris di antara karya-karya yang sama, kecuali padding adalah spasi dan #akan dicetak di akhir baris.

Catatan: Saya agak baru di Lisp dan berharap memiliki banyak ruang untuk perbaikan dalam hal ini.


Kenapa tidak menamainya s? Atau apakah saya fungsi anonim?
Cyoce

Saya tidak tahu Lisp, tetapi apakah semua ruang antara kata dan braket terbuka di sebelah kanannya perlu? Seperti, apakah harus dotimes (h (- v 2))atau mungkinkah dotimes(h(- v 2))?
HyperNeutrino

@AlexL. ya, ada banyak peluang untuk perbaikan di sini. Satu ton spasi dapat dihapus antara tanda kurung dan simbol lainnya. Saya hanya akan melakukannya dengan sangat cepat
artificialnull

0

Haskell, 67 byte

l#n=l<$[1..n]
f n=unlines$'#'#n:('#':' '#(n-2)++"#")#(n-2)++['#'#n]

Contoh penggunaan:

Prelude> putStrLn $ f 4
####
#  #
#  #
####

Bagaimana itu bekerja:

l#n=l<$[1..n]                      -- helper function that makes n copies of l

   '#'#n                           -- make a string of n copies of #, followed by
                        #(n-2)     -- n-2 copies of
     '#':' '#(n-2)++"#"            -- # followed by n-2 times spaces, followed by #
                           ['#'#n] -- and a final string with n copies of #
unlines                            -- join with newlines in-between

0

Jelly , 13, byte

,þ%µỊṀ€€ị⁾# Y

TryItOnline! atau coba 0 hingga 15

Bagaimana?

,þ%µỊṀ€€ị⁾# Y - Main link: n
 þ            - outer product with
,             -    pair:   [[[1,1],[2,1],...,[n,1]],[[1,2],[2,2],...,[n,2]], ... ,[[1,n],[2,n],...,[n,n]]]
  %           - mod n:     [[[1,1],[2,1],...,[0,1]],[[1,2],[2,2],...,[0,2]], ... ,[[1,0],[2,0],...,[0,0]]]
   µ          - monadic chain separation
    Ị         - abs(z)<=1: [[[1,1],[0,1],...,[1,1]],[[1,0],[0,0],...,[1,0]], ... ,[[1,1],[0,1],...,[1,1]]]
      €€      - for each for each
     Ṁ        - maximum:   [[1,    1,    ...,1],    [1,    0,    ..., 1],    ... ,[1,    1,    ..., 1]   ]
        ị     - index into (1 based)
         ⁾#   - "# ":      ["##...#","# ...#", ...,"##...#"]
           Y  - join with line feeds

0

Pip , 16 byte

15 byte kode, +1 untuk -nbendera.

(Y_Xa-2WR'#s)My

Bekerja untuk input> = 2. Cobalah online!

Penjelasan dari versi yang agak tidak disunat

Pertama, kita mendefinisikan fungsi yyang mengambil argumen string, mengulanginya a-2kali (di mana ainput baris perintah pertama), dan membungkus hasilnya #.

Y _ X a-2 WR '#
  _              Identity function
    X a-2        String-repeated by a-2
          WR '#  Wrapped in #
Y                Yank the resulting function into y

Selanjutnya, kami menerapkan fungsi ini dua kali - sekali normal, sekali lagi dengan peta - untuk mendapatkan kuadrat sebagai daftar string:

y M (y s)
    (y s)  Call function y with s (preinitialized to " ") as argument
y M        Map y to each character of the resulting string

Untuk input 4, (y s)hasil dalam "# #"dan y M (y s)dalam ["####"; "# #"; "# #"; "####"]. Nilai yang terakhir ini kemudian dicetak, dengan-n bendera yang menyebabkannya dipisahkan oleh baris baru.

Trik bermain golf

Untuk mendapatkan dari yang tidak disunat ke versi golf:

  • Hapus spasi.
  • Yadalah operator, yang artinya kita dapat menggunakannya dalam ekspresi. Alih-alih Y...diikuti (ys), kita bisa melakukannya (Y...s).
  • Masalahnya adalah, kita harus menarik fungsi sebelum kita merujuknya lagi sebagai y; jadi yM(Y_Xa-2WR'#s)tidak akan bekerja. Solusi: menukar operan dari Moperator ap. Selama salah satu dari mereka adalah fungsi dan yang lainnya adalah tipe yang dapat diubah, tidak masalah urutannya.

0

Racket 113 byte

(let*((d display)(g(λ()(for((i n))(d"#")))))(g)(d"\n")(for((i(- n 2)))(d"#")(for((i(- n 2)))(d" "))(d"#\n"))(g))

Tidak Disatukan:

(define (f n)
  (let* ((d display)
         (g (λ () 
              (for ((i n))
                (d "#"))
              (d "\n"))))
    (g)
    (for ((i (- n 2)))
      (d "#")
      (for ((i (- n 2)))
        (d " ") )
      (d "#\n"))
    (g)))

Pengujian:

(f 5)

Keluaran:

#####
#   #
#   #
#   #
#####

0

SpecBAS - 57 byte

1 INPUT n: a$="#"*n,n-=2,b$="#"+" "*n+"#"#13: ?a$'b$*n;a$

?adalah singkatan untuk PRINT, #13adalah carriage return yang dapat ditempel pada akhir string tanpa perlu +bergabung dengan mereka.

Apostrof memindahkan kursor cetak ke bawah satu baris.


0

Terjebak, 29 27 Bytes

Cukup lama untuk bahasa "golf", tetapi saya lupa bagaimana banyak dari itu bekerja: P

i_2-_u'#*N+_'#' u*'#N+++u*u

Penjelasan:

i_2-_u                           # take input and triplicate, subtracting 2 (5 -> [3,3,5])
      '#*N+_                     # create the top and bottom rows
            '#' u*'#N+++u*       # create input - 2 copies of middle rows
                          u      # rotate left 1 to get correct order, implicit output

0

C #, 154 152 byte

Golf:

void F(int n){Console.Write($"{new string('#',n)}\n");for(int i=2;i<n;i++)Console.Write($"#{new string(' ',n-2)}#\n");Console.Write(new string('#',n));}

Tidak Disatukan:

    void F(int n)
    {
        Console.Write($"{new string('#', n)}\n");

        for (int i = 2; i < n; i++)
            Console.Write($"#{new string(' ', n - 2)}#\n");

        Console.Write(new string('#', n));
    }

EDIT1: Optimasi rentang loop.


0

Lithp , 117 byte

Garis terbagi dua agar mudah dibaca:

#N::((var X (repeat "#" N))(print X)(each (seq 3 N) (scope #X::((print (+ "#" 
     (repeat " " (- N 2)) "#")))))(print X))

Penggunaan sampel:

% square.lithp
(
    (import "lists")
    (def s #N::((var X (repeat "#" N))(print X)(each (seq 3 N) (scope #X::((print (+ "#" (repeat " " (- N 2)) "#")))))(print X)))
    (s 10)
)

Output:
$ ./run square.lithp
##########
#        #
#        #
#        #
#        #
#        #
#        #
#        #
#        #
##########
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.