大きなASCII Xを描く


20

問題

同様のことをする前の挑戦に触発された

正の整数入力n出力が与えられた場合、このパターンに従う形状:

入力n=1

* *
 *
* *

入力n=2

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

入力n=3

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

等々...

次のプロパティがあります。

n*2+1 背の高い線

「腕」はn幅が広い

中心線がn広い

場合n偶数ラインの上および中央未満であるn*2広いです

n奇数の場合、中心の上下の線はn*2-1幅が広い

ルール

  • 末尾の改行を受け入れました
  • 標準的な抜け穴が適用されます
  • 最短バイトが勝つ
  • 出力は、印刷または文字列または文字列の配列です。

編集

  • n=0 処理する必要はありません
  • 末尾のスペースを許可

2
それは出力がある場合は大丈夫です1の代わり*0スペースの代わりに?
ジョンファンミン

パターンに0インデックスを付けることはできますか?
リーキー修道女

@JungHwanMin私はそれを許可しますが、それからあなたは勝つことを許されません、あなたが最も支持されているなら揺れるかもしれません。
-LiefdeWen

@LeakyNun 0インデックスは問題あり
ません-LiefdeWen

回答:


9

木炭13 12 バイト

@ErikTheOutgolferに1バイトありがとう

FN«PX⁺*×*Iθ→

オンラインでお試しください!

これは私の初めてのチャコールの回答であり、ゴルフはそうではないかもしれないと確信していますが、どこかから始めると思いました。

 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私はそれをする方法がなければならないと知っていました!ありがとうございました!
nmjcman101

そして、はい、それは実際にそれができる限りゴルフされたように見えます。
エリックアウトゴルファー

@EriktheOutgolferそれはあなたがとにかくやって来る前ではなかった:)
nmjcman101

1
@thomasrutter Charcoalには、256バイト独自のカスタムコードページがあり、これらの各文字は1バイトです。したがって、これらの文字の一部が実際に複数バイトになるASCIIではエンコードされません。nmjcman101 +1 btw。昨日、私の最初のチャコールの答えも試していましたが、仕事から家に帰る前に持っていた数分でうまくいきませんでした。だからあなたは私を打ち負かした。私はあなたの答えからいくつかのことを学んだので、ありがとう。
ケビンCruijssen

13

MATL、16バイト

EQXyG:Y+tP+g42*c

オンラインでお試しください!

説明

2例として入力を検討してください。スタックの内容は、最新のものとともに以下に示されています。

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: ['**  **';
                  ' **** ';
                  '  **  ';
                  ' **** ';
                  '**  **']

あなたは...速く私よりもね
漏れ修道女

@LeakyNunめったにありません:-)
ルイスメンドー

私は...私は、各行に0を追加して、ベクトル化の和を適用しなければならなかった...ゼリーが2D畳み込みを持っていたい
漏れ修道女

1
@LeakyNunあなたが知っている...彼らは畳み込みについて言う何を
ルイスMendo

1
@LuisMendo私の心では、あなたは畳み込みを使うことで勝者となり、そのような素晴らしい思い出を持ち帰ります。
-LiefdeWen

9

ゼリー、15バイト

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

オンラインでお試しください!


非常に素晴らしい。8バイト不足です。
リーキー修道女

@LeakyNun簡単なアプローチはかなり役立ちます。
エリックアウトゴルファー

非常に素晴らしいアプローチ
ジョナサンアラン

うん@JonathanAllan、特にあなたが学ぶTFW »ベクトル化...
エリックOutgolfer

1
ユーザー名が本当に好きです!しかし、私は、あなたが「エリックviの王」...(ここではモンティ・パイソンのファン...)選択することができますので、あなたは、代わりに「VI」または「VIM」を使用したい
オリヴィエ・デュラック

4

V18 17バイト

@DJMcMayhemの入力トリックのおかげで1バイト節約できました。

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

オンラインでお試しください!

説明

Àé*ÄJÀäl

これは挿入します [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

バッファーの元になるループの各反復

|**   ***

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

どこ|でカーソルで*その下には、


ワオ。あなたはすごいゴルフをしました。よくやった!いくつかのヒント:のÀé*ÄJÀäl代わりに行うÀá*Àá Àá*こともできます<M-c>。つまり、ã(ニーモニック:中央)を行の中央に移動することができますÀlオンラインでお試しください!
DJMcMayhem

@DJMcMayhemいろいろな場所であなたと話をしようとしています。私は私が思う最初の提案を盗むつもりですが、<M-c>より高い数値のブレーク
-nmjcman101

3

05AB1E、18バイト

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

オンラインでお試しください!

説明

の例 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バイト

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

オンラインでお試しください!

Hexdump:

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

なんらかの理由で、このチャレンジは最後のチャレンジよりもVで非常に困難です。n回の一般的なアプローチである 'x'の成長はここでは機能しないため、代わりにXの上部を作成し、コピーして反転し、2つの部分を結合します。

説明:

Àé*Ä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.

ループの最後でインデントを行うと、暗黙的な終了を利用できます。これは、n + 1行を作成するのにも便利です。これは、まさに 'X'の上半分です。入力が4だったとします。この時点で、バッファーは次のようになります。

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

そして、最後の行にいます。それで、我々:

                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

私もãxx最初はそれをしましたが、たとえばn = 8で壊れると思いますか?
nmjcman101

@ nmjcman101ああ、あなたは正しい。行う場合ãl、またはセンタリングする前にインデントする場合でも問題ありませんが、実際にはバイトを節約しません。しかし、なぜそれが小さい数字で機能するのか理解できません。
DJMcMayhem

3

C#、139130115バイト

文字列を作成してを呼び出すことにより、-1バイトWriteLine。したがって、新しい行のチェックを保存します。
ケビンと彼のマスターゴルフテクニックのおかげで-6バイト!
-2置き換えることにより、バイトn*3-nn*2
Kevinが親切に正しい方向を示してから-15バイト後:文字列を印刷する代わりに返すだけで、呼び出しを保存できますSystem.Console.WriteLine()。その他のヒントも...

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

オンラインでお試しください!

ゴルフをしていない:

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

大きなXを印刷するために必要なスペースの行と列に沿って反復し、条件に応じてa '*'またはa を印刷します' '


1
+1!ゴルフにいくつかの小さなもの。この場合、すべての&&可能性が&あり||ます|for(int j=0;することができますし、内側のループの前にfor(int j=0,i;削除することができます。また、最初の変更後と、あなたはまた、削除することができますforループ、および変更の内側に。int i&|i++i==n*3-1?...i++==n*3-1?...
ケビンCruijssen

@KevinCruijssenありがとうございます!内側のループを変更し、文字列を作成してを呼び出してWriteLine、1バイトだけ保存しました。だから今、あなたの最後のアドバイスで何をすべきかわからない。
チャーリー

1
ところで、なぜSystem.Console.WriteLine?文字列を返す: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;}より短い[ 120バイト ](また、forループ内にすべてを配置することで角かっこを取り除きます。これが機能することを示すTIOリンクがあります。また、これ(または独自の)を自由に追加してください。あなたの答えへのTIOリンク:)
ケビンクルーッセン

1
@KevinCruijssen TIOがC#コードを処理できることを知りませんでした!私は、追加WriteLineOPがに尋ねたので、コード内の出力だけでなくするために、大きなXを返し、私は(呼び出すことで、Xの出力と感じていたので、それをWriteLineする方法)は、コードの一部である必要があります。それにもかかわらず、私はまだコードゴルフのルールに慣れておらず、コードを書くときにどのライセンスを取ることができるかわかりません。ここで、他の回答の一部はコードにXを印刷し、他の一部はフッターに印刷することを見ました。この場合の有効なアプローチは何ですか?
チャーリー

1
通常、文字列を返すだけでなく、プログラムの代わりに関数を使用することは、特に明記しない限りデフォルトで許可されています。また、質問では、「出力は印刷されるか、文字列または文字列の配列である可能性がある」と記載されているため、文字列を返すことが許可されています。:)ああ、そしてあなたがゴルフをすることができる最後の一つ:j<n*2+1することができますj<=n*2。また、同じバイトカウントで回答のJava 8ポートを作成しました。もちろん、すばらしい回答が得られました。
ケビンCruijssen



2

MATLAB、153 126バイト(17.6%↓)

@LuisMendoのコメントのおかげで、関数disp()は単一引用符なしで文字を出力できるため、fprintfwithの使用を防ぎformats、数バイトを省略できました。また、彼のコメントchar(32)は、char(0)(null)ではなくスペースを表示するために使用する必要があることを思い出させてくれます。

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

オンラインでお試しください!

MATLAB、153バイト

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

結果の例:n = 10

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

2

パイソン293の 90 89 83バイト

Leaky Nunのおかげで-3バイト
Zachary Tのおかげで-1バイト
xnorのおかげで-6バイト

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

[オンラインで試してみてください!] [TIO-j3xwsktf]

以下のような文字列で始まる'*** 'ためにn=3適用し、map/max選択する*、その後、各位置のためのスペースの上にスペースを追加し、文字列の最後の文字を削除し、すべて再びこれを行います。



あなたは置き換えることはできませんn*2*' 'n*' '
ザカリー

map(maxせずに直接行うことができますzip。また、n*2+1ですn-~n
-xnor

1

Haskell、70バイト

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

オンラインでお試しください!

文字列のリストを出力します。

row r、columnの各位置についてc、式を使用して、2つの対角バンドのいずれかに該当するかどうかを判断し*ます。



1

Javascript(ES2017)、155 157バイト

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

文字列の配列を返します。アレイで操作を実行してから、ミラーリングします。これはおそらく他の答えのような行列で最適化できますが、私はユニークになりたかったです。

編集:Neilが指摘したようにn、の値が偶数の場合、中心線はn広くないため、列をスライスするときに偶数/奇数を検出するための係数を追加しました。

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

非ゴルフ

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
}

象限

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

水平にミラー

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

垂直にミラー

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

これにより、偶数に対して誤った出力が生成されますn-中心線はn広くありません。
ニール

0

Mathematica、148バイト

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バイト

コード:

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)

テスト:

> 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バイト

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

これは、スタックから数値を取得し、スタックに行のリストを出力するブロックです。

説明:

{                        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バイト

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)

このプログラムは、各行を4つの部分、最初のスペース、最初の星、2番目のスペース、次に2番目の星に分割します。Xの各水平線について、線の4つのセクションのそれぞれに必要な星またはスペースの数を計算し、その文字列を作成して出力します。


0

網膜、144バイト

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

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

オンラインでお試しください!説明:

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

入力値の前に2n + 1個のスペースを追加します(各出力行に1つ)。

$`#$'¶

各スペースをaに置き換えて#、結果を収集します。これにより、対角線の#s が得られ、両側にスペースが埋め込まれ、入力値に接尾辞が付きます。

¶\d+$

各行にコピーがあるので、元の入力値を削除します。

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

ペアのs *n囲まれたスペースのセパレーター列を使用して、n の2つの対角線を構築し#ます。

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

*sが中央に近い行で、2つの半分を入れ替えます。これにより、外観が似てい> | | <ます。

+` (# +#)
$1 

| |sを左端まで移動して、ある種の>> > <外観を与えます。

+` #...
#

#s 間のスペースごとに、次の3つの文字を削除します。これはに結合> <しますX

##

不要になったを削除します#

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.