Büyük bir ASCII X çizin


20

Sorun

Benzer bir şey yapmak için önceki bir meydan okuma

Pozitif tamsayı giriş nçıktısı verildiğinde bu kalıbı izleyen bir şekil verilir:

girdi n=1:

* *
 *
* *

girdi n=2:

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

girdi n=3:

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

ve bunun gibi...

Şu özelliklere sahiptir:

n*2+1 uzun çizgiler

"kollar" nbirleştikleri zaman geniş

merkez hattı ngeniş

eğer nhatta hatları üzerinde ve merkezinde altındadır olan n*2geniş

Eğer ntek, yukarıda ve merkezi aşağıdaki hatları n*2-1geniş

kurallar

  • Sondaki yeni satırlar kabul edildi
  • Standart boşluklar geçerlidir
  • En kısa bayt kazanma
  • Çıktı yazdırılabilir veya bir dize veya dize dizisi olabilir

Düzenlemeler

  • n=0 ele alınması gerekmez
  • İzin verilen sondaki boşluklar

2
O çıkış varsa iyi mi 1yerine *ve 0yerine uzayın?
JungHwan Min

Modellerimiz 0 dizinli olabilir mi?
Leaky Nun

@JungHwanMin Buna izin vereceğim, ancak kazanmanıza izin verilmiyor, en çok oy verildiyseniz sallanabilir.
LiefdeWen

@LeakyNun 0 Endeksli iyi
LiefdeWen

Yanıtlar:


9

Kömür , 13 12 bayt

@ErikTheOutgolfer'a bir bayt için teşekkürler

FN«PX⁺*×*Iθ→

Çevrimiçi deneyin!

Bu benim ilk Kömür cevabım ve eminim o kadar iyi golf değil, ama bir yerden başlayacağını düşündüm.

 FN«            # For input() (i in range(0,input()))
     P           # Print
       X          # In an 'X' shape
        ⁺*×*Iθ   # '*'+'*'*int(first_input)
               →  # Move the cursor right one


@EriktheOutgolfer Bunu yapmanın bir yolu olması gerektiğini biliyordum! Teşekkür ederim!
nmjcman101

Ve evet aslında olabildiğince golf gibi görünüyor.
Outgolfer Erik

@EriktheOutgolfer Yine de gelmeden önce değildi :)
nmjcman101

1
@thomasrutter Charcoal'ın 256 baytlık kendi özel kod sayfası vardır ve bu karakterlerin her biri 1 bayttır. Bu nedenle, bu karakterlerden bazılarının gerçekten de çok bayt olacağı ASCII'de kodlanmamıştır. nmjcman101 +1 btw. Dün de ilk Kömür cevabımı deniyordum, ama işten eve gitmeden önce birkaç dakika içinde gerçekten işe yaramadı. Yani beni yendin. Cevabınızdan bazı şeyler öğrendim, bunun için teşekkürler.
Kevin Cruijssen

13

MATL , 16 bayt

EQXyG:Y+tP+g42*c

Çevrimiçi deneyin!

açıklama

Girişi 2örnek olarak ele alalım. Yığın içeriği aşağıda daha yeni olanlarla gösterilir.

EQ    % Implicitly input n. Push 2*n+1
      %   STACK: 5
Xy    % Identity matrix of that size
      %   STACK: [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]
G:    % Push [1 2 ... n]
      %   STACK: [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],
                 [1 2]
Y+    % 2D convolution, extending size
      %   STACK: [1 2 0 0 0 0;
                  0 1 2 0 0 0;
                  0 0 1 2 0 0;
                  0 0 0 1 2 0;
                  0 0 0 0 1 2]
tP+   % Duplicate, flip vertically, add
      %   STACK: [1 2 0 0 2 1;
                  0 1 2 1 2 0;
                  0 0 1 4 0 0;
                  0 1 2 1 2 0;
                  1 2 0 0 1 2]
g     % Convert to logical
      %   STACK: [1 1 0 0 1 1;
                  0 1 1 1 1 0;
                  0 0 1 1 0 0;
                  0 1 1 1 1 0;
                  1 1 0 0 1 1]
42*   % Multiply by 42.
      %   STACK: [42 42  0  0 42 42;
                   0 42 42 42 42  0;
                   0  0 42 42  0  0;
                   0 42 42 42 42  0;
                  42 42  0  0 42 42]
