Verilen genişlikle # 'in içi boş bir kare çizin


21

Codingame'den bu zorlukla karşılaştım ve benimkinden daha iyi çözümler hakkında merak ediyorum:

Standart giriş yoluyla bir genişlik verildiğinde, verilen genişlik ve uzunluktaki '#' boşluklu bir kare çizin.

Örnek:

5 sonuç bulundu

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

Bunu çözmek için python kullandım, bu yüzden özellikle diğer python kodlarıyla ilgileniyorum. Ancak lütfen çözümünüzü istediğiniz dilde göndermekten çekinmeyin.


7
Girdi 0 veya 1 ise ne olur?
Karl Napf

8
İlgili bu dupe olmayabilir farklı yetebilir olsa.
AdmBorkBork

3
PPCG'ye Hoşgeldiniz! Gelecekteki sorularınız için, ana sayfaya göndermeden önce bir meydan okuma hakkında anlamlı geri bildirim alabileceğiniz Sandbox'ı kullanmanızı öneririm .
AdmBorkBork

4
Cevapları okurken ikna olmadığımı ikna olmadım. Buradaki cevapların çoğu (golf ve normal diller), "Yazdır N Karesi" ndeki cevapların boyutunun yaklaşık yarısı kadardır.
AdmBorkBork 7:16

1
Bu kesinlikle bir kopya. Diğer zorluğun çözümleri burada geçerli ve rekabetçi olacak şekilde önemsiz şekilde değiştirilebilir.
Mego,

Yanıtlar:


1

Pyke, 11 bayt

ttDd*n+*.X#

Burada dene!

ttDd*n+*    - a square of spaces n-2*n-2 big
        .X# - surround in `#`

12

Kömür , 6 bayt

Kod:

NβBββ#

Açıklama:

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

Çevrimiçi deneyin!


1
Kömür girişini nasıl okuyacağımı bulmaya çalışıyordum. Şimdi biliyorum :)
Emigna

1
@Emigna Python'da olduğu gibi bir ifadede de kullanılabileceğini unutmayın int(input()). Bu zorluk "verilen genişlik ve yükseklikte içi boş bir dikdörtgen çizilirse" çözüm olabilir BNN#.
DLosc

Kömür UTF8 olmayan bir karakter kümesi kullanıyor mu?
OldBunny2800

Bu 6 karaktere değil 6 karaktere benziyor. β birçok 8-bit karakter kümesinde bol miktarda var, ancak dub (N olmayan) hakkında şüpheliyim
Sparr

3
@Sparr Kömür kendi kod sayfasını kullanır.
Conor O'Brien,

8

MATL , 12 bayt

:G\1>&*~35*c

Çevrimiçi deneyin!

açıklama

:     % 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 bayt

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

İş için doğru araç :)
Emigna

Meraktan, neden üç #gerekli?
Kevin Cruijssen

3
@KevinCruijssen Her biri yatay dikmeleri, dikey destekleri ve köşe parçalarını belirtir.
Conor O'Brien,

6

Python 2, 62 54 bayt

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

İade #\n#girişi olduğunda1

Yazdırılan 55 bayt sürümü

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

Herhangi bir giriş için çalışan 62 Bayt sürümü:

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

2
Kullanmadıkça söylemek f=zorunda değilsin - ki kullanmadın.
Daniel

@Dopapp Biliyorum ama bence daha adil ( bence tam işlevler / programlar ile karşılaştırıldığında)
Rod

@Rod Seçiminiz, ancak onlara izin veren anonim işlevler hakkında bir politikamız var.
Outgolfer Erik,

5

COW , 426 405 348 330 bayt

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo

Çevrimiçi deneyin! Çıktıyı değiştirmek için ikinci satırdaki sayıyı herhangi bir sayıya değiştirin.

Burada kullanıyorum COW tercümanı Perl'de yazılmıştır (ve bu zorluğa göre daha yeni), ancak kodu buraya girerek yine aynı sonucu elde edebilirsiniz .

açıklama

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

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

repl.it

Not: Bir girdi, 1bir çıktı üretir ##, ancak içi boş bir kare hiçbir zaman bir girdi için asla üretilmeyecektir 3, bu yüzden bunun iyi olduğunu düşünüyorum.


4

Java 7, 113 112 110 bayt

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

@ OlivierGrégoire sayesinde 1 bayt kurtarıldı ; @Cliffroot
sayesinde 2 bayt kaydedildi .

Çapraz Kare Oluşturma cevabım temelinde türetilmiş çözüm .

Burada dene.


