Lipat string menjadi segitiga


22

Diberikan string yang panjangnya dapat dibagi 4, buat segitiga seperti yang ditunjukkan di bawah ini.

Jika stringnya abcdefghijkl, maka segitiga itu adalah:

   a
  b l
 c   k
defghij

Jika stringnya iamastringwithalengthdivisiblebyfour, maka segitiga itu adalah:

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

Jika stringnya thisrepresentationisnotatriangle, maka segitiga itu adalah:

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

Catatan

  • String hanya akan terdiri dari karakter dari ahingga z.
  • Leading / Trailing whitespaces dan baris baru diizinkan selama bentuknya tidak rusak.
  • Daftar string saat output diizinkan.

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.

Jawaban:


7

Arang , 25 22 21 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Cukup iris string menjadi tiga bagian dan cetak di arah yang sesuai. Sunting: Disimpan 3 byte dengan menggunakan pembagian integer dan slicing. Menyimpan byte lebih lanjut dengan menggunakan CycleChopalih-alih Sliceuntuk kepala string. Sunting: Charcoal sekarang mendukung menggambar teks sewenang-wenang di sepanjang tepi poligon, menyederhanakan kode hingga 12 byte:

GH↙→→↖⊕÷Lθ⁴θ

Cobalah online! Tautan adalah untuk mengucapkan versi kode.


Apa yang mereka lakukan?
Erik the Outgolfer

@EriktheOutgolfer Itulah operator Slice baru.
Neil

: | Ups yang dimaksudkan untuk membuat PolygonHollow melakukan ini, GH↙→→↖⊕÷Lθ⁴θakan berfungsi saat berikutnya saya mendorong Charcoal
ASCII-only

6

05AB1E , 23 byte

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

Cobalah online!

Penjelasan

ć                        # 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 byte

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

Diformat dan dikomentari

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

Uji kasus


4

C #, 260 byte

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

Benar-benar ingin menggunakannya SetCursorPosition.

Tidak Disatukan:

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

Maafkan ketidaktahuan saya, tetapi apa tujuan Aksi dalam solusi Anda? Apakah hanya sedikit byte daripada fungsi kosong?
confusedandamused

1
@confusedandamused Saya sudah terbiasa menulis jawaban fungsi tunggal sehingga bahkan tidak mempertimbangkan menempatkan fungsi normal, itu akan lebih pendek.
LiefdeWen

3

Mathematica, 164 byte

(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}]})&


memasukkan

