Wieże Eiffla: Stwórz duże „A” z „A”

20

Utwórz funkcję, która przy danej liczbie wierszy ntworzy bigA.

  • Poziomy pasek bigAmusi znajdować się w środkowym rzędzie lub niższym z dwóch, jeśli njest parzysty
  • Załóż wyjściową czcionkę monospace

Dane wyjściowe powinny być ciągiem znaków (lub podobnym, np. Tablicą znaków) z wyraźnymi podziałami linii, aby rozbić linie, oraz z prawidłową spacją dla marginesów po lewej stronie (możesz założyć, że \ t to 4 spacje). Po prawej stronie może znajdować się dowolna biała spacja.

Przykłady

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

Jest to inspirowane przez Utwórz literę „H” z mniejszych liter „H”

Budd
źródło
Czy mogę dodać spację po prawej stronie? Czy dozwolony jest także znak nowej linii?
Bubbler
@Bubbler, Wszelkie białe znaki po prawej stronie są w porządku, nie ma jednak końca nowej linii
Budd
Czy wolno nam zwracać tablice znaków 2D zamiast ciągów? (wskazówka: zazwyczaj zaleca się zezwolić na dowolny rodzaj wyników)
Olivier Grégoire
1
@ OlivierGrégoire Pewnie, o ile istnieje wyraźna przerwa dla linii (np. Element „\ n”, tablice zagnieżdżone)
Budd
1
@TonHospel, Nie, to naprawdę pokonuje celowość tego
Budd

Odpowiedzi:

12

05AB1E , 13 bajtów

Kod:

Ð;î¹)'A1376SΛ

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie:

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

Brezentowy

Powinienem chyba trochę więcej dokumentować płótno (i wiele innych funkcji), ale to w zasadzie podsumowuje. Kanwa ma różne „tryby” w zależności od podanych typów parametrów. Polecenie canvas ma trzy parametry: <długość> <ciąg> <kierunek> .

Ponieważ parametry długości i kierunku są listami, „zamyka” te listy, aby utworzyć zestaw instrukcji do wykonania. Parametr ciągu to tylko litera A , więc jest to znak wypełnienia używany przez wszystkie instrukcje. Kanwa interpretuje to jako następujący zestaw instrukcji (dla danych wejściowych 7):

  • Narysuj linię o długości 7 sznurkiem A w kierunku
  • Narysuj linię o długości 7 sznurkiem A w kierunku
  • Narysuj linię o długości 4 sznurkiem A w kierunku
  • Narysuj linię o długości 7 sznurkiem A w kierunku

Wskazówki są tłumaczone w następujący sposób:

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

Jeśli nic nie zostało wyprowadzone, 05AB1E automatycznie wysyła wynik płótna.

Adnan
źródło
1
Dziękuję bardzo za objaśnienie płótna, to genialna funkcja :-)
Kaldo
Trójka
@ thecoder16 quadruplicate, quintuplicate, ..., decuplicate
Magic Octopus Urn
Łał. Wątpiłem w nieuplikację, ale istnieje tak, jak wszyscy inni. Oczywiście mamy takie bezużyteczne słowa w języku angielskim xD
Quintec
1
@KevinCruijssen Hej, przepraszam za wszystkie spóźnione odpowiedzi, przez ostatnie kilka tygodni byłem niesamowicie zajęty (udało mi się tylko 8 godzin snu w ciągu ostatnich 72 godzin haha), więc nie sądzę, że jestem w stanie to zrobić cokolwiek teraz, ale jeśli chcesz, możesz dodać je do strony ze wskazówkami.
Adnan
6

Węgiel drzewny , 17 15 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Wejście n.

P×θA

Wydrukuj poziomy pasek dużego A. (W przypadku liczb parzystych n+1th i tak zachodzi na prawą stronę.)

M⊘θ↗

Przejdź na szczyt dużej A.

P^×θA

Wydrukuj obie strony dużego A.

Neil
źródło
4

Python 2 , 80 bajtów

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

Wypróbuj online!

Podziel pożądany wynik na lewą białą spację, lewą Aplus środkową białą spację lub As i prawą A. Oblicz środkową część za pomocą krojenia na stałym sznurku. Pozwala to użyć tego samego sposobu do wygenerowania pierwszej linii.

Bubbler
źródło
4

Stax , 15 bajtów

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

Uruchom i debuguj

Program po rozpakowaniu, niepolowaniu i komentowaniu wygląda tak.

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)

