Büyük bir eğik çizgi çizin X


21

Negatif olmayan bir tamsayı Xverildiğinde, bu kadar büyük bir baskı yapın . Xgiriş için çıktıdır 0ve Xdaha büyük girişleri genişletmek için her yöndeki girişe eşit eğik çizgi ekleyeceksiniz .

Test Kılıfları

0

X

1

\ /
 X
/ \

2

\   /
 \ /
  X
 / \
/   \

...

10

\                   /
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \     /
        \   /
         \ /
          X
         / \
        /   \
       /     \
      /       \
     /         \
    /           \
   /             \
  /               \
 /                 \
/                   \

kurallar

Çıktısını yazdırabilir veya bir işlevden bir dize ya da dize listesi döndürebilirsiniz. Takip eden bir yeni satırın yanı sıra, etkilemeyen ekstra iç boşluk görünmesine izin verilir.

Bu , bayt cinsinden en kısa cevap!



6
... sadece kömür 1 baytlık çözümü bekleyeceğim.
Sızdıran Rahibe

@LeakyNun Kömür Xortada kolaylıkla başa çıkabiliyorsa şaşırırdım (neden eklememin bir parçası) ama kim bilir: D
Stephen


Yanıtlar:


6

Tuval , 3 bayt

╵\┼

Burada dene!

Kömür cevabının boyutunun yarısı: D

