Bir dizgiyi üçgene katlayın


22

Uzunluğu 4 ile bölünebilen bir dize verildiğinde, aşağıda gösterildiği gibi bir üçgen yapın.

Dize ise abcdefghijkl, o zaman üçgen olacaktır:

   a
  b l
 c   k
defghij

Dize ise iamastringwithalengthdivisiblebyfour, o zaman üçgen olacaktır:

         i
        a r
       m   u
      a     o
     s       f
    t         y
   r           b
  i             e
 n               l
gwithalengthdivisib

Dize ise thisrepresentationisnotatriangle, o zaman üçgen olacaktır:

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

notlar

  • Dize sadece aila arasındaki karakterlerden oluşacaktır z.
  • Lider / İzleyen boşluklar ve yeni satırlara, şekil kırılmadığı sürece izin verilir.
  • Çıktı olarak dizelerin listesine izin verilir.

Bu . Bayt cinsinden en kısa cevap kazanır. Standart boşluklar uygulanır.

Yanıtlar:


7

Kömür , 25 22 21 bayt

≔÷Lθ⁴λ↙…θλ→✂θλ±λ↖✂θ±λ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Sadece ipi üç parçaya böler ve uygun yönlere basar. Düzenleme: Tamsayı bölme ve dilimleme kullanarak 3 bayt kaydedildi. Dize başı CycleChopyerine kullanarak başka bir bayt kaydedildi Slice. Düzenleme: Kömür artık bir poligonun kenarı boyunca rastgele metin çizmeyi destekleyerek kodu 12 bayta dönüştürüyor:

GH↙→→↖⊕÷Lθ⁴θ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur.


Ne yapar lar do?
Outgolfer Erik,

@EriktheOutgolfer Bu yeni Slice operatörü.
Neil

: | Oops PolygonHollow yapmak istedi, bir GH↙→→↖⊕÷Lθ⁴θdahaki sefere ben Kömür
ASCII-

6

05AB1E , 23 bayt

ćsIg4÷GćsÁćsŠN·<ú«s}».C

Çevrimiçi deneyin!

açıklama

ć                        # extract head of input
 s                       # swap the remaining string to top of stack
  Ig4÷G                  # for N in [1...len(input)/4-1] do:
       ć                 # extract head
        sÁ               # swap remaining string to top of stack and rotate right
          ć              # extract head
           sŠ            # reorder stack as tail, head, remaining
             N·<ú        # prepend N-1 spaces to tail
                 «s      # concatenate with head and swap remaining string to top
                   }     # end loop
                    ».C  # join by newlines and center

6

JavaScript (ES6), 119 117 108 105 bayt

s=>(l=s.length/4,S=' ',g=([c,...s],p)=>S.repeat(l)+c+(l--?p+s.pop()+`
`+g(s,p?p+S+S:S):s.join``))(s+S,'')

Biçimlendi ve yorumlandı

s => (                            // given the input string s:
  l = s.length / 4,               // l = length of side edge - 1
  S = ' ',                        // S = space (defining S costs 6 bytes but saves 7)
  g = (                           // g = recursive function which takes:
       [c,                        //   - c = next character
           ...s],                 //   - s = array of remaining characters
                  p) =>           //   - p = middle padding string
    S.repeat(l) + c + (           // append left padding + left character
      l-- ?                       // if side edges are not complete:
        p + s.pop() + '\n' +      //   append middle padding + right character + Line Feed
        g(s, p ? p + S + S : S)   //   and do a recursive call with updated middle padding
      :                           // else:
        s.join``                  //   append all remaining characters and stop recursion
    )                             //   (this is the bottom edge)
  )(s + S, '')                    // initial call to g()

Test durumları


4

C #, 260 bayt

namespace System{using static Console;class P{static void Main(){var d=ReadLine();int e=d.Length/4,x=e,y=0,g=0,i=0;Action<int,int>a=(p,q)=>{SetCursorPosition(p,q);Write(d[g++]);};for(;i<e;i++)a(x--,y++);for(i=0;i<e*2;i++)a(x++,y);for(i=0;i<e;i++)a(x--,y--);}}}

