พับสตริงเป็นรูปสามเหลี่ยม


22

รับสตริงที่มีความยาวหารด้วย 4 ทำสามเหลี่ยมตามตัวอย่างด้านล่าง

หากสตริงเป็นabcdefghijklดังนั้นรูปสามเหลี่ยมจะเป็น:

   a
  b l
 c   k
defghij

หากสตริงเป็นiamastringwithalengthdivisiblebyfourดังนั้นรูปสามเหลี่ยมจะเป็น:

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

หากสตริงเป็นthisrepresentationisnotatriangleดังนั้นรูปสามเหลี่ยมจะเป็น:

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

หมายเหตุ

  • สตริงจะประกอบด้วยอักขระตั้งแต่aถึงzเท่านั้น
  • ช่องว่างนำหน้า / ต่อท้ายและขึ้นบรรทัดใหม่ได้รับอนุญาตตราบใดที่รูปร่างไม่แตก
  • อนุญาตให้รายการสตริงเป็นเอาต์พุต

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์ ช่องโหว่มาตรฐานใช้

คำตอบ:


7

ถ่าน , 25 22 21 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด เพียงแค่แบ่งสตริงออกเป็นสามส่วนและพิมพ์ในทิศทางที่เหมาะสม แก้ไข: บันทึก 3 ไบต์โดยใช้การหารจำนวนเต็มและการแบ่งส่วน บันทึกไบต์เพิ่มเติมโดยใช้CycleChopแทนSliceส่วนหัวของสตริง แก้ไข: Charcoal สนับสนุนการวาดข้อความโดยพลการตามขอบของรูปหลายเหลี่ยมทำให้รหัสเป็น 12 ไบต์:

GH↙→→↖⊕÷Lθ⁴θ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด


พวกเขาทำอะไร
Erik the Outgolfer

@EriktheOutgolfer นั่นคือผู้ดำเนินการ Slice ใหม่
Neil

: | โอ๊ะตั้งใจที่จะทำให้รูปหลายเหลี่ยมติดตามนี้GH↙→→↖⊕÷Lθ⁴θจะทำงานในครั้งต่อไปที่ฉันกดถ่าน
ASCII- เท่านั้น

6

05AB1E , 23 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ć                        # 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 ไบต์

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

จัดรูปแบบและแสดงความคิดเห็น

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

กรณีทดสอบ


4

C #, 260 ไบต์

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

ต้องการใช้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--);
        }
    }
}

ให้อภัยความไม่รู้ของฉัน แต่อะไรคือจุดประสงค์ของการกระทำในการแก้ปัญหาของคุณ? มันน้อยกว่าฟังก์ชั่นโมฆะ?
สับสนถูกใช้เมื่อ

1
@confusedandamused ฉันเคยเขียนคำตอบฟังก์ชั่นเดียวดังนั้นไม่ได้พิจารณาการวางฟังก์ชั่นตามปกติมันจะสั้นลง
LiefdeWen

3

Mathematica, 164 ไบต์

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


อินพุต

[ "iamastringwithalengthdivisiblebyfour"]


เราทุกคนรู้ว่าสามารถถูกแทนที่ด้วย[[1]] #&@@
user202729

1
คุณเป็นคนที่ฉลาดมากเลย!
J42161217

ฉันหมายถึงcodegolf.stackexchange.com/questions/12900/...
user202729

