Eiffeltürme: Erstellen Sie ein großes "A" aus "A"

20

Erstellen Sie eine Funktion, die bei einer bestimmten Anzahl von Zeilen na bigA.

  • Die horizontale Leiste von bigAmuss sich in der mittleren Reihe befinden, oder die untere der beiden, wenn sie gerade nist
  • Nehmen Sie eine Monospace-Schriftart für die Ausgabe an

Die Ausgabe sollte aus einer Zeichenfolge (oder einer ähnlichen Zeichenfolge, z. B. einem Zeichenarray) mit klaren Zeilenumbrüchen zum Aufbrechen der Zeilen und einem korrekten Leerzeichen für das Auffüllen nach links bestehen (Sie können davon ausgehen, dass es sich bei \ t um 4 Leerzeichen handelt). Auf der rechten Seite kann ein Leerzeichen stehen.

Beispiele

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

Dies ist inspiriert durch Erstellen eines "H" aus kleineren "H"

Budd
quelle
Darf ich auf der rechten Seite Leerzeichen einfügen? Darf auch ein Zeilenumbruch erfolgen?
Bubbler
@Bubbler, Alle Leerzeichen auf der rechten Seite sind in Ordnung, aber keine nachgestellten Zeilenumbrüche
Budd
Dürfen wir 2D-Zeichenfelder anstelle von Zeichenfolgen zurückgeben? (Hinweis: Es wird normalerweise empfohlen, jede Art von Ausgabe zuzulassen)
Olivier Grégoire
1
@ OlivierGrégoire Sicher, solange die Zeilen deutlich unterbrochen sind (z. B. ein "\ n" -Element, verschachtelte Arrays)
Budd
1
@TonHospel, Nein, das macht dem Geld nichts aus
Budd

Antworten:

12

05AB1E , 13 Bytes

Code:

Ð;î¹)'A1376SΛ

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Erläuterung:

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

Segeltuch

Ich sollte die Zeichenfläche wahrscheinlich ein bisschen mehr dokumentieren (und viele andere Funktionen), aber das fasst es im Grunde zusammen. Die Zeichenfläche verfügt über verschiedene "Modi", die auf den angegebenen Parametertypen basieren. Der Canvas-Befehl verfügt über drei Parameter: <Länge> <Zeichenfolge> <Richtung> .

Da es sich bei den Längen- und Richtungsparametern um Listen handelt, werden diese Listen komprimiert, um einen Satz auszuführender Anweisungen zu erstellen. Der string-Parameter ist nur der Buchstabe A , dies ist also das Füllzeichen, das von allen Anweisungen verwendet wird. Die Zeichenfläche interpretiert dies als folgenden Befehlssatz (für Eingabe 7):

  • Zeichnen Sie eine Linie der Länge 7 mit der Schnur A in Richtung
  • Zeichnen Sie eine Linie der Länge 7 mit der Schnur A in Richtung
  • Zeichnen Sie eine Linie der Länge 4 mit der Schnur A in Richtung
  • Zeichnen Sie eine Linie der Länge 7 mit der Zeichenfolge A in Richtung

Die Anweisungen werden folgendermaßen übersetzt:

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

Wenn nichts ausgegeben wurde, gibt 05AB1E das Canvas-Ergebnis automatisch aus.

Adnan
quelle
1
Vielen Dank für die Leinwand Erklärung, das ist ein brillantes Feature :-)
Kaldo
TIL dreifach ist ein Wort
Quintec
@ thecoder16 vervierfachen, verfünffachen, ..., vervierfachen
Magic Octopus Urn
Wow. Ich bezweifelte, dass es sich nicht um ein Duplikat handelt, aber es existiert wie alle anderen auch. Natürlich haben wir solche nutzlosen Wörter auf Englisch xD
Quintec
1
@KevinCruijssen Hey, entschuldige mich für die späten Antworten. Ich habe in den letzten Wochen unglaublich viel zu tun gehabt (ich habe in den letzten 72 Stunden nur 8 Stunden Schlaf geschafft, haha), also glaube ich nicht, dass ich das kann Momentan noch nichts, aber Sie können es jederzeit der Tipp-Seite hinzufügen, wenn Sie möchten.
Adnan
6

Charcoal , 17 15 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

Nθ

Eingabe n.

P×θA

Drucken Sie die horizontale Leiste des großen A. (Bei geraden Zahlen n+1überlappt das th ohnehin die rechte Seite.)

M⊘θ↗

Bewegen Sie sich an die Spitze des großen A.

P^×θA

Bedrucken Sie beide Seiten des großen A.

Neil
quelle
4

Python 2 , 80 Bytes

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

Probieren Sie es online!

Teilen Sie die gewünschte Ausgabe in das linke Leerzeichen, das linke Aplus das mittlere Leerzeichen oder As und das rechte A. Berechnen Sie den mittleren Teil, indem Sie eine feste Zeichenfolge aufschneiden. Auf diese Weise können Sie die erste Zeile auf dieselbe Weise generieren.

