Tworzenie skrzyżowanego kwadratu

23

Tworzenie skrzyżowanego kwadratu

Musisz wprowadzić liczbę całkowitą jednego lub więcej i wyprowadzić kwadrat wykonany z dowolnego wybranego przez Ciebie znaku do wydrukowania z ukośnym krzyżem przez środek.

Ogólną ideą jest, aby wyjście było pustym kwadratem, który ma przekątną:

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

W powyższym przykładzie „*” oznaczają zewnętrzną ramkę, a „#” oznaczają przekątny krzyż.

Zauważ, że powyższy przykład używa dwóch różnych znaków, aby łatwiej było zobaczyć, jak wygląda wynik, twój program powinien używać tylko jednego znaku.

Wkład

Liczba całkowita równa 1 lub więcej, na pewno jest nieparzysta.

Wydajność

Kwadrat, na który składa się wybrana postać, z krzyżem pośrodku.

  • Krzyż musi być ukośny
  • Kwadrat może być wyprowadzany za pomocą funkcji lub zapisywany w wyniku
  • Końcowe znaki nowej linii są w porządku
  • Może również wyświetlać jako grafikę, diagram lub obraz

Przykłady

Input: 1
Output:
*

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

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

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

Okular

  • Funkcje lub pełne programy są dozwolone
  • Możesz uzyskać wkład w preferowany sposób
  • Standardowe luki są niedozwolone
  • Programy muszą działać bez żadnych dodatkowych instrukcji, tj. usingW C#, muszą być zawarte we wpisie
  • Możesz wyprowadzić dane z funkcji lub wydrukować wynik

To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie.

TheLethalCoder
źródło
1
Czy możemy również indeksować te wyniki 0,1,2,3,...?
flawr
@flawr Nie jestem w 100% pewien, co masz na myśli
TheLethalCoder
@TheLethalCoder Pyta, czy może wziąć dane wejściowe ni wydrukować kwadrat wielkości 2n+1.
Martin Ender,
@MartinEnder Och, więc w moich przykładach dane wejściowe 1 dają, *ale dla niego będą to dane wejściowe 0?
TheLethalCoder
1
@TheLethalCoder Tak, a dane wejściowe 1dadzą przykład 3.
Martin Ender,

Odpowiedzi:

9

MATL , 20 19 17 bajtów

2-:XdtP!+~TTYa1YG

Możesz spróbować eksperymentalnie w MATL online . Może być konieczne odświeżenie strony, jeśli nie działa.

Przykładowy przebieg:

enter image description here

Wersja ASCII: 19 bajtów

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

Wypróbuj online!

Luis Mendo
źródło
Ale przynajmniej upewnij się, że linie są równoległe i prostokątne. : D
wada
@flawr Hm? Co masz na myśli?
Luis Mendo,
Przynajmniej na środku wygląda tak, jakby boki kwadratów były nachylone, ale to tylko złudzenie. Albo to jest? (Może być również czarną dziurą za moim ekranem, wypaczającą czasoprzestrzeń.)
flawr
@flawr A może pójść do okulisty :-P
Luis Mendo
Nie działa w trybie MATL online, wersja 19.0.0. Hmmm ...
Erik the Outgolfer
16

VBA Excel, 168 bajtów

Instrukcja:

Uważam, że Excel za pomocą VBA jest skutecznym i wystarczającym narzędziem do tego wyzwania. Ustaw arkusz roboczy programu Excel w następujący sposób

enter image description here

Tak, używamy małych, klasycznych kwadratowych pikseli jak za dawnych czasów, używając komórek w arkuszu jako pikseli. Ha ha...

Tutaj używam komórki A1 jako danych wejściowych i zmieniam kolor czcionki na czerwony. Dlaczego czerwony Ponieważ czerwony ma trzyliterowy kolor, więc pasuje do gry w golfa. Napisz i uruchom następujący kod w oknie natychmiastowym:

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

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

Objaśnienie krok po kroku:

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

enter image description here

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

enter image description here

Pętla po przekątnej komórek zakresu: Cells(i, i).Interior.Color = vbRed

enter image description here

Ostatni krok i wynik: Cells(i, N + 1 - i).Interior.Color = vbRed

enter image description here

Anastasiya-Romanova 秀
źródło
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
8

JavaScript (ES6), 96 bajtów

