Tháp Eiffel: Tạo ra một khu vực lớn của người A-đô-la


20

Tạo một hàm cho một số dòng n, tạo một bigA.

  • Thanh ngang bigAphải ở hàng giữa hoặc thấp hơn của hai nếu nlà chẵn
  • Giả sử một phông chữ đơn cách cho đầu ra

Đầu ra phải là một chuỗi (hoặc tương tự, ví dụ mảng ký tự) với các ngắt dòng rõ ràng để phá vỡ các dòng và với khoảng trắng chính xác cho phần đệm bên trái (bạn có thể giả sử \ t là 4 khoảng trắng). Có thể có bất kỳ khoảng trắng bên phải.

Ví dụ

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

Điều này được lấy cảm hứng từ Tạo một "H" từ các chữ "H" nhỏ hơn


Tôi có thể thêm khoảng trắng vào phía bên phải không? Ngoài ra, theo dõi dòng mới được phép?
Bong bóng

@Bubbler, Bất kỳ khoảng trắng nào ở phía bên phải đều ổn, mặc dù không có dòng mới nào
Budd

Chúng ta có được phép trả về mảng ký tự 2D thay vì chuỗi không? (gợi ý: thường được khuyến nghị cho phép bất kỳ loại đầu ra nào)
Olivier Grégoire

1
@ OlivierGrégoire Chắc chắn, miễn là có sự ngắt quãng rõ ràng cho các dòng (ví dụ: phần tử "\ n", mảng lồng nhau)
Budd

1
@TonH Phúc, Không, điều đó thực sự đánh bại mục đích của việc này
Budd

Câu trả lời:


12

05AB1E , 13 byte

Mã số:

Ð;î¹)'A1376SΛ

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình:

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

Tranh sơn dầu

Tôi có lẽ nên ghi lại khung vẽ thêm một chút nữa (và rất nhiều chức năng khác), nhưng về cơ bản, nó tổng hợp lại. Canvas có các 'chế độ' khác nhau dựa trên các loại tham số đã cho. Lệnh canvas có ba tham số: <length> <string> <direction> .

Vì các tham số độ dài và hướng là các danh sách, nên các danh sách này sẽ tạo ra một tập hợp các hướng dẫn sẽ được thực thi. Tham số chuỗi chỉ là chữ A , vì vậy đây là ký tự điền được sử dụng bởi tất cả các hướng dẫn. Canvas giải thích điều này như một bộ hướng dẫn sau (cho đầu vào 7):

  • Vẽ một đường có độ dài 7 với chuỗi Một theo hướng
  • Vẽ một đường có độ dài 7 với chuỗi Một theo hướng
  • Vẽ một đường có độ dài 4 với chuỗi Một theo hướng
  • Vẽ một dòng có độ dài 7 với chuỗi A theo hướng

Các hướng được dịch theo cách sau:

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

Nếu không có gì được xuất ra, 05AB1E sẽ tự động xuất kết quả canvas.


1
Cảm ơn bạn rất nhiều vì lời giải thích về khung vẽ, đó là một tính năng tuyệt vời :-)
Kaldo 23/03/18

TIL triplicate là một từ
Quintec

@ thecoder16 tăng gấp bốn lần, quint trùng lặp, ..., lặp lại
Bạch tuộc ma thuật Urn

Ồ Tôi đã nghi ngờ về sự không trùng lặp, nhưng nó tồn tại như tất cả những người khác làm. Tất nhiên chúng ta có những từ vô dụng như vậy trong tiếng Anh xD
Quintec 26/03/18

1
@KevinCruijssen Này, xin lỗi vì tất cả những câu trả lời trễ, tôi đã rất bận rộn trong vài tuần qua (tôi chỉ có được 8 giờ ngủ trong 72 giờ qua haha) vì vậy tôi không nghĩ mình có thể làm được bất cứ điều gì ngay bây giờ, nhưng hãy thoải mái thêm nó vào trang mẹo nếu bạn muốn.
Ad Nam

6

Than , 17 15 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Đầu vào n.

P×θA

In thanh ngang của lớn A. (Đối với các số chẵn, n+1dù sao thì phần này sẽ chồng lên phía bên phải.)

M⊘θ↗

Di chuyển đến đỉnh của lớn A.

P^×θA

In cả hai mặt lớn A.


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

Hãy thử trực tuyến!