╵    increment the input
 \   create a diagonal that long
  ┼  and quad-palindromize, mirroring what's required, with 1 overlap;
     This overlaps the `/` and `\`, resulting in `X`

Dang bu kısa.
dylnan

: ||||||| Golf sahası için +1
sadece ASCII

Ayrıca yığın tabanlı dillerin temelde her zaman diğer dilleri geçip geçmediğini merak ediyorum.
sadece ASCII

@ ASCII-sadece jöle
Okx

@Okx * yığın tabanlı / tacit
yalnızca ASCII

22

Kömür , 6 bayt

PX⁺¹NX

Saçmalıkların beni durdurmuyor;)

Çevrimiçi deneyin!


2
TIO, gerçekten büyük bir sayı koyduğunuzda ilginç görünüyor
Stephen

@StephenS Sadece sarma yüzünden.
Okx,

Biliyorum, sadece sarılmışların hepsinin hizalı kalması sezgiseldir (çünkü boşluklar sarılmaz)
Stephen

5 karakter (gönderim tarihi sonlandırması) sadece Canvas'a biraz daha yaklaşmak için
ASCII-only

16

JavaScript (ES6), 79 bayt

Özyinelemeli fonksiyonu kullanır g bir ızgara üzerinden girer ve karakteri ile çıkış karakterini oluşturur.

n=>(g=x=>`/\\ X
`[~x?x-y?x+y-w&&2:x-n?1:3:4]+(~y?g(~x--?x:y--&&w):''))(y=w=n*2)

Nasıl?

Her iki değişken x ve y yineleme gelen 2n için -1 , burada n girişidir.

Izgaradaki her bir pozisyon için (x, y) , şu karakterlerden birini seçiyoruz:

  • 0: /
  • 1: \
  • 2: boşluk
  • 3: X
  • 4: newline

aşağıdaki testleri kullanarak:

  • ~x: Falsy ise x == -1 : satırın sonuna geldik.
  • x-y: Falsy if x == y : Biz anti-köşegenin üzerinde bulunuyoruz.
  • x+y-w: Eğer x + y == w olursa olsun yanlış : köşegen üzerinde duruyoruz.
  • x-n: Eğer x == n ise sahtedir : çünkü bu test sadece x == y olduğunda yapılır , bunun anlamı gridin tam merkezinde olduğumuz anlamına gelir.

ve aşağıdaki karar ağacı:

decision tree

gösteri


4
Bu ... JavaScript mi? Sana ne oldu eski dostum.
roberrrt-s

13

MATL , 16 bayt

'\/X 'iEQXytEP+)

Çevrimiçi deneyin!

2Bir örnek olarak girişi düşünün . Yığın burada baş aşağı gösterilmiştir, yani düşük elemanlar en yakın zamanda bastırılanlardır.

'\/X '  % Push this string
        %   STACK: '\/X '
iEQ     % Input a number, n. Multiply by 2, add 1: gives 2*n+1
        %   STACK: '\/X '
                   5
Xy      % Identity matrix of that size
        %   STACK: '\/X '
                   [1 0 0 0 0;
                    0 1 0 0 0;
                    0 0 1 0 0;
                    0 0 0 1 0;
                    0 0 0 0 1]
tEP     % Duplicate, multiply each entry by 2, flip vertically
        %   STACK: '\/X '
                   [1 0 0 0 0;
                    0 1 0 0 0;
                    0 0 1 0 0;
                    0 0 0 1 0;
                    0 0 0 0 1]
                   [0 0 0 0 2;
                    0 0 0 2 0;
                    0 0 2 0 0;
                    0 2 0 0 0;
                    2 0 0 0 0]
+       % Add the two matrices
        %   STACK: '\/X '
                   [1 0 0 0 2;
                    0 1 0 2 0;
                    0 0 3 0 0;
                    0 2 0 1 0;
                    2 0 0 0 1]
)       % Index into the string. Indexing is 1-based and modular, so 1 picks
        % the first character ('\'), ..., 0 picks the last (space)
        %   STACK: ['\   /';
                    ' \ / ';
                    '  X  ';
                    ' / \ ';
                    '/   \']
        % Implicit display

Octave'da benzer bir şey yapmak istedim, ama sen beni yendin ve MATL'de Octave'den bile daha kısa, çok iyi iş!
Michthan

@Michthan Teşekkürler! Bir Octave versiyonu da kesinlikle yayınlanmaya değer. Girişim 38 byte, seninki ne?
Luis Mendo

Tüm hafta sonu boyunca düşündüm ve burada kullandığınızdan daha etkili bir yol bulamadım. Bu yüzden tüm krediler size bir oktav sürümü için gitmeli.
Michthan

6

C 108 106 bayt

a;g(n){for(int b=2*n,i=1,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);}

Çevrimiçi deneyin!

(MD XF sayesinde −2 golf)

Dinamik alan genişliğinde iki karakter yazdırır (ilk önce c = 47eğik çizgi ve c + 45ters eğik çizgi; sonra değiştirilir).

Alan genişlikleri başlar 1ve 2nher yinelemede, birinci genişlik 1 artar, ikincisi 2 artar.

İkinci alan genişliği 0 olduğunda, 'X'normal karakterler yerine yeni bir satır çıkarır ve artımların yönünü ( i) tersine çevirir . Diğer tüm satırlar için ayrı olarak bir yeni satır yazdırılır ( puts("")).


106 bayt: a,b,i=1,c;g(n){for(b=2*n,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);} Çevrimiçi deneyin!
MD XF

Fikir için teşekkürler! Kodun iki kez aranabilmesini sağlamak için sadece bir kısmını kullandım.
anatolyg

5

shortC , 111 bayt

s(x){Wx--)R" ")}j;f(x){O;j<x;j++)s(j),P92),s((x-j)*2-1),R"/\n");s(x);R"X\n");Wj--)s(j),P47),s((x-j)*2-1),R"\\\n

C cevabımı temel alarak . Dönüşümler:

  • R -> printf(
  • P -> putchar(
  • W -> while(
  • O -> for(
  • Otomatik eklenen kapatma ");}

Bu aynı zamanda ASCII kodlarını kullanır \ve/ .

Çevrimiçi deneyin!



5

C, 168 155 150 bayt

-5 Computronium sayesinde

#define p printf(
s(x){while(x--)p" ");}j;f(x){for(;j<x;j++)s(j),p"\\"),s((x-j)*2-1),p"/\n");s(x);p"X\n");while(j--)s(j),p"/"),s((x-j)*2-1),p"\\\n");}

Kesinlikle golf oynayabilir; Ben yapıyorum Çevrimiçi deneyin!

Ungolfed:

int space(int x)
{
    while (x--)
        putchar(' ');
}

int f(int x)
{
    for (int j = 0; j < x; j++) {
        space(j);
        printf("\\");
        space((x-j)*2-1);
        printf("/\n");
    }

    space(x);
    puts("X");

    while (j--) {
        space(j);
        putchar('/');
        space((x-j)*2-1);
        printf("\\\n");
    }
}

2
P'yi "printf" yerine "printf (" olarak tanımlayarak 5 karakter kaybedebilirsiniz.
Computronium

3

V , 21 bayt

éXÀñ>HÄÒ r\Á/YGpr/$r\

Çevrimiçi deneyin!

HexDump:

00000000: e958 c0f1 3e48 c4d2 2072 5cc1 2f59 4770  .X..>H.. r\./YGp
00000010: 722f 2472 5c                             r/$r\

Açıklama:

éX                      " Insert an 'X'
  Àñ                    " Arg1 times:
    >H                  "   Add a space to every line.
                        "   Conveniently, this also puts us on the first line
      Ä                 "   Duplicate this line
       Ò                "   And replace the whole line with spaces
         r\             "   Replace the first char with '\'
           Á/           "   Append a '/' char
             Y          "   Yank this line
              G         "   Move to the last line
               p        "   And paste the line we yanked
                r/      "   Replace the first character with a '/'
                  $     "   Move to the end of the line
                   r\   "   And replace the last character with a '\'

Temel olarak, bir X ekleyebildik, n kez eğik çizgileri uzatın .

Fakat bu o kadar basit değil, çünkü ilk kez eğik çizgileri de eklemeliyiz. Eğer eğik çizgiler zaten orada olsaydı, eğik çizgileri şu şekilde genişletebilirdik :

>HÄX2pGÙX2p

Bu bizi 6 bayt kurtarır.


3

C #, 157 122 120 bayt

_=d=>"".PadLeft(d)
a=>{var s=_(a)+"X\n";for(int i=0;++i<=a;)s=$@"{_(a-i)}\{_(i*2-1)}/
{s+_(a-i)}/{_(i*2-1)}\
";return s;}

Ungolfed versiyonu:

 Func<int, string> _ = (d) =>"".PadLeft(d);
        Func<int, string> func = a => {

            var s = _(a) + "X\n";

            for (int i = 0; ++i <= a;) {

                s = $@"{_(a - i)}\{_(i * 2 - 1)}/
{s + _(a - i)}/{_(i * 2 - 1)}\
";

            }
            return s;
        };

1
Diğer anonim işlevi ilk dışına taşıyabilir ve daha sonra farklı şekilde ekleyebilirsiniz _=d=>new string(' ',d);(etraftaki desteklere gerek yoktur d). Kıvrımlı parantezleri for döngüsünün etrafından kaldırabilirsiniz. Herhangi bir ters eğik çizgiden kaçmanıza gerek kalmayan bir sözlü dize kullanın. Ayarladıysanız i=0, ++i<a+1kaldırabilir ve kaldırabilirsiniz i++.
TheLethalCoder

Ayrıca verbatim dizelerinde \ngerçek bir satır beslemesi eklemeniz gerekmeyecek , ancak daha sonra for döngüsünün etrafındaki parantezleri çıkarabilecek misiniz emin değilim, denemek zorundasınız.
TheLethalCoder

1
Uygulandıktan sonra TheLethalCoder tarafından ilk öneri , ayrıca yerini alabilir ++i<a+1için ++i<=a EDIT'e yapabilirsiniz ayrıca değiştirerek 4 daha bayt tasarruf Funcgelen new string(' ',d)etmek"".PadLeft(d)
auhmaan

Önerileriniz için teşekkür ederiz, @TheLethalCoder 2 işlev bildiririm, eğer bunu yapabilseydik C # golfünü kısaltır mı?
LiefdeWen

1
@StefanDelport Bir yerde bir meta tartışma var ama durduğu gibi işlev ismini gösterdiğiniz sürece yapabileceğinize inanıyorum. Bu durumda _.
TheLethalCoder

3

Mathematica, 71 bayt

(Jenny_mathy'nin 104 baytlık çözümünden kısmen ilham alındı)

""<>#&/@(#"\\"+Reverse@#"/"&@IdentityMatrix[2#+1]/.{0->" ",a_+_->"X"})&

Dizelerin bir listesini döndürür.

Açıklama: IdentityMatrix[2#+1]diyagonal boyunca 1s ve başka yerlerde 0s ile doğru boyutta bir matris yapar. Sonra, çarpma bunun tarafından "\\"ters eğik çizgi olduğunu Ters eğik çizgi ders 1 kez beri başka bir yerde diyagonal boyunca ters eğik ve 0s ile bir matris yapar (kaçan bir ters eğik çizgi) ve 0'dır ters bölü 0 kez Biz bu eklemek "/"marka kez onun tersini X şekli. Neredeyse bitti, her yerde hala 0 var ve ortada "\\" + "/". Biz yerine bu iki şeyi düzeltmek " "için 0ve "X"için a_+_(gibi iki şeyden herhangi toplamını eşleşen, _+_Mathematica kendi iyiliği için çok zeki olduğunu ve yorumlayan ve bu kadar 2 kez hariç gerektiği _). Son olarak, ""<>#&/@bunu bir dizi listesine dönüştürür.


3

Java (OpenJDK 8) , 135 bayt

i->{int k=0,j,l=2*i+1;String[]s=new String[l];for(;k<l;k++)for(s[k]="",j=0;j<l;j++)s[k]+=j==k?j==i?"X":"\\":j==l-1-k?"/":" ";return s;}

Bir dizi dizgeyi alan ve tam sayı alan ve döndüren Lambda ifadesi

Çevrimiçi deneyin!

Ungolfed:

i->{
    int k=0,j,l=2*i+1;                // Some variables to be used
    String[]s=new String[l];            // Return array (size 2*i+1)
    for(;k<l;k++)                       // For each array entry
        for(s[k]="",j=0;j<l;j++)        // Set each character to 
            s[k]+=j==k?j==i?"X":"\\"    // \ or X if it's the jth character of the jth row
                 :j==l-1-k?"/"          // / if it's the opposite char
                 :" ";                  // else blank
    return s;
}

3

T-SQL, 201 bayt

DECLARE @ INT SELECT @=a FROM t DECLARE @i INT=@
WHILE @>0BEGIN PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'SET @-=1 END
PRINT SPACE(@i)+'X'WHILE @<@i BEGIN SET @+=1 PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'END

biçimlendirilmiş:

DECLARE @ INT 
SELECT @=a FROM t 
DECLARE @i INT=@
WHILE @>0
    BEGIN
        PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'
        SET @-=1 
    END
PRINT SPACE(@i)+'X'
WHILE @<@i 
    BEGIN 
        SET @+=1 
        PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'
    END

Girdi, kurallarımıza göre , t isimli bir a sütunu aracılığıyla yapılır .


3

Yakut , 66 bayt

Özyinelemeli işlevi.

f=->x{?X[x]||"\\#{s=' '*(2*x-1)}/
#{f[x-1].gsub /^/,' '}
/#{s}\\"}

Çevrimiçi deneyin!

açıklama

f=->x{                  # Start of recursive function named `f`
      ?X[x]||           # Return 'X' if x==0, otherwise the following:
"\\#{s=' '*(2x-1)}/     #  Top edge of the cross. Save no. of spaces needed
#{f[x-1]                #  Get result of f[x-1]
        .gsub /^/,' '}  #  Regex sub to left-pad every line w/ a space
/#{s}\\"                #  Bottom edge of cross (insert saved no. of spaces)

3

Jöle , 24 17 bayt

Ḥ‘=þ`µḤ+Uị“/\x ”Y