f=
n=>[...Array(n--)].map((_,i,a)=>a.map((_,j)=>i&&j&&n-i&&n-j&&i-j&&n-i-j?' ':'*').join``).join`
`
;
<input type=number min=1 step=2 oninput=  o.textContent=f(this.value)><pre id=o>

Neil
źródło
7

Python 2, 65 bajtów

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

Wykorzystuje pomysł Jonathana Allana wyprowadzania liczb binarnych, takich jak:

11111
11011
10101
11011
11111

Wiersze są tworzone za pomocą arytmetyki bitów i wyświetlane w postaci binarnej. Każda część to lub reszta. Części są wytwarzane przez moce 2 n(ustalone) i i(spadające) przez

  1. Lewa strona 1
  2. Prawa strona n
  3. Przekątne iin/i
  4. Góra i dół według n-1terminu i==1lub i==n.

W rzeczywistości, (1) i (4) są łączone przez wytwarzanie, 1kiedy 1<i<ni n-1inaczej.

xnor
źródło
7

Python, 114 110 96 90 bajtów

Całkowicie zmieniony:

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

Zwraca listę ciągów znaków, znaków używających 1i 0.
-6 bajtów dzięki TheBikingViking

Przetestuj to w ideone


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

Przetestuj na ideonie

Jonathan Allan
źródło
Zaoszczędzić 6 bajtów przez przekształcenie lambda i restrukturyzacji i albo wzoru: 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 Ach, masz rację - naprawdę powinienem był zagrać w golfa, aby trochę się zakręcić (mój pierwotny zamiar), zanim przedstawię ten pomysł i przespać: str.
Jonathan Allan
7

Java 7, 131 130 128 125 124 122 bajtów

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 bajty zapisane dzięki @LeakyNun ;
1 bajt zapisany dzięki @ OliverGrégoire w mojej odpowiedzi na losowanie pustego kwadratu # przy danym wyzwaniu szerokości ;
2 bajty zapisane dzięki @cliffroot .

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

*

***
***
***

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

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******
Kevin Cruijssen
źródło
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;}Zapisano 4 bajty
Leaky Nun
@LeakyNun 3 faktycznie. Nadal potrzebujesz ;wewnętrznej pętli for.
Kevin Cruijssen
1
po pierwsze, uważam, że tak powinno być, i-->0a zamiast 2 bajtów n-->0można również użyći*j<1i<1|j<1
cliffroot
@cliffroot Oczywiście pan miał coś znaleźć. Hehe, jk, dzięki! ;) Pamiętam, że zrobiłem już coś takiego w innej odpowiedzi, więc całkiem źle, że zapomniałem to zrobić tutaj: S
Kevin Cruijssen
6

Matlab, 68 66 64 58 bajtów

Ponieważ dozwolone są również dane graficzne:

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

Które wyjścia np

enter image description here

Wersje tylko ascii to:

To używa indeksowania 0,1,2,3,...

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

Alternatywnie z indeksowaniem 1,3,7,...:

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']
wada
źródło
Fajnie, wyjście graficzne nie tylko wygląda lepiej imo, ale fajnie, że jest również krótsze pod względem bajtów. Zwykle zrobienie czegoś bardziej graficznego zamiast zwykłego ASCII zwiększyłoby tylko liczbę bajtów (zwykle o wiele).
Kevin Cruijssen
6

C #, 112 101 bajtów

Dzięki TheLethalCoder za przypomnienie mi, że te anonimowe wyrażenia ani wyrażenie lambda są dozwolone w języku 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;};

Kto powiedział, że C # nie jest fajnym językiem golfa?

Scepheo
źródło
Wiem, prawda? 27591 bajtów: p
Jonathan Allan
5

Logo, 155 bajtów

Rozwiązanie graficzne, zaimplementowane jako funkcja

Zmodyfikowałem swoją odpowiedź dla Alphabet Triangle i nieco zmieniłem kąty. Tak jak poprzednio, rrysuje linię znaków. Tym razem bfunkcja rysuje ramkę, rysując jedną prostą krawędź i jedną ukośną, obracając i powtarzając cztery razy. Powoduje to, że przekątne są rysowane dwa razy (jeden na drugim), ale było mniej kodu niż osobne obchodzenie się z nim. Ta odpowiedź również poprawnie obsługuje liczby parzyste. Musiałem dodać specjalną obsługę dla danych wejściowych, 1aby zapobiec dalszemu rozwojowi.

