Квадратний корінь арт


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:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  

3
V збирається добре в цьому
caird coinheringaahing

16
математик, який справді ненавидить TeX, LaTeX тощо. Я майже кинув читати саме там
Луїс Мендо,

5
Ви працюєте, я майже кинув читати саме там
Арнольд,

Відповіді:


7

Пітон 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 байти завдяки кроку Хен

-13 байт завдяки Джонатану Аллану


@StepHen Hm. Це працює, але також /буде працювати. Спасибі.
HyperNeutrino

Те саме дляi+l//2
Стівен

Підкреслити потрібно розтягнути один символ додатково з обох боків.
Ніл

Ви можете взяти введення як список рядків (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 Деревне вугілля старіє ...
Erik the Outgolfer

@EriktheOutgolfer D: старий як
лише ASCII

@ ASCII Добре, що SOGL є новішим і кращим, тому ... не ображайтесь на Вугілля, хоча він все ще багато виграє.
Erik the Outgolfer

@EriktheOutgolfer, але як це краще :(
ASCII лише

IMO це якось, як сказати Haskell, новіший і кращий, тому Haskell> C #, хоча він все ще багато виграє
лише ASCII

5

Пітон 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знаходиться вхід, або в якості параметра функції або введення () функції і т.д. (PS вашого відповідь також , здається, не вистачає кілька пробілів-відступів.)
officialaimm

2
@officialaimm, дякую за привітання! Для практики майбутніх проблем я оновив і включив посилання TIO
Коннер Джонстон

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. Усі лінії повинні мати однакову довжину.

Спираючись на приклади виходів, я припустив, що не потрібно додавати пробіл до кожного рядка у вході, тому програма цього не робить.

Завдяки Джонатан Allan за нагадування мені про ~операторі.

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;}

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

Безумовно

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

Перл 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}

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

Журнал змін:

  • потрібно було більше байтів, щоб виправити помилку (передбачалося, що спочатку квадратний вхід)
  • виправили ще одну помилку та використали поради з коментарів (дякую Дада!)

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

Давно, коли я користувався 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 символів зі стандартного введення та зчитує їх у масив. Він друкує їх по 1 на стандартний вихід із змінами, вказаними на виклик. Він передбачає, що вхід прямокутний.

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