การสร้างสแควร์ไขว้


23

การสร้างสแควร์ไขว้

คุณจะต้องใส่จำนวนเต็มหนึ่งหรือมากกว่าและส่งออกสี่เหลี่ยมที่ทำจากตัวอักษรที่พิมพ์ได้ที่คุณเลือกด้วยการข้ามเส้นทแยงมุมผ่านศูนย์

แนวคิดทั่วไปสำหรับการส่งออกเป็นสี่เหลี่ยมกลวงที่มีเส้นทแยงมุมทะลุผ่านมัน:

Input: 7
Output:
*******
*#   #*
* # # *
*  #  *
* # # *
*#   #*
*******

ในตัวอย่างข้างต้นเครื่องหมาย '*' แทนกล่องด้านนอกและ '#' หมายถึงเครื่องหมายกากบาทแนวทแยงมุม

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

อินพุต

จำนวนเต็ม 1 หรือมากกว่านั้นรับประกันว่าจะเป็นเลขคี่

เอาท์พุต

สี่เหลี่ยมจัตุรัสที่ประกอบขึ้นจากตัวละครที่คุณเลือกโดยมีกากบาทผ่านกลาง

  • ไม้กางเขนจะต้องเป็นเส้นทแยงมุม
  • สแควร์อาจถูกส่งออกผ่านฟังก์ชั่นหรือเขียนไปยังเอาท์พุท
  • การขึ้นบรรทัดใหม่จะไม่เป็นไร
  • สามารถส่งออกเป็นกราฟิกแผนภาพหรือภาพหากคุณต้องการเช่นกัน

ตัวอย่าง

Input: 1
Output:
*

Input: 3
Output:
***
***
***

Input: 5
Output:
*****
** **
* * *
** **
*****

Input: 7
Output:
*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

รายละเอียด

  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • คุณสามารถรับข้อมูลด้วยวิธีการที่คุณต้องการ
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • โปรแกรมจะต้องทำงานโดยไม่ต้องงบเพิ่มเติมใด ๆ เช่นusingในC#พวกเขาต้องรวมอยู่ในรายการ
  • คุณสามารถส่งออกจากฟังก์ชั่นหรือพิมพ์ผล

นี่คือรหัสกอล์ฟเพื่อให้ทางออกที่สั้นที่สุดชนะ


1
เราสามารถทำดัชนีผลลัพธ์เหล่านี้ด้วยได้0,1,2,3,...หรือไม่?
ข้อบกพร่อง

@flawr ฉันไม่แน่ใจ 100% ว่าคุณหมายถึงอะไร
TheLethalCoder

@TheLethalCoder เขาถามว่าเขาสามารถใช้การป้อนข้อมูลและพิมพ์ตารางขนาดn 2n+1
Martin Ender

@ มาร์ตินเอนเดอร์ในตัวอย่างของฉันอินพุต 1 ให้*แต่สำหรับเขามันจะเป็นอินพุต 0?
TheLethalCoder

1
@TheLethalCoder ใช่และการป้อนข้อมูลจะให้ผลผลิตตัวอย่างของคุณสำหรับ1 3
Martin Ender

คำตอบ:


9

MATL , 20 19 17 ไบต์

2-:XdtP!+~TTYa1YG

คุณสามารถทดลองใช้ได้ MATL ออนไลน์ คุณอาจต้องรีเฟรชหน้าเว็บถ้ามันไม่ทำงาน

วิ่งตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

รุ่น ASCII: 19 ไบต์

2-:XdtP!+~TTYa~42*c

ลองออนไลน์!


แต่อย่างน้อยต้องแน่ใจว่าเส้นนั้นขนานและสี่เหลี่ยม : D
ข้อบกพร่อง

@flawr หืม? คุณหมายถึงอะไร
Luis Mendo ใน

อย่างน้อยตรงกลางดูเหมือนว่าด้านข้างของสี่เหลี่ยมกำลังเอียง แต่มันเป็นเพียงภาพลวงตา หรือมันคืออะไร? (อาจเป็นหลุมดำที่อยู่ด้านหลังหน้าจอของฉันเวลาแปรปรวนเวลา)
ข้อผิดพลาด

@ flawr หรืออาจไปพบแพทย์ตา :-P
Luis Mendo

ไม่ทำงานบน MATL ออนไลน์เวอร์ชัน 19.0.0 อืม ...
Erik the Outgolfer

16

