วาดเส้นทแยงมุมของข้อความ


46

กำหนดอินพุตของรายการคำเอาท์พุทคำด้วยตัวอักษรของพวกเขาจัดแนวทแยงมุม:

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f

(ข้างต้นควรเป็นเอาต์พุตสำหรับอินพุตprogramming puzzles and code golf)

เพื่อความแม่นยำแต่ละคำจะเริ่มต้นที่คอลัมน์แรกและสามแถวด้านล่างคำก่อนหน้าและตัวอักษรต่อเนื่องแต่ละตัวจะย้ายหนึ่งคอลัมน์ไปทางขวาและลงหนึ่งแถว

การป้อนข้อมูลอาจมีให้เป็นชุดคำเดียวโดยคั่นด้วยช่องว่างหนึ่งช่องหรือรายการ / ชุดคำ คำจะประกอบด้วยตัวอักษรตัวพิมพ์เล็กa-zเท่านั้นและจะต้องมีความยาวอย่างน้อยหนึ่งตัวอักษร

ผลลัพธ์อาจเป็นสายอักขระเดียวอาร์เรย์ของบรรทัดหรืออาร์เรย์ของอักขระ ไม่อนุญาตให้นำช่องว่างนำหน้าหรือต่อท้ายยกเว้นบรรทัดใหม่ต่อท้ายบรรทัดเดียว

กรณีทดสอบเพิ่มเติม:

a bcd efgh i j

a


b
 c
  d
e
 f
  g
i  h


j

x

x

verylongword short

v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

ตั้งแต่นี้เป็นรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!


ฉันรู้สึกว่าฉันควรจะสามารถสร้างโปรแกรม Python ได้ภายใน 5 นาที แต่ดูเหมือนว่าจะล้มเหลวเสมอ ... ; _;
HyperNeutrino

ว้าวดูเหมือนว่ามีความท้าทายมากมายที่ออกแบบมาสำหรับTurtléd
Destructible Lemon

อนุญาตให้ใช้รหัสยกเว้นเทอร์มินัลได้หรือไม่ :)
Chromium

คำตอบ:


17

เป็นกลุ่ม, 85, 76, 66 , 52 การกดแป้น / ไบต์

เมื่อแรกที่ฉันดูความท้าทายนี้ฉันคิดว่า "นี่เหมาะสำหรับกลุ่ม!" และเมื่อฉันลองทุกอย่างผิดพลาด นี่มันคือทั้งหมดที่เกี่ยวกับความยุ่งเหยิงที่ยุ่งเหยิง:

:se ve=all|s/ /\r\r\r/g
qqGo<esc>?\<.\S
lDjP@qq@qG?.
jdG

ลองใช้ออนไลน์ขอบคุณล่าม V ส่วนใหญ่ที่เข้ากันได้แบบย้อนหลัง

คำอธิบาย:

ตอนแรกฉันคิดว่าฉันสามารถทำรุ่น 37 ไบต์ที่เรียบง่ายได้อย่างสวยงาม:

:se ve=all
qq:g/\S\S/norm ^lDjP
@qq@q

น่าเสียดายที่มันไม่ง่ายอย่างนั้น ลองดูทีละบรรทัด:

:se ve=all

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

ตอนนี้เราต้องแยกคำออกเป็นบรรทัดต่างกัน ดังนั้นเราจะแทนที่แต่ละช่องว่างด้วย 3 บรรทัดใหม่ เนื่องจากนี่เป็นคำสั่ง ex เราจึงสามารถเรียกใช้ได้พร้อมกันกับคำสั่ง ex สุดท้ายของเรา:se ve=allโดยแยกทั้งสองด้วยแถบ

|s/ /\r\r\r/g

ตอนนี้บัฟเฟอร์มีลักษณะดังนี้:

Programming


Puzzles


and


code-golf

นี่คือจุดเริ่มต้นของความสนุก เราตั้งค่าแมโครแบบเรียกซ้ำโดยใช้: qqแล้วเรียกสิ่งนี้:

G               " Move to the last line
 o<esc>         " Append an extra newline

