ASCII sanatının karekökü


30

TeX, LaTeX, vs.'den gerçekten nefret eden bir matematikçi için stajyer olarak çalışıyorsunuz . Öyle ki, tüm dizgileri terk etmeye ve ASCII'de tüm biçimlendirmeleri yapmaya karar vermeye karar verdi. Bir süre sonra bundan bıktınız ve parçalarını kare köklerle başlayarak otomatikleştirmeye karar verdiniz.

İşte nasıl karekök yapıldığı:

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

Ve bu kadar!

kurallar

Bir dizgede, dizgelerin (yani satırların) veya karakter dizisinin içinde yer alan ve yukarıdaki açıklamaya göre dönüştürülen girdiyi çıkaran bir program veya işlev yapacaksınız (zorunlu olarak tam olarak aynı sırada veya işlemle değil)

İsterseniz girişin dikdörtgen olduğunu varsayabilirsiniz. İzleyen boşluk, ne gerekli ne de izin verilmedi.

Bu , yani bayt cinsinden en kısa cevap kazanır.

Örnekler:

Input:
40
Output:
  ____
\/ 40

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

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

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

3
V bu konuda iyi olacak
caird coinheringaahing

16
Gerçekten TeX nefret eden bir matematikçi, LaTeX vb Neredeyse orada okuma çıkmak
Luis Mendo

5
Sen çalışıyoruz Neredeyse orada okuma çıkmak
Arnauld

Yanıtlar:


7

Python 2 , 196 bayt

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))

Çevrimiçi deneyin!

Tavuk Kademe sayesinde -2 bayt

Jonathan Allan sayesinde -13 bayt


@StepHen Hm. Çalışıyor ama /işe yarayacaktı. Teşekkürler.
HyperNeutrino

Aynı kişii+l//2
Stephen

Alt çizgi, her iki tarafa da bir karakter fazla koymak zorundadır.
Neil,

Bir dizge listesi olarak girdi alabilirsiniz (Python 2'ler input()ham girişi değerlendirir). Ayrıca '_'*len(Q[0])+'__'olduğunu '_'*(2+len(Q[0])).
Jonathan Allan


5

Kömür , 32 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Dikdörtgen giriş varsayan 29 bayt sürümü:

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

3
@LuisMendo Kömür yaşlanıyor ...
Outgolfer Erik

@EriktheOutgolfer D: eski nasıl
ASCII sadece

@ ASCII-only Peki SOGL daha yeni ve daha iyi, bu yüzden ... hala çok kazanmasına rağmen Kömür'e alınma.
Outgolfer Erik,

@EriktheOutgolfer ama nasıl daha iyi :(
ASCII-yalnızca

Hala çok kazanır rağmen IMO Haskell daha yeni ve Haskell> C # böylece daha iyi olduğunu söylemek gibi tür var
ASCII yalnızca

5

Python 3 , 138 147 Bayt

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' değişkeni, her biri bir satır dizesidir. Okunabilir sürüm:

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)

Tamamlanmış bir V ile bir karekök sembolü oluşturur ve ardından sola göre traş olur.

Çevrimiçi Deneyin!


2
Merhaba, PPCG'ye hoş geldiniz. Güzel ilk cevap, ama bu bir pasaj, çünkü değişkeni lgirdi olarak kabul ediyor. Sen parçasını içermektedir da gerekir lgirdidir ya bir fonksiyon parametresi veya giriş () fonksiyonu olarak (PS Cevabınız da birkaç white-space-dolgu eksik gibi görünüyor.)
officialaimm

2
@officialaimm, hoş geldiniz için teşekkür ederim! Gelecekteki problemler için pratik yapmak için TIO bağlantısını güncelledim ve
Conner Johnston

3

Python 2 ,  131  130 bayt

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:]

Yalnızca dikdörtgensel ödenekle girdi olarak satır listelerini alan tam bir program (aslında ilk satır en uzun olanlardan biridir).

