Эйфелева башня: создайте большой «А» из «А» с


20

Создайте функцию, которая с учетом количества строк n, делает bigA.

  • Горизонтальная полоса bigAдолжна быть в среднем ряду, или нижняя из двух, если nчетная
  • Предположим, моноширинный шрифт для вывода

Выходные данные должны быть строкой (или аналогичной, например, массив символов) с четкими переносами строк, чтобы разбить строки, и с правильными пробелами для заполнения слева (вы можете считать \ t равным 4 пробелам). Там может быть любой пробел справа.

Примеры

n = 1

A

п = 2

 A
AAA

n = 3

  A
 AAA
A   A

n = 4

   A
  A A
 AAAAA
A     A

п = 5

    A
   A A
  AAAAA
 A     A
A       A

Это вдохновлено созданием буквы "H" из меньших букв "H".


Могу ли я добавить пробелы с правой стороны? Кроме того, разрешен ли трейлинг новой строки?
Bubbler

@Bubbler, Любой пробел с правой стороны - это нормально, хотя нет и новой строки
Бадд,

Разрешено ли возвращать двухмерные символьные массивы вместо строк? (подсказка: обычно рекомендуется разрешать любые результаты)
Оливье Грегуар

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 имеет три параметра: <длина> <строка> <направление> .

Так как параметры длины и направления являются списками, эти списки «сжаты» для создания набора инструкций, которые должны быть выполнены. Строковый параметр - это просто буква A , поэтому это символ заполнения, используемый всеми инструкциями. Холст интерпретирует это как следующий набор инструкций (для ввода 7):

  • Нарисуйте линию длиной 7 со строкой A в направлении
  • Нарисуйте линию длиной 7 со строкой A в направлении
  • Нарисуйте линию длиной 4 со строкой A в направлении
  • Нарисуйте линию длиной 7 со строкой A в направлении

Направления переводятся следующим образом:

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

Если ничего не было выведено, 05AB1E автоматически выводит результат холста.


1
Большое спасибо за объяснение холста, это замечательная особенность :-)
Kaldo

Тройной экземпляр TIL - это слово
Quintec

@ thecoder16 Четырехкратный, пятикратный, ..., дублированный
Магический Осьминог Урна

Вау. Я сомневался в неповторимости, но он существует, как и все остальные. Конечно, у нас есть такие бесполезные слова на английском xD
Quintec

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

6

Древесный уголь , 17 15 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Nθ

Вход n.

P×θA

Распечатать горизонтальную полосу большого A. (Для четных чисел n+1th в любом случае перекрывает правую сторону.)

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

Stax , 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 байтов.
Лохматый

+1 намного лучше, чем мое чудовище .
Оливер


1

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

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

Попробуйте онлайн!

=þ`создает единичную матрицу размера n.

L‘HĊƲнаходит индекс строки горизонтальной панели с ¦выбором этой строки и применением o\к ней, которая создает панель.

Uпереворачивает каждый ряд, чтобы у нас не было перевернутой буквы «А» и ŒB(palindromize; vectorize) составляет вторую половину «А».

ị⁾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

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

1

Хаскелл , 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

Python 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.