?               " Search backwards for
 \<.            " Any character at the beginning of a word
    \S          " Followed by a non-space character
l               " Move one character to the right
 D              " Delete eveything until the end of this line
  j             " Move down one line
   P            " Paste what we just deleted

แล้วเราจบแมโคร recursive @qq@qกับ ณ จุดนี้เรามีเส้นทแยงมุมทั้งหมดเราแค่ต้องทำความสะอาดนิดหน่อย

G                   " Move to the last line
 ?.                 " Search backwards for any character
j                   " Move down one line
 dG                 " Delete until the end of the buffer

ว้าว JavaScript มีขนาดสั้นกว่า Vim นั่นเป็นเหตุการณ์ที่เกิดขึ้นได้ยากในทุกวันนี้ ...
ผลิตภัณฑ์ ETH

@ETHproductions ไม่มีอีกแล้ว :)
DJMcMayhem

6

Turtlèd , 28 26 ไบต์

โอ้ฉันฉันจะเต้นภาษาที่ออกแบบมาโดยเฉพาะสำหรับการเล่นกอล์ฟ วันนี้เป็นวันที่ดี

!_4[*.[ rd+.]ul[ ul]r;_+]_

ลองออนไลน์!

คำอธิบาย

(เขียนหมายถึงการเขียนไปยังเซลล์ในตาราง, แหลม char หมายถึงถ่านในการป้อนตัวชี้สตริงที่ชี้ไปที่)

!                         Take string input into variable
 _                        Normally conditional, with >1 input (there will be), write ' '
  4                       set register to 4
   [*                   ] until the current cell is *
     .                    Write pointed char, initially first char
      [     ]             Until space is written on cell
        rd+.              move right, down, string pointer++, write pointed char
             ul[ ul]      Move back up to the top of the word
                    r;    Move right, down 4 (because this is register value)
                      _+  write * if end of input, else ' ', increment string pointer
                        _ will always write ' ', since it will always point at start char

บันทึกพื้นที่ต่อท้าย

อินพุตยังต้องการพื้นที่ต่อท้าย การเห็นว่าไพ ธ อนสามารถทำรายการได้สิ่งนี้ก็เหมือนกับการจดรายการในTurtlèd


5

MATL , 28 ไบต์

c!t&n:q3_*ts_b+5M4$XdZ!cZ{Zv

อินพุตเป็นอาร์เรย์ของสตริงที่มีเครื่องหมายจุลภาคเป็นตัวคั่นทางเลือก:

{'programming' 'puzzles' 'and' 'code' 'golf'}

หรือ

{'programming', 'puzzles', 'and', 'code', 'golf'}

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด: 1 , 2 , 3 , 4

คำอธิบาย

พิจารณาอินพุตต่อไปนี้เป็นตัวอย่าง:

{'aaaa' 'bb' 'ccc'}

คุณสามารถดูผลลัพธ์บางส่วน (เนื้อหาสแต็ค) แทรกสัญลักษณ์ความคิดเห็น%ที่จุดใดก็ได้ในรหัส ตัวอย่างเช่นดูเนื้อหาสแต็กหลังจากฟังก์ชันที่สี่ ( &n)

c        % Input cell array of strings implicitly. Convert to 2D char array,
         % right-padding with spaces
         % STACK: ['aaaa'; 'bb  '; 'ccc']
!        % Transpose
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  ']
t        % Duplicate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '],
                  ['abc'
                   'abc'
                   'a c'
                   'a  '],
&n       % Number of rows and of columns
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, 3
:q       % Range, subtract 1
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 1 2]
3_*      % Multiply by -3
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6]
ts_      % Duplicate, sum, negate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6], 9
b        % Bubble up in stack
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 9, 4
+        % Add
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13
5M       % Push second input of last function again
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13, 4
4$Xd     % Buld numerical sparse matrix from the above four arguments. The
         % columns of the first input argument will be the diagonals of the
         % result, with indices given bu the second input (negative is below
         % main diagonal). The matrix size is the third and fourth arguments
         % STACK: [97  0  0  0
                    0 97  0  0
                    0  0 97  0
                   98  0  0 97
                    0 98  0  0
                    0  0 32  0
                   99  0  0 32
                    0 99  0  0
                    0  0 99  0
                    0  0  0 32
                    0  0  0  0
                    0  0  0  0
                    0  0  0  0]