Çevrimiçi deneyin!

Nasıl çalışır

Ḥ‘=þ`µḤ+Uị“/\x ”Y   main link, input a
Ḥ‘                  input doubled and incremented
   þ                Make a table: Apply  
  =                 "equals"/ to      
    `               each element in range(2a+1) cartesian multiplied with itself.
                      eg. For input 1: [1=1,1=2,1=3],[2=1,2=2,2=3],[3=1,3=2,3=3]      
     µ              on this array:
       +            add: 
      Ḥ             double of it to
        U           its reverse (changes south-east to north-west)
         ị“/\x ”    index into the string "/\x " to get the right characters
                Y   join by newlines for the final output.

@LeakyNun ve ek bir iyileştirme ile -1 bayt sayesinde -6 bayt



2

Toplu iş, 201 bayt

@echo off
set s= /
for /l %%i in (2,1,%1)do call set s=  %%s%%
set s=\%s%
for /l %%i in (-%1,1,%1)do call:c
exit/b
:c
echo %s%
set s=%s:\ = \%
set s=%s:X =/\%
set s=%s:\/=X %
set s=%s: /=/ %

Üst çizgiyi oluşturarak başlar, sonra her çizgiyi yazdırdıktan sonra, \sağda bir boşluk /bırakıp bir kez boşluk bırakarak Xortada bir yer aldıklarından emin olun .



