Квадратный корень искусства ASCII


30

Вы работаете в качестве интерна для математика, который действительно ненавидит TeX, LaTeX и т. Д. Настолько, что он решил отказаться от всякой верстки и заставить вас делать все форматирование в ASCII. Вы устали от этого через некоторое время и решили начать автоматизировать его части, начиная с квадратных корней.

Вот как получается квадратный корень:

###  this is the input
###
###

_____  put a row of underscores stretching one character off either side on top
 ### 
 ### 
 ### 

   _____  put a diagonal of slashes in front going the height of the input
  / ### 
 /  ### 
/   ### 

      _____ put a diagonal of backslashes in front of that, going up half of the input's height rounded up
     / ###
 \  /  ###
  \/   ###

Вот и все!

правила

Вы должны создать программу или функцию, которая принимает строку, список строк (то есть строк) или массив символов и выводит входные данные, преобразованные в соответствии с описанием выше (необязательно точно таким же порядком или процессом)

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

Это , поэтому выигрывает самый короткий ответ в байтах.

Примеры:

Input:
40
Output:
  ____
\/ 40

Input:
  ____
\/ 40
Output:
   ________
  /   ____
\/  \/ 40 

Input:
/| 
 | 
 | 
_|_
Output:
      _____
     / /|
    /   |
\  /    |
 \/    _|_

Input:
#  # 
#  # 
#####
   # 
   # 
Output:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  


16
математик, который действительно ненавидит TeX, LaTeX и т. д. Я почти перестал читать прямо здесь
Луис Мендо

5
Вы работаете, я почти перестал читать прямо там
Арно

Ответы:


7

Python 2 , 196 байт

x=Q=input()
l=len(x)
k=(l+1)/2
q=l+k
x=[[' ']*(q+1)+list(y)for y in x]
for i in range(k):x[i+l/2][i]='\\'
for j in range(l):x[j][q-j-1]='/'
print'\n'.join([' '*q+'_'*(2+len(Q[0]))]+map(''.join,x))

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

-2 байта благодаря Step Hen

-13 байтов благодаря Джонатану Аллану


@ StepHen Хм. Это работает, но /будет работать тоже. Спасибо.
HyperNeutrino

То же самое дляi+l//2
Stephen

Подчеркивания должны растягиваться на один символ с каждой стороны.
Нил

Вы можете принять ввод как список строк (Python 2 input()оценивает необработанный ввод). И '_'*len(Q[0])+'__'есть '_'*(2+len(Q[0])).
Джонатан Аллан


5

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

WS⊞υιP⪫υ¶↖P×_⁺²⌈EυLι↙↙Lυ↑↖÷⁺¹Lυ²

Попробуйте онлайн! Ссылка на подробную версию кода. 29-байтовая версия, которая предполагает прямоугольный ввод:

WS⊞υιP⪫υ¶↖P×_⁺²Lθ↙↙Lυ↑↖÷⁺¹Lυ²

3
@LuisMendo Древесный уголь стареет ...
Эрик Outgolfer

@EriktheOutgolfer D: old how
только ASCII

@ ASCII-only Ну, SOGL новее и лучше, так что ... не обижайся на уголь, хотя он все еще много выигрывает.
Эрик Outgolfer