VBA Excel ขนาด 168 ไบต์

คำแนะนำ:

ฉันพบ Excel ด้วยความช่วยเหลือของ VBA เป็นเครื่องมือที่มีประสิทธิภาพและเพียงพอสำหรับความท้าทายนี้ ตั้งค่าแผ่นงานของ Excel ดังต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

ใช่เราใช้พิกเซลทรงสี่เหลี่ยมเล็ก ๆ ที่คลาสสิคเหมือนสมัยก่อนโดยใช้เซลล์ในแผ่นงานเป็นพิกเซล ฮ่า ...

ที่นี่ฉันใช้เซลล์ A1 เป็นอินพุตและฉันเปลี่ยนสีตัวอักษรเป็นสีแดง ทำไมสีแดง เพราะสีแดงเป็นสีสามตัวอักษรจึงเหมาะสำหรับการเล่นกอล์ฟ เขียนและเรียกใช้รหัสต่อไปนี้ในหน้าต่าง Immediate:

N=[A1]:Range("A1",Cells(N,N)).Interior.Color=vbRed:Range("B2",Cells(N-1,N-1)).Clear:For i=1To N:Cells(i,i).Interior.Color=vbRed:Cells(i,N+1-i).Interior.Color=vbRed:Next

Ungolfed รหัส:

Sub A()
    N = [A1]
    Range("A1", Cells(N, N)).Interior.Color = vbRed
    Range("B2", Cells(N - 1, N - 1)).Clear

    For i = 1 To N
        Cells(i, i).Interior.Color = vbRed
        Cells(i, N + 1 - i).Interior.Color = vbRed
    Next
End Sub

คำอธิบายทีละขั้นตอน:

N = [A1]: Range("A1", Cells(N, N)).Interior.Color = vbRed

ป้อนคำอธิบายรูปภาพที่นี่

Range("B2", Cells(N - 1, N - 1)).Clear

ป้อนคำอธิบายรูปภาพที่นี่

วนลูปผ่านเส้นทแยงมุมของเซลล์พิสัย: Cells(i, i).Interior.Color = vbRed

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนสุดท้ายและผลลัพธ์: Cells(i, N + 1 - i).Interior.Color = vbRed

ป้อนคำอธิบายรูปภาพที่นี่


Cells.RowHeight=48:set r=[A1]:r.Resize(r,r).Interior.Color=0:[B2].Resize(r-2,r-2).Clear:For i=1To[A1]:set r=Union(r,Cells(i,i),Cells(i,r-i+1)):Next:r.Interior.Color=0
Taylor Scott


7

Python 2, 65 ไบต์

i=n=2**input()/2
while i:print bin((n>i>1or~-n)|n|i|n/i)[2:];i/=2

ใช้ความคิดของโจนาธานอัลลันในการแสดงเลขฐานสองเช่น:

11111
11011
10101
11011
11111

แถวถูกสร้างขึ้นด้วยบิตเลขคณิตและแสดงเป็นเลขฐานสอง แต่ละส่วนมันหรือเข้าสู่ส่วนที่เหลือ ชิ้นส่วนผลิตโดยพลังของ 2 n(คงที่) และi(ลดลง) ผ่าน

  1. ด้านซ้าย 1
  2. ด้านขวา n
  3. เส้นทแยงมุมiและn/i
  4. ด้านบนและล่างโดยn-1เมื่อหรือi==1i==n

ที่จริงแล้ว (1) และ (4) จะรวมกันโดยการผลิต1เมื่อใด1<i<nและn-1อื่น ๆ


7

Python, 114 110 96 90 ไบต์

การเปลี่ยนแปลงทั้งหมด:

lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)]

ส่งกลับรายการของสตริงอักขระที่ใช้และ10
-6 ไบต์ขอบคุณ TheBikingViking

ทดสอบที่ideone


Python 2 ก่อนหน้านี้ 110

def f(n):g=range(n);n-=1;print'\n'.join(''.join((c in(r,n-r,0,n)or r in(0,n))and'#'or' 'for c in g)for r in g)

ทดสอบบนideone


บันทึก 6 lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)]ไบต์โดยการแปลงแลมบ์ดาและการปรับโครงสร้างหนี้และหรือการแสดงออก:
TheBikingViking

@ TheBikingViking อาคุณพูดถูก - ฉันควรจะลงเล่นกอล์ฟนิดหน่อย (เจตนาดั้งเดิมของฉัน) ก่อนที่จะนำความคิดออกมาและนอนหลับ: p
โจนาธานอัลลัน