2

Retina , 74 bayt

.+
$* X
+`^ ( *).( *)
$1\  $2/¶$&
+`¶ ( *).( *).?$
$&¶$1/  $2\
m` (\W)$
$1

Çevrimiçi deneyin! Açıklama:

.+
$* X

Yerleştirin X.

+`^ ( *).( *)
$1\  $2/¶$&

'Den başlayarak, Xyukarı doğru çalışarak, \her seferinde sola çapraz bir şekilde yerleştirin. Ayrıca geçen /seferden sonra iki boşluk daha koyun /.

+`¶ ( *).( *).?$
$&¶$1/  $2\

'Den başlayarak, Xaşağı doğru çalışarak, /her seferinde sola çapraz bir şekilde yerleştirin. Ayrıca geçen \seferden sonra iki boşluk daha koyun /.

m` (\W)$
$1

İki diyagonal arasındaki boşlukların sayısı tek olmalıdır, bu nedenle her satırdaki son alan (orijinal Xsatır hariç ) silinir.


2

Mathematica, 131 bayt

(F[x_,y_]:=Table[x<>StringJoin@Table[" ",i]<>y,{i,1,#*2,2}];Column[Join[Reverse@F["\\","/"],{"X"},F["/","\\"]],Alignment->Center])&


Mathematica, 104 bayt

Grid kullanan başka bir yaklaşım burada

(S=DiagonalMatrix[Table["\\",r=2#+1]];Table[S[[r+1-i,0+i]]="/",{i,r}];S[[#+1,#+1]]="X";Grid@S/. 0->" ")&

2

APL (Dyalog) , 25 bayt

⎕IO←0Birçok sistemde varsayılan olanı gerektirir .

' \/X'[(⊢+2×⌽)∘.=⍨⍳1+2×⎕]

Çevrimiçi deneyin!

' \/'[] Dizeyi dizine ekle

 girdi almak

 iki ile çarp

1+ bir tane ekle

 birçok tam sayıdan daha

∘.=⍨ eşitlik tablosu (yani kimlik matrisi; NW-SE diyagonal)

() Üzerine şu tacit fonksiyonunu uygulayın

   argüman

  + artı

   iki kere

   yatay olarak yansıtılmış argüman (yani NE-SW diyagonal)


2

Bash , 138 bayt

for i in `seq $1;seq $[$1-1] -1 1`
{ $[a++]
printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`
}|sed 's/22/X/'|tr 12 /\\

Çevrimiçi deneyin!

Çok uzun, bash '\ ve /'

Daha az golf oynadı

 for i in {1..10} {9..1};{
   $[a++];                      #argument as padding, prints 1 for \ and 2 for /
   printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`;
  }|sed 's/22/X/g' | tr 12 /\\



1

Perl 5, 110 + 1 = 111 bayt

-nBayrak kullanır .

$x=$_;$,="\n";push@x,$"x($x-$_)."\\".$"x(2*--$_+1)."/"while$_>0;say@x,$"x$x."x";for(reverse@x){y!\\/!/\\!;say}

1

QBIC , 90 bayt

~b=0|?@X`\[0,:-1|X=space$(a)┘Z=Z+X+@\`+space$((b-a)*2-1)+@/`+X+@┘`]Z=Z+space$(b)+A+_fZ

Bu canavarlık nasıl işler, okuyucu için bir egzersiz olarak bırakılır ...

Örnek çıktı:

Command line: 3
\     /
 \   / 
  \ /  
   X
  / \  
 /   \ 
/     \

1

Visual Basic.Net , 454 450 Bayt

Option Strict Off
module m
sub main(a As String())
dim v=Convert.toInt32(a(0))
for i as Integer=v to 1 step -1
for j as Object=1 to v-i
w(" ")
next
w("\")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("/")
next
console.writeline(new String(" ",v)&"X")
for i as Object=1 to v
for j as Object=1 to v-i
w(" ")
next
w("/")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("\")
next
end sub
sub w(s)
console.write(s)
end Sub
end module

emin bir fonk yapım olmadığını writelineişaret için bazı bayt Stephen S sayesinde kurtaracak as ...da değişti çıkarılması integeriçine object son düzenleme İlki geri değişti


Cesur birisin :) Hepsini kaldırabileceğine inanıyorum as Types, çünkü eğer varsa Option Strict Off, VB.NET gevşek yazılmış bir dil gibi davranıyor.
Stephen

Şu anda Linux üzerinde mono can sıkıcı
polyglotrealIknow

mono Option Strict'i umursamıyor ya da en azından düşündüğüm şeyi umursamıyor
polyglotrealIknow

Ah functions görünüyordu ! = for loops Golf için teşekkürler
polyglotrealIknow

Isn't Option Strict off by default? It is in Visual Studio at least
Stephen

1

05AB1E, 22 bytes

F'\IN-úR.∞})Âí'Xs)˜.c»

Try it online!

Explanation

F                        # for N in [0...input-1] do
 '\                      # push a backslash
   IN-ú                  # prepend input-N spaces
       R                 # reverse
        .∞               # mirror
          }              # end loop
           )             # wrap stack in a list
            Â            # bifurcate
             í           # reverse each item
              'Xs        # push an "X" between the 2 lists on the stack
                 )˜      # wrap in flattened list
                   .c    # pad lines to equal length
                     »   # join on newlines

Alternative 22 byte solution

F'\N·>ú'/ì})Âí'X¸«ì.c»

1

Pyke, 14 bytes

\XQV.X \   /\/

Try it here!

\X             - "X"
  QV           - repeat input times:
    .X \   /\/ -  surround(^, all=" ", 
                              tl="\", 
                              left=" ",  
                              right=" ",  
                              lower=" ",  
                              tr="/",  
                              br="\",  
                              bl="/")

1

tcl, 134

proc P {x s b} {time {puts [format %[incr ::i $x]s%[expr ($::n-$::i)*2+2]s $s $b]} $::n}
P 1 \\ /
puts [format %[incr i]s X]
P -1 / \\

demo

Set n on the first line.

May be I can golf it more using a recursive approach


1

R, 75 72 bytes

y=diag(b<-2*scan()+1);write(c(" ",'\\','/','X')[y+2*y[,b:1]+1],'',b,,'')

Inspired by this answer, generates an implicit matrix and writes it to stdout; reads the size from stdin. It has to build a matrix of space characters and uses sep='' b/c otherwise it has spacing issues.

diag(b)                     # generates a main diagonal of 1, rest 0
2*diag(b)[,b:1]             # the other diagonal is 2
                            # [,b:1] reverses columns
                            # [b:1,] reverses the rows; they're equivalent
diag(b)+2*diag(b)[,b:1]     # sums, so we get 1 for main diagonal
                            # 2 for other diagonal, 3 for center
diag(b)+2*diag(b)[,b:1]+1   # add 1 since R is 1-indexed
                            # the result is indices for the vector
c(' ','\\','/','X')

Try it online!

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.