Zaimplementowałem go jako funkcję, bktóra przyjmuje wielkość jako argument:

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

Wypróbuj to na interpreterze logo Calormen.com . Aby go wywołać, dodaj linię i zadzwoń bw następującym formacie:

b 7

Sample of size 7

... lub wypróbuj talerz samplera, który pobiera cztery próbki w rozmiarach 5, 7, 9 i 11, obracając się o 90 stopni pomiędzy:

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

Sample of multiple sizes

GuitarPicker
źródło
4

R, 102 bajty

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

Zauważ, że bardziej wydajne jest wyrażenie warunku przy użyciu% w% niż i == 1 | j == 1 | ...

JDL
źródło
Możliwe jest 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")}
zagranie
94 bajty
Giuseppe,
4

Haskell, 102 100 96 91 87 bajtów

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=' '
  • Oszczędność 2 bajtów dzięki flawr .
  • Zaoszczędzono jeszcze 4 bajty, używając wyrażeń listowych.
  • 5 bajtów zaoszczędzonych łącząc ulepszenie flawr zany
  • 4 bajty zapisane zastępując anyzelem

Wersja bez golfa:

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

Jestem pewien, że można to jeszcze poprawić, ale na to właśnie wpadłem.

Stara wersja:

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=' '
sudee
źródło
2
Używasz [1..s]dwa razy, myślę, że możesz to zdefiniować where.
flawr
Spowodowałoby to również 102 bajty, ponieważ musielibyśmy dodać dodatkową spację przed słowem kluczowym where. 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
Ach tak, ale możesz spakować <$>[1..s]do funkcji, prawda? Likec 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
Dobrze, że to naprawdę działa. :)
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=' '
flawr
3

Java, 130 bajtów

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":"*":" ");};

Program testowy

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);
Shaun Wild
źródło
+1! Podałbym, że jest to Java 8, btw. Możesz też trochę zagrać w golfa, usuwając int przedtem ji int i=0,j;zamiast tego użyj . Można też wymienić wszystkie ||z |i usuń nawiasy w potrójnym-check. Używasz także s-1cztery razy, więc umieściłbym to w zmiennej. Można także zmienić ==0się <1. Więc w sumie staje się 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 bajtów ) Dość trochę krótszy niż moja odpowiedź Java 7 , więc fajne podejście!
Kevin Cruijssen
1
@KevinCruijssen Zawsze kończę na krótszej odpowiedzi, ale mam więcej miejsca na ulepszenia niż ty LMAO. Dobrze grał mój przyjaciel.
Shaun Wild,
Hehe xD Możesz użyć 116-bajtowej wersji btw. To twój kod, po prostu grałem w golfa. ;) Moja odpowiedź na Javę 7 (która jest niestety dłuższa) używa nieco innego podejścia. Gdybym go edytował do wersji 116-bajtowej, po prostu ukradłbym twoją odpowiedź, czego nie chcę.
Kevin Cruijssen
Nie ma sensu po prostu kopiować i wklejać twoich golfów, zwykle wysyłam szybką makietę, a następnie wracam do niej później, aby sprawdzić, czy coś przegapiłem. Ale ZRININOWAŁEŚ TO DLA MNIE :( haha ​​jk
Shaun Wild,
O przepraszam. Większość podanych przeze mnie wskazówek znajduje się w Poradach dotyczących gry w golfa w Javie . Chyba jestem tylko 2quick4u. ;)
Kevin Cruijssen
3

C, 140 121 114 bajtów

19 bajtów dzięki Quentin.

7 bajtów zapisanych przez przejście z podwójnie zagnieżdżonej pętli do jednej pętli.

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

Sugestie dotyczące gry w golfa mile widziane.