@EriktheOutgolfer, но как это лучше :(
ASCII-only

IMO, это как сказать, что Haskell новее и лучше, так что Haskell> C #, хотя он все еще выигрывает
только ASCII

5

Python 3 , 138 147 байт

def f(l):h=len(l);w=len(l[0]);c=int(h/2);print('\n'.join([(h*2-c)*' '+w*'_']+[(i*' '+'\\'+(h-i-1)*2*' '+'/'+i*' ')[c:]+s for(i,s)in enumerate(l)]))

Переменная 'l' - это список строк, каждая строка - строка. Читаемая версия:

def f(l):
  height = len(l)
  width = len(l[0])
  half_height_floor = int(height / 2)

  print((height * 2 - half_height_floor) * ' ' + width * '_')

  for (index, line) in enumerate(l):
    #build a V based on the location of the line
    #surrounding V whitespace
    outer_space = index * ' '

    #inner V whitespace
    inner_space = (height - index - 1) * 2 * ' ' #inner v space

    #complete V
    v = outer_space + '\\' + inner_space + '/' + outer_space

    #left half_height_floor chars removed
    v_chopped = v[half_height_floor:]

    print(v_chopped + line)

Формирует символ квадратного корня с полным V, затем соответственно сбривает левый.

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


2
Привет, добро пожаловать в PPCG. Хороший первый ответ, но это фрагмент, так как он принимает переменную в lкачестве входных данных. Вы также должны включить часть l, в которую вводится, либо в качестве параметра функции, либо функции input () и т. Д. (PS В вашем ответе также не хватает нескольких пробелов.)
officialaimm

2
@officialaimm, спасибо за прием! Чтобы попрактиковаться в решении будущих проблем, я обновил и включил ссылку
Коннер Джонстон

3

Python 2 ,  131  130 байт

x=input()
n=len(x)
s=" "
for v in[s*2*n+"_"*(2+len(x[0]))]+[s*i+"\\"+s*2*(n+~i)+"/"+s*-~i+r for i,r in enumerate(x)]:print v[n/2:]

Полная программа, принимающая список строк в качестве входных данных с учетом только прямоугольника (фактически первая строка является одной из самых длинных).

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


2

Java 8, 244 байта

Очень длинное решение, но, вероятно, близко к самому короткому для Java. Эта лямбда принимает строки ввода как a String[]и возвращает a String. Все строки должны иметь одинаковую длину.

Основываясь на выходных данных примера, я предположил, что нет необходимости добавлять пробел к каждой строке ввода, поэтому программа этого не делает.

Спасибо Джонатану Аллану за напоминание об ~операторе.

l->{int h=l.length,w=l[0].length(),a=h/2,i=w+3,x=h+a+h%2;String s="",t=s;for(;--i>0;)t+="_";for(;i++<x;)s+=" ";t=s+t;for(i=0;i<h;)t+="\n"+s.substring(0,i<a?x+~i:i-a)+(i<a?"":"\\"+s.substring(0,(h+~i)*2))+"/"+s.substring(0,i+1)+l[i++];return t;}

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

Ungolfed

l -> {
    int
        h = l.length,
        w = l[0].length(),
        a = h / 2,
        i = w + 3,
        x = h + a + h % 2
    ;
    String
        s = "",
        t = s
    ;
    for (; --i > 0; )
        t += "_";
    for (; i++ < x; )
        s += " ";
    t = s + t;
    for (i = 0; i < h; )
        t +=
            "\n"
            + s.substring(0, i < a ? x + ~i : i - a)
            + (i < a ? "" : "\\" + s.substring(0, (h + ~i) * 2))
            + "/"
            + s.substring(0, i + 1)
            + l[i++]
        ;
    return t;
}

Подтверждения

  • -2 байта благодаря Кевину Круйссену

1
Хороший ответ +1. Вы можете играть в гольф 2 байта, создавая переменную для h+a+h%2которой вы используете два раза в коде: l->{int h=l.length,w=l[0].length(),a=h/2,i=w+3,x=h+a+h%2;String s="",t=s;for(;--i>0;)t+="_";for(;i++<x;)s+=" ";t=s+t;for(i=0;i<h;)t+="\n"+s.substring(0,i<a?x+~i:i-a)+(i<a?"":"\\"+s.substring(0,(h+~i)*2))+"/"+s.substring(0,i+1)+l[i++];return t;}. (Я также использовал верхний и нижний колонтитулы в ссылке TIO, чтобы вы могли изолировать свой действительный код в гольфе от тестового кода.)
Кевин Круйссен,

1

Japt , 46 байт


l *2
£Vç hY'\ h~Y'/ +S+XÃuVç +'_p2+Ug l¹msV/4

Ведущий перевод строки является частью программы. Ввод и вывод - это массив строк, представляющих строки.

Попробуйте онлайн! используя -Rфлаг, чтобы соединить результирующий массив с символами новой строки.


@ETHproductions К сожалению, это не сработает, так Uкак это массив, а не строка.
Джастин Маринер


1

JavaScript (ES6), 140 байт

Принимает ввод как массив строк / возвращает массив строк.

a=>[a[0].replace(/./g,'_'),...a].map((r,y)=>[...a,...a].map((_,x)=>x-y+1|y-.5<l/2?l*2-x-y?' ':'/':'\\',c=y?' ':'_').join``+c+r+c,l=a.length)

Контрольные примеры


1

Perl 5 , 177 185 160 байт

$s=$f=int((@t=<>)*1.5+.5);print" "x$f;print"_"x length$t[0];print"_
";$b=-int(@t/2);for(0..$#t){--$s;print$_==$s?"/":$_==$b?"\\":" " for 0..$f;print$t[$_];++$b}

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

Changelog:

  • нужно больше байтов, чтобы исправить ошибку ( сначала предполагался квадратный ввод)
  • исправил еще одну ошибку и использовал несколько советов из комментариев (спасибо Dada!)

Сокращено до 132 байт . Я позволю вам взглянуть на то, что я сделал. Большие строки: <>вместо того <STDIN>, print" "x$fчтобы вместо for(1..$f){print" "}использования xxx for yyyвместо for(yyy){xxx}использования $_в цикле for вместо явных переменных ( for$i(..){..}) ...
Дада

Давненько я не использовал Perl, спасибо! Но я пытался x$fи не мог заставить его работать: o пытаясь снова сейчас ...
Феликс Пальмен

Э-э, и я только что нашел ошибку в обеих версиях ... дайте мне немного времени, чтобы это исправить;)
Феликс Пальмен,

0

C ++, 291 байт

Функция предполагает, что все строки в векторе, переданные в качестве параметра, имеют одинаковую длину

#include<vector>
#include<string>
#define S std::string
#define T size()
void f(std::vector<S>&c){c.insert(c.begin(),S(c[0].T+1,'_'));int i,j=0;for(i=1;i<c.T;++i){c[i]='/'+S(i,' ')+c[i];if(i>=c.T/2)c[i]='\\'+S((c.T-i-1)*2,' ')+c[i];}for(auto&a:c)j=j>a.T?j:a.T;for(auto&a:c)a=S(j-a.T,' ')+a;}


0

C 485 байтов

Эта программа берет до 999 символов из стандартного ввода и считывает их в массив. Он выводит их по одному за раз в стандартный вывод с указанными изменениями. Предполагается, что вход является прямоугольным.

#include<stdio.h>
#define p(a)putc(a,stdout);
#define P j+j/2+1
a[999],i,j,k,l,m,n,q;char c;pad(a){m=P;if(a&&!k){m-=1;}for(n=0;n!=m;n++){q=32;if((!a||k)&&n==c){c--;q=47;}else if((P-c+1)>j/2+1&&(P)/2-n==c-2){q=92;}p(q);}}int main(){k=i=j=0;x:if(read(0,&c,1)){if('\n'==(a[i++]=c)){if(!j){l=i;}j++;}goto x;}i--;if('\n'==a[i-1]){i--;}else{j++;}c=P-2;for(;k!=i;k++){if(!k||a[k]==10){if(a[k]==10){p(10);}pad(1);if(!k){l++;while(l-->0){p(95);}p(10);pad(0);}if(a[k]==10){continue;}}p(a[k]);}}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.