Uruchom ten

rekurencyjny
źródło
4

Python 3.6 , 79 bajtów lub 73 bajty

Używanie ciągów F do wyrównywania poziomych części litery:

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

Z \bsłuży do usuwania jednego A(ewentualnie oszustwo):

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

J , 65 bajtów

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

Wypróbuj online!

Można go zmniejszyć o ok. 12 bajtów, po prostu czyniąc czasownik milczącym, ale mam problemy z tym.

Wyjaśnienie:

3 : '...' oznacza jednoznaczny czasownik jednowierszowy

y jest argumentem

=/~@i. tworzy macierz tożsamości z rozmiarem argumentu

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

([:(}:@|."1,.]) wstawia macierz tożsamości z kopią lustrzaną, porzucając ostatnie elementy każdego rzędu.

    ]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(...)}(...) zmienia na 1 pozycje w prawym argumencie, wybrane przez lewy

([:(<@;]+i.@+:)<.@-:) - przygotowuje wybór, wykonując następujące czynności:

               <.@-: - 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'{~ renderuje spację w miejscach 0 i „A”, gdzie jest 1

    ' A'{~1(([:(<@;]+i.@+:)<.@-:) 4)}a
   A   
  A A  
 AAAAA 
A     A
Galen Iwanow
źródło
2

Rubin , 66 bajtów

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

Wypróbuj online!

Zwraca jako tablica linii

Kirill L.
źródło
2

SOGL V0.12 , 12 bajtów

 A*:╚╥≤.»I:ž

Wypróbuj tutaj!

Wyjaśnienie:

 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
źródło
2

Japt -R , 20 19 bajtów

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

Spróbuj


Wyjaśnienie

                        :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

Alternatywny

(Mam nadzieję, że może mi to pomóc w znalezieniu oszczędności!)

Æ'AúXÄ" A"gX¶Uz¹êÃû
Kudłaty
źródło
1
Kolejna alternatywa, która jest bajtem dłuższa:ç h'AUz)¬íp ®i'A êÃû
ETHprodukcje
@ETHproductions Wymień p ze ²i to również 19 bajtów.
Kudłaty
+1 o wiele lepiej niż moja potworność .
Oliver,
1

Galaretka , 23 20 19 18 bajtów

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

Wypróbuj online!

=þ`tworzy matrycę tożsamości wielkości n.

L‘HĊƲznajduje indeks wiersza poziomego paska z ¦wybraniem tego wiersza i zastosowaniem o\go do tego, który tworzy pasek.

Uodwraca każdy wiersz, więc nie mamy odwróconego „A” i ŒB(palindromize; wektoryzacja) tworzy drugą połowę „A”.

ị⁾A(ze spacją, która jest przycinana w formatowaniu) zastępuje 0s spacjami is 1s As.

dylnan
źródło
1

T-SQL , 182 177 bajtów

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

Pierwsza wersja (z 182 bajtami):

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

Powyższa wersja działa do @ n = 9.

Oto kolejna wersja, która działa do @ n = 23, ale ma 2 dodatkowe bajty:

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

Nie golfowany:

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
źródło
1

Haskell , 98 97 95 bajtów i 109 bajtów

Dwa bardzo różne podejścia. Pierwszy (95 bajtów):

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

i drugi (109 bajtów):

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

Wypróbuj je tutaj! ; Wypróbuj zmodyfikowaną wersję tutaj!

Wypróbuj trzecią wersję tutaj!

Radek
źródło
Witamy w PPCG! Możesz zapisać bajt przy pierwszym podejściu, definiując ljako operator infix .
Laikoni
m True='A'zostać skróconym do m b|b='A'.
Laikoni,
Okazało się, że można zapisać nawet dwa bajty. Dzięki! :)
Radek
1

Python 2 , 70 bajtów lub 65 bajtów

Lista ciągów jest akceptowalnym wynikiem, jak @Budd stwierdził w komentarzach.

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

Wypróbuj online!


Pozornie oszukańcze rozwiązanie, za pomocą \b. Wygląda funky w TIO, w konsoli robi to samo.

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

Wypróbuj online!

Dead Possum
źródło
0

JavaScript, 124 bajty

Dość naiwne rozwiązanie dało szansę na ćwiczenie umiejętności 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)){}

Rozpakowane

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
źródło
0

Python 3 , 93 , 88 bajtów

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

Wypróbuj online!

-3 przez @ovs za pomocą f-string

Rick Rongen
źródło