เมื่อคุณพบว่าตัวเองทำ@(...)เพียงทำ[...]แทน และฉันยังไม่ได้ทดสอบ แต่คุณสามารถบันทึกไบต์อื่นได้ด้วยColumnการตั้งชื่อ (หรืออาจColumn[#,Alignment->Center]&จะหลีกเลี่ยงq) แล้วใส่ตัวแปรที่เหลือทั้งหมดลงในอาร์กิวเมนต์แรกของด้านนอกColumn(เพื่อบันทึกวงเล็บที่อยู่รอบ ๆ )
Martin Ender

3

Python 3 , 120 ไบต์

ครั้งแรกที่ฉันคิดว่าฉันอาจเรียนรู้ Python บางส่วนไปพร้อมกัน

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

ลองออนไลน์!

คำอธิบาย:

อักขระตัวแรกจะถูกพิมพ์ด้วยตัวเองหลังlen(a)//4ช่องว่างจากนั้นiอักขระตัวแรกและตัวสุดท้ายที่เริ่มต้นจากตัวที่สองจะถูกพิมพ์โดยคั่นด้วย2*i - 1ช่องว่าง

ในที่สุดสตริงย่อยที่เหลือจะถูกพิมพ์


ยินดีต้อนรับสู่ PPCG! คุณสามารถเรียนรู้จากวิธีนี้
Leun Nun

สนามกอล์ฟที่เป็นไปได้ที่นี่คือการประกาศp=printและจากนั้นใช้pสำหรับสามสนามprintที่คุณใช้
FlipTack

นอกจากนี้ความยาวสตริงรับประกันได้ว่าจะเสมอหารด้วยสี่//(ส่วนชั้น) /สามารถถูกแทนที่ด้วย
FlipTack

อย่างไรก็ตามรหัสที่คุณเชื่อมโยงเพื่อลองออนไลน์นั้นไม่เหมือนกับรหัสในคำตอบของคุณ
FlipTack

3

รุ่น GNU , 178 158 132 + 1 = 133 ไบต์

+1 ไบต์สำหรับการ-rตั้งค่าสถานะ

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

ลองออนไลน์!

คำอธิบาย

ในการแก้ไขครั้งก่อนหน้านี้ฉันใช้ไบต์จำนวนมากที่เกี่ยวข้องกับคณิตศาสตร์กรณีพิเศษและการล้างข้อมูลแม้ว่าฉันจะแน่ใจว่าสามารถหลีกเลี่ยงได้ ตั้งแต่นั้นมาฉันก็สามารถทำได้เช่นกัน

abcdEFGHIJKLMnopสมมติว่าเรามีการป้อนข้อมูล ตัวอักษรEFGHIJKLMจะอยู่ด้านล่างของสามเหลี่ยมดังนั้นฉันจึงใช้ตัวพิมพ์ใหญ่เป็นเครื่องมือช่วยในการมองเห็น

ก่อนอื่นเราเตรียมข้อมูลโดยใส่อักขระตัวแรกในบรรทัดของตัวเอง (นำหน้าด้วยช่องว่าง) และแทรกเคอร์เซอร์ ( ;) หน้าอักขระสุดท้าย:

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

ตอนนี้เรามี:

 a
bcdEFGHIJKLMno;p

ทีนี้ในวงเราจะทำสองสามสิ่งกับบรรทัดสุดท้าย: 1. คัดลอกช่องว่างจากบรรทัดก่อนหน้าและแทรกหลังจากอักขระตัวแรกบวกสอง; 2. ย้ายอักขระตัวสุดท้ายไปทางขวาหลังช่องว่างแล้วตามด้วยบรรทัดใหม่ และ 3. เลื่อนเคอร์เซอร์สามตัวไปทางซ้าย

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

นี่คือผลลัพธ์ของการวนซ้ำแต่ละครั้ง:

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

คุณสามารถเห็นปิรามิดเริ่มเป็นรูปเป็นร่าง นอกจากนี้คุณยังสามารถดูว่าเคอร์เซอร์ใช้ทำอะไร: ในแต่ละการวนซ้ำมันจะเลื่อนไปทางซ้ายสามตัวอักษรและเมื่อไม่มีตัวละครสามตัวทางซ้ายมันจะแบ่งลูปซึ่งจะเกิดขึ้นเมื่อเราถึง "ด้านล่าง" ของปิรามิด

ตอนนี้เรากำลังจะทำสิ่งที่คล้ายกัน แต่กลับกัน ในลูปเราจะคัดลอกช่องว่างจากจุดเริ่มต้นของบรรทัดด้วยเคอร์เซอร์ไปยังจุดเริ่มต้นของบรรทัดก่อนหน้าบวกหนึ่งในกระบวนการย้ายเคอร์เซอร์ขึ้นไปที่บรรทัดนั้น

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

นี่คือการวนซ้ำสองครั้งและผลลัพธ์สุดท้าย:

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

เราเสร็จเรียบร้อยแล้วยกเว้นอักขระพิเศษบางตัว: A ;และช่องว่างพิเศษในบรรทัดแรกและช่องว่างสองช่องใน "กึ่งกลาง" ของปิรามิดในสามบรรทัดถัดไป การทดแทนอย่างง่ายกำจัดพวกมันได้:

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

เสร็จเรียบร้อย!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

Python 2 , 100 97 96 ไบต์

  • Jacoblawบันทึก 1 ไบต์: การหารจำนวนเต็มไม่จำเป็น
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

ลองออนไลน์!

คำอธิบาย:

สิ่งหนึ่งที่ชาญฉลาดที่ฉันทำที่นี่คือการเพิ่มอินพุตด้วยช่องว่างในตอนท้ายเช่นตัวละครตัวแรกจับคู่กับมันและสิ่งนี้สามารถผลักเข้าไปในลูปได้ (และเนื่องจากอนุญาตให้ใช้ช่องว่างต่อท้าย)

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.

len(word)//4จำนวนของลูปที่จะปฏิบัติตามมีความเกี่ยวข้องกับ ในขั้นตอนสุดท้ายสตริงที่เหลือทั้งหมดจะถูกพิมพ์ (ซึ่งจะเป็นฐานของรูปสามเหลี่ยม) ช่องว่างเป็นไปตามรูปแบบที่เรียบง่าย ช่องว่างชุดแรกเริ่มลดลง 1 ขณะที่ช่องว่างชุดที่สองเพิ่มขึ้น 2


1
คุณสามารถโกน byte โดยไม่ทำการแบ่งจำนวนเต็มได้หรือไม่? เนื่องจากaจะเป็นทวีคูณของ 4. //->/
jacoblaw

ขอขอบคุณฉันรู้สึกประหลาดใจที่ไม่ได้โยนข้อผิดพลาดใด ๆ แม้แต่สำหรับ [อินพุตที่มีความยาวไม่หารด้วย 4] [ tio.run/…
เป็นทางการ

1
นั่นเป็นเพราะใน Python 2 การหารเป็นจำนวนเต็มโดยค่าเริ่มต้น ที่ถูกกระแทกใน Python 3
CalculatorFeline

2

C 225 ไบต์

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

อธิบาย

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
}


1

ระดับแปดเสียง 87 ไบต์

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

* ในเครื่อง windows รหัสด้านบนสร้างผลลัพธ์ที่ถูกต้อง แต่ใน tio ฉันเพิ่มรหัสบางอย่างเพื่อแก้ไข

คำอธิบาย:

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

ลองออนไลน์!




1

AWK , 129 ไบต์

{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

ลองออนไลน์!

ฉันควรคิดว่านี่น่าจะเป็นสนามกอล์ฟอีกเล็กน้อย แต่ไม่เห็น


1

เรติน่า 99 ไบต์

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

ลองออนไลน์! คำอธิบาย: สองขั้นตอนแรกสร้างสองบรรทัดแรก แต่หลังจากนั้นไม่จำเป็นต้องมีการใส่ปลอกพิเศษและแต่ละบรรทัดที่ตามมาสามารถสร้างขึ้นโดยอัตโนมัติ:

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 ไบต์

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

คำอธิบาย:

ลองที่นี่

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)

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