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

3
Vはこれでうまくいくだろう
ケアードコヒーリングアーイング

16
本当にTeXのを嫌っている数学者、乳液など私はほとんどすぐそこに読んで終了
ルイスMendo

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バイト

ジョナサンアランのおかげで-13バイト


@StepHen Hm。動作しますが、/動作します。ありがとう。
ハイパーニュートリノ

同じi+l//2
スティーブン

アンダースコアは、両側に1文字余分に伸ばす必要があります。
ニール

入力を文字列のリストとして受け取ることができます(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チャコールは古くなっています...
エリックアウトゴルファー

@EriktheOutgolfer D:古い方法
ASCIIのみ


@EriktheOutgolferしかし、それはどのように良いですか:(
ASCIIのみ

IMOそれはまだ多くの勝利が、HaskellはHaskellの> C#のように、より新しい、より良いです言うようなちょっとだ
ASCIIのみ

5

Pythonの3138の 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'は文字列のリストで、各文字列は1行です。読み取り可能なバージョン:

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リンクを更新して組み込みました
コナージョンストン


2

Java 8、244バイト

非常に長いソリューションですが、おそらくJavaの最短に近いでしょう。このラムダは、入力行をaとして受け取り、a 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;}

オンラインで試す

非ゴルフ

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。h+a+h%2コードで2回使用する変数を作成すると、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、文字列ではなく配列であるため機能しません。
ジャスティンマリナー

ああ、それは…
。– ETHproductions

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}

オンラインでお試しください!

変更ログ:

  • バグを修正するためにさらにバイトが必要でした(最初に正方形の入力を想定していました)
  • 別のバグを修正し、コメントからいくつかのヒントを使用しました(Dadaに感謝!)

132バイトに短縮。私がやったことを見てみましょう。大きな行:の<>代わりに<STDIN>、のprint" "x$f代わりにfor(1..$f){print" "}、のxxx for yyy代わりにfor(yyy){xxx}使用$_、明示的な変数の代わりにforループで使用(for$i(..){..}
ダダ

perlを使用してから長い間、ありがとう!しかし、私はしてみましたx$f...今再び試みる○:と仕事にそれを得ることができませんでした
フェリックス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.