Bubbler
quelle
4

Stax , 15 Bytes

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

Führen Sie es aus und debuggen Sie es

Entpackt, ungolfed und kommentiert sieht das Programm so aus.

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)

Führen Sie dieses aus

rekursiv
quelle
4

JavaScript (ES6), 77 Byte

Dieser Quellcode hat eine rechteckige Form ! Oh warte ... falsche Herausforderung: - /

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

Probieren Sie es online!

Arnauld
quelle
4

Python 3.6 , 79 Bytes oder 73 Bytes

Verwenden von F-Strings zum Ausrichten horizontaler Buchstabenteile:

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

Mit \bverwendet, um eine zu löschen A(möglicherweise Betrug):

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

J , 65 Bytes

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

Probieren Sie es online!

Es kann um ca. 12 Bytes, indem Sie einfach das Verb tacit machen, aber ich habe Probleme, es zu tun.

Erläuterung:

3 : '...' bezeichnet ein explizites einzeiliges Verb

y ist das Argument

=/~@i. Erstellt eine Identitätsmatrix mit der Größe des Arguments

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

([:(}:@|."1,.]) Stellt der Identitätsmatrix ihre Spiegelkopie voran, wobei die letzten Elemente jeder Zeile abgelegt werden.

    ]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(...)}(...) ändert die Positionen in seinem rechten Argument auf 1, ausgewählt durch die linke

([:(<@;]+i.@+:)<.@-:) - bereitet die Auswahl folgendermaßen vor:

               <.@-: - 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'{~ Gibt ein Leerzeichen an den Stellen 0 und 'A' aus, an denen 1 steht

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

Ruby , 66 Bytes

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

Probieren Sie es online!

Gibt als Array von Zeilen zurück

Kirill L.
quelle
2

SOGL V0.12 , 12 Bytes

 A*:╚╥≤.»I:ž

Probieren Sie es hier aus!

Erläuterung:

 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
quelle
2

Japt -R , 20 bis 19 Bytes

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

Versuch es


Erläuterung

                        :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

Alternative

(In der Hoffnung, dass es mir helfen könnte, einige Einsparungen zu finden!)

Æ'AúXÄ" A"gX¶Uz¹êÃû
Zottelig
quelle
1
Eine weitere Alternative, die ein Byte länger ist:ç h'AUz)¬íp ®i'A êÃû
ETHproductions
@ETHproductions Ersetzen p durch ²und es sind auch 19 Bytes.
Shaggy
+1 viel besser als meine Monstrosität .
Oliver
1

Jelly , 23 20 19 18 Bytes

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

Probieren Sie es online!

=þ`Erstellt eine Identitätsmatrix der Größe n.

L‘HĊƲFindet den Zeilenindex der horizontalen Leiste, wobei ¦diese Zeile ausgewählt und o\auf diese angewendet wird , wodurch die Leiste erstellt wird.

UKehrt jede Zeile um, damit wir kein umgedrehtes "A" haben, und ŒB(palindromize; vectorizes) macht die zweite Hälfte des "A".

ị⁾A(mit einem Leerzeichen, das in der Formatierung abgeschnitten wird) ersetzt 0s durch Leerzeichen und 1s durch As.

dylnan
quelle
1

T-SQL , 182 177 Bytes

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

Erste Version (mit 182 Bytes):

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

Die obige Version funktioniert bis zu @ n = 9.

Hier ist eine andere Version, die bis zu @ n = 23 funktioniert, aber 2 zusätzliche Bytes hat:

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

Ungolfed:

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
quelle
1

Haskell , 98 97 95 Bytes und 109 Bytes

Zwei sehr unterschiedliche Ansätze. Erste (95 Bytes):

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

und Sekunde (109 Bytes):

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

Probieren Sie sie hier aus! ; Probieren Sie hier eine geänderte Version aus!

Versuchen Sie die dritte Version hier!

Radek
quelle
Willkommen bei PPCG! Sie können ein Byte bei Ihrer ersten Annäherung speichern, indem Sie lals Infix-Operator definieren .
Laikoni
m True='A'verkürzt werden auf m b|b='A'.
Laikoni
Es stellte sich heraus, dass sogar zwei Bytes gespeichert werden konnten. Vielen Dank! :)
Radek
1

Python 2 , 70 Bytes oder 65 Bytes

Liste der Zeichenfolgen ist akzeptables Ergebnis, wie @Budd in Kommentaren angegeben.

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

Probieren Sie es online!


Scheinbar betrügerische Lösung mit \b. In TIO sieht es irre aus, in der Konsole macht es den Job.

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

Probieren Sie es online!

Totes Opossum
quelle
0

Javascript, 124 Bytes

Eine ziemlich naive Lösung, es gab einen Versuch, seine Fähigkeiten zu üben.

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

Unverpackt

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
quelle
0

Python 3 , 93 , 88 Bytes

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

Probieren Sie es online!

-3 von @ovs mit f-string

Rick Rongen
quelle