Построить арки ASCII


17

Мне нравится ascii art, и мне очень скучно, поэтому я нашел несколько символов ascii и начал делать случайные вещи, 8-битный замок Марио, лабиринты и арки. Я обнаружил, что арки можно легко сложить аккуратно.

╔═══════╗
║╔═════╗║
║║╔═══╗║║
║║║╔═╗║║║
╨╨╨╨─╨╨╨╨

Вызов

Создайте программу, функцию или любой другой стандартный формат, который принимает целое число, которое больше или равно 0 (если вы не делаете бонус), и выводит ascii art с указанным количеством арок.

Тестовые случаи

Входные данные:

7

Выход:

╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

Alt:

+-------------+
|+-----------+|
||+---------+||
|||+-------+|||
||||+-----+||||
|||||+---+|||||
||||||+-+||||||
||||||| |||||||
---------------

Входные данные:

1

Выход:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Если целое число равно 0, ничего не выводить
  • Этот вопрос будет в utf-8, каждый символ будет считаться "байтом"
  • Это поэтому выигрывает самый короткий ответ.
  • У вас есть возможность использовать +-+вместо ╔═╗, ---а не ╨─╨и |вместо

Бонус (не решено, разрешить ли это на альтернативной версии, потому что это не будет так сложно)

-10%, если программа поддерживает отрицательные числа и переворачивает арки вот так

╥╥╥╥─╥╥╥╥
║║║╚═╝║║║
║║╚═══╝║║
║╚═════╝║
╚═══════╝

3
AFAIK это не символы ASCII. Юникод-арт
flawr

привет, @flawr, ты прав. Что теперь ...
JuanPotato

Мир рухнет! Не волнуйтесь, возможно просто упомяните, что они не являются частью стандартного ASCII, но тег ascii-art все еще применяется (тег unicode был шуткой.)
flawr

Это похоже на расширенный ASCII, так что вы, вероятно, в порядке.
Mama Fun Roll

2
@ ՊՓԼՃՐՊՃՈԲՍԼ Нет стандартной версии расширенного ASCII en.wikipedia.org/wiki/Extended_ASCII. Наиболее близкая вещь - это кодовая страница 437 en.wikipedia.org/wiki/Code_page_437, которая была стандартной в США и многих других странах, но я нахожу, когда я скопируйте и вставьте это в редактор кодовой страницы 437 и верните обратно в окна, которые он «интерпретирует» как арки +---+сверху, сбоку |и снизу, -----которые мне подходят. Juanpotato, если вы хотите использовать не-ascii символы, пожалуйста, укажите кодировку в вопросе. В таком виде я голосую за закрытие, так как неясно.
Уровень River St

Ответы:



2

Python 2, 106 байт (94 символа)

n=input();j=1
exec"s=j/2*'║';print s+'╔'+'═'*(2*n-j)+'╗'+s;j+=2;"*n
if n:t='╨'*n;print t+'─'+t

Довольно просто. Печатает построчно с изменяющимся количеством горизонтальных и вертикальных полос. Последняя строка печатается отдельно.

Я чувствую, что мне не хватает некоторых оптимизаций. Тот факт, что символы состоят из нескольких байтов, означает, что вы не можете делать что-то подобное '║╨'[n>0], поэтому я не нашел хорошего способа напечатать последнюю строку в цикле. Уродливо, что с прилавком происходит так много манипуляций. Я бы хотел обновить строки напрямую, s+='║'но индекс также используется для горизонтальных столбцов.


Теперь вы можете использовать +-|для создания арок, см. Op для примеров.
JuanPotato

2
@JuanPotato OP означает оригинальный постер. Вы имеете в виду вопрос?
Эддисон Крамп

1
@flagasspam да, я только что видел варианты использования, где это означает оригинальный пост
JuanPotato

2

Perl, 78 82 символа

