Menara Eiffel: Buat "A" besar dari "A" s

20

Buat fungsi yang diberi sejumlah garis n, buat a bigA.

  • Bilah horizontal bigAharus berada di baris tengah, atau lebih rendah dari keduanya jika ngenap
  • Asumsikan font monospace untuk output

Output harus berupa string (atau yang serupa, misalnya array karakter) dengan linebreak yang jelas untuk memecah baris, dan dengan spasi putih yang benar untuk bantalan kiri (Anda dapat mengasumsikan \ t menjadi 4 spasi). Mungkin ada spasi putih di sebelah kanan.

Contohnya

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

Ini terinspirasi oleh Buat "H" dari "H" yang lebih kecil

Budd
sumber
Bolehkah saya menambahkan spasi putih di sisi kanan? Juga, apakah membuntuti baris baru diperbolehkan?
Bubbler
@Bubbler, Setiap spasi putih di sisi kanan baik-baik saja, tidak ada baris baru
Budd
Apakah kami diizinkan mengembalikan array karakter 2D alih-alih string? (petunjuk: biasanya disarankan untuk mengizinkan segala jenis output)
Olivier Grégoire
1
@ OlivierGrégoire Tentu, selama ada jeda yang jelas untuk garis-garis (mis. Elemen "\ n", array bersarang)
Budd
1
@TonHospel, Tidak, itu benar-benar mengalahkan tujuan ini
Budd

Jawaban:

12

05AB1E , 13 byte

Kode:

Ð;î¹)'A1376SΛ

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

Ð                  # 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.

Kanvas

Saya mungkin harus mendokumentasikan kanvas sedikit lebih banyak (dan banyak fungsi lainnya), tetapi ini pada dasarnya meringkasnya. Kanvas memiliki 'mode' yang berbeda berdasarkan jenis parameter yang diberikan. Perintah kanvas memiliki tiga parameter: <length> <string> <direction> .

Karena parameter panjang dan arah adalah daftar, itu 'zip' daftar ini untuk membuat satu set instruksi yang akan dieksekusi. Parameter string hanyalah huruf A , jadi ini adalah karakter isian yang digunakan oleh semua instruksi. Kanvas menafsirkan ini sebagai set instruksi berikut (untuk input 7):

  • Menarik garis panjang 7 dengan string A arah
  • Menarik garis panjang 7 dengan string A arah
  • Gambarlah garis panjang 4 dengan string A ke arah
  • Menarik garis panjang 7 dengan string A arah

Arahan diterjemahkan dengan cara berikut:

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

Jika tidak ada keluaran, 05AB1E secara otomatis menampilkan hasil kanvas.

Adnan
sumber
1
Terima kasih banyak atas penjelasan kanvasnya, itu fitur yang luar biasa :-)
Kaldo
Rangkap tiga TIL adalah sebuah kata
Quintec
@ thecoder16 quadruplicate, quintuplicate, ..., decuplicate
Magic Octopus Urn
Wow. Saya ragu dengan non-duplikasi, tetapi ada seperti yang lainnya. Tentu saja kami memiliki kata-kata yang tidak berguna dalam Bahasa Inggris xD
Quintec
1
@KevinCruijssen Hei, permintaan maaf untuk semua balasan terlambat, sudah sangat sibuk bagi saya beberapa minggu terakhir (saya hanya berhasil mendapatkan 8 jam tidur selama 72 jam terakhir haha) jadi saya tidak berpikir saya bisa melakukan apa pun sekarang, tapi jangan ragu untuk menambahkannya ke halaman ujung jika Anda mau.
Adnan
6

Arang , 17 15 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukan n.

P×θA

Cetak bilah horizontal besar A. (Untuk bilangan genap, n+1toh tumpang tindih dengan sisi kanan.)

M⊘θ↗

Pindah ke atas yang besar A.

P^×θA

Cetak kedua sisi besar A.

Neil
sumber
4

Python 2 , 80 byte

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

Cobalah online!

Membagi output yang diinginkan ke dalam spasi putih kiri, spasi Aditambah kiri atau tengah A, dan kanan A. Hitung bagian tengah menggunakan slicing pada string yang tetap. Ini memungkinkan untuk menggunakan cara yang sama untuk menghasilkan baris pertama.

Bubbler
sumber
4

Stax , 15 byte

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

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, programnya terlihat seperti ini.

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)

Jalankan yang ini

rekursif
sumber
4

JavaScript (ES6), 77 byte

Kode sumber ini memiliki bentuk persegi panjang ! Oh tunggu ... tantangan yang salah: - /

f=(n,k=n>>1,p='A')=>--n?f(n,k,' '+p)+`
${p}${(k-n?' ':'A').repeat(n*2-1)}A`:p

Cobalah online!

Arnauld
sumber
4

Python 3.6 , 79 byte atau 73 byte

