วาดสี่เหลี่ยมกลวงของ # ด้วยความกว้างที่กำหนด


21

ฉันได้รับความท้าทายนี้จากรหัสและฉันอยากรู้เกี่ยวกับการแก้ปัญหาที่ดีกว่าของฉัน:

กำหนดความกว้างผ่านอินพุตมาตรฐานให้วาดสี่เหลี่ยมกลวงของ '#' ในความกว้างและความยาวที่กำหนด

ตัวอย่าง:

5 ผลลัพธ์ใน

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

ฉันใช้หลามเพื่อแก้ปัญหานี้ดังนั้นฉันจึงสนใจในรหัสหลามอื่น ๆ โดยเฉพาะ แต่โปรดโพสต์โซลูชันของคุณในภาษาที่คุณต้องการ


7
เกิดอะไรขึ้นถ้าการป้อนข้อมูลเป็น 0 หรือ 1?
Karl Napf

8
ที่เกี่ยวข้องแม้ว่านี่อาจจะแตกต่างกันพอที่จะไม่ตกเป็นเหยื่อ
AdmBorkBork

3
ยินดีต้อนรับสู่ PPCG! สำหรับคำถามในอนาคตฉันขอแนะนำให้คุณใช้Sandboxซึ่งคุณจะได้รับข้อเสนอแนะที่มีความหมายในการท้าทายก่อนโพสต์ไว้ในหน้าหลัก
AdmBorkBork

4
อ่านผ่านคำตอบฉันไม่เชื่อว่ามันเป็นคนหลอกลวง คำตอบส่วนใหญ่ที่นี่ (ภาษากอล์ฟและภาษาปกติ) มีขนาดประมาณครึ่งหนึ่งของคำตอบใน "Print N Squared"
AdmBorkBork

1
นี่เป็นสิ่งที่ซ้ำกันอย่างแน่นอน โซลูชั่นจากความท้าทายอื่น ๆ สามารถแก้ไขได้เล็กน้อยเพื่อให้ถูกต้องและแข่งขันได้ที่นี่
Mego

คำตอบ:



12

ถ่าน 6 ไบต์

รหัส:

NβBββ#

คำอธิบาย:

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

ลองออนไลน์!


1
ฉันพยายามหาวิธีอ่านอินพุตใน Charcoal ตอนนี้ฉันรู้แล้ว :)
Emigna

1
@Emigna โปรดทราบว่าสามารถใช้ในการแสดงออกเช่นint(input())ใน Python หากความท้าทายนี้เป็น "วาดสี่เหลี่ยมกลวงด้วยความกว้างและความสูงที่กำหนด" วิธีแก้ปัญหาอาจเป็นBNN#ได้
DLosc

Charcoal ใช้ชุดอักขระที่ไม่ใช่ UTF8 หรือไม่
OldBunny2800

ที่มีลักษณะเหมือน 6 ​​ตัวอักษรไม่ใช่ 6 ไบต์ βอยู่ในชุดอักขระ 8 บิตแบบสลับกันมากมาย แต่ฉันสงสัยเกี่ยวกับ N (ซึ่งไม่ใช่ N)
Sparr

3
@Sparr Charcoal ใช้เพจรหัสของตัวเอง
Conor O'Brien

8

MATLขนาด 12 ไบต์

:G\1>&*~35*c

ลองออนไลน์!

คำอธิบาย

:     % 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 ไบต์

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

เครื่องมือที่เหมาะสมสำหรับงาน :)
Emigna

จากความอยากรู้ทำไมถึง#ต้องมีสามประการ
Kevin Cruijssen

3
@KevinCruijssen แต่ละคนระบุเสาแนวนอนเสาแนวตั้งและมุมต่างๆ
Conor O'Brien

6

Python 2, 62 54 ไบต์

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

ส่งคืน#\n#เมื่ออินพุตเป็น1

รุ่น 55 ไบต์ที่พิมพ์

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

รุ่น 62 ไบต์ที่ใช้งานได้กับอินพุตใด ๆ :

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

2
คุณไม่จำเป็นต้องพูดf=นอกเสียจากว่าคุณจะใช้ - ซึ่งคุณไม่ต้องการ
แดเนียล

@Dopapp ฉันรู้ แต่ฉันคิดว่ามันมากขึ้นยุติธรรมว่าวิธีการ (เมื่อเทียบกับฟังก์ชั่นเต็มรูปแบบ / โปรแกรม)
ร็อด

@Rod ทางเลือกของคุณ แต่เรามีนโยบายเกี่ยวกับฟังก์ชั่นที่ไม่ระบุชื่อที่ช่วยให้พวกเขา
Erik the Outgolfer

