รากที่สองของศิลปะ ASCII


30

คุณกำลังทำงานเป็นนักศึกษาฝึกงานสำหรับนักคณิตศาสตร์ที่หนึ่งจริงๆเกลียดเท็กซ์, น้ำยาง, ฯลฯ มากเพื่อให้เขาได้ตัดสินใจที่จะละทิ้งการเรียงพิมพ์ทั้งหมดใด ๆ และทำให้คุณทำทั้งหมดในการจัดรูปแบบ 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 และอื่น ๆฉันเกือบจะเลิกอ่านตรงนั้น
Luis Mendo

5
คุณกำลังทำงานฉันเกือบจะเลิกอ่านตรงนั้น
Arnauld

คำตอบ:


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 Step

-13 ไบต์ขอบคุณ Jonathan Allan


@ StepHen อืม มันใช้งานได้ แต่/ก็ใช้ได้เช่นกัน ขอบคุณ
HyperNeutrino

เหมือนกันi+l//2
สตีเฟ่น

เครื่องหมายขีดล่างต้องยืดอักขระหนึ่งตัวที่ด้านใดด้านหนึ่ง
Neil

คุณสามารถรับอินพุตเป็นรายการสตริง (Python 2 input()ประเมินค่าอินพุตดิบ) นอกจากนี้ยังเป็น'_'*len(Q[0])+'__' '_'*(2+len(Q[0]))
Jonathan Allan


5

ถ่าน 32 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รุ่น 29 ไบต์ที่สมมติว่าอินพุตเป็นรูปสี่เหลี่ยมผืนผ้า:

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

3
@LuisMendo Charcoal กำลังจะแก่ ...
Erik the Outgolfer

@EriktheOutgolfer D: เก่าอย่างไร
เท่านั้น

@ ASCII เท่านั้น Well SOGL นั้นใหม่กว่าและดีกว่าดังนั้น ... ไม่มีความผิดใด ๆ กับ Charcoal แม้ว่ามันจะยังคงชนะอยู่มาก
Erik the Outgolfer

@EriktheOutgolfer แต่มันจะดีกว่าได้อย่างไร :(
ASCII เท่านั้น

IMO เหมือนที่บอกว่า Haskell ใหม่กว่าและดีกว่าดังนั้น Haskell> C # ถึงแม้ว่ามันจะยังชนะมาก
ASCII- เท่านั้น

5

Python 3 , 138 147 Bytes

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
@ อย่างเป็นทางการขอขอบคุณสำหรับการต้อนรับ! เพื่อฝึกฝนสำหรับปัญหาในอนาคตฉันได้อัปเดตและรวมลิงค์ TIO
Conner Johnston

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 ที่สั้นที่สุด แลมบ์ดานี้จะใช้เวลาสายของการป้อนข้อมูลเป็นและผลตอบแทนString[] 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 ไบต์ขอบคุณKevin Cruijssen

1
คำตอบที่ดี +1 คุณสามารถเล่นกอล์ฟ 2 ไบต์โดยสร้างตัวแปรให้h+a+h%2l->{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 เพื่อให้คุณสามารถแยกรหัสแข็งแรงเล่นกอล์ฟของคุณที่เกิดขึ้นจริงจากรหัสการทดสอบ.)
เควิน Cruijssen

1

Japt , 46 ไบต์


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

ขึ้นบรรทัดใหม่เป็นส่วนหนึ่งของโปรแกรม อินพุตและเอาต์พุตเป็นอาร์เรย์ของสตริงที่แทนบรรทัด

ลองออนไลน์! การใช้-Rแฟล็กเพื่อเข้าร่วมอาร์เรย์ผลลัพธ์กับการขึ้นบรรทัดใหม่


@ETHproductions น่าเศร้าที่ใช้ไม่ได้เนื่องจากUเป็นอาร์เรย์และไม่ใช่สตริง
Justin Mariner

อ๊ะ
เหรอ

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 bytes

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

ลองออนไลน์!

การเปลี่ยนแปลง:

  • จำเป็นไบต์มากขึ้นในการแก้ไขข้อผิดพลาด (มันสันนิษฐานตารางการป้อนข้อมูลครั้งแรก)
  • แก้ไขข้อผิดพลาดอื่นและใช้เคล็ดลับจากความคิดเห็น (ขอบคุณ Dada!)

ลงไป132 ไบต์ ฉันให้คุณดูสิ่งที่ฉันทำ เส้นใหญ่: <>แทน<STDIN>, print" "x$fแทนfor(1..$f){print" "}, ใช้xxx for yyyแทนfor(yyy){xxx}, ใช้$_ในการวนรอบแทนตัวแปรชัดเจน ( for$i(..){..}) ...
Dada

เวลานานตั้งแต่ฉันใช้ perl ขอบคุณ! แต่ผมพยายามกับx$fและไม่สามารถได้รับมันจะทำงาน: o พยายามอีกครั้งในขณะนี้ ...
เฟลิกซ์ Palmen

เอ่อและฉันก็พบข้อผิดพลาดในทั้งสองรุ่นมา ... ให้ฉันเวลาในการแก้ไขปัญหานี้;)
เฟลิกซ์ Palmen

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.