Menggunakan f-string untuk meluruskan bagian horizontal surat:

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

Dengan yang \bdigunakan untuk menghapus satu A(mungkin curang):

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

Java (JDK 10) , 124 byte

n->{var a=new char[n][n+n-1];for(int c=n,r;c-->0;)for(r=n;r-->0;)a[r][n+n-c-2]=a[r][c]+=r==n/2&c>=r|r==n+~c?65:32;return a;}

Cobalah online!

Olivier Grégoire
sumber
3

J , 65 byte

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

Cobalah online!

Itu bisa dikurangi kira-kira. 12 byte hanya dengan membuat kata kerja diam-diam, tapi saya punya masalah melakukannya.

Penjelasan:

3 : '...' menunjukkan sebuah kata kerja satu-baris eksplisit

y adalah argumennya

=/~@i. menciptakan matriks identitas dengan ukuran argumen

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

([:(}:@|."1,.]) menambahkan matriks identitas dengan salinan cerminnya dengan elemen terakhir dari setiap baris yang dijatuhkan.

    ]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(...)}(...) berubah menjadi 1 posisi dalam argumen kanannya, dipilih oleh yang kiri

([:(<@;]+i.@+:)<.@-:) - menyiapkan seleksi dengan melakukan hal berikut:

               <.@-: - 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'{~ membuat spasi di tempat 0 dan 'A' di mana ada 1

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

Ruby , 66 byte

->n{(0...n).map{|i|(s=(i==n/2??A:?\s)*2*i+?A)[0]=?A;?\s*(n+~i)+s}}

Cobalah online!

Kembali sebagai array garis

Kirill L.
sumber
2

SOGL V0.12 , 12 byte

 A*:╚╥≤.»I:ž

Coba Di Sini!

Penjelasan:

 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
dzaima
sumber
2

Japt -R , 20 19 byte

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

Cobalah


Penjelasan

                        :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

Alternatif

(Dengan harapan hal itu dapat membantu saya menemukan penghematan!)

Æ'AúXÄ" A"gX¶Uz¹êÃû
Shaggy
sumber
1
Alternatif lain yang lebih lama satu byte:ç h'AUz)¬íp ®i'A êÃû
ETHproduk
@ ETHproductions Ganti p dengan ²dan juga 19 byte
Shaggy
+1 jauh lebih baik daripada keburukan saya .
Oliver
1

Ruby , 73 byte

->n{(0...n).map{|i|(?A.ljust(i*2,i==n/2??A:' ')+(i>0??A:'')).center n*2}}

Cobalah online!

Asone Tuhid
sumber
1

Jelly , 23 20 19 18 byte

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

Cobalah online!

=þ`menciptakan matriks ukuran identitas n.

L‘HĊƲmenemukan indeks baris bilah horizontal dengan ¦memilih baris itu dan menerapkannya o\yang membuat bilah.

Umembalikkan setiap baris sehingga kita tidak memiliki terbalik "A" dan ŒB(palindromize; vectorizes) membuat paruh kedua "A".

ị⁾A(dengan spasi yang dipangkas dalam format) menggantikan 0s dengan spasi dan 1s dengan As.

dylnan
sumber
1

T-SQL , 182 177 byte

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

Versi pertama (dengan 182 byte):

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

Versi di atas berfungsi hingga @ n = 9.

Ini adalah versi lain, yang berfungsi hingga @ n = 23, tetapi memiliki 2 byte tambahan:

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

Tidak Terkumpul:

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
Razvan Socol
sumber
1

Haskell , 98 97 95 byte dan 109 byte

Dua pendekatan yang sangat berbeda. Pertama (95 byte):

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

dan kedua (109 byte):

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

Coba di sini! ; Coba versi modifikasi di sini!

Coba versi ketiga di sini!

Radek
sumber
Selamat datang di PPCG! Anda dapat menyimpan byte pada pendekatan pertama Anda dengan mendefinisikan lsebagai operator infiks .
Laikoni
m True='A'disingkat menjadi m b|b='A'.
Laikoni
Ternyata bahkan dua byte dapat disimpan. Terima kasih! :)
Radek
1

Python 2 , 70 byte atau 65 byte

Daftar string adalah hasil yang dapat diterima, seperti yang dikatakan @Budd dalam komentar.

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

Cobalah online!


Solusi yang tampaknya curang, menggunakan \b. Itu terlihat funky di TIO, di konsol itu melakukan pekerjaan.

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

Cobalah online!

Possum Mati
sumber
0

Javascript, 124 byte

Solusi yang cukup naif, mencobanya untuk melatih keterampilan 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)){}

Dibongkar

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)){}
Budd
sumber
0

Python 3 , 93 , 88 byte

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

Cobalah online!

-3 oleh @ovs menggunakan f-string

Rick Rongen
sumber