5

COW , 426 405 348 330 ไบต์

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo

ลองออนไลน์! เปลี่ยนตัวเลขในบรรทัดที่สองเป็นตัวเลขใด ๆ เพื่อเปลี่ยนเอาต์พุต

ล่ามวัวที่ฉันใช้ที่นี่ถูกเขียนใน Perl (และใหม่กว่าความท้าทายนี้) แต่คุณยังคงได้รับผลลัพธ์เดียวกันโดยป้อนรหัสที่นี่ที่นี่

คำอธิบาย

; 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 ไบต์

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

repl.it

หมายเหตุ: อินพุตของ1สร้างเอาต์พุตของ##แต่สี่เหลี่ยมกลวงจะไม่ถูกสร้างขึ้นสำหรับอินพุตที่น้อยกว่า3ดังนั้นฉันเดาว่านี่เป็นเรื่องปกติ


4

Java 7, 113 112 110 ไบต์

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 ไบต์ขอบคุณ@ OlivierGrégoire ;
2 ไบต์บันทึกขอบคุณที่@cliffroot

วิธีการแก้ปัญหาที่ได้มาอยู่บนพื้นฐานของฉันสร้างสแควร์ข้ามคำตอบ

ลองที่นี่


1
คุณสามารถโกนไบต์ด้วยการทำสิ่งต่อไปนี้ได้for(int i=n,j;i-->0;r+="\n")หรือไม่? เนื่องจากเราไม่สนใจว่าบรรทัดล่างสุดหรืออันแรกนั้นไม่มีเหตุผลใดที่จะรักษาความสงบเรียบร้อยใช่ไหม?
Olivier Grégoire

1
@ OlivierGrégoireขอบคุณ! ฉันได้แก้ไขมันในคำตอบของการสร้าง Crossed Squareของฉันด้วยเนื่องจากสามารถทำได้เช่นเดียวกัน
Kevin Cruijssen

4

PowerShell v2 +, 48 47 ไบต์

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

-1 ไบต์ขอบคุณ JohnLBevan

รับอินพุต$nตั้งค่า$zเป็น$nhashmarks พร้อมกับ$nลดการโพสต์ สรุปว่าอยู่ใน parens เพื่อวางสำเนาบนไพพ์ไลน์ แล้วใช้ประกอบจุลภาคเพื่อสร้างอาร์เรย์ของก่อน decremented $nเส้นของช่องว่าง# #สิ่งเหล่านั้นถูกทิ้งไว้บนท่อ จากนั้นวาง$zอีกครั้งบนท่อ การส่งออกโดยปริยายWrite-Outputในตอนท้ายแนะนำบรรทัดใหม่ระหว่างองค์ประกอบดังนั้นเราจึงได้รับฟรี

เนื่องจากรหัสของ OPไม่ทำงานสำหรับอินพุตn <= 1ฉันจึงใช้วิธีนี้เพื่อหมายความว่าเราไม่จำเป็นต้องสนับสนุนอินพุต1เช่นกัน

ตัวอย่าง

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

3
###
# #
###

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

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

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

คุณสามารถเคาะไบต์อื่นออก:param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
JohnLBevan

1
@JohnLBevan ความคิดที่ดีกับบล็อกสคริปต์ ขอบคุณ!
AdmBorkBork



3

WinDbg, 206 200 182 170 ไบต์

.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 ไบต์จากการลบ parens จาก.ifและใช้jแทนวินาที.if

-18 ไบต์โดยใช้fแทนการ.forสร้างสตริง

-12 ไบต์โดยไม่ใช่ NULL- ยุติสตริงแทนผ่านความยาวไป da

อินพุตถูกส่งผ่านผ่านการลงทะเบียนหลอก$t0(เช่นr $t0 = 5; {above-code} )

คำอธิบาย:

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

ตัวอย่างผลลัพธ์:

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 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ@lmis !

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

(ไม่จัดการ0หรือ1)

สำหรับ 13 ไบต์พิเศษ (ที่71 ไบต์ ) คุณสามารถทำได้!

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

วิธีแก้ปัญหาเหล่านี้ค่อนข้างเรียบง่าย: พวกมันมีพื้นที่เก็บข้อมูลมากมายเพื่อไม่ให้ซ้ำตัวเองเพื่อบันทึกสองสามไบต์ ไม่ระบุโดยไม่มี variablsm มันจะมีลักษณะดังนี้:

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

ลองมัน!

<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?'#':ความพิเศษไบต์ 15 ที่จุดเริ่มต้นของร่างกายฟังก์ชั่นที่คุณสามารถจัดการกับปัจจัยการผลิตและ0 1
Kayla