["Aku harusmenggunakandivisiblebaikuntuk" "


Kita semua tahu itu [[1]]bisa diganti dengan #&@@.
user202729

1
kalian semua manis sekali!
J42161217


Ketika Anda menemukan diri Anda melakukannya @(...), lakukan [...]saja. Dan saya belum menguji tetapi Anda mungkin dapat menyimpan byte lain dengan memberikan Columnnama (atau bahkan mungkin Column[#,Alignment->Center]&untuk menghindari q) dan kemudian dengan meletakkan semua variabel yang tersisa ke argumen pertama dari luar Column(untuk menyimpan tanda kurung sekitarnya).
Martin Ender

3

Python 3 , 120 byte

Golf pertama, saya pikir saya mungkin juga belajar beberapa Python di sepanjang jalan.

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

Cobalah online!

Penjelasan:

Karakter pertama dicetak dengan sendirinya setelah len(a)//4spasi, maka karakter pertama dan terakhir imulai dari yang kedua dicetak, dipisahkan oleh 2*i - 1spasi.

Akhirnya, substring yang tersisa dicetak.


Selamat datang di PPCG! Anda bisa belajar dari solusi ini .
Leaky Nun

Golf yang memungkinkan di sini adalah untuk menyatakan p=print, dan kemudian gunakan saja puntuk ketiganya printyang Anda gunakan.
FlipTack

Juga, karena panjang tali dijamin selalu dapat habis dibagi empat, //(pembagian lantai) dapat diganti dengan /.
FlipTack

Omong-omong, kode yang Anda tautkan untuk mencoba online tidak sama dengan kode dalam jawaban Anda.
FlipTack

3

GNU sed , 178 158 132 + 1 = 133 byte

+1 byte untuk -rbendera.

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

Cobalah online!

Penjelasan

Dalam revisi sebelumnya saya menggunakan banyak byte yang berurusan dengan matematika, kasus khusus, dan pembersihan, meskipun secara intuitif saya yakin mereka bisa dihindari. Sejak itu saya berhasil melakukannya, kebanyakan.

Misalkan kita punya input abcdEFGHIJKLMnop. Surat-surat EFGHIJKLMakan menjadi bagian bawah segitiga, jadi saya telah memanfaatkannya sebagai alat bantu visual.

Pertama kita menyiapkan input dengan meletakkan karakter pertama pada barisnya sendiri (didahului oleh spasi) dan memasukkan kursor ( ;) sebelum karakter terakhir:

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

Sekarang kita punya:

 a
bcdEFGHIJKLMno;p

Sekarang, dalam satu lingkaran, kita akan melakukan beberapa hal ke baris terakhir: 1. Salin spasi dari baris sebelumnya dan masukkan setelah karakter pertama, ditambah dua; 2. Pindahkan karakter terakhir ke kanan setelah spasi, diikuti oleh baris baru; dan 3. Pindahkan kursor tiga karakter ke kiri.

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

Inilah hasil dari setiap iterasi:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

Anda dapat melihat piramida mulai terbentuk. Anda juga dapat melihat untuk apa kursor itu: Di setiap iterasi, kursor itu bergerak ke kiri tiga karakter, dan ketika tidak ada lagi tiga karakter di sebelah kirinya, itu mematahkan loop, yang kebetulan hanya ketika kita telah mencapai "bawah" dari piramida.

Sekarang kita akan melakukan operasi serupa tetapi secara terbalik. Dalam satu lingkaran, kami akan menyalin spasi dari awal baris dengan kursor ke awal baris sebelumnya, ditambah satu, dalam proses memindahkan kursor ke baris itu.

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

Berikut adalah beberapa iterasi dan hasil akhirnya:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

Kita semua sudah selesai sekarang, kecuali untuk beberapa karakter tambahan: A ;dan ruang ekstra pada baris pertama, dan dua ruang di "tengah" piramida pada tiga baris berikutnya. Substitusi sederhana menghilangkan mereka:

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

Semua selesai!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

Python 2 , 100 97 96 byte

  • Jacoblaw menyelamatkan 1 byte: divisi integer tidak perlu
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

Cobalah online!

Penjelasan:

Satu hal cerdas yang saya lakukan di sini adalah memasukkan input dengan spasi di bagian akhir, sehingga karakter pertama berpasangan dengannya dan ini dapat didorong ke dalam loop (dan karena spasi spasi tambahan diperbolehkan)

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.

Jumlah loop untuk diikuti terkait dengan len(word)//4. Pada langkah terakhir, seluruh string yang tersisa dicetak (ini membentuk dasar segitiga). Ruang mengikuti pola sederhana; set ruang pertama pergi berkurang 1, sedangkan set kedua ruang meningkat 2.


1
Bisakah Anda mencukur byte dengan tidak melakukan pembagian integer? Karena aakan selalu merupakan kelipatan dari 4. //->/
jacoblaw

Terima kasih, saya terkejut itu tidak membuat kesalahan apa pun bahkan untuk [input dengan panjang tidak dapat dibagi 4] [ tio.run/…
officialaimm

1
Itu karena dalam Python 2, pembagian adalah bilangan bulat secara default. Itu digulung dengan Python 3.
CalculatorFeline

2

C 225 byte

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

dijelaskan

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 byte

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

Cobalah online!


1

Oktaf, 87 byte

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

* Dalam mesin windows kode di atas menghasilkan hasil yang benar namun di tio saya menambahkan beberapa kode untuk memperbaikinya.

Penjelasan:

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

Cobalah online!


1

Haskell , 136 byte

i#x=x<$[1..i]
f s|let h=div l 4;l=length s=unlines$[(h-i)#' '++(s!!i):(2*i-1)#' '++[(s++" ")!!(l-i)]|i<-[0..h-1]]++[drop h$take(l-h+1)s]

Cobalah online!


1

PHP> = 7.1, 122 Bytes

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 Online

PHP> = 7.1, 124 Bytes

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 Online


1

AWK , 129 byte

{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

Cobalah online!

Saya harus berpikir ini bisa bermain golf sedikit lebih, hanya saja tidak melihatnya.


1

Retina , 99 byte

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

Cobalah online! Penjelasan: Dua tahap pertama menghasilkan dua baris pertama, tetapi setelah itu tidak ada casing khusus diperlukan dan setiap baris berikutnya dapat dihasilkan secara otomatis:

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 byte

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

Penjelasan:

Coba di sini.

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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.