Gerçekten kullanmak istedim SetCursorPosition.

Ungolfed:

namespace System {
    using static Console;

    class P {
        static void Main() {
            var d = ReadLine();
            int e = d.Length / 4, x = e, y = 0, g = 0, i = 0;
            Action<int, int> a = (p, q) => { SetCursorPosition(p, q); Write(d[g++]); };
            for (; i < e; i++)
                a(x--, y++);
            for (i = 0; i < e * 2; i++)
                a(x++, y);
            for (i = 0; i < e; i++)
                a(x--, y--);
        }
    }
}

Bilmiyorum cehaletim, peki çözümünüzdeki eylemin amacı nedir? Boşluk işlevinden daha az bayt mı?
karıştırıpdamar

1
@confusedandamused Tek işlevli yanıtlar yazmaya alışkınım, bu yüzden işlevi normal şekilde koymayı bile düşünmedim, ancak daha kısa olacak.
LiefdeWen

3

Mathematica, 164 bayt

(b=Length[c=Characters@#];k=Column[#,Alignment->Center]&;T=Table;k@{#&@@c,k@T[""<>{c[[i+2]],T[" ",2i+1],c[[-i-1]]},{i,0,(a=b/4)-2}],""<>T[c[[i]],{i,a+1,b/2+1+a}]})&


giriş

[ "İamastringwithalengthdivisiblebyfour"]


Hepimiz [[1]]bunun yerini alabileceğini biliyoruz #&@@.
user202729

1
hepiniz çok akıllı tatlısınız!
J42161217


Kendinizi yaparken bulduğunuzda @(...), sadece yapın [...]. Ve henüz test etmedim, ancak muhtemelen Columnbir isim vererek (veya belki de Column[#,Alignment->Center]&kaçınmak için q) ve sonra kalan tüm değişkenleri dışın ilk argümanına Column(çevreleyen parantezleri kurtarmak için) koyarak kaydedebilirsiniz.
Martin Ender

3

Python 3 , 120 bayt

İlk golf, yol boyunca biraz Python öğrenebileceğimi düşündüm.

a=input()
l=len(a)//4
print(l*" "+a[0])
for i in range(1,l):print((l-i)*" "+a[i]+(2*i-1)*" "+a[4*l-i])
print(a[l:3*l+1])

Çevrimiçi deneyin!

Açıklama:

İlk karakter len(a)//4boşluklardan sonra kendiliğinden yazdırılır , daha sonra iikinciden başlayan ilk ve son karakterler 2*i - 1boşluklarla ayrılarak yazdırılır .

Son olarak, kalan alt dize basılır.


PPCG'ye Hoşgeldiniz! Bu çözümden öğrenebilirsiniz .
Sızdıran Rahibe

Burada olası bir golf ilan etmek p=printve sonra kullandığınız püç printsaniye için kullanmaktır.
FlipTack

Ayrıca, kordon uzunluğunun her zaman dörde bölünebileceği garanti edildiğinden, //(zemin bölümü) ile değiştirilebilir /.
FlipTack

Bu arada, çevrimiçi denemek için bağladığınız kod, cevabınızdaki kodla aynı değil.
FlipTack

3

GNU sed , 178 158 132 + 1 = 133 bayt

-rBayrak için +1 bayt .

s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm

Çevrimiçi deneyin!

açıklama

İçinde önceki revizyonlar Ben sezgisel Emin onlar önlenebileceği olsa bile, matematik, özel durumlarda ve temizleme ile uğraşan bayt çok kullanılır. O zamandan beri, çoğunlukla bunu başardım.

Diyelim ki girdi bizde. abcdEFGHIJKLMnop . HarflerEFGHIJKLM üçgenin dibi olacak, bu yüzden onları görsel yardım olarak büyük harf kullandım.

Önce, ilk karakteri kendi satırına koyarak (önce bir boşluk bırakarak) ve imleci ekleyerek girişi hazırlarız.; son karakterden önce ) :

s/(.)(.*)(.)/ \1\n\2;\3/

Şimdi biz var:

 a
bcdEFGHIJKLMno;p

Şimdi, bir döngüde, son satıra birkaç şey yapacağız: 1. Boşlukları önceki satırdan kopyalayın ve ilk karakterden sonra artı iki ekleyin; 2. Son karakteri boşluklardan hemen sonra sağa, sonra yeni bir satırla hareket ettirin; ve 3. İmleci üç karakter sola hareket ettirin.

:
  s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
  t

İşte her yinelemenin sonucu:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

Piramidin şekillenmeye başladığını görebilirsiniz. İmlecin ne için olduğunu da görebilirsiniz: Her yinelemede üç karakter sola hareket etti ve solunda üç karakter kalmadığında, sadece "alt" a ulaştığımızda olan döngüyü keser. Piramidin

Şimdi benzer bir işlem yapacağız ancak tersi. Döngüde, imleci bu satırın üstüne getirme işleminde, imleçle satırın başından imleci bir önceki satırın başına kadar olan boşlukları kopyalayacağız.

:A
  s/(.*\n)( *)(.*);/ \2;\1\2\3/m
  tA

İşte birkaç yineleme ve sonuç:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

Bazı ekstra karakterler hariç, şimdi hepimiz bitti: A ;ve ilk satırda fazladan boşluk ve sonraki üç satırda piramidin "ortasında" iki boşluk. Basit bir oyuncu değişikliği onlardan kurtulur:

s/. (.)$/\1/gm

Hepsi tamam!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

Python 2 , 100 97 96 bayt

  • Jacoblaw 1 byte kurtardı: tamsayı bölünmesi gereksiz
a=input()+" "
k=j=len(a)/4
while j:print j*" "+a[0]+(2*(k-j)-1)*" "+a[-1];a=a[1:-1];j-=1
print a

Çevrimiçi deneyin!

Açıklama:

Burada yaptığım akıllı bir şey, girdiyi sonunda bir boşluk olacak şekilde dolduruyor, öyle ki ilk karakter onunla eşleşiyor ve bu, döngünün içine itilebiliyor (ve sondaki boşluklara izin verildiğinden beri)

abcdefghijkl[space]   
To print [0] [-1]            Output=>[spaces]a[another_calculated_spaces(=0 here)][space]
Strip at both ends(a[1:-1])  
bcdefghijkl                
To print [0] [-1]            Output=>[spaces]b[another_calculated_spaces]l
Strip at both ends(a[1:-1])
and so on.

İzlenecek döngü sayısı ile ilişkilidir len(word)//4. Son adımda, kalan tüm dize yazdırılır (bu üçgenin tabanını oluşturur). Boşluklar basit bir kalıp izler; ilk boşluk grubu 1 ile azalırken, ikinci boşluk grubu 2 ile artar.


1
Tamsayılı bölme yapmadan bir baytı tıraş edebilir misiniz? Yana ahep 4. katları olacak //> -/
jacoblaw

Teşekkür ederim, [4 ile bölünemeyen girdiler için bile] herhangi bir hata atmadığına şaşırdım
officialaimm

1
Çünkü Python 2'de, bölme varsayılan olarak tamsayıdır. Bu Python 3'te canged
CalculatorFeline

2

C 225 bayt

p(c){putchar(c);}S(n){while(n--)p(' ');}main(int c,char**v){int i= strlen(v[1]),n=i/4,r;char*s=v[1],*e=&s[i-1];S(n);p(*s++);p('\n');for (r=1;r<n;r++){S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n');}e++;while (s!=e)p(*s++);p('\n');}

açıkladı

p(c){putchar(c);}        // p is alias for putchar
S(n){while(n--)p(' ');}  // S prints n spaces
main(int c,char**v){
    int i= strlen(v[1]), // counter
        n=i/4,           // num rows in figure - 1
        r;               // current row 
    char*s=v[1],         // start char
        *e=&s[i-1];      // end char
    S(n);p(*s++);p('\n');// print first row
    for (r=1;r<n;r++){ 
        S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n'); // print middle rows
    }
    e++;while (s!=e)p(*s++);p('\n'); // print last row
}

2

C #, 172 bayt

int i=0,n=s.Length;var p="";p=new string(' ',n/4)+s[i]+"\r\n";for(i=1;i<n/4;i++){p+=new string(' ',n/4-i)+s[i]+new string(' ',i*2-1)+s[n-i]+"\r\n";}p+=s.Substring(i,n/2+1);

Çevrimiçi deneyin!


1

Octave, 87 bayt

@(s,x=(n=nnz(s))/4)[[' ';flip(diag(s(1:x))')]' [' ';diag(s(n:-1:n-x+2))];s(x+1:n-x+1)];

* Bir Windows makinesinde yukarıdaki kod doğru sonucu veriyor, ancak bunu düzeltmek için bir kod ekledim.

Açıklama:

[' ';flip(diag(s(1:x))')]'        %left side
[' ';diag(s(n:-1:n-x+2))]         %right side
s(x+1:n-x+1)                      %bottom side

Çevrimiçi deneyin!



1

PHP> = 7.1, 122 Bayt

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i])echo str_pad(str_pad($a[$i],$i*2).$e,$w+1," ",2),"
";echo substr($a,$i,$w+1);

PHP Sandbox Çevrimiçi

PHP> = 7.1, 124 Bayt

for(;$i*2<$w=strlen($a=$argn)/2;$e=$a[-++$i],$s.=$s?"  ":" ")echo str_pad("",$w/2-$i)."$a[$i]$s$e
";echo substr($a,$i,$w+1);

PHP Sandbox Çevrimiçi


1

AWK , 129 bayt

{n=split($0,a,"")
printf"%"(w=n/4+1)"s\n",a[++i]
for(;++i<w;)printf"%"(w-i+1)"s%"2*i-2"s\n",a[i],a[n-i+2]
$0=substr($0,i,i+w-1)}1

Çevrimiçi deneyin!

Bunu görmemekle biraz daha golf oynayabileceğini düşünmeliyim.


1

Retina , 99 bayt

^(.)(?=(....)+)
$#2$*  $1¶$#2$* 
( ( *).)(.*)(.)$
$1 $4¶$2$3
+`(( +).¶ ( *).)(.*)(.)$
$1$2  $5¶$3$4

Çevrimiçi deneyin! Açıklama: İlk iki aşama ilk iki satırı oluşturuyor, ancak bundan sonra özel bir kılıf gerekmiyor ve ardından gelen her satır otomatik olarak oluşturulabiliyor:

thisrepresentationisnotatriangle

        t
       hisrepresentationisnotatriangle

        t
       h e
      isrepresentationisnotatriangl

        t
       h e
      i   l
     srepresentationisnotatriang

...

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

1

Java 8, 213 bayt

s->{int n=s.length()/4,i;String r=s(n)+s.charAt(0)+"\n";for(i=1;i<n;r+=s(n-i)+s.charAt(i)+s(i*2-1)+s.charAt(n*4-i++)+"\n");return r+s.substring(i,n*2+i+1);}String s(int n){String r="";for(;n-->0;r+=" ");return r;}

Açıklama:

Burada dene.

s->{                           // Method (1) with String parameter and String return-type
  int n=s.length()/4,          //  The length of the input divided by 4
      i;                       //  And an index-integer
  String r=                    //  Result-String which starts as:
           s(n)                //   Trailing spaces
           +s.charAt(0)+"\n";  //   + the first character and a new-line
  for(i=1;i<n;                 //  Loop from `1` to `n`
      r+=                      //   And append the result-String with:
         s(n-i)                //    Trailing spaces
         +s.charAt(i)          //    + the character of the left diagonal line
         +s(i*2-1)             //    + center spaces
         +s.charAt(n*4-i++)    //    + the character of the right diagonal line
         +"\n"                 //    + a new-line
  );                           //  End of loop
  return r                     //  Return the result-String
         +s.substring(i,n*2+i+1);
                               //   + the bottom part of the triangle
}                              // End of method (1)

String s(int n){               // Method (2) with integer parameter and String return-type
  String r="";                 //  Result-String
  for(;n-->0;r+=" ");          //  Append the result-String with `n` spaces
  return r;                    //  Return the result-String
}                              // End of method (2)

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.