7

Java 7, 131 130 128 125 124 122 ไบต์

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

บันทึก 3 ไบต์ด้วย@LeakyNun ;
บันทึก 1 ไบต์ขอบคุณ@ OliverGrégoireในคำตอบของฉันสำหรับการวาดสี่เหลี่ยมกลวงของ # ด้วยการท้าทายความกว้างที่กำหนด
บันทึก 2 ไบต์ด้วย@cliffroot @cliffroot

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static String c(int n){
    String r = "";
    for(int i = n, j; n-- > 0; r += "\n"){
      for(j = 0; j < n;
            r += i < 1      // Responsible for the first horizontal line
               | j < 1      // Responsible for the first vertical line
               | n-i < 2    // Responsible for the last horizontal line
               | n-j < 2    // Responsible for the last vertical line
               | i == j     // Responsible for the top-left to bottom-right diagonal line
               | i == n-++j // Responsible for the top-right to bottom-left diagonal line (and increasing j)
             ? "*"
             : " ");
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(3));
    System.out.println(c(5));
    System.out.println(c(7));
  }
}

เอาท์พุท:

*

***
***
***

*****
** **
* * *
** **
*****

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

1
String c(int n){String r="";for(int i=-1,j;++i<n;r+="\n")for(j=0;j<n;r+=i<1|j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ")return r;}บันทึก 4 ไบต์
Leun Nun

@LeakyNun 3 จริง ๆ คุณยังต้องการ;เบื้องหลังด้านในสำหรับลูป
Kevin Cruijssen

1
ครั้งแรกฉันเชื่อว่ามันควรจะi-->0เป็นมากกว่าn-->0และคุณยังสามารถใช้i*j<1แทนi<1|j<1 2 ไบต์
cliffroot

@cliffroot แน่นอนคุณต้องหาอะไรซักอย่าง เฮ้ jk ขอบคุณมาก! ;) ฉันจำได้ว่าฉันเคยทำอะไรแบบนั้นมาก่อนในคำตอบอื่นแย่มากฉันลืมที่จะทำที่นี่ .. : S
Kevin Cruijssen

6

Matlab, 68 66 64 58 ไบต์

เนื่องจากเอาต์พุตกราฟิกอนุญาตเช่นกัน:

k=input('');[x,y]=ndgrid(abs(-k:k));spy(~(max(x,y)<k&x-y))

ซึ่งผลเช่น

enter image description here

รุ่น ASCII เท่านั้นจะเป็น:

นี่คือการใช้การจัดทำดัชนี 0,1,2,3,...

k=input('');[x,y]=ndgrid(abs(-k:k));[(max(x,y)==k|~(x-y))*42,'']

อีกทางหนึ่งด้วยการจัดทำดัชนี1,3,7,...:

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']

ดีมากไม่เพียง แต่เอาต์พุตกราฟิกจะดูดีขึ้นเท่านี้มันก็เจ๋งที่มันสั้นกว่าเช่นกัน โดยปกติแล้วการสร้างกราฟิกให้มากกว่า ASCII ธรรมดาจะเพิ่มจำนวนไบต์เท่านั้น (โดยมาก)
Kevin Cruijssen

6

C #, 112 101 ไบต์

ขอบคุณ TheLethalCoder ที่เตือนฉันว่าสิ่งที่แลมบ์ดาหรือนิพจน์นิพจน์ที่ไม่ระบุชื่อเหล่านี้ได้รับอนุญาตใน C #

n=>{var r="";for(int y=n--,x;y-->0;r+="*\n")for(x=0;x<n;r+=y%n*x<1|y==x|y==n-x++?"*":" ");return r;};

ใครบอกว่า C # ไม่ใช่ภาษากอล์ฟที่สนุก?


ฉันรู้ใช่มั้ย 27591 ไบต์: p
Jonathan Allan

5

โลโก้ 155 ไบต์

วิธีการแก้ปัญหากราฟิกดำเนินการเป็นฟังก์ชั่น

ฉันปรับคำตอบของฉันสำหรับTriangle Triangleและเปลี่ยนมุมรอบเล็กน้อย เหมือนเมื่อก่อนrวาดเส้นของอักขระ คราวนี้bฟังก์ชั่นดึงกล่องโดยการวาดเส้นตรงหนึ่งเส้นและเส้นทแยงมุมหนึ่งเส้นหมุนและทำซ้ำสี่ครั้ง สิ่งนี้ทำให้เส้นทแยงมุมถูกวาดสองครั้ง (อยู่ด้านบนของกันและกัน) แต่มันเป็นรหัสน้อยกว่าการจัดการแยกต่างหาก คำตอบนี้ยังจัดการหมายเลขได้อย่างถูกต้อง ฉันต้องเพิ่มการจัดการพิเศษสำหรับอินพุตของ1เพื่อป้องกันไม่ให้ไปข้างหน้า

ฉันใช้มันเป็นฟังก์ชั่นbซึ่งใช้ขนาดเป็นอาร์กิวเมนต์:

pu
to r:n:b:l repeat:n[rt:b label "A lt:b if repcount>1[fd:l]] end
to b:s
repeat 4[rt 90
r:s 90-heading 20 rt 135
r:s 90-heading 20*sqrt 2 rt 45]
end

ลองมันออกมาบนCalormen.com ของล่ามโลโก้ หากต้องการเรียกใช้ให้ต่อสายและโทรbในรูปแบบต่อไปนี้:

b 7

Sample of size 7

... หรือลองแผ่นตัวอย่างซึ่งดึงสี่ตัวอย่างในขนาด 5, 7, 9 และ 11 หมุน 90 องศาระหว่าง:

repeat 4[
  b repcount*2+3
  rt 90
]

Sample of multiple sizes


4

R, 102 ไบต์

    n=scan();for(i in 1:n){for(j in 1:n){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(1,i,n))z="*";cat(z)};cat("\n")}

โปรดทราบว่าการแสดงเงื่อนไขโดยใช้% ใน% มากกว่า i == 1 | j == 1 | ...


มีความเป็นไปได้ที่จะตีตัวละครตัวเดียวหากอินพุตมีการรับประกันมากกว่าหนึ่งตัว: n=scan();for(i in n:1){for(j in n:2){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(i,n))z="*";cat(z)};cat("*\n")}
JDL