Chia đầu ra mong muốn vào khoảng trắng bên trái, bên trái Acộng với khoảng trắng giữa hoặc As và bên phải A. Tính toán phần giữa bằng cách cắt trên một chuỗi cố định. Điều này cho phép sử dụng cùng một cách để tạo dòng đầu tiên.


4

Stax , 15 byte

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

Chạy và gỡ lỗi nó

Giải nén, không ghi chú và nhận xét, chương trình trông như thế này.

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)

Chạy cái này



4

Python 3.6 , 79 byte hoặc 73 byte

Sử dụng chuỗi f để căn chỉnh các phần ngang của chữ cái:

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

Được \bsử dụng để xóa một A(có thể gian lận):

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


3

J , 65 byte

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

Hãy thử trực tuyến!

Nó có thể được giảm khoảng 12 byte bằng cách đơn giản làm cho động từ ngầm, nhưng tôi có vấn đề khi thực hiện nó.

Giải trình:

3 : '...' biểu thị một động từ một lớp rõ ràng

y là đối số

=/~@i. tạo một ma trận danh tính với kích thước đối số

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

([:(}:@|."1,.]) chuẩn bị ma trận danh tính với bản sao nhân bản của nó với các phần tử cuối cùng của mỗi hàng được thả.

    ]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(...)}(...) thay đổi thành 1 vị trí trong đối số bên phải của nó, được chọn bởi bên trái

([:(<@;]+i.@+:)<.@-:) - chuẩn bị lựa chọn bằng cách làm như sau:

               <.@-: - 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'{~ biểu hiện một khoảng trắng ở vị trí 0 và 'A' trong đó có 1

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



2

SOGL V0.12 , 12 byte

 A*:╚╥≤.»I:ž

Hãy thử nó ở đây!

Giải trình:

 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

Japt -R , 20 19 byte

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

Thử nó


Giải trình

                        :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

Thay thế

(Với hy vọng nó có thể giúp tôi phát hiện ra một số tiền tiết kiệm!)

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

1
Một thay thế khác dài hơn một byte:ç h'AUz)¬íp ®i'A êÃû
ETHproductions 23/03/18

@ETHproductions Thay thế p bằng ²và nó cũng 19 byte.
Xù xì

+1 cách tốt hơn sự quái dị của tôi .
Oliver


1

Thạch , 23 20 19 18 byte

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

Hãy thử trực tuyến!

=þ`tạo ra một ma trận nhận dạng kích thước n.

L‘HĊƲtìm chỉ số hàng của thanh ngang bằng cách ¦chọn hàng đó ra và áp dụng o\cho nó tạo ra thanh đó.

Uđảo ngược mỗi hàng để chúng ta không có chữ "A" lộn ngược và ŒB(palindromize; vectorizes) tạo ra nửa sau của chữ "A".

ị⁾A(với một 0khoảng trắng được cắt theo định dạng) thay thế s bằng khoảng trắng và 1s bằng As.


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

Phiên bản đầu tiên (với 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

Phiên bản trên hoạt động lên đến @ n = 9.

Đây là một phiên bản khác, hoạt động tới @ n = 23, nhưng có thêm 2 byte:

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

Ung dung:

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

Haskell , 98 97 95 byte và 109 byte

Hai cách tiếp cận rất khác nhau. Đầu tiên (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]]

và thứ hai (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]]

Hãy thử chúng ở đây! ; Hãy thử phiên bản sửa đổi ở đây!

Hãy thử phiên bản thứ ba tại đây!


Chào mừng đến với PPCG! Bạn có thể lưu một byte theo cách tiếp cận đầu tiên của mình bằng cách định nghĩa llà toán tử infix .
Laikoni

m True='A'một được rút ngắn lại m b|b='A'.
Laikoni

Nó chỉ ra rằng thậm chí hai byte có thể được lưu. Cảm ơn! :)
Radek

1

Python 2 , 70 byte hoặc 65 byte

Danh sách các chuỗi là kết quả chấp nhận được, như @Budd đã nêu trong các bình luận.

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

Hãy thử trực tuyến!


Dường như giải pháp gian lận, sử dụng \b. Nó trông thú vị trong TIO, trong giao diện điều khiển nó thực hiện công việc.

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

Hãy thử trực tuyến!


0

Javascript, 124 byte

Một giải pháp khá ngây thơ, đã cho nó một shot để thực hành các kỹ năng 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)){}

Giải nén

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)){}


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.