c     % Convert to char. Char 42 is '*'. Char 0 is displayed as space
      %   STACK: ['**  **';
                  ' **** ';
                  '  **  ';
                  ' **** ';
                  '**  **']

Benden daha
hızlısın

@LeakyNun Çok nadiren :-)
Luis Mendo

Keşke Jelly 2B dönüşümü olsaydı ... Her satıra 0 eklemek ve sonra vektörize toplam uygulamak zorunda kaldım ...
Leaky Nun


1
@LuisMendo Kalbimde, evrişimi kullanmanın kazananı sizsiniz, bu güzel anıları geri getiriyor.
LiefdeWen

9

Jöle , 15 bayt

Ḥ‘Ḷ⁶ẋ;€”*ẋ$»Ṛ$Y

Çevrimiçi deneyin!


Çok hoş. 8 baytım benden.
Leaky Nun

@LeakyNun Basit yaklaşım biraz yardımcı olur.
Outgolfer Erik

Çok hoş bir yaklaşım
Jonathan Allan

@JonathanAllan Evet, özellikle tfw »vectorized öğrenir ...
Erik the Outgolfer

1
Kullanıcı adınızı gerçekten beğendim! Ama keşke "vi" ya da "vim" kullansaydın, böylece "Erik the vi King" i seçebilirsin ... (Monty Python hayranı burada ...)
Olivier Dulac

4

V , 18 17 bayt

@ DJMcMayhem'in giriş numarası sayesinde bir bayt kaydetti.

Àé*ÄJÀälÀñ2ÙÀl2x>

Çevrimiçi deneyin!

açıklama

Àé*ÄJÀäl

Bu ekler [n]*'*'+[n]*' '+[n]*'*'

        Àñ        ' [arg] times
          2Ù      ' Duplicate the current line down twice
            Àl    ' Move right [arg] times
              2x  ' Delete two characters
                > ' Indent this line one space

Tamponun gittiği her döngü yinelemesi

|**   ***

için

***   ***
 |** ***
***   ***

Altında |bir imleç nerede*


Vay. Sen Waaay beni outgolfed. Aferin! Birkaç ipucu: Sen Àé*ÄJÀälyerine Àá*Àá Àá*yapabilirsin, ve yapabilirsin <M-c>, yani ã(anımsatıcı: ortada ) çizginin ortasına, yani bayttan daha kısa olana Àl. Çevrimiçi deneyin!
DJMcMayhem

@DJMcMayhem Sizinle bir sürü farklı yerde konuşmaya çalışıyorum. Sanırım ilk öneriyi çalacağım, ancak <M-c>daha yüksek rakamlar için molalar
vereceğim

3

05AB1E , 18 bayt

Å4bS{I·ƒDÂ~„ *èJ,À

Çevrimiçi deneyin!

açıklama

İçin örnek n=2

Å4                   # push a list of 4s with length as the input
                     # STACK: [4,4]
  b                  # convert each to binary
                     # STACK: [100, 100]
   S{                # split into digit list and sort
                     # STACK: [0, 0, 0, 0, 1, 1]
     I·ƒ             # input*2+1 times do
        D            # duplicate top of stack
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
         Â~          # or each item in the duplicate with its reverse
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 1, 1, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
           „ *èJ     # use the resulting binary list to index into the string " *"
                     # 1st iteration: [0, 0, 0, 0, 1, 1], "**  **"
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], " **** "
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], "  **  "
                ,    # print
                 À   # rotate list left

3

V , 23 bayt

Àé*ÄJÀälÀñÙãlxx>ñyHæGVp

Çevrimiçi deneyin!

HexDump:

00000000: c0e9 2ac4 4ac0 e46c c0f1 d9e3 6c78 783e  ..*.J..l....lxx>
00000010: f179 48e6 4756 70                        .yH.GVp

Her ne sebeple olursa olsun, bu zorluk V'de sonuncudan önemli ölçüde daha zordur. Genel olarak n kez yaklaşımımız olduğundan , 'x' büyümek burada işe yaramayacak, bunun yerine X'in tepesini inşa edeceğiz, kopyalayıp çevireceğiz, sonra iki parçayı birbirine ekleyeceğiz.

Açıklama:

Àé*ÄJÀäl                " Insert ('*' * n) + (' ' * n) + ('*' * n) 
                        " The obvious way would be 'Àé*ÀÁ ÀÁ*', but this 
                        " non-obvious way saves us a byte
        Àñ      ñ       " 'n' times:
          Ù             "   Duplicate this line (below us)
           ãl           "   Move to the center of this line
             xx         "   Delete two characters
               >        "   And indent this line with one space.

En girinti yaparak sonunda döngü, bize sağlayan örtülü sonlar yararlanmak . Bu aynı zamanda 'X'in tam olarak üst yarısı olan n + 1 çizgilerini de oluşturur . Diyelim ki girdi 4 idi. Sonra bu noktada tampon şöyle görünür:

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

Ve biz son sıradayız. O zaman biz:

                yH      " Copy the whole buffer and move to the first line
                  æG    " Reverse every line
                    Vp  " And paste what we just copied *over* the current
                        " line, deleting it in the process

Ben de ãxxilk başta bir şey yaptım , ama bence n = 8?
nmjcman101

@ nmjcman101 Ah, haklısın. Bunu yaparsanız ãlveya ortalamadan önce girintili yaparsanız iyi olur , ancak bu aslında herhangi bir bayt kaydetmez. Yine de neden daha küçük sayılar için çalıştığını anlamıyorum.
DJMcMayhem

3

C #, 139130115 bayt

-1 bayt bir dize oluşturarak ve çağırarak WriteLineyeni satırın çekini kaydederek.
Kevin ve usta golf teknikleri sayesinde -6 bayt!
-2 değiştirerek bayt n*3-nile n*2.
-15 bayt Kevin beni doğru yönde işaret ettikten sonra: Sadece dize yazdırmak yerine geri dönebilir, böylece çağrıyı kaydedebilirim System.Console.WriteLine(). Ve diğer bazı ipuçları da ...

n=>{var s="";for(int i,j=0;j<=n*2;j++,s+='\n')for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>=n*2-j?'*':' ';return s;}

Çevrimiçi deneyin!

Ungolfed:

class Program
{
    static void Main(string[] args)
    {
        System.Func<int, string> g = n =>
        {
            var s = "";
            for (int i, j = 0; j <= n*2; j++, s += '\n')
                for (i = 0; i < n*3;)
                    s += i >= j & i < j+n | i <= n*3-j-1 & i++ >= n*2-j ? '*' : ' ';
            return s;
        };

        System.Console.Write(f(1));
        System.Console.Write(f(2));
        System.Console.Write(f(3));
        System.Console.Write(f(5));
        System.Console.Write(f(8));

        System.Console.ReadKey();
    }
}

Sadece büyük X'i yazdırmak için gereken alanın satırları ve sütunları boyunca yinelenir ve duruma bağlı olarak a '*'veya a ' 'olarak yazdırılır .