1
n=>(b='#'[r='repeat'](n))และจากนั้น#${" "[r](n-=2)}เป็นต้นช่วยให้คุณประหยัด 3 ไบต์โดยการหลีกเลี่ยงการทำซ้ำrepeat:)
LMIS

2

Python ขนาด 109 ไบต์

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
คุณสามารถแทนที่ด้วยlist(' '*n) [' ']*nคุณสามารถแทนที่x%(n-1)ด้วยx%~-n
Wheat Wizard

นอกจากนี้ถ้าคุณเปิดforบล็อกเข้าสู่ความเข้าใจรายการคุณสามารถประหยัดมากกว่า 20 ไบต์
ร็อด

นอกจากนี้คุณภาพชั้นหนึ่งเพื่อหลาม 2 ลดลงและวงเล็บรอบint() print
Artyer

ใช้แทน<1 ==0
mbomb007

2

Ruby, 39 ไบต์

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

กลายเป็นว่าจะสั้นลงกว่าวิธีแฟนซีทั้งหมดที่ฉันพยายาม โปรดทราบว่านี่ไม่ได้จัดการกับ 0 หรือ 1 เลย


2

Python 2, 50 ไบต์

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

n>=2ผลงาน พิมพ์แต่ละบรรทัดด้วยเครื่องหมายปอนด์n-2ของสัญลักษณ์ที่เหมาะสมจากนั้นลงชื่ออีกปอนด์

นามแฝงสัญลักษณ์ปอนด์ให้ความยาวเท่ากัน:

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

ความพยายามอื่น ๆ :

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 ไบต์

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

n>=2ผลงาน กำหนดดำเนินงานของตัวละครประกบระหว่าง#การnสตริงขึ้นบรรทัดใหม่สิ้นสุดอักขระแล้วนำไปใช้เป็นครั้งที่สองที่จะทำให้ตาราง 2D

โทรเช่น:

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

2

C, 83 82 80 78 77 ไบต์

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

แอบในทวีคูณและบันทึกไบต์ ...

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

นับถอยหลัง j และบันทึกอีกไม่กี่ ...

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

นับฉันจาก n เป็นศูนย์และบันทึกสองสามไบต์ ...

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

เข้าใจง่ายขึ้นเล็กน้อยและอีก 1 ไบต์

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

คุณต้องการ&&แทน&ไหม
corvus_192

ใช่จำเป็นต้องมีเหตุผล & ฉันสามารถใช้คูณ แต่ต้องวงเล็บมากเกินไป ...
cleblanc


1

PHP, 81 69 ไบต์

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

ทำงานด้วย -r ; ระบุอินพุตเป็นอาร์กิวเมนต์

พ่นDivisionByZeroErrorสำหรับการป้อนข้อมูล1=


1

R, 68 70ไบต์

ใช้งานได้สำหรับ n> 1 ขอบคุณ @Billywob สำหรับสองสามไบต์ที่สลับอาร์เรย์สำหรับเมทริกซ์

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

ใช้ rbind และ cbind เพื่อวางแถวและคอลัมน์ของ#รอบเมทริกซ์ช่องว่าง n-2 บรรทัดใหม่ถูกผูกไว้กับแถวเช่นกัน ขึ้นบรรทัดใหม่ในแหล่งที่มามีความสำคัญ อินพุตจาก STDIN


ดี! \nฉันมีความคิดว่าการขึ้นบรรทัดใหม่ในสตริงโดยปริยายเพิ่ม คุณสามารถประหยัดไบต์ที่สองโดยใช้matrixแทน arrayแม้ว่า
Billywob

1

เสียงกระเพื่อมสามัญ150 130 ไบต์

-20 ขอบคุณ @Cyoce และ @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 #\# #\#))

การใช้งาน:

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

โดยทั่วไปจะใช้formatสองครั้งสำหรับด้านบนและด้านล่างและวนรอบสำหรับแถวในระหว่าง การเรียกรูปแบบสำหรับด้านบนและด้านล่างจะแสดงบรรทัดที่ขึ้นต้นด้วย#และเพิ่มความกว้างที่เหมาะสมด้วย#s การจัดรูปแบบการเรียกแถวในระหว่างการทำงานในทำนองเดียวกันยกเว้นการขยายเป็นช่องว่างและ#ได้รับการพิมพ์ที่ส่วนท้ายของบรรทัด

หมายเหตุ: ฉันค่อนข้างใหม่กับ LISP และคาดว่าจะมีพื้นที่มากมายสำหรับการปรับปรุงในเรื่องนี้