1
Aşağıdakileri yaparak bir baytı tıraş eder misiniz for(int i=n,j;i-->0;r+="\n")? Hangisinin altta veya hangisinin üst olduğunun umrunda olmadığı için, bu sırayı korumak mantıklı değil mi?
Olivier Grégoire

1
@ OlivierGrégoire Teşekkürler! Aynı şeyi Yapabileceğim bir Çapraz Kare Oluşturma cevabında da düzenlemiştim .
Kevin Cruijssen

4

PowerShell v2 +, 48 47 bayt

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

JohnLBevan sayesinde -1 bayt

Girişi alır $n, setleri $zolarak $nsahip hashmarks $nsonrası indirildiği. Boru hattına bir kopyasını yerleştirmek için parens içinde kapsüller. Sonra virgül operatörünü kullanarak önceden azaltılmış , boşluk, $nsatır dizisi oluşturmak için kullanılır . Bunlar boru hattında kaldı. Sonra tekrar boru hattına yerleştirir. Sonunda örtük olan çıktılar, elemanlar arasında yeni bir satır açar, bu yüzden bunu bedavaya alırız.##$zWrite-Output

Yana OP'ın kod girişi için çalışmalarını değil n <= 1, biz destek girişine gerek yok demek için aldı 1ya.

Örnekler

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

3
###
# #
###

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

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

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

Başka bir baytı devre dışı param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
bırakabilirsiniz

1
@JohnLBevan Senaryo bloğu ile iyi fikir. Teşekkürler!
AdmBorkBork,

3

C, 98 bayt

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

Kullanımı:

f(5)


3

WinDbg, 206 200 182 170 bayt

.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 bayt , saniye yerine parens kaldırma .ifve kullanmaj.if

-18 bayt fyerine .fordizeleri oluşturmak için.

-12 bayt, NULL sonlandırıcı olmayan dizeler da

Girdi, sözde sicilden geçirilir $t0(örn.r $t0 = 5; {above-code} ).

Açıklama:

.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
    '
}

Örnek çıktı:

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 bayt

@Lmis sayesinde 3 bayt kaydedildi !

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

(İşlemez 0veya 1)