4

Haskell, 102 100 96 91 87 ไบต์

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|elem y[1,s,x]||elem x[1,s,s-y+1]='*'|1>0=' '
  • บันทึก 2 ไบต์ต้องขอบคุณข้อบกพร่อง flawr
  • บันทึกอีก 4 ไบต์โดยใช้รายการความเข้าใจ
  • บันทึก 5 ไบต์รวมข้อบกพร่องกับการปรับปรุงด้วยany
  • บันทึก 4 ไบต์โดยแทนที่anyด้วยelem

เวอร์ชันที่ไม่ถูกปรับแต่ง:

cross :: Int -> String
cross s = unlines $ map line [1..s]
    where line y = map (pos y) [1..s]
          pos y x | x == y = '*'
                  | x == s - y + 1 = '*'
                  | y `elem` [1, s] = '*'
                  | x `elem` [1, s] = '*'
                  | otherwise = ' '

ฉันแน่ใจว่าสิ่งนี้ยังคงได้รับการปรับปรุง แต่นี่คือสิ่งที่ฉันคิดไว้ตอนนี้

เวอร์ชั่นเก่า:

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|any(==y)[1,s,x]||any(==x)[1,s,s-y+1]='*'|1>0=' '

2
คุณใช้[1..s]สองครั้งฉันคิดว่าคุณสามารถกำหนดสิ่งwhereต่อไปนี้ได้
ข้อบกพร่อง