1
1! Golf için bazı küçük şeyler. Hepsi &&olabilir &ve ||olabilir |bu durumda. for(int j=0;olabilir for(int j=0,i;ve daha sonra iç döngüdeki int önünü çıkarabilirsiniz i. Ayrıca, ilk değişiklikten sonra &ve |, ayrıca kaldırabilir i++For döngüsü ve değişiklik iç i==n*3-1?...için i++==n*3-1?....
Kevin Cruijssen

@KevinCruijssen çok teşekkür ederim! İç döngüyü değiştirdim ve şimdi WriteLinesadece 1 bayt kaydedilen arayabileceğim bir dize oluşturuyorum . Şimdi son tavsiyenizle ne yapacağınızdan emin değilim.
Charlie

1
Btw, neden System.Console.WriteLine? Dizeyi döndürmek: n=>{string s="";for(int i,j=0;j<n*2+1;j++,s+="\n")for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>n*2-j-1?'*':' ';return s;}daha kısadır [ 120 bayt ] (ve her şeyi for- loop'un içine koyarak parantezlerden kurtulur. İşte çalıştığını göstermek için bir TIO bağlantısı . Ayrıca, bunu (veya kendinizinkini) eklemekten çekinmeyin Cevabınıza TIO bağlantısı. :)
Kevin Cruijssen

1
@KevinCruijssen TIO'nun C # kodunu işleyebileceğini bilmiyordum! Ben WriteLinekod ekledi çünkü OP sadece geri dönmek için değil, büyük X çıktı istedi , bu yüzden X ( yöntemi çağırarak ) çıkış kodun bir parçası olması gerektiğini hissettim . Bununla birlikte, hala kod golf kurallarına alışkın değilim ve kod yazarken hangi lisansları alabileceğimi bilmiyorum. Buradaki diğer cevaplardan bazılarının X kodunu yazdırdığını ve bazılarının altbilgide yazdırdığını gördüm. Bu durumda geçerli yaklaşım nedir? WriteLine
Charlie

1
Genellikle bir dize döndürmeye ve program yerine bir işlev kullanmaya izin vermez, aksi belirtilmedikçe varsayılan olarak izin verilir. Ayrıca, soruda " Çıktı yazdırılabilir veya bir dize veya dizgi dizisi olabilir " ifadesi kullanıldığından, bir dizenin döndürülmesine izin verilir. :) Oh, ve golf yapabileceğiniz son bir şey: j<n*2+1olabilir j<=n*2. Ayrıca cevabınızın aynı bayt sayımı ile bir Java 8 portu oluşturdum ve elbette şaşırtıcı cevabınızı kredilendirdim.
Kevin Cruijssen



2

MATLAB, 153126 bayt (% 17.6 ↓)

@ LuisMendo'nun yorumu sayesinde, işlev disp()tek tırnak işaretleri olmadan karakter çıktısı alabilir, böylece birkaç bayt fprintfile kullanmayı engelleyebilir formatsve atlayabilirim. Ayrıca, yorumu bana (boş) char(32)yerine boşluk sunmak için kullanmam gerektiğini hatırlatıyor char(0).

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=10
disp([a+32 ''])

Çevrimiçi deneyin!

MATLAB, 153 bayt

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1 
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=42
fprintf([repmat('%c',1,c),'\n'],char(a)')

Sonuç örneği: n = 10

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

2

Python 2 , 93 90 89 83 bayt

Leaky Nun
-1 -3 byte sayesinde Zachary T -6 byte xnor sayesinde -3 byte

n=input()
x=n*'*'+n*'  '
exec"print`map(max,x,x[::-1])`[2::5];x=' '+x[:-1];"*(n-~n)

[Çevrimiçi deneyin!] [TIO-j3xwsktf]

Böyle bir dize ile başlar '*** 'için n=3başvuran, map/maxalmaya *, sonra her pozisyon için boşluklar üzerinde bir boşluk eklemek ve ipten son karakterini kaldırmak ve tüm tekrar yapmak.



Eğer yerini alamaz n*2*' 'ile n*' '?
Zacharý

map(maxBir doğrudan yapılabilir zip. Ayrıca, n*2+1öyle n-~n.
xnor

1

Haskell , 70 bayt

f n=[[last$' ':['*'|y<-[1..n],(c-n-y)^2==r^2]|c<-[1..3*n]]|r<-[-n..n]]

Çevrimiçi deneyin!

Dizelerin bir listesini çıkarır.

Her satır konumu için rsütun c, iki çapraz banttan birine düşüp düşmediğini belirlemek için bir formül kullanır *.



1

JavaScript (ES2017), 155 157 bayt

n=>[...e=[...Array(n+1)].map((a,i)=>[...d=((b=''.padEnd(n))[c='slice'](i)+'*'.repeat(n)+b[c](0,i))[c](n/2)].reverse().join``+d[c](n%1)),...e.reverse()[c](1)]

Bir dizgi dizisi döndürür. Diziler üzerinde işlemler yaparım, sonra aynalar. Bu muhtemelen diğer cevaplar gibi matrislerle optimize edilebilir, ancak benzersiz olmak istedim.

Düzenleme: Neil tarafından işaret edildiği gibi, hatta değerleri için n, merkez hattı ngeniş değildi , bu yüzden sütun dilimleme sırasında çift / tek tespit etmek için bir modül ekledim.

n=5
['*****     *****',
 ' *****   ***** ',
 '  ***** *****  ',
 '   *********   ',
 '    *******    ',
 '     *****     ',
 '    *******    ',
 '   *********   ',
 '  ***** *****  ',
 ' *****   ***** ',
 '*****     *****']

Ungolfed

n => {
  e = [...Array(n+1)].map((a, i) => {   // Create and iterate over array with n+1 elements
    b = ''.padEnd(n)                    // String of n spaces
    d = (b.slice(i) + '*'.repeat(n) + b.slice(0, i)).slice(n/2) // Create row string
    return [...d].reverse().join`` + d.slice(1) // Mirror and combine row horizontally
  })
  return [...e,...e.reverse().slice(1)] // Mirror and combine vertically
}

çeyrek daire

n=5
   *****
  ***** 
 *****  
*****   
****    
***     

Yatay Yansıtılmış

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     

Dikey Olarak Aynalı

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     
    *******    
   *********   
  ***** *****  
 *****   ***** 
*****     *****

Bu, çift için yanlış çıktı üretir n- orta çizgi ngeniş değildir .
Neil

0

Mathematica, 148 bayt

T=Table;(a=Join[T[T["*",i],{i,(n=#)+2,2n,2}],T[Join[t=T["*",n],T[" ",y],t],{y,1,n,2}]];Column[Row/@Join[Reverse@a,{T["*",n]},a],Alignment->Center])&

0

R, 102 bayt

Kod:

n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)

Ölçek:

> n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)
1: 10
2: 
Read 1 item
**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********

0

CJam, 24 bayt

{:T2*){S*T'**+}%_W%..e>}

Bu, yığından bir sayı alan ve yığına bir satır listesi veren bir bloktur.

Açıklama:

{                        e# Stack:           | 2
 :T                      e# Store in T:      | 2, T=2
   2*                    e# Multiply by 2:   | 4
     )                   e# Increment:       | 5
      {                  e# Map over range:  | [0
       S                 e#   Push space:    | [0 " "
        *                e#   Repeat string: | [""
         T               e#   Push T:        | ["" 2
          '*             e#   Push char '*': | ["" 2 '*
            *            e#   Repeat char:   | ["" "**"
             +           e#   Concatenate:   | ["**"
              }%         e# End:             | ["**" " **" "  **" "   **" "    **"]
                _        e# Duplicate:       | ["**" " **" "  **" "   **" "    **"] ["**" " **" "  **" "   **" "    **"]
                 W%      e# Reverse:         | ["**" " **" "  **" "   **" "    **"] ["    **" "   **" "  **" " **" "**"]
                   ..e>  e# Overlay:         | ["**  **" " ****" "  **" " ****" "**  **"]
                       } e# End

0

Python 2 , 110 bayt

x=a=0
n=c=input()
while x<2*n+1:
    print ' '*a+'*'*n+' '*c+'*'*(2*n-2*a-c)
    x+=1
    a=n-abs(n-x)
    c=max(0, n-2*a)

Bu program her satırı 4 parçaya böler, ilk boşluklar, ilk yıldızlar, ikinci boşluklar ve sonra ikinci yıldızlar. X'in her yatay çizgisi için, çizginin 4 bölümünün her biri için kaç yıldız veya boşluk gerektiğini hesaplar, ardından bu dizeyi oluşturur ve yazdırır.


0

Retina , 144 bayt

.+
 $&$* $&$* $&
 
$`#$'¶
¶\d+$

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1
( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3
+` (# +#)
$1 
+` #...
#
##

Çevrimiçi deneyin! Açıklama:

.+
 $&$* $&$* $&

Giriş değerinin önüne 2n + 1 boşluk ekleyin (her çıkış satırı için bir tane).

$`#$'¶

Her alanı a ile değiştirin #ve sonuçları toplayın. Bu #, giriş değeri eklenmiş olarak her iki tarafta da boşluk olan çapraz bir s satırı verir .

¶\d+$

Artık her satırda bir kopyamız olduğu için orijinal giriş değerini silin.

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1

Bir çiftin içine sarılmış boşlukların *ayırıcı sütunu ile iki s n çapraz çizgisi noluşturun# s .

( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3

*S'nin ortaya daha yakın olduğu satırlarda , iki yarıyı değiştirin. Bu, benzeyen bir görünüm verir> | | < .

+` (# +#)
$1 

Leri | |gidecekleri kadar sola hareket ettirin,>> > < görünüm verin.

+` #...
#

#S arasındaki her boşluk için aşağıdaki üç karakteri silin. Bu > <birX .

##

Şimdi gereksiz olanları silin #.

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.