Çevrimiçi deneyin!


2

Java 8, 244 bayt

Çok uzun bir çözüm, fakat muhtemelen Java için en kısa süreye yakın. Bu lambda giriş satırlarını a olarak alır String[]ve a döndürür String. Tüm çizgiler aynı uzunlukta olmalıdır.

Örnek çıktılara dayanarak, girdideki her satıra bir boşluk eklemenin gerekmediğini varsaydım, böylece program bunu yapmaz.

Sayesinde Jonathan Allan için Hatırlattığın hakkında ~operatörü.

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

Çevrimiçi Deneyin

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

Teşekkür

  • Kevin Cruijssen sayesinde -2 bayt

1
Güzel cevap +1. Sen golf 2 için bir değişken oluşturarak bayt can h+a+h%2kodunuzda iki kere kullanan: 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;}. (Ayrıca TIO bağlantısındaki üstbilgiyi ve altbilgiyi de kullandım, bu nedenle gerçek golf kodunuzu test kodundan
çıkarabilirsiniz

1

Japt , 46 bayt


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

Öncü newline programın bir parçasıdır. Giriş ve çıkış, çizgileri temsil eden bir dizeler dizisidir.

Çevrimiçi deneyin! -Rbayrak dizisini, elde edilen diziye yeni satırlara katılmak için kullanma .


@ETHproductions Ne yazık ki işe yaramayacak çünkü Ubir dizi değil, bir dize.
Justin Mariner

Ah,
kahretsin

1

JavaScript (ES6), 140 bayt

Girdiyi dizge olarak alır / dizge dizisini döndürür.

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)

Test durumları


1

Perl 5 , 177 185 160 bayt

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

Çevrimiçi deneyin!

Değişiklikler:

  • bir hatayı düzeltmek için daha fazla bayta ihtiyaç duyuldu (önce bir kare girişi olduğu varsayıldı )
  • başka bir hatayı düzeltti ve yorumlardan bazı ipuçlarını kullandı (teşekkürler Dada!)

132 bayta kısaltıldı . Yaptıklarıma bir göz atmana izin verdim. : Büyük çizgiler <>yerine <STDIN>, print" "x$fyerine for(1..$f){print" "}kullanılarak xxx for yyyyerine for(yyy){xxx}kullanarak, $_yerine açık değişkenlerin (bir döngü için de for$i(..){..}) ...
Dada

Perl'i kullandığımdan beri çok teşekkür ederim! Ama denedim x$fve işe yaramadı: o şimdi tekrar deniyorum ...
Felix Palmen

Uh ve ben her iki versiyonda da bir hata bulduk ... düzeltmek için bana biraz zaman verin;)
Felix Palmen

0

C ++, 291 bayt

İşlev, vektördeki tüm dizelerin parametre olarak iletilenlerin aynı uzunluğa sahip olduğunu varsayar.

#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

Dyalog APL, 95 bayt

{((' '/⍨y+x),'_'/⍨2+⊃⌽⍴⍵)⍪⍉(x-y)↓⍉(⊖(x(-x)↑⌽y y⍴'\',' '\⍨y←⌈x÷2),x x⍴'/',' '\⍨x←⊃⍴⍵),' ',⍵,' '}

Çevrimiçi deneyin!


0

C, 485 bayt

Bu program standart girişten en fazla 999 karakter alır ve bunları bir diziye okur. Zorladığınız değişikliklerle birlikte standart çıktıya her defasında 1 yazdırır. Girişin dikdörtgen olduğunu varsayar.

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

0

Perl 5 , 159 bayt

@a=map{$m=(y///c)>$m?y///c:$m;$_}<>;$_=$"x($l=@a/2-.5).'\\/'.$"x@a;for$i(1..@a){$a[-$i]=$_.$a[-$i];s| \\|\\ |;s|/ | /|;$i>$l&&y/\\/ /}chop;say$_.'_'x++$m,$/,@a

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.