13 ekstra byte için ( 71 byte'da ),!

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

Bu çözümler oldukça basittir: birkaç byte tasarruf etmek için kendilerini tekrar etmemek için çok fazla depolama alanı kullanırlar . Değişkenlik olmadan unminified gibi görünüyordu:

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

Dene!

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


!n?'':n==1?'#':İşlev gövdesinin başlangıcına fazladan 15 bayt ekleyerek , girişleri 0ve kullanabilirsiniz 1.
Kayla,

1
n=>(b='#'[r='repeat'](n))ve sonra #${" "[r](n-=2)}vb. tekrar etmekten kaçınarak 3 bayt kazandırır repeat:)
Lmis

2

Python, 109 bayt

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
Sen yerini alabilir list(' '*n)ile [' ']*n. Ayrıca yerini alabilir x%(n-1)ilex%~-n
Buğday Sihirbazı

Ayrıca, forbloğu bir listeye çevirirseniz, 20 bayttan daha fazlasını kaydedebilirsiniz
Rod

Ayrıca, Python 2'ye çevirin, bırakın int()ve destekleri çevirin print.
Artyer,

Yerine <1kullanın ==0.
mbomb007

2

Ruby, 39 bayt

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

Bu şekilde denediğim tüm süslü şeylerden daha kısa olduğu ortaya çıkıyor. Bunun hiç bir şekilde 0 ya da 1'i idare etmediğine dikkat edin.


2

Python 2,50 bayt

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

İçin çalışıyor n>=2. Her satırı bir sayı işareti ile yazdırır,n-2 , uygun sembolden bir pound işareti, ardından başka .

Pound sembolünün diğer adı ile aynı uzunluk verilir:

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

Diğer girişimler:

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 bayt

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

İçin çalışıyor n>=2. Arasında bir karakteri sandwiching çalışmasını tanımlar #Ann karakter yeni satır sonlandırılmış dize , daha sonra bir 2B ızgara oluşturmak için iki kez uygular.

Gibi ara:

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

2

C, 83 82 80 78 77 Bayt

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

Çarpın içinde gizlice girin ve bir bayttan tasarruf edin ...

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

Ayrıca, j'yi sayın ve birkaç tane daha kazanın ...

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

İ'yi n'den sıfıra sayın ve birkaç bayttan tasarruf edin ...

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

Anlaması biraz daha kolay ve 1 byte daha fazla

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

Bunun &&yerine ihtiyacınız var &mı?
corvus_192

Evet, mantıklı olması gerekiyor.
Çoğalta


1

PHP, 81 69 bayt

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

İle koş -r ; bağımsız değişken olarak giriş sağlayın.

A DivisionByZeroErrorgirişini atar = 1.


1

R, 68 70 bayt

N> 1 için çalışıyor. Bir matris için diziyi değiştiren birkaç bayt için @Billywob.

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

#N-2 kare matrisinin etrafındaki satır ve sütunları koymak için rbind ve cbind kullanır . Yeni satırlar da satırlara bağlanır. Kaynaktaki yeni hat önemlidir. Giriş STDIN'den


Güzel! Bir dizgideki yeni satırın örtük olarak eklediği hakkında hiçbir fikrim yoktu \n. İki bayt olsa matrixyerine kullanarak kaydedebilirsiniz array.
Billywob

1

Ortak Lisp, 150 130 bayt

-20 @Cyoce ve @AlexL sayesinde.

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

Kullanımı:

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

Temel olarak formatüst ve alt için iki kez ve aradaki satırlar için bir döngü kullanır. Üst ve alt için çağrı çağrısı #, #s ile başlayan ve s ile uygun genişliğe kadar doldurulmuş bir çizgi çıkarır . Aradaki satırları biçimlendirme çağrısı benzer şekilde çalışır;# satırın sonunda basılan işaretler .

Not: Lisp için yeniyim ve bu konuda daha fazla yer açmayı düşünüyorum.


Neden isim vermiyorsun s? Yoksa anonim işlev mi yapıyorum?
Cyoce

Lisp'i tanımıyorum ama bir kelime ile bir açık braket arasındaki boşlukların tümü gerekli mi? Gibi olmak zorunda mı dotimes (h (- v 2))yoksa olabilir mi dotimes(h(- v 2))?
HyperNeutrino

@AlexL. evet, burada iyileştirme için birçok fırsat var. Parantezler ve diğer semboller arasında bir ton boşluk çıkarılabilir. Ben sadece gerçekten hızlı bunu yapacağım
artificialnull

0

Haskell, 67 bayt

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

Kullanım örneği:

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

Nasıl çalışır:

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

Jöle , 13 bayt

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

TryItOnline! veya 0 ila 15'i deneyin

Nasıl?

,þ%µỊṀ€€ị⁾# 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 bayt

15 baytlık kod, -nbayrak için +1 .

(Y_Xa-2WR'#s)My

Giriş için çalışır> = 2. Çevrimiçi deneyin!

Biraz ungolfed versiyonunun açıklaması

İlk olarak, ybir string argümanını alan, onu tekrarlayan a-2( ailk komut satırı girişi nerede ) ve sonucu saran bir fonksiyon tanımlarız #.

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

Sonra, bu işlevi iki kez uygularız - bir kez normal, sonra tekrar harita ile - kareyi bir dizi listesi olarak elde etmek için:

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

Girişi için 4, (y s)içinde "# #"ve y M (y s)içinde sonuçlanır ["####"; "# #"; "# #"; "####"]. Bu ikinci değer daha sonra-n bayrak yeni satırla ayrılmasına neden olur.

Golf oyunları

Ungolfed'den golf versiyonuna geçmek için:

  • Boşlukları kaldır.
  • Ybir operatör, bu da onu bir ifadede kullanabileceğimiz anlamına gelir. Y...Takip etmek yerine (ys)sadece yapabiliriz.(Y...s) .
  • Sorun şu ki, işlevi tekrar referans göstermeden önce yanklamak zorundayız y; bu yüzden yM(Y_Xa-2WR'#s)işe yaramaz. Çözüm: Map operatörünün işleçlerini değiştirin. Bunlardan biri bir işlev, diğeri yinelenebilir bir tür olduğu sürece, hangi sıraya girdikleri önemli değildir.

0

Raket 113 bayt

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

Ungolfed:

(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)))

Test yapmak:

(f 5)

Çıktı:

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

0

SpecBAS - 57 bayt

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

?için kısaltmadır PRINT,#13 bir gerekmeden bir dize sonuna tacked edilebilir satırbaşı olan +onlara katılmaya.

Kesme işareti, imleci bir satır aşağıya taşır.


0

Stuck, 29 27 Bayt

"Golf" dili için oldukça uzun, ama ne kadar çok işe yaradığını unuttum: P

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

Açıklama:

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 bayt

golfed:

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

Ungolfed:

    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: Döngü aralığı optimizasyonu.


0

Lithp , 117 bayt

Satır okunabilirlik için ikiye bölünmüş:

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

Örnek kullanım:

% 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
##########
#        #
#        #
#        #
#        #
#        #
#        #
#        #
#        #
##########
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.