Ейфелева вежа: Створіть велике “A” з “A” s


20

Створення функції, яка задала ряд рядків n, робить a bigA.

  • Горизонтальна смуга bigAмає бути в середньому ряду, або нижня з двох, якщо nрівна
  • Припустимо для виведення шрифт монопростір

Вихід повинен бути рядком (або подібним, наприклад, масив символів) з чіткими розривами рядків для розбиття рядків та з правильним пробілом для накладення ліворуч (можна вважати, що \ 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" s


Чи можу я додати пробіл у правій частині? Крім того, чи дозволений новий рядок?
Бубон

@Bubbler, Будь-який пробіл праворуч - це добре, але жодна лінія нового рядка не буває
Budd

Чи дозволяється нам повертати двовимірні масиви замість рядків? (натяк: зазвичай рекомендується дозволити будь-який вихід)
Олів'є Грегоар

1
@ OlivierGrégoire Звичайно, якщо існує чітка перерва для рядків (наприклад, "\ n" елемент, вкладені масиви)
Budd

1
@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 має три параметри: <length> <string> <direct> .

Оскільки параметри довжини та напрямку є списками, вони "перебирають" ці списки, щоб створити набір інструкцій, які потрібно виконати. Параметр рядка - це лише буква А , тому цей символ заповнення використовується всіма інструкціями. Полотно трактує це як наступний набір інструкцій (для введення 7):

  • Накресліть лінію довжиною 7 за допомогою рядка A у напрямку
  • Накресліть лінію довжиною 7 за допомогою рядка A у напрямку
  • Накресліть лінію довжиною 4 за допомогою рядка А у напрямку
  • Накресліть лінію довжиною 7 за допомогою рядка А у напрямку

Вказівки перекладаються таким чином:

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

Якщо нічого не виведено, 05AB1E автоматично виводить результат полотна.


1
Дуже дякую за пояснення на полотні, це геніальна особливість :-)
Калдо


@ thecoder16 четвірна копія, квінтюплікація, ..., розв'язування
Чарівна восьминіжка Урна,

Ого. Я не сумнівався в неподатливості, але вона існує, як і всі інші. Звичайно, у нас є такі непотрібні слова англійською мовою xD
Quintec,

1
@KevinCruijssen Ей, вибачте за всі пізні відповіді, мені було надзвичайно зайнято останні кілька тижнів (мені вдалося заснути 8 годин сну останні 72 години ха-ха), тому я не думаю, що я в змозі це зробити будь-що зараз, але сміливо додайте його на підказку, якщо хочете.
Аднан

6

Вугілля деревне , 17 15 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Вхідні дані n.

P×θA

Роздрукуйте горизонтальну смужку великого A. (Для парних чисел число n+1все одно перекриває праву сторону.)

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

З \bвикористовується для видалення одного 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 : '...' позначає явне однослівне дієслово

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

Japt -R , 20 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
Ще один заступник, який є байтом довше:ç h'AUz)¬íp ®i'A êÃû
ETHproductions

@ETHproductions Замініть p на, ²і це також 19 байт.
Shaggy

+1 шлях краще, ніж моє чудовисько .
Олівер


1

Желе , 23 20 19 18 байт

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

Спробуйте в Інтернеті!

=þ` створює ідентифікаційну матрицю розміру n .

L‘HĊƲ знаходить індекс рядка горизонтальної смуги с ¦ вибираючи цей рядок і застосовуючи йогоo\ до нього, що створює панель.

U перевертає кожен ряд, щоб у нас не було перевернутих "A" і " ŒB (паліндромізувати; векторизується) складає другу половину "A".

ị⁾A(з пробілом, який обробляється у форматуванні) замінює 0s пробілами, а 1s - As.


1

T-SQL , 182 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

Haskell , 98 97 95 байт і 109 байт

Два дуже різні підходи. Перший (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]]

і друге (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]]

Спробуйте їх тут! ; Спробуйте модифіковану версію тут!

Спробуйте третю версію тут!


Ласкаво просимо до PPCG! Ви можете зберегти байт при першому підході, визначивши його lяк оператор інфіксації .
Лайконі

m True='A'бути скороченим до m b|b='A'.
Лайконі

Виявилося, що навіть два байти можна зберегти. Спасибі! :)
Радек

1

Пітон 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)){}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.