ก็จะส่งผลให้ 102 ไบต์เช่นกันเนื่องจากเราจะต้องเพิ่มพื้นที่พิเศษก่อนที่คำหลักที่ไหน c s=unlines$(\m->(m#)<$>z)<$>z where z=[1..s];m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
sudee

1
อ่าใช่ แต่คุณสามารถบรรจุ<$>[1..s]ลงในฟังก์ชั่นใช่มั้ย ชอบc s=unlines$f(\m->f(m#))where m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' ';f=(<$>[1..s])
flawr

จุดดีที่ใช้งานได้จริง :)
sudee

1
PS:c s=unlines$f$f.(#)where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
ข้อบกพร่อง

3

Java, 130 ไบต์

s->{for(int i=0;i<s;i++)for(int j=0;j<s;j++)System.out.print((s-1-i==j||i==j||i==0||j==0||i==s-1||j==s-1)?j==s-1?"*\n":"*":" ");};

โปรแกรมทดสอบ

Consumer<Integer> consumer = s -> {
        for (int i = 0; i < s; i++) {
            for (int j = 0; j < s; j++) {
                System.out.print((s - 1 - i == j || i == j || i == 0 || j == 0 || i == s - 1 || j == s - 1) ? j == s - 1 ? "*\n" : "*" : " ");
            }
        }
    };

    consumer.accept(20);

+1! ฉันจะระบุว่าเป็น Java 8, btw นอกจากนี้คุณยังสามารถตีกอล์ฟได้โดยการลบออกint ก่อนjและใช้int i=0,j;แทน คุณยังสามารถแทนที่ทั้งหมด||ด้วย|และลบวงเล็บใน ternary-check นอกจากนี้คุณใช้s-1สี่ครั้งดังนั้นฉันจะใส่มันลงในตัวแปร นอกจากนี้คุณยังสามารถเปลี่ยนไป==0 <1ดังนั้นโดยรวมจะกลายเป็นs->{for(int i=0,j,x=s-1;i<s;i++)for(j=0;j<s;j++)System.out.print(x-i==j|i==j|i<1|j<1|i==x|j==x?j==x?"*\n":"*":" ");}( 116 ไบต์ ) ค่อนข้างสั้นกว่าคำตอบ Java 7 ของฉันเล็กน้อยวิธีการที่ดีมาก!
Kevin Cruijssen

1
@KevinCruijssen ฉันมักจะจบลงด้วยคำตอบที่สั้นกว่า แต่มีพื้นที่สำหรับการปรับปรุงมากกว่าคุณ LMAO เพื่อนของฉันเล่นกอล์ฟได้ดี
Shaun Wild

ฮิฮิ. xD รู้สึกอิสระที่จะใช้ 116 ไบต์รุ่น btw มันเป็นรหัสของคุณเพิ่งจะตีกอล์ฟเพิ่มขึ้น ;) Java 7 คำตอบของฉัน (ซึ่งน่าเสียดายอีกต่อไป) ใช้วิธีการที่แตกต่างกันเล็กน้อย ถ้าฉันจะแก้ไขมันเป็นรุ่น 116 ไบต์ฉันจะขโมยคำตอบของคุณซึ่งฉันไม่ต้องการ
Kevin Cruijssen

ไม่มีจุดคัดลอกและวางกอล์ฟของคุณโดยปกติฉันโพสต์ล้อเลียนอย่างรวดเร็วแล้วกลับมาที่มันอีกครั้งในภายหลังเพื่อดูว่าฉันพลาดอะไรที่สามารถเล่นกอล์ฟได้หรือไม่ แต่คุณทำลายมันสำหรับฉัน :( haha ​​jk
Shaun Wild

ขอโทษด้วย ส่วนใหญ่ของเคล็ดลับผมให้เป็นจริงในปัจจุบันเคล็ดลับสำหรับการเล่นกอล์ฟในชวา ฉันเดาว่าฉันแค่ 2quick4u ;)
Kevin Cruijssen

3

C, 140 121 114 114 ไบต์

19 ไบต์ขอบคุณ Quentin

บันทึก 7 ไบต์โดยการเปลี่ยนจากการวนซ้ำสองครั้งเป็นการวนซ้ำหนึ่งครั้ง

main(a){scanf("%d",&a);for(int i=0;i<a*a;i++,i%a||puts(""))putchar(i/a&&i/a^a-1&&i%a&&-~i%a&&i%-~a&&i%~-a?32:42);}

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ


ฉันไม่เคยเขียนโปรแกรมใน C แต่ไม่สามารถวาง int ไว้ใน for-loop แรกใน Java ได้หรือไม่ คือint i,j;for(i=0;ไปfor(int i=0,j;
เควิน Cruijssen

1
ครั้งสุดท้ายที่ฉันใช้ C คุณไม่สามารถใส่ได้int i,j;หลังจากscanf!
Neil

ลองn+~i-jฯลฯ
Neil

GCC เป็นเรื่องปกติด้วยการลบ#includeอย่างสมบูรณ์
เควนติน

@Neil คุณหมายถึงอะไรหลังจากนั้นคุณไม่สามารถพูดได้
Leun Nun

3

PowerShell (133)

filter s($x){1..$x|%{$o="";$r=$_;1..$x|%{if($_-eq1-or$r-eq1-or$_-eq$x-or$r-eq$x-or$r-eq$_-or$r-1-eq$x-$_){$o+="*"}else{$o+="_"}};$o}}

Clunky แต่มันใช้งานได้ดีพอ

s(11)
***********
**_______**
*_*_____*_*
*__*___*__*
*___*_*___*
*____*____*
*___*_*___*
*__*___*__*
*_*_____*_*
**_______**
***********

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟแน่นอนว่ามันนานเกินไปที่ฉันจะใช้ PowerShell


3

ไซโลขนาด 212 ไบต์

readIO 
a = i
lbla
a - 1
t = a
t + 1
t % i
t * a
b = i
lblb
b - 1
u = b
u + 1
u % i
u * b
u * t
v = a
v - b
u * v
v = a
v + b
v + 1
v % i
u * v
u |
if u c
print #
GOTO d
lblc
print .
lbld
if b b
printLine 
if a a

ลองออนไลน์!


:) ขอบคุณที่ให้ความสนใจกับภาษานี้มากขึ้น
Rohan Jhunjhunwala

1
@RohanJhunjhunwala ฉันสนุกกับการเขียนโปรแกรมในนั้นขอบคุณสำหรับการสร้างภาษาที่ยอดเยี่ยม
Leun Nun

3

GNU sed, 117 114 + 1 (แฟล็ก r) = 115 ไบต์

p;/^0$/Q;/^000$/{p;q}
h;s/./ /3g;s/  $/00/
:f;/ 00 /!{G;h;s/\n.*//p;t;:}
s/^(0 *)0  ?( *)0/\1 0\20 /
tf;s/00/0/p;g

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

วิ่ง:

sed -rf crossed_square.sed <<< "00000"

เอาท์พุท:

00000
00 00
0 0 0
00 00
00000

3

Python ขนาด 89 ไบต์

นี่คือการย้อนกลับ! ฉันใช้โมดูลเต่าของงูหลาม

from turtle import*
n=input()
for i in[(n,n),(n,0),(0,n),(0,0),(n,0),(0,n),(n,n)]:goto(i)

นี่คือผลลัพธ์เมื่อ n = 200:

enter image description here


1
+1 สำหรับความคิดสร้างสรรค์
mbx

2

สกาลา, 141 137 ไบต์

val s=args(0).toInt-1;val t=0 to s;print(t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString)

วิ่ง:

$ scala cross.scala 10

ในทางเทคนิคแล้วฉันสามารถลบสิ่งที่พิมพ์ออกมาและไปที่สิ่งที่ชอบ

def c(n:Int)={val (s,t)=(n-1,0 to n-1);t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString}

สิ่งนี้จะทำให้ 135 หรือ 121 ไบต์ขึ้นอยู่กับว่าคุณนับสิ่งที่ฟังก์ชั่นไวยากรณ์

รุ่นที่อ่านได้:

def cross(n: Int) = {
   // Declares both s and t as variables with tuple expansion
   // s is the zero-based size and t is a range from 0 to s
   val (s,t) = (n-1, 0 to n-1)

   // Maps all rows by mapping the columns to a star or a space
   t.map { x =>
      t.map { y =>
        if (x == 0 || x == s || y == 0 || y == s || x == y || x == s-y) "*" 
        else " "
      }.mkString+"\n" // Concatenate the stars and spaces and add a newline
   }.mkString         // Concatenate the created strings
 }


2

Python 2, 83 ไบต์

i=n=input()
while i:l=['* '[1<i<n]]*n;i-=1;l[0]=l[~0]=l[i]=l[~i]='*';print`l`[2::5]

แก้ไขรายการอักขระของแถวเพื่อใส่*ลงในตำแหน่งแรก, สุดท้าย, i'th และ i'th-to-last แถวแรกและแถวสุดท้ายเริ่มต้นเป็นทั้งหมด*และส่วนที่เหลือเป็นช่องว่างทั้งหมด ใช้งานได้แม้เช่นกัน lambdaแสดงออกอาจจะสั้นกว่าการปรับเปลี่ยน แต่ผมชอบวิธีการนี้



2

Mathematica, 81 ไบต์

""<>#&/@Table[If[i^2==j^2||i^2==#^2||j^2==#^2,"*"," "],{i,-#,#},{j,-#,#}]&[(#-1)/2]&

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


2

Javascript ( 289 270 ไบต์)

function s(a){b=[];for(i=0;i<a;i++)if(b.push([]),0==i||i==a-1)for(j=0;j<a;j++)b[i].push("*");else for(j=0;j<a;j++)0==j||j==a-1?b[i].push("*"):j==i||a-1-j==i?b[i].push("*"):b[i].push(" ");c="";for(i=0;i<b.length;i++){for(j=0;j<b[i].length;j++)c+=b[i][j];c+="\n"}return c}

Ungolfed:

function square(size){
str=[];

for(i=0;i<size;i++){
    str.push([]);
    if(i==0||i==size-1){
        for(j=0;j<size;j++){
            str[i].push("*");
        }
    }else{
        for(j=0;j<size;j++){
            if(j==0||j==size-1){
                str[i].push("*");
            }else if(j==i||size-1-j==i){
                str[i].push("*");
            }else{
                str[i].push(" ");
            }
        }
    }
}

out="";
for(i=0;i<str.length;i++){
    for(j=0;j<str[i].length;j++){
        out+=str[i][j];
    }
    out+="\n";
}
return out;
}

แก้ไข: บันทึกแล้ว 19 ไบต์ขอบคุณ Philipp Flenker


เนื่องจากการขึ้นบรรทัดใหม่นั้นไม่เป็นไรฉันคิดว่าคุณไม่จำเป็นต้องตรวจสอบsize==1
Philipp Flenker

1
@PhilippFlenker ถูกต้อง
Paul Schmitz

1

Perl, 83 +1 = 84 ไบต์

วิ่งด้วย-nธง

$\="*
*";print$c="*"x($_+1);for$b(1..$_){@a=($")x$_;@a[$b-1,-$b]=(a,a);print@a}say$c

ขึ้นบรรทัดใหม่ตัวอักษรจะช่วยประหยัด 1 ไบต์\nหรือ$/หรือ

อ่านได้:

$\="*\n*";
print$c="*"x($_+1);
for$b(1..$_){
    @a=($")x$_;
    @a[$b-1,-$b]=(a,a);
    print@a
}
say$c

รหัสจะพิมพ์บรรทัดบนสุดและบันทึกไว้$cจากนั้นพิมพ์ช่องว่างจำนวนมากด้วยช่องที่เหมาะสมแทนที่ด้วยa s จากนั้นพิมพ์บรรทัดบนสุดอีกครั้ง

การมอบหมายให้กับ$\ตัวแปรบอกล่ามในการพิมพ์เนื้อหา (เครื่องหมายดอกจันขึ้นบรรทัดใหม่และดอกจันอื่น) ทุกครั้งหลังแต่ตอนนี้ไม่ได้เกิดขึ้นหลังจากที่printsay


1

SmileBASIC ขนาด 46 ไบต์

INPUT I
GBOX I,I,1,1GLINE 1,I,I,1GLINE 1,1,I,I

(ไม่, SB ไม่ได้ใช้กราฟิกที่มีดัชนี 1 ... )


1

Charcoal, 8 bytes (ไม่ใช่การแข่งขัน; ความท้าทายทางภาษา postdates)

GH+↘↑↙N*

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน คำอธิบาย: เมื่อใช้เป็นพารามิเตอร์ในPolygonHollowคำสั่งให้+วาดกล่องและลูกศรจากนั้นสร้างเส้นทแยงมุม มีอักขระทางลัดอื่น ๆ แต่พวกเขาจะต้องกำหนดใหม่เพื่อเป็นประโยชน์เช่นYเทียบเท่ากับ↖↗↓แต่ถ้ามันเป็น eqivalent ↗↓↖แล้วY+จะพอเพียง


1

SHELL ( 135 ไบต์ ):

 C(){ j=$(($1-1));for i in $(seq 0 $j);do dc<<<2o10i`echo $((1|2**$i|2**($j-$i)|2**$j|(($i==0||$i==$j))*(2**$j-1)))`p;done|tr 01 ' X';}

การทดสอบ:

 C 1
 X

 C 3
 XXX
 XXX
 XXX

 C 5
 XXXXX
 XX XX
 X X X
 XX XX
 XXXXX

 C 7
 XXXXXXX
 XX   XX
 X X X X
 X  X  X
 X X X X
 XX   XX
 XXXXXXX

 C 9
 XXXXXXXXX
 XX     XX
 X X   X X
 X  X X  X
 X   X   X
 X  X X  X
 X X   X X
 XX     XX
 XXXXXXXXX

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