エッフェル塔:「A」から大きな「A」を作成する


20

行数を指定した関数を作成しn、なりますbigA

  • の水平バーはbigA中央の行、またはn偶数の場合は2つの下になければなりません
  • 出力に等幅フォントを想定

出力は、行を分割するための明確な改行と、左詰めの正しい空白を含む文字列(または同様の文字配列など)である必要があります(\ tは4つのスペースと想定できます)。右側に空白を含めることができます。

n = 1

A

n = 2

 A
AAA

n = 3

  A
 AAA
A   A

n = 4

   A
  A A
 AAAAA
A     A

n = 5

    A
   A A
  AAAAA
 A     A
A       A

これは、小さな「H」から「H」を作成することに触発されています


右側に空白を追加できますか?また、末尾の改行は許可されますか?
バブラー

@Bubbler、右側の空白は罰金、末尾には改行文字けれどもある
バッド

文字列の代わりに2D文字配列を返すことはできますか?(ヒント:通常、あらゆる種類の出力を許可することをお勧めします)
オリビエグレゴワール

1
@OlivierGrégoire確かに、行に明確な区切りがある限り(たとえば、「\ n」要素、ネストされた配列)
Budd

1
本当にこれのpurporseを破ること@TonHospel、いいえ、
バッド

回答:


12

05AB1E、13バイト

コード:

Ð;î¹)'A1376SΛ

05AB1Eエンコードを使用します。オンラインでお試しください!

説明:

Ð                  # Triplicate the input.
 ;î                # Compute ceiling(n / 2).
   ¹               # Push the first input again.
    )              # Wrap into an array. For input 7, this would result in:
                     [7, 7, 4, 7].
     'A            # Push the character 'A'
       1376S       # Push the array [1, 3, 7, 6]. These are the directions of the canvas.
                     This essentially translates to [↗, ↘, ↖, ←].
            Λ      # Write to canvas using the previous three parameters.

キャンバス

キャンバスをもう少し(および他の多くの機能)文書化する必要がありますが、これは基本的に要約しています。キャンバスには、指定されたパラメータータイプに基づいて異なる「モード」があります。canvasコマンドには3つのパラメーターがあります:<length> <string> <direction>

長さと方向のパラメータはリストであるため、これらのリストを「圧縮」して、実行する命令セットを作成します。文字列パラメータは単なる文字Aであるため、これはすべての命令で使用される塗りつぶし文字です。キャンバスは、これを次の一連の指示(入力7用)として解釈します。

  • string 方向にstringAで長さ7の線を引きます
  • string 方向にstringAで長さ7の線を引きます
  • 長さの線を描く4列でA方向に
  • ←の方向に文字列Aで長さ7の線を描画します

方向は次の方法で翻訳されます。

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

何も出力されていない場合、05AB1Eはキャンバスの結果を自動的に出力します。


1
キャンバスの説明をありがとう、それは素晴らしい機能です:
カルド

TILトリプリケートは一言です
-Quintec

@ thecoder16 quadruplicate、quintuplicate、...、decuplicate
マジックタコUrn

ワオ。私は重複していないことを疑っていましたが、他のすべての人と同じように存在します。もちろん、私たちは英語のxDで無駄な言葉を持っている
Quintec

1
@KevinCruijssenねえ、すべての遅い返信をおologiesびします。ここ数週間は信じられないほど忙しかったです(最後の72時間は8時間しか眠れませんでした)。現在は何でも可能ですが、必要に応じて自由にヒントページに追加してください。
アドナン

6

17 15バイト

NθP×θAM⊘θ↗P^×θA

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

入力n

P×θA

大きなの水平バーを印刷しますA。(偶数の場合、n+1thはとにかく右側に重なります。)

M⊘θ↗

大きなの上部に移動しAます。

P^×θA

大きいの両面を印刷しAます。


4

Python 2、80バイト

lambda n:'\n'.join(' '*(n+~i)+('A'+' A'[i==n/2]*n*2)[:i*2]+'A'for i in range(n))

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