$n='─';$_='══'x pop;while(s/══//){print"$s╔═$_╗$s\n";$s.="║";$n="╨$n╨"}$s&&print$n

К сожалению, я не мог найти способ воспользоваться бонусом без увеличения размера более чем на 10%. Я еще могу победить.

Ungolfed

Довольно просто, правда. Постепенно наращивает нижнюю строку ( ╨$n╨), укорачивая верхнюю строку ( ══) на два символа, заканчивая, когда ее уже нельзя укоротить, поэтому мне не нужно возиться со счетчиками.

 $n = '─'; # Bottom line
 $_ = '══'x pop; # "Top" line, length from commandline argument
 while (s/══//) { # Shorten top line by two characters
     print "$s╔═$_╗$s\n"; # Print current line with $s (sides)
     $s .= "║";           # Append vertical bar to sides
     $n  = "╨$n╨";        # Widen bottom line
 }
 $s && print $n; # Print bottom line if input is not 0

Я думаю, что это печатает один для n = 0, но ничего не должно печатать.
Линн

@Mauris Я только что запустил его, и вы правы
JuanPotato

1
@ Маурис Данг! Ты абсолютно прав. Моя оригинальная версия была в порядке, но где-то вдоль линии я потерял чек. Исправлено, за счет 4 символов. Спасибо, что заметили это.
type_outcast

Я знаю, что это старо, но чтобы добавить комментарий @ Abigail, вы также можете сохранить байты, используя -n: Попробуйте онлайн!
Дом Гастингс

1

Bash, 124 байта (112 символов)

printf -vh %$1s
b=${h// /╨}
h=${h// /═}
for((n=$1;n--;)){
echo $v$h${h:1}╗$v
h=${h#?}
v+=║
}
(($1))&&echo $b$b

Образец прогона:

bash-4.3$ bash ascii-arch.sh 7
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ bash ascii-arch.sh 1
╔═╗
╨─╨

bash-4.3$ bash ascii-arch.sh 0

1

Japt -R , 29 байт

Использует +& -. Пожертвовано 4 байта для обработки кровавой проверки ввода!

©Æ'+²¬q-p´UÑÄÃpS û| p-pNÑÄ)ªP

Попытайся


объяснение

                                  :Implicit input of integer U
©                                 :Logical AND with U
 Æ                                :Map the range [0,U)
  '+                              :  Literal "+"
    ²                             :  Repeat twice
     ¬                            :  Split
      q                           :  Join with
       -                          :   Literal "-"
        p                         :   Repeat
         ´U                       :    Decrement U
           Ñ                      :    Multiply by 2
            Ä                     :    Add 1
             Ã                    :End mapping
              pS                  :Push a space
                 û|               :Centre pad each element with "|" to the length of the longest element
                    p     )       :Push
                     -            : Literal "-"
                      p           : Repeat
                       N          :  The array of inputs (which will be cast to an integer if we perform a mathematical operation on it)
                        ÑÄ        :  Multiply by 2 and add 1
                           ª      :Logical OR
                            P     :The empty string
                                  :Implicitly join with newlines and output

терпит неудачу на входе0
dzaima

@dzaima, что ты имеешь в виду? Как у вас может быть арка размером 0?
Лохматый

If the integer is 0 then don't output anythingиз испытания: /
Дзайма

@dzaima, О, я пропустил это. Благодарю. Прежде всего: Boo-urns для проверки ввода! Во-вторых, Japt не может ничего выводить - я мог выводить 0,false или пустая строка стоимостью некоторых байтов , но я не знаю , если какой - либо из тех , кто был бы приемлем , за исключением, может быть, пустая строка, которая будет стоить мне 5 байт ( 0будет стоить только мне 1).
Лохматый

0

JavaScript (ES6), 101 символ

f=(n,i=0)=>n?i-n?(b="║"[r="repeat"](i))+`╔${"═"[r]((n-i)*2-1)}╗${b}
`+f(n,i+1):(g="╨"[r](n))+"─"+g:""

объяснение

Рекурсивная функция, которая печатает каждую строку

f=(n,i=0)=>              // f = recursive function, i = current line (default = 0)
  n?                     // if n != 0
    i-n?                 // if we are not in the last line, print the line
      (b="║"[r="repeat"](i))+`╔${"═"[r]((n-i)*2-1)}╗${b}
`+f(n,i+1)               // add the output of the next line
    :(g="╨"[r](n))+"─"+g // if we ARE in the last line, print the last line
  :""                    // print nothing if n = 0

Тестовое задание

Тест не использует параметр по умолчанию для совместимости браузера.


0

PHP (109 символов)

$s='';for($b=($n=$argv[1])?'─':'';$n--;){echo$s.'╔═'.str_repeat('══',$n)."╗$s\n";$s.='║';$b="╨{$b}╨";}echo$b;

Все еще нужно избавиться от этого str_repeat, но большинство альтернатив не будет обрабатывать символы mulyibyte.

$s = '';
// Initialise $b (bottom) to '─' or '' for n==0
for ($b = ($n = $argv[1]) ? '─' : ''; $n--;) {
    // Echo sides + arch + sides
    echo $s . '╔═' . str_repeat('══', $n) . "╗$s\n";
    // Growing sides
    $s .= '║';
    // Growing bottom
    $b = "╨{$b}╨";
}
// Show bottom
echo $b;


0

Swift (209 байт)

Вероятно, Swift - не лучший язык для этого, я впервые пытаюсь выполнить кодовый гольф:

func *(l:String,r: Int)->String{return r>0 ?l+(l*(r-1)):""}
let n=Int(readLine()!)!
for i in 0...(n-1){let a=("║"*i)+"╔═";let b=a+("══"*(n-1-i))+"╗"+("║"*i);print(b)};print("╨"*n+"─"+"╨"*n)

0

Рубин, 90 байтов (74 символа)

->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}

Образец прогона:

2.1.5 :001 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[7]
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨
 => nil 

2.1.5 :002 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[1]
╔═╗
╨─╨
 => nil 

2.1.5 :003 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[0]
 => false 

0

Haskell, 151 162 байта

r=replicate
c=concat
f n=putStr$unlines[c[r i '║',"╔",r(2*(n-i)-1)'═',"╗",r i '║']|i<-[0..n-1]]++c[r n '╨',r(signum n)'─',r n '╨']
main=readLn>>=f

Изменить: я забыл иметь дело в 0качестве ввода


0

54 54 символа / 95 байт

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`+Ⅰ$;ï⅋ᵖⅠï+⬭+Ⅰï,Ⅱ*2+1

Try it here (Firefox only).

объяснение

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`+Ⅰ$;ï⅋ᵖⅠï+⬭+Ⅰï,Ⅱ*2+1 // implicit: ï=input, $=mapped item
                                                       // PHASE 1
⩥ïⓜ                                                   // create a range to map over
    ᵖ                                                  // push to stack:
     ⟮ ⍘|ď⟯$                                            // | repeated $ times
           +`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`                      // & +[- repeated 2$-1 times]+
                                 +Ⅰ$;                  // & | repeated $ times
                                                       // PHASE 2
                                     ï⅋                // if ï>0
                                       ᵖ               // push to stack 2 items:
                                        Ⅰï+⬭+Ⅰï,      // | repeated $ times & [space] & | repeated $ times
                                                 Ⅱ*2+1 // and - repeated 2ï+1
                                                       // implicit stack output, newline-separated

ПРИМЕЧАНИЕ: здесь используются хорошие старые блоки копирования, чтобы добраться до тех мест, где обычное объявление переменных не может быть достигнуто.


0

Sed, 97 байт (81 символ)

(Код 96 байтов (80 символов) + опция командной строки из 1 символа)

s/.(.*)/2&\13/
t
:
H
s/(.+)11(.+)/4\1\24/
t
y/1234/─╨╨╨/
H
g
s/\n//
y/1234/═╔╗║/

Ввод ожидается как однозначное целое число.

Образец прогона:

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< '1111111'
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< '1'
╔═╗
╨─╨

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< ''

Sed, 105 байт (75 символов)

(Код 104 байта (74 символа) + опция командной строки из 1 символа)

y/1/═/
s/.(.*)/╔&\1╗/
t
:
H
s/(.+)══(.+)/║\1\2║/
t
y/╔║╗═/╨╨╨─/
H
g
s/\n//

Ввод ожидается как однозначное целое число.

Образец прогона:

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< '1111111'
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< '1'
╔═╗
╨─╨

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< ''

0

Холст 15 байт

-*+∔]⤢:↷±n│L-×∔

Попробуй это здесь!

Объяснение:

{    ]            map over 1..input
 -*                 repeat "-" counter times
   +∔               append "+" to that
      ⤢           transpose
       :          create a duplicate of that
        ↷±        rotated 90°, then reversed horizontally
          n       overlap the 2
           |      and palindromize horizontally with 1 overlap
            L     get the with of that
             -×   repear "-" that many times
               ∔  and add vertically to the rest of the output
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.