Leaky Nun
źródło
Nigdy nie programuję w C, ale czy nie jest możliwe umieszczenie int w pierwszej pętli for, jak w Javie? Czyli int i,j;for(i=0;dofor(int i=0,j;
Kevin Cruijssen
1
Ostatni raz użyłem C nie można nawet umieścić int i,j;po scanf!
Neil,
Spróbuj n+~i-jitd.
Neil,
GCC jest w porządku z #includecałkowitym usunięciem .
Quentin,
@Neil Co masz na myśli mówiąc, że nie możesz tego po tym wyrazić?
Leaky 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, ale działa wystarczająco dobrze.

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

Sugestie dotyczące gry w golfa są mile widziane, minęło już dużo czasu, odkąd mam PowerShell'd.

fuandon
źródło
3

SILOS , 212 bajtów

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

Wypróbuj online!

Leaky Nun
źródło
:) dzięki za zwrócenie większej uwagi na ten język
Rohan Jhunjhunwala
1
@RohanJhunjhunwala Podobało mi się programowanie w nim, dziękuję za stworzenie tak wspaniałego języka.
Leaky Nun
3

GNU sed, 117 114 + 1 (flaga r) = 115 bajtów

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

Ponieważ sed nie ma natywnego wsparcia dla liczb, dane wejściowe są podawane w formie jedności w oparciu o ten konsensus . Druga połowa kwadratu to pierwsza połowa, która była przechowywana w odwrotnej kolejności w miejscu do przechowywania.

Biegać:

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

Wydajność:

00000
00 00
0 0 0
00 00
00000
seshoumara
źródło
3

Python, 89 bajtów

To był powrót! Użyłem modułu żółwia pytona.

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

Oto wynik, gdy n = 200:

enter image description here

ren
źródło
1
+1 za kreatywność
mbx
2

Scala, 141 137 bajtów

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)

Biegać:

$ scala cross.scala 10

Technicznie rzecz biorąc, mógłbym usunąć wydruk i przejść do czegoś podobnego

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}

To sprawi, że będzie to 135 lub 121 bajtów w zależności od tego, czy policzysz składnię funkcji.

Wersja do odczytu:

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
 }
AmazingDreams
źródło
2

Python 2, 83 bajty

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

Zmienia listę znaków wiersza, tak aby umieściła a *na pierwszym, ostatnim, i-tym i i-tym do ostatniego miejsca. Pierwszy i ostatni rząd zaczynają się jak wszystkie *, a reszta jak wszystkie spacje. Działa również na równi. lambdaEkspresja prawdopodobnie mniejsza niż zmiany, ale jak to metody.

xnor
źródło
2

Mathematica, 81 bajtów

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

Tworzy układ współrzędnych z punktem początkowym w środku i oblicza, gdzie *powinien się znaleźć s. Zwraca tablicę ciągów, po jednym na wiersz.

Greg Martin
źródło
2

JavaScript ( 289 270 bajtów)

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}

Nie golfowany:

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

EDYCJA: Zaoszczędź 19 bajtów dzięki Philippowi Flenkerowi.

Paul Schmitz
źródło
Ponieważ końcowe znaki nowej linii są w porządku, myślę, że nie potrzebujesz czekusize==1
Philipp Flenker,
1
@PhilippFlenker Correct.
Paul Schmitz,
1

Perl, 83 +1 = 84 bajtów

Uruchom z -nflagą.

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

Dosłowna nowa linia oszczędza 1 bajt nad \nlub $/.

Czytelny:

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

Kod drukuje górną linię i zapisuje ją $c, następnie drukuje wiązkę spacji z odpowiednimi szczelinami zamienionymi na as, a następnie drukuje ponownie górną linię.

Przypisanie do $\zmiennej każe interpreterowi drukować zawartość (gwiazdka, nowa linia i kolejna gwiazdka) po każdym print, ale NIE następuje to po say.

Gabriel Benamy
źródło
1

SmileBASIC, 46 bajtów

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

(Nie, SB NIE używa grafiki 1-indeksowanej ...)

12Me21
źródło
1

Węgiel drzewny, 8 bajtów (niekonkurencyjny; wyzwanie dotyczące postdatacji języka)

GH+↘↑↙N*

Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Gdy zostanie użyty jako parametr PolygonHollowpolecenia, +rysuje ramkę, a następnie strzałki tworzą przekątne. Istnieje kilka innych znaków skrótu, ale oni muszą być na nowo może być przydatna np Yodpowiada ↖↗↓, ale jeśli to było eqivalent aby ↗↓↖potem Y+wystarczy.

Neil
źródło
1

SHELL ( 135 bajtów ):

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

testy:

 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
Ali ISSA
źródło
1

Kotlin , 123 116 bajtów

zmień, jeśli za pomocą \ n, aby wydrukować

{s:Int->val n=s-1
for(r in 0..n){for(c in 0..n)print(if(n-r==c||r==c||r<1||c<1||r==n||c==n)"#"
else " ")
println()}}

Wypróbuj online!

JohnWells
źródło