Z!c      % Convert from sparse to full, and then to char. Character 0 is
         % displayed as space
         % STACK: ['a   '
                   ' a  '
                   '  a '
                   'b  a'
                   ' b  '
                   '    '
                   'c   '
                   ' c  '
                   '  c '
                   '    '
                   '    '
                   '    '
                   '    ']
Z{       % Split into cell array, with each row in a cell
         % STACK: {'a   ', ' a  ', '  a ', 'b  a', ' b  ', '    ', 'c   ', ' c  ', '  c ', '   ', '   ', '   ', '   '}
Zv       % Deblank: remove trailing space from each string. Implicitly display,
         % each string on a different line. Empty strings do not generate
         % a newline
         % STACK: {'a   ', ' a', '  a', 'b  a', ' b', '', 'c', ' c', '  c', '', '', '', ''}

4

JavaScript (ES6), 118 109 84 ไบต์

รับอินพุตเป็นอาร์เรย์ของคำ ส่งคืนอาร์เรย์ของอาร์เรย์อักขระ

s=>s.map((w,y)=>[...w].map((c,x)=>(a[p=y*3+x]=a[p]||Array(x).fill(' '))[x]=c),a=[])&&a

รุ่นทางเลือก 109 ไบต์

ส่งคืนสตริง


2

Common LISP, 673 668 597 ไบต์

วิธีแก้ปัญหาแย่มากฉันรู้ ฉันจะแก้ไขเพิ่มเติมหลังจากนอนหลับ

(defun f(&rest z)(let((l)(a 0)(s)(o)(b)(c 0))(loop(setf b(length l))(setf l"")(loop for w in z for i from 0 do(if(>(+(length w)(* i 3))c)(setf c(+(length w)(* i 3))))(setf s(+(* i -3)a))(when(and(>= s 0)(< s(length w)))(setf o(format nil"~v@{~a~:*~}"s" "))(if(and(>=(- s 3)0)(not(equal i(-(length z)1))))(setf o(subseq o(- s 2))))(setf l(concatenate'string o(string(char w s))l)))(when(>= s(length w))(setf l(concatenate'string"   "l))))(if(<=(length l)b)(setf l(concatenate'string(format nil"~v@{~a~:*~}"(- b(length l)-1)" ")l)))(print(string-right-trim" "l))(if(>= b c)(return))(setf a(1+ a)))))

การใช้งาน:

* (f "ppcg" "is" "pretty" "ok")

"p" 
" p" 
"  c" 
"i  g" 
" s" 
"" 
"p" 
" r" 
"  e" 
"o  t" 
" k  t" 
"     y" 
""
NIL

สิ่งนี้จะวนซ้ำทุกคำในรายการที่ให้ไว้และเพิ่มอักขระที่เหมาะสมให้กับบรรทัดปัจจุบัน ช่องว่างภายในที่เหมาะสมให้บริการโดยการใช้งาน subpar formatของฉัน

หมายเหตุ: ฉันใหม่กับ Common LISP แต่ฉันรู้เพียงพอที่จะตระหนักว่านี่อาจใช้การปรับปรุงอย่างมาก


2
> :( "ppcg ... ตกลง" !?
เลมอนที่ถูกทำลายได้

2

C #, 336 ไบต์:

แข็งแรงเล่นกอล์ฟ:

string D(string[]s){int x=0,y=0,r=0,q=2*(s.Max().Length+s.Length)+1;var a=new char[q, q];for(int i=0;i<s.Length;i++){y=r;for(int j=0;j<s[i].Length;j++){a[y,x]=s[i][j];x+=1;y+=1;}x=0;r+=3;}var o="";for(x=0;x<q;x++){var t="";for(y=0;y<q;y++)t+=a[x,y];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\r\n");}return o;}

Ungolfed:

public string D(string[] s)
{
  int x = 0, y = 0, r = 0, q = 2 * (s.Max().Length + s.Length) + 1;
  var a = new char[q, q];
  for (int i = 0; i < s.Length; i++)
  {
    y = r;
    for (int j = 0; j < s[i].Length; j++)
    {
      a[y, x] = s[i][j];
      x += 1;
      y += 1;
    }
    x = 0;
    r +=3;
  }
  var o = "";
  for (x = 0; x < q; x++)
  {
    var t = "";
    for (y = 0; y < q; y++)
      t += a[x, y];
    o += t == string.Join("", Enumerable.Repeat('\0', q)) ? "" : (t.TrimEnd('\0') + "\r\n");
  }
  return o;
}

การทดสอบ:

  var codeGolf = new DrawDiagonalLinesOfText();
  Console.WriteLine(codeGolf.E(new string[] { "programming", "puzzles", "and", "code", "golf" }));
  Console.WriteLine(codeGolf.E(new string[] { "a", "bcd", "efgh", "i", "j" }));
  Console.WriteLine(codeGolf.E(new string[] { "verylongword", "short" }));

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f


a
b
 c
  d
e
 f
  g
i  h
j


v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

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

@Doorknob โอ๊ะโอขอโทษ ... แก้ไขแค่ 2 ไบต์เท่านั้น :)
Pete Arden

1
คอมไพล์ไปFunc<string[], string>และทำการเปลี่ยนแปลงอื่น ๆ อีกมากมายสำหรับ 297 ไบต์s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};แต่คุณต้องเพิ่ม 18 ไบต์using System.Linq;
TheLethalCoder

@TheLethalCoder ขอบคุณ แต่ฉันไม่ต้องการที่จะใช้วิธีการแก้ปัญหาทั้งหมดของคุณ :)
พีอาร์เดน

มันไม่ใช่ของคุณฉันแค่เอาของบางอย่างออกไปแล้วนั่นก็คือการเคลื่อนย้ายพวกมันiและjไปยังการประกาศ int ที่ด้านบนและเคลื่อนย้ายบางส่วน++ดังนั้นพวกมันจึงถูกใช้ในการใช้งานตัวแปรครั้งสุดท้าย
TheLethalCoder

2

Python 2, 146 ไบต์

s=input()
k=max(map(len,s))
a=[k*[' ']for x in range(k+len(s)*3+3)]
for x in range(len(s)):
 for y in range(len(s[x])):a[x*3+y][y]=s[x][y]
print a

หมายเหตุ: การเยื้องสำหรับสองบรรทัดสุดท้ายคือ<space>และ<tab>ซึ่งบันทึกหนึ่งไบต์เนื่องจากฉันไม่จำเป็นต้องเยื้องสองครั้ง

การป้อนข้อมูลจะได้รับการป้อนเป็นอาร์เรย์ของสตริงเช่นดังนั้น: หรือ["hello", "world"] ['hello', 'world']เอาต์พุตคืออาร์เรย์ของอาร์เรย์ของอักขระ

อาจมีวิธีที่ดีกว่าในการทำเช่นนี้ ...

แก้ไขขอบคุณ Doorknob ที่ชี้ให้เห็นว่าฉากสี่เหลี่ยมจัตุรัสปิดหายไป ฉันวางไว้ก่อนหน้า*k...ในบรรทัดที่สาม


มีข้อผิดพลาดทางไวยากรณ์ในรหัสของคุณในบรรทัดที่สาม; มีวงเล็บสองอันที่เปิดอยู่ แต่มีเครื่องหมายวงเล็บปิดอยู่เพียงอันเดียว อย่างไรก็ตามฉันจะแก้ไขมัน (โดยการเพิ่มวงเล็บปิดพิเศษหรือลบวงเล็บเปิดพิเศษ) โปรแกรมจะแสดงข้อผิดพลาดเมื่อทำงาน
Doorknob

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


@LeakyNun ขอบคุณ คุณเพิ่งจะผ่านและเล่นกอล์ฟคำตอบทั้งหมดของฉัน? : P
HyperNeutrino

1

Mathematica, 146 ไบต์

P=PadRight;T=Transpose;R=Riffle;Select[Rest@T@P@MapIndexed[""~Table~#2~Join~#1&,T@P@R[Characters/@#~R~{},{},3]]//.{0->"",{x__,""}->{x}},#!={""}&]&

ฉันผิดหวังโดยจำนวนนี้ แต่โอ้ดี

กำหนดฟังก์ชั่นนิรนามที่รับรายการคำ (เช่น{"this","that","these"}) และส่งกลับอาร์เรย์แบบสองมิติของอักขระ หากต้องการดูในรูปแบบกริดให้เพิ่ม//Gridที่ท้าย

แปลงสตริงไปยังอาร์เรย์เพิ่มบรรทัดพิเศษสลับอาร์เรย์เตรียมการเลื่อนที่จำเป็นจากนั้นสลับอีกครั้ง

ตัวอย่างผลลัพธ์ (จัดรูปแบบเป็นกริด): ตัวอย่างผลลัพธ์


1

เยลลี่ 24 ไบต์

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷

ลองออนไลน์!

อย่างไร?

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷ - Main link: a list of strings
z                        - transpose with filler...
 ⁶                       -     space character
  j€                     - join €ach with
    ⁾                    -     two spaces
       µ                 - monadic chain separation, call the result x
        J                - range(length(x)) [1,2,...,x]
         ’               - decrement (vectorises) [0,1,...x-1]
           ẋ             - repeat (vectorises)
          ⁶              - a space ['', ' ',...,'x spaces']
             "           - zip with
            ;            - concatenation (prefixes with the space strings)
              z          - transpose with filler...
               ⁶         -     space character
                œr€⁶     - trim spaces from the right of €ach
                    Y    - join with line feeds
                     œr⁷ - trim line feeds from the right
                         - implicit print

1

Python 2, 182 ไบต์

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:
  i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i];k+=1
  if i==M-1:r=r.rstrip()+'\n'
 return r.strip()

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

รายการคำถูกส่งผ่านไปยังฟังก์ชัน 'ช่องว่าง' บางรายการถูกนำไปใช้กับรายการนี้จากนั้นอัลกอริทึมจะจับคู่แถวคู่คอลัมน์กับ wordNumber, characterNumber ในรายการที่ขยาย (นี่เป็นบิตของการผกผันของกลยุทธ์ปกติที่เห็นในการแก้ปัญหาอื่น ๆ )

หากเราอนุญาตการเว้นวรรคต่อท้ายในทุกบรรทัดยกเว้นที่ผ่านมาเราสามารถทำได้ดีขึ้นเล็กน้อย (163 bytes):

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i]+'\n'*(i==M-1);k+=1
 return r.strip()

1

q / kdb +, 130 109 94 90 86 84 ไบต์

วิธีการแก้:

f:{-1(+)a rtrim(til(#)E){raze(x#" "),y,\:"  "}'E:(+)(a:{(max(#:)each x)$x})" "vs x;}

ตัวอย่าง:

q)f "programming puzzles and code golf"
p          
 r         
  o        
p  g       
 u  r      
  z  a     
a  z  m    
 n  l  m   
  d  e  i  
c     s  n 
 o        g
  d        
g  e       
 o         
  l        
   f 
q)f "a bcd efgh i j"
a   


b   
 c  
  d 
e   
 f  
  g 
i  h


j  
q)f (),"x"
x
q)f "verylongword short"
v           
 e          
  r         
s  y        
 h  l       
  o  o      
   r  n     
    t  g    
        w   
         o  
          r 
           d

คำอธิบาย (ungolfed):

สรุปสาระสำคัญพื้นฐานคือการสร้างกลุ่มของสตริงความยาวเท่ากันจากสตริงอินพุตพลิก (หมุน) พวกเขาแล้วเพิ่มช่องว่างที่เหมาะสมเพื่อให้ได้สิ่งที่มีลักษณะเช่นนี้:

"p  p  a  c  g   "
" r  u  n  o  o  "
"  o  z  d  d  l "
"   g  z     e  f"
"    r  l        "
"     a  e       "
"      m  s      "
"       m        "
"        i       "
"         n      "
"          g     "

ซึ่งจะพลิกอีกครั้งและพิมพ์ไปยัง stdout

นี่คือการแบ่งแนวคิดตามบรรทัด:

A:"programming puzzles and code golf"; // original input
B:" " vs A;                            // split on " "
C:max count each B;                    // find length of the longest string
D:C$B;                                 // pad each string to this length
E:flip D;                              // flip (rotate) string
F:{raze(x#" "),y,\:"  "};              // appends each char with "  " and prepends an increasing number of " "
G:(til count E)F'E;                    // execute function F with each pair of 0..n and item in list E
H:max count each rtrim G;              // find longest string (ignoring right whitespace)
I:H$G;                                 // pad each of the strings to this length
J:flip I;                              // flip to get result
-1 J;                                  // print to stdout, swallow return value

หมายเหตุ:

ไม่กี่วิธีที่จะโกนบางส่วน (11) ไบต์ง่ายถ้าเราจริงๆอยากไปที่:

  • สามารถบันทึก 2 ไบต์โดยปล่อยf:และปล่อยให้เป็นฟังก์ชันที่ไม่ระบุชื่อ
  • สามารถบันทึกได้ 3 ไบต์โดยปล่อย-1และ;และส่งคืนรายการสตริงแทนที่จะพิมพ์ไปยัง stdout
  • สามารถบันทึก 6 ไบต์ได้ถ้าเราส่งผ่านรายการสตริงแทนที่จะเป็นสตริงที่คั่นด้วยช่องว่าง

การแก้ไข:

  • -11 ไบต์ใช้rtrimเพื่อค้นหาความยาวสูงสุดถึงแผ่นนำออกต้องเก็บCตัวแปร
  • -15 ไบต์สลับไปmax count eachใช้ฟังก์ชั่นแลมบ์ดาaซึ่งถูกสร้างขึ้นหนึ่งครั้งและใช้สองครั้ง
  • -4 ไบต์ย้ายrazeไปที่ฟังก์ชั่นแลมบ์ดาเพื่อบันทึกraze each
  • -4 ไบต์ทำให้ฟังก์ชั่นหลักแลมบ์ดาเพิ่มช่องว่าง
  • -2 ไบต์ใช้(+)สำหรับจดชวเลขflip

1

ถ่าน , 16 9 ไบต์

WS«P↘ιM³↓

คำตอบถ่านครั้งแรกของฉัน ขอบคุณ@DLoscสำหรับคำแนะนำและแทนที่จะใช้และ(กระโดด) เพื่อกลับไปที่จุดเริ่มต้นของบรรทัด (และสามลง)

ลองออนไลน์ (verbose)หรือลองออนไลน์ (บริสุทธิ์)

คำอธิบาย:

วนซ้ำในขณะที่ยังมีสตริงอินพุตถัดไป:

While(InputString()){ ... }
WS« ...

พิมพ์สตริงนี้โดยไม่เลื่อนเคอร์เซอร์ไปในทิศทางขวา:

Multiprint(:DownRight, i);
P↘ι

จากนั้นเลื่อนตำแหน่งที่สามลงเพื่อทำซ้ำครั้งถัดไป:

Move(3, :Down);
M³↓

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

อย่างน้อยที่สุดก็ไม่มีใครบ่นเมื่อผมใช้เคล็ดลับที่นี่ :-)
Charlie

@CarlosAlejo ฉันเจอคำตอบของคุณเมื่อฉันกำลังมองหาแรงบันดาลใจในคำตอบ Charcoal ที่มีอยู่ :)
Kevin Cruijssen

IDK วิธีที่ฉันมักจะใช้เป็นเพียงแค่สตริง + สตริงว่างที่ท้ายถ้ามี multiline แล้วใส่เป็นอาร์เรย์หลาม
ASCII เท่านั้นเท่านั้น

@CarlosAlejo มันผ่านมานานแล้ว แต่ฉันเพิ่งใช้หลายบรรทัดตอนนี้ด้วยบรรทัดว่างเพื่อทำลาย while (และ golfed 7 bytes ในเวลาเดียวกัน) เห็นว่ามันถูกใช้ในหนึ่งในคำตอบของNeilและตอนนี้ฉันเห็นASCII เท่านั้นที่แนะนำสิ่งเดียวกัน (อย่างใดพลาดความคิดเห็นนั้น)
Kevin Cruijssen

1

Japtap -Rx, 17 16 13 ไบต์

รับอินพุตเป็นอาร์เรย์ของคำ หากอนุญาตให้ช่องว่างต่อท้ายในแต่ละบรรทัดนั้นสามารถลบอักขระ 4 ตัวสุดท้ายเพื่อผูกกับโซลูชัน Charcoal

yÈmú3)iYçÃmx1

ลองใช้หรือเรียกใช้กรณีทดสอบทั้งหมด


คำอธิบาย

y                 :Transpose
 È                :Map each word at 0-based index Y
  m               :  Map each character
   ú3             :    Right pad with spaces to length 3
     )            :  End mapping
      i           :  Prepend
       Yç         :   Space repeated Y times
         Ã        :End mapping and transpose
          m       :Map
           x1     :  Trim right
                  :Implicitly join with newlines, trim and output

1

K4 , 58 ไบต์

วิธีการแก้:

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:

ตัวอย่าง:

q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("programming";"puzzles";"and";"code";"golf")
"p          "
" r         "
"  o        "
"p  g       "
" u  r      "
"  z  a     "
"a  z  m    "
" n  l  m   "
"  d  e  i  "
"c     s  n "
" o        g"
"  d        "
"g  e       "
" o         "
"  l        "
"   f       "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:(,"a";"bcd";"efgh";,"i";,"j")
"a   "
"    "
"    "
"b   "
" c  "
"  d "
"e   "
" f  "
"  g "
"i  h"
"    "
"    "
"j   "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("verylongword";"short")
"v           "
" e          "
"  r         "
"s  y        "
" h  l       "
"  o  o      "
"   r  n     "
"    t  g    "
"        w   "
"         o  "
"          r "
"           d"

คำอธิบาย:

สตริงแผ่นขวา - ขวาเพื่อให้มีความยาวเดียวกันเคลื่อนย้ายเข้าร่วมกับ" "แผ่นซ้ายเพื่อสร้างเส้นทแยงมุมจากนั้นแผ่นขวาจะแก้ไขความยาวและย้อนกลับ รับรายการสตริงและส่งคืนรายการสตริง น่าจะเป็นกอล์ฟ แต่ก็ยังสั้นกว่าโซลูชัน q / kdb + ของฉัน

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:
                                                        x:      / save as variable x
                                                       $        / pad
                                             (        )         / do this together
                                                  #:'x          / count (#:) each (') x
                                                |/              / max
                                              c:                / save as variable c
                                            +                   / flip / transpose
                                           $                    / string ($)
                                    "  "/:'                     / join each with "  "
                                   $                            / pad
                      (           )                             / do this together
                                #x                              / count (#) x
                              3*                                / multiply by 3
                             +                                  / add to
                         (  )                                   / do this together
                          !c                                    / range 0..c
                       2-                                       / subtract from 2
                    x:                                          / save as x:
                   $                                            / pad
 (                )                                             / do all this together
    {         }@'x                                              / apply (@) lambda {} to each x
            ^x                                                  / null (^) x (" " is considered null)
           ~                                                    / not
          |                                                     / reverse
        |\                                                      / max (|) scan (\), maxs
     0+/                                                        / sum (+) over (/) starting with 0
  |/                                                            / max (|) over (/), max
+                                                               / transpose

0

Perl 6 , 73 ไบต์

{my@t;for .kv ->\i,\w{for w.comb.kv {@t[3*i+$^a][$^a]=$^b}};@t »||»" "}

ลองออนไลน์!

อาร์กิวเมนต์อินพุตเป็นรายการของคำ ผลลัพธ์คืออาร์เรย์ของอาร์เรย์ของอักขระ


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