ทำไมไม่ตั้งชื่อมันs? หรือฟังก์ชั่นที่ไม่ระบุชื่อทำอะไร?
Cyoce

ฉันไม่รู้จัก LISP แต่มีช่องว่างทั้งหมดระหว่างคำและวงเล็บเปิดทางด้านขวาที่จำเป็นใช่ไหม เช่นจะต้องมีdotimes (h (- v 2))หรืออาจเป็นdotimes(h(- v 2))?
HyperNeutrino

@AlexL ใช่มีโอกาสมากมายสำหรับการปรับปรุงที่นี่ สามารถลบช่องว่างจำนวนหนึ่งตันระหว่างวงเล็บและสัญลักษณ์อื่น ๆ ได้ ฉันจะทำอย่างรวดเร็วจริง ๆ
artificialnull

0

Haskell, 67 ไบต์

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

ตัวอย่างการใช้งาน:

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

มันทำงานอย่างไร:

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

เยลลี่ , 13, ไบต์

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

TryItOnline! หรือลอง 0 ถึง 15

อย่างไร?

,þ%µỊṀ€€ị⁾# 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 ไบต์

โค้ด 15 ไบต์, +1 สำหรับการ-nตั้งค่าสถานะ

(Y_Xa-2WR'#s)My

ใช้งานได้กับอินพุต> = 2 ลองออนไลน์!

คำอธิบายของเวอร์ชันที่ไม่ได้รับการดัดแปลง

ครั้งแรกที่เรากำหนดฟังก์ชันyที่ใช้อาร์กิวเมนต์สตริงซ้ำมันa-2ครั้ง (ซึ่งaคือการป้อนคำสั่งบรรทัดแรก) และ wraps #ผลใน

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

ต่อไปเราจะใช้ฟังก์ชั่นนี้สองครั้ง - ตามปกติแล้วอีกครั้งกับแผนที่ - เพื่อให้ได้สแควร์เป็นรายการสตริง:

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

สำหรับใส่ของ4, (y s)ผลใน"# #"และในy M (y s) ["####"; "# #"; "# #"; "####"]ค่าหลังนี้จะถูกพิมพ์จากนั้นด้วยเครื่องหมาย-nแฟล็กที่ทำให้ค่านั้นคั่นด้วยบรรทัดใหม่

เทคนิคการตีลูกกอล์ฟ

วิธีรับจากรุ่นที่ไม่ได้ตีกอล์ฟไปยังรุ่นที่เล่นกอล์ฟ:

  • ลบช่องว่าง
  • Yเป็นผู้ดำเนินการซึ่งหมายความว่าเราสามารถใช้มันในการแสดงออก แทนที่จะY...ทำตาม(ys)เราก็ทำได้(Y...s)เราก็สามารถทำได้
  • ปัญหาคือเราต้องดึงฟังก์ชั่นก่อนที่เราจะอ้างอิงอีกครั้งเป็นy; ดังนั้นyM(Y_Xa-2WR'#s)จะไม่ทำงาน วิธีแก้ปัญหา: สลับโอเปอแรนด์ของMโอเปอเรเตอร์ ap ตราบใดที่หนึ่งในนั้นเป็นฟังก์ชั่นและอีกอันหนึ่งเป็นประเภทที่ทำซ้ำได้มันไม่สำคัญว่าจะมีคำสั่งใดเข้ามา

0

แร็กเก็ต 113 ไบต์

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

การทดสอบ:

(f 5)

เอาท์พุท:

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

0

SpecBAS - 57 ไบต์

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

?คือชวเลขPRINT, #13จะกลับรถซึ่งสามารถติดอยู่ที่ส่วนท้ายของสตริงโดยไม่จำเป็นต้อง+ร่วมกับพวกเขา

อะพอสโทรฟีเลื่อนเคอร์เซอร์พิมพ์ลงหนึ่งบรรทัด


0

ติดอยู่, 29 27 ไบต์

ค่อนข้างช้าสำหรับภาษา "กอล์ฟ" แต่ฉันลืมไปแล้วว่ามันทำงานได้มากมาย: P

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

คำอธิบาย:

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 ไบต์

แข็งแรงเล่นกอล์ฟ:

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: การเพิ่มประสิทธิภาพช่วงลูป


0

Lithp , 117 ไบต์

แบ่งบรรทัดเป็นสองส่วนเพื่อให้สามารถอ่านได้:

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

ตัวอย่างการใช้งาน:

% 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
##########
#        #
#        #
#        #
#        #
#        #
#        #
#        #
#        #
##########
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.