目的の出力を左の空白、左Aと中央の空白またはAs、および右に分割しますA。固定文字列のスライスを使用して中間部分を計算します。これにより、同じ方法を使用して最初の行を生成できます。


4

スタックス、15 バイト

┴3╬*ôP^x'┌_╓J²♫

実行してデバッグする

解凍、コメントなし、コメント付きで、プログラムは次のようになります。

m       map over [1 .. input] using rest of the program, output each result
'A      "A" literal
xhi=    is the iteration index equal to (integer) half the input?
65*     multiply by 65 (character code of "A")
]i*     repeat that character (" " or  "A") i times
+       concat to initial "A"
x)      left pad to the original input
|p      palindromize (concatenate the reverse minus the last character)

これを実行する



4

Python 3.6、79バイトまたは73バイト

f文字列を使用して、文字の水平部分を整列します。

lambda n:'\n'.join(f"{'A'+' A'[i==n//2]*2*i:>{n+i}}"[:-1]+'A'for i in range(n))

\b1を削除するために使用されるA(おそらく不正行為):

lambda n:'\n'.join(f"{'A'+' A'[i==n//2]*2*i:>{n+i}}\bA"for i in range(n))


3

J、65バイト

f=:3 :''' A''{~1(([:(<@;]+i.@+:)<.@-:)y)}([:(}:@|."1,.])=/~@i.)y'

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

それは約で減らすことができます。単純に動詞を暗黙的にすることで12バイトですが、それを行うのに問題があります。

説明:

3 : '...' 明示的な1行動詞を示します

y 引数です

=/~@i. 引数のサイズで単位行列を作成します

    =/~@i. 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

([:(}:@|."1,.]) アイデンティティマトリックスの先頭に、各行の最後の要素が削除されたミラーコピーが追加されます。

    ]a =. ([:(}:@|."1,.])=/~@i.) 4
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 0 0 0 1 0
1 0 0 0 0 0 1

1(...)}(...) 左の引数で選択された右の引数の位置を1に変更します

([:(<@;]+i.@+:)<.@-:) -以下を実行して選択を準備します。

               <.@-: - halves the argument and finds the floor (finds the row number)
    <@;              - box the row, followed by a list of columns:  
        ]+i.@+:      - a list form the argumnt to the doubled row number

    ([:(<@;]+i.@+:)<.@-:) 4
┌───────────┐
│┌─┬───────┐│
││2│2 3 4 5││
│└─┴───────┘│
└───────────┘

    1(([:(<@;]+i.@+:)<.@-:) 4)}a
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 1 1 1 1 0
1 0 0 0 0 0 1

' A'{~ 0と 'A'の場所に1があるスペースをレンダリングします

    ' A'{~1(([:(<@;]+i.@+:)<.@-:) 4)}a
   A   
  A A  
 AAAAA 
A     A



2

SOGL V0.12、12のバイト

 A*:╚╥≤.»I:ž

ここで試してみてください!

説明:

 A*           repeat "A" input times
   :          duplicate it
    ╚         create a "/" diagonal of one of the copies of As
     ╥        palindromize it horizontally
      ≤       get the other copy of the "A"s on top
       .»I:   push floor(input/2)+1 twice
           ž  and at those coordinates in the palindromized diagonals place in the row of As

2

ジャプト -R20 19バイト

Çç" A"gZ¶Uz¹i'A êÃû

それを試してみてください


説明

                        :Implicit input of integer U
Ç                       :Create the range [0,U) and pass each Z through a function
         Uz             :  Floor divide U by 2
       Z¶               :  Test for equality with Z (true=1, false=0)
  " A"g                 :  Get the character in the string " A" at that index
 ç                      :  Repeat Z times
           ¹            :  (Closes a few nested methods)
            i'A         :  Prepend an "A"
                ê       :  Palindromise
                 Ã      :End function
                  û     :Centre pad each element to the length of the longest element
                        :Implicitly join with newlines and output

代替案

(それがいくつかの節約を見つけるのに役立つかもしれないことを願って!)

Æ'AúXÄ" A"gX¶Uz¹êÃû

1
もう1バイト長い代替案:ç h'AUz)¬íp ®i'A êÃû
ETHproductions

@ETHproductionsで置き換えp られ²、それも19バイトです。
シャギー

私の極悪非道より+1良い。
オリバー


1

ゼリー23 20 19 18バイト

=þ`o\L‘HĊƲ¦UŒBị⁾A 

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

=þ`sizeの単位行列を作成しますn

L‘HĊƲ¦その行を取り出して適用することで、水平バーの行インデックスを見つけますo\して、バーを作成します。

U各行を逆にしますので、逆さまの「A」はなく、ŒB(palindromize; vectorizes)は「A」の後半を作ります。

ị⁾A(書式設定0でスペースが削除されます)は、sをスペースに、1sをAsに置き換えます。


1

T-SQL182 177バイト

DECLARE @n INT=5DECLARE @ INT=0a:DECLARE @s VARCHAR(9)=STR(POWER(10,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1IF @<@n GOTO a

最初のバージョン(182バイト):

DECLARE @n INT=5DECLARE @ INT=0WHILE @<@n BEGIN DECLARE @s VARCHAR(9)=STR(POWER(10,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1 END

上記のバージョンは@ n = 9まで機能します。

以下に、@ n = 23まで機能する別のバージョンを示しますが、2バイト余分にあります

DECLARE @n INT=5DECLARE @ INT=0WHILE @<@n BEGIN DECLARE @s VARCHAR(23)=STR(POWER(10.,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1 END

ゴルフをしていない:

DECLARE @n INT=5

DECLARE @i INT=0
WHILE @i<@n BEGIN
    DECLARE @s VARCHAR(9)=STR(POWER(10,@i),@n)
    PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@i=@n/2,'A',' '))
    SET @i+=1
END

1

Haskell98 97 95バイトおよび109バイト

2つの非常に異なるアプローチ。最初(95バイト):

c!n=([1..n]>>c)++"A"
f n=unlines[" "!(n-x)++drop 3([" "!(abs$n`div`2-x+1)!!0]!(2*x))|x<-[1..n]]

2番目(109バイト):

m True='A'
m _=' '
g n=unlines[[m(abs(n-j)==l||l==q&&elem j[q+1..q+n])|j<-[1..2*n]]|l<-[0..n-1],q<-[n`div`2]]

ここで試してみてください!; ここで修正版をお試しください!

ここで3番目のバージョンをお試しください!


PPCGへようこそ!挿入演算子として定義することlにより、最初のアプローチでバイトを節約できます。
ライコニ

m True='A'に短縮されm b|b='A'ます。
ライコニ

2バイトでも保存できることがわかりました。ありがとう!:)
ラデク

1

Python 2、70バイトまたは65バイト

@Buddがコメントで述べているように、文字列のリストは許容可能な結果です。

lambda n:['%*sA\n'%(n+i,('A'+i*2*' A'[i==n/2])[:-1])for i in range(n)]

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


を使用して、一見不正なソリューション\b。TIOではファンキーに見えますが、コンソールでは仕事をします。

lambda n:['%*s\bA\n'%(n+i,'A'+i*2*' A'[i==n/2])for i in range(n)]

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


0

Javascript、124バイト

かなり単純なソリューションで、jsスキルを練習するためのショットを提供しました。

for(i=-1,p=" ".repeat(n-1)+"A ";++i<n;console.log(i-~~(n/2)?p:p.slice(0,i)+"A".repeat(n)),p=p.slice(1,n)+" "+p.slice(n-1)){}

開梱

for(
 //create the first line
 i=-1, p=" ".repeat(n-1)+"A "; 
 ++i<n;
 console.log( 
 //if we are not at the bar
      i-~~(n/2)?
 //otherwise, use the modified previous line
      p
 //slice the start of the previous line and add As
      :p.slice(0,i)+"A".repeat(n)), 
 //add a space in between the previous line and remove padding on each side
 p=p.slice(1,n)+" "+p.slice(n-1)){}


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