Văn bản tam giác


39

Viết chương trình hoặc hàm lấy trong một chuỗi được đảm bảo chỉ chứa các ký tự ASCII có thể in được ngoại trừ khoảng trắng và là số tam giác dương (1, 3, 6, 10, 15, ...).

In hoặc trả lại cùng một chuỗi, nhưng được định hình thành một hình tam giác bằng cách sử dụng khoảng trắng. Một số ví dụ sẽ thể hiện tốt nhất những gì tôi muốn nói:

Nếu đầu vào là Rthì đầu ra sẽ là

R

Nếu đầu vào là catthì đầu ra sẽ là

 c
a t

Nếu đầu vào là monk3ythì đầu ra sẽ là

  m
 o n
k 3 y

Nếu đầu vào là meanIngfu1thì đầu ra sẽ là

   m
  e a
 n I n
g f u 1

Nếu đầu vào là ^/\/|\/[]\thì đầu ra sẽ là

   ^
  / \
 / | \
/ [ ] \

Nếu đầu vào là

Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?

sau đó đầu ra sẽ là

              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e d a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?

Về cơ bản, các dòng mới được chèn vào giữa các chuỗi con có chiều dài hình tam giác, các khoảng trắng được thêm vào giữa tất cả các ký tự và mỗi dòng được thụt vào với các khoảng trắng để khớp với hình dạng tam giác.

Một dòng mới duy nhất và các dòng có khoảng trắng ở cuối được tùy chọn cho phép, nhưng nếu không thì đầu ra của bạn phải khớp chính xác với các ví dụ này. Dòng cuối cùng của tam giác không nên có khoảng trắng ở đầu.

Mã ngắn nhất tính bằng byte thắng.


Có tối đa tuyệt đối độ dài của chuỗi có thể được không?
geokavel

@geokavel Nó sẽ hoạt động với mọi độ dài của chuỗi mà ngôn ngữ của bạn thường có thể xử lý.
Sở thích của Calvin

11
Đây là một cây thông Giáng sinh cho những ai chưa đặt chúng lên. * / \ / | \ / | o \ / | o | \ / o | o | \ / | | o | o \ / o ||| o | \ / o | | o ||| \ / || o | | | o | \ / | o ||| o || o \
Timmy

Câu trả lời:


9

Bình thường, 22 byte

jua+L\ GjdHfTczsM._UzY

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

jua+L\ GjdHfTczsM._UzY   implicit: z = input string
                   Uz    create the list [0, 1, ..., len(z)-1]
                 ._      all prefixes of this list: [[0], [0,1], [0,1,2], ...]
               sM        sum up each sublist: [0, 1, 3, 6, 10, ...]
             cz          split z at these indices
           fT            remove all the unnecessary empty strings
                         this gives us the list of strings of the triangle
 u                   Y   reduce this list, with the initial value G = []
   +L\ G                    prepend a space to each string in G
        jdH                 join the current string with spaces
  a                         and append it to G
j                        print each string on a separate line

12

Python, 81 byte

def f(s,p=''):
 i=-int(len(2*s)**.5)
 if s:f(s[:i],p+' ');print p+' '.join(s[i:])

Một hàm đệ quy. Đi từ cuối s, cắt ra và in các ký tự. Số lượng ký tự cần lấy được tính từ độ dài của s. Hàm được thiết lập để in theo thứ tự ngược lại của các cuộc gọi đệ quy, kết thúc khi strống và sau đó giải quyết sao lưu dòng. Mỗi lớp, tiền tố pcó thêm một không gian được thêm vào.

Trong Python 3, điều này ifcó thể được thực hiện thông qua đoản mạch, mặc dù điều này dường như không lưu ký tự:

def f(s,p=''):i=-int(len(2*s)**.5);s and[f(s[:i],p+' '),print(p+' '.join(s[i:]))]

Một thay thế dài bằng nhau với chuỗi bất bình đẳng:

def f(s,p=''):i=-int(len(2*s)**.5);''<s!=f(s[:i],p+' ')!=print(p+' '.join(s[i:]))

Cả hai printftrở lại None, đó là khó sử dụng.


1
Điều này khá thông minh. Bằng cách cắt từng chuỗi một hàng một lần, bạn vẫn kết thúc chuỗi có độ dài hình tam giác để tính số lượng khoảng trắng hàng đầu với.
xsot

6

Võng mạc , 108 102 94 87 82 64 63 byte

Cảm ơn Sp3000 vì đã khiến tôi theo đuổi cách tiếp cận ban đầu của mình, điều này đã đưa số byte từ 108 xuống còn 82.

Rất nhiều lời cảm ơn đến Kobi, người đã tìm ra một giải pháp thanh lịch hơn nhiều, cho phép tôi lưu thêm 19 byte trên đó.

S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)
.
$0 
m+`^(?=( *)\S.*\n\1)
<space>

Trong đó <space>đại diện cho một ký tự không gian duy nhất (nếu không sẽ bị tước bởi SE). Đối với mục đích đếm, mỗi dòng đi trong một tệp riêng biệt và \nnên được thay thế bằng một ký tự dòng thực tế. Để thuận tiện, bạn có thể chạy mã như từ một tệp duy nhất có -scờ.

Hãy thử trực tuyến.

Giải trình

Chà ... như thường lệ, tôi không thể giới thiệu đầy đủ về các nhóm cân bằng ở đây. Đối với một mồi xem câu trả lời Stack Overflow của tôi .

S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)

Giai đoạn đầu tiên là giai đoạn Split, phân chia đầu vào thành các dòng có chiều dài tăng dần. Dấu _hiệu cho thấy các khối trống nên được bỏ qua khỏi phần tách (chỉ ảnh hưởng đến phần cuối, bởi vì sẽ có một kết quả khớp ở vị trí cuối cùng). Bản thân regex hoàn toàn được chứa trong một cái nhìn xung quanh nên nó sẽ không khớp với bất kỳ nhân vật nào, mà chỉ có các vị trí.

Phần này dựa trên giải pháp của Kobi với một số sân chơi bổ sung mà tôi tự tìm thấy. Lưu ý rằng lookbehind được khớp từ phải sang trái trong .NET, vì vậy giải thích sau đây tốt nhất nên được đọc từ dưới lên trên. Tôi cũng đã chèn một \Glời giải thích khác cho rõ ràng, mặc dù điều đó không cần thiết cho mẫu hoạt động.

(?<=
  ^         # And we ensure that we can reach the beginning of the stack by doing so.
            # The first time this is possible will be exactly when tri(m-1) == tri(n-1),
            # i.e. when m == n. Exactly what we want!
  (?<-1>.)* # Now we keep matching individual characters while popping from group <1>.
  \G        # We've now matched m characters, while pushing i-1 captures for each i
            # between 1 and m, inclusive. That is, group <1> contains tri(m-1) captures.
  (?:       
    (?<=
      \G    # The \G anchor matches at the position of the last match.
      (.)*  # ...push one capture onto group <1> for each character between here
            # here and the last match.
    )       # Then we use a lookahead to...
    .       # In each iteration we match a single character.
  )+        # This group matches all the characters up to the last match (or the beginning
            # of the string). Call that number m.
)           # If the previous match was at position tri(n-1) then we want this match
            # to happen exactly n characters later.

Tôi vẫn đang ngưỡng mộ công việc của Kobi ở đây. Điều này thậm chí còn thanh lịch hơn so với regex thử nghiệm chính. :)

Hãy chuyển sang giai đoạn tiếp theo:

.
$0 

Đơn giản: chèn một khoảng trắng sau mỗi ký tự không phải dòng.

m+`^(?=( *)\S.*\n\1)
<space>

Giai đoạn cuối cùng này thụt lề tất cả các dòng chính xác để tạo thành hình tam giác. Đây mchỉ là chế độ đa dòng thông thường để ^khớp với phần đầu của một dòng. Lệnh +Retina lặp lại giai đoạn này cho đến khi chuỗi ngừng thay đổi (trong trường hợp này có nghĩa là biểu thức chính quy không còn phù hợp nữa).

^      # Match the beginning of a line.
(?=    # A lookahead which checks if the matched line needs another space.
  ( *) # Capture the indent on the current line.
  \S   # Match a non-space character to ensure we've got the entire indent.
  .*\n # Match the remainder of the line, as well as the linefeed.
  \1   # Check that the next line has at least the same indent as this one.
)

Vì vậy, điều này khớp với phần đầu của bất kỳ dòng nào không có thụt lề lớn hơn dòng tiếp theo. Trong bất kỳ vị trí như vậy, chúng tôi chèn một không gian. Quá trình này chấm dứt, một khi các dòng được sắp xếp theo hình tam giác gọn gàng, bởi vì đó là bố cục tối thiểu trong đó mỗi dòng có một vết lõm lớn hơn so với dòng tiếp theo.


@ _ @ Nó làm cái quái gì vậy?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Bây giờ với sự tuyệt vời hơn 100%, lịch sự của Kobi.
Martin Ender

6

Kẹo , 67 59 57 byte

&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

hoặc là:

          &
         8 *
        7 - r
       1 - 2 /
      = y @ 1 i
     & { | . } b
    Y R ( "   " ;
   = ) Z R ( = a &
  { ; } "   " ; ) "
 \ n " ; Y 1 - = y a
1 j

dạng dài:

stackSz
digit8    # Y = (sqrt((numCh - 1) * 8 + 1) - 1) / 2   using pythagorean
mult      # Y = (sqrt(numCh * 8 - 7) - 1) / 2  equivalent but shorter
digit7
sub
root
digit1
sub
digit2
div
popA
YGetsA
label digit1
incrZ
stackSz   # bail if we're out of letters
if
  else
  retSub
endif
stack2
pushY     # print the leading spaces (" " x Y)
range1
while
  " " printChr
  popA
endwhile
pushZ
range1      # output this row of characters (Z of them)
while
  popA
  stack1
  stackSz
  if
    printChr    # bail on unbalanced tree
  endif
  " " printChr
endwhile
"\n" printChr
pushY
digit1
sub
popA
YGetsA
stack1
digit1 jumpSub   # loop using recursion

Phải, tôi cảm thấy Giáng sinh-y.
Dale Johnson

5

CJam, 27 26 byte

Cảm ơn Sp3000 vì đã tiết kiệm 1 byte.

Lq{' @f+_,)@/(S*N+a@\+\s}h

Đáng ngạc nhiên là gần với Pyth, hãy xem liệu điều này có thể được đánh gôn ...

Kiểm tra nó ở đây.

Giải trình

L        e# Push an empty array to build up the lines in.
q        e# Read input.
{        e# While the top of the stack is truthy (non-empty)...
  ' @f+  e#   Prepend a space to each line we already have.
  _,)    e#   Get the number of lines we already have and increment.
  @/     e#   Split the input into chunks of that size.
  (S*    e#   Pull off the first chunk (the next line) and join with spaces.
  N+     e#   Append a linefeed.
  a@\+   e#   Append it to our list of lines.
  \s     e#   Pull up the other chunks of the input and join them back into one string.
}h

Tại sao nó không hoạt động nếu tôi đổi ' thành S???
geokavel

@geokavel Vì Slà một chuỗi, không phải là ký tự, nên fsẽ ánh xạ qua chuỗi đó thay vì danh sách các dòng.
Martin Ender

Đó là dự đoán của tôi. Bạn có ý tưởng nào về cơ sở lý luận để biến S thành một chuỗi không?
geokavel

@geokavel Không, tôi không có.
Martin Ender

5

Ruby, 84 77 73 byte

->v{1.upto(n=v.size**0.5*1.4){|i|puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "}}

77 byte

->v{0.upto(n=(v.size*2)**0.5-1){|i|puts" "*(n-i)+v[i*(i+1)/2,i+1].chars*" "}}

Giảm thêm vài byte bằng cách loại bỏ biến rtheo đề xuất của steveverrill.

84 byte

->v{n=(v.size*2)**0.5-1;0.upto(n){|i|puts" "*(n-i)+v[(r=i*(i+1)/2)..r+i].chars*" "}}

Ung dung:

->v {
  1.upto(n=v.size**0.5*1.4) { |i|
    puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "
  }
}

Đầu tiên tính số tam giác từ chuỗi đầu vào

n=v.size**0.5*1.4

ví dụ: kích thước chuỗi đầu vào là 120 và số tam giác n của chúng ta, sẽ là 15.

puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "

Trong dòng trên, nó in các khoảng trắng theo sau là chuỗi chuỗi được tìm nạp từ chuỗi đầu vào bằng mẫu sau

[[0,0],[1,2],[3,5],[6,9]]

Sử dụng:

f=->v{1.upto(n=v.size**0.5*1.4){|i|puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "}}
f["Thisrunofcharactersismeanttohavealengththatcanbeexpressesasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?"]
              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e s a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?

Wow, cách tiếp cận của chúng tôi rất giống nhau, nhưng chúng tôi dường như có kiến ​​thức chơi golf bổ sung. Tôi không biết uptokhông yêu cầu một đối số nguyên, ( timeschắc chắn là có.) Tôi đã kết hợp một số cú pháp của bạn vào bản sửa đổi câu trả lời của tôi. Lời khuyên lớn nhất tôi dành cho bạn là, bạn không cần biến đó r. Chỉ cần sử dụng ,thay thế ..và số sau dấu phẩy là tổng số phần tử sẽ trả về, thay vì kết thúc phạm vi.
Cấp sông St

Thật. Cảm ơn vì mẹo tôi đang cập nhật câu trả lời của mình ngay lập tức :)
Vasu Adari

4

Bình thường, 27 byte

Js.IsSGlzWz+*-J=hZdjd<~>zZZ

                               z = input()
                               Z = 0
                               d = ' '
    sSG                        G -> tri(G)
  .I   lz                      Find the (float) input whose output is len(z).
 s                             Convert to int.
J                              Save as J.
         Wz                    while z:
               =hZ             Z += 1
            *-J  Zd            Generate J-Z spaces.
                      ~>zZ     Remove the first Z characters from z.
                     <    Z    Generate those first Z characters.
                   jd          Join on spaces.
           +                   Add the two together and print.

Phòng thử nghiệm

Một cách tiếp cận thú vị - bắt buộc và sử dụng .I. Có lẽ là golf.


4

C, 138 136 134 byte

Lấy một chuỗi làm đầu vào:

j,r,k,a;f(char*s){j=strlen(s);r=k=sqrt(1+8*j)/2;for(;r--;printf("\n")){for(j=r;j--;)printf(" ");for(j=k-r;j--;)printf("%c ",s[a++]);}}

Cho đến nay, bạn dường như đã đánh bại JavaScript với C 1 byte: D
Mark K Cowan

@MarkKCowan có, rõ ràng. Tôi hy vọng tôi làm cho nó thậm chí còn nhỏ hơn! :)
Sahil Arora

@SahilArora - Bạn có thể thay thế printf(" ")printf("\n")bằng puts(" ")puts("\n"). Mỗi lần thay thế sẽ giúp bạn tiết kiệm 2 byte. :)
boostzflep

@enhzflep Tôi đã thử rồi, nó cho một kết quả mơ hồ!
Sahil Arora

Oh. :( Hoạt động tốt ở đây trên win7 với gcc 4.7.1 - Tôi đoán nó sẽ hoạt động theo cách mà đầu ra printf được chuyển sang thiết bị xuất chuẩn. +1 để đánh bại Javascript.
boostzflep

4

Cách tiếp cận Ruby 2 rev 1, 76 byte

->s{s=s.chars*' '
0.upto(w=s.size**0.5-1){|i|puts' '*(w-i)+s[i*i+i,i*2+2]}}

Tối ưu hóa bằng cách sử dụng các ý tưởng cú pháp từ câu trả lời của Vasu Adari, cộng với một vài vòng xoắn của riêng tôi.

Cách tiếp cận Ruby 2 rev 0, 93 byte

->s{s=s.chars.to_a.join(' ')
w=(s.size**0.5).to_i
w.times{|i|puts' '*(w-i-1)+s[i*i+i,i*2+2]}}

Cách tiếp cận hoàn toàn khác nhau. Đầu tiên chúng ta thêm khoảng trắng ở giữa các ký tự của đầu vào. Sau đó, chúng tôi in ra các hàng theo từng dòng.

Cách tiếp cận Ruby 1, 94 byte

->s{n=-1;w=((s.size*2)**0.5).to_i
(w*w).times{|i|print i/w+i%w<w-1?'':s[n+=1],-i%w==1?$/:' '}}

điều này đã kết thúc lâu hơn dự kiến.

w chứa số lượng ký tự có thể in ở hàng dưới cùng hoặc tương đương với số lượng dòng.

Mỗi dòng chứa w ký tự khoảng trắng (cuối cùng là dòng mới), vì vậy ý ​​tưởng là in các ký tự khoảng trắng này và chèn các ký tự có thể in được khi cần thiết.


3

Chồn 0,14 , 42 byte

(xid2;$I2*`,)1-[i1+[" "o]lrx" "$ii-1-D$O].

Hãy thử nó ở đây.

Giải trình

(                Open while loop
 x               Dump top of stack
  i              Loop counter (i)
   d2;           Duplicate and square
      $I2*       Length of input times two
          `,     Push (i^2) <= (length of input)
            )    Close for loop; pop top of stack and exit when it's 0

1-[                              Open for loop that repeats sqrt(len(input))-1 times
   i1+[                          Open for loop that repeats (loop counter + 1) times
       " "o                      Push a space then read in character from input
           ]                     Close for loop
            l                    Push 10 (newline)
             r                   Reverse stack
              x                  Dump top of stack
               " "               Push a space
                  $i             Push the max iterations of for loop
                    i-           Subtract loop counter
                      1-         Subtract 1
                        D        Pop n and duplicate top of stack n times
                         $O      Output whole stack as characters
                           ].    Close for loop and stop.

2
Thật là một số byte hoàn hảo! làm tốt lắm!
TanMath

1
@TanMath nhưng 42 không phải là số tam giác!
Paŭlo Ebermann

3

Python 2, 88 85 byte

s=t=raw_input()
i=1
while s:print' '*int(len(t*2)**.5-i)+' '.join(s[:i]);s=s[i:];i+=1

Cảm ơn xnor đã lưu 3 byte.


Không rút ngắn làm sxáo trộn tính toán số lượng không gian?
xnor

Ô đung rôi. Tôi đã xóa một biến tạm thời trước khi gửi nhưng không nhận ra rằng nó làm mất hiệu lực mã.
xsot

Điều gì nếu bạn làm như trước nhưng lưu lại một bản sao lưu S=s=raw_input()?
xnor

Gợi ý tốt. Tôi nghĩ rằng có lẽ có một chiến lược tổng thể ngắn hơn mặc dù.
xsot

Crossed out 88 trông buồn cười
Pinkfloydx33

3

CJam, 50 byte

q:QQ,1>{,{),:+}%:RQ,#:IR2ew<{~Q<>:LS*L,I+(Se[N}%}&

Hãy thử nó ở đây.

Giải trình

q:QQ,1>{  e# Only proceed if string length > 1, otherwise just print.
,{),:}%:R e# Generates a list of sums from 0 to k, where k goes from 0 to the length of the string [0,1,3,6,10,15,21,...]
Q,#:I     e# Find the index of the length of the string in the list
R2ew<     e# Make a list that looks like [[0,1],[1,3],[3,6],...,[?,n] ]where n is the length of the string 
{~Q<>:L   e# Use that list to get substrings of the string using the pairs as start and end indices
S*        e# Put spaces between the substrings
L,I+(Se[N e# (Length of the substring + Index of string length in sum array -1) is the length the line should be padded with spaces to. Add a new line at the end.
%}& 

2

JavaScript (ES6), 135 byte

w=>{r='';for(s=j=0;j<w.length;j+=s++);for(i=j=0;w[j+i];j+=++i)r+=Array(s-i-1).join` `+w.slice(j,i+j+1).split``.join` `+'<br>';return r}

De-golf + demo:

function t(w) {
    r = '';
    for (s = j = 0; j < w.length; j += s++);
    for (i = j = 0; w[j + i]; j += ++i) r += Array(s - i - 1).join` ` + w.slice(j, i + j + 1).split``.join` ` + '<br>';
    return r;
}

document.write('<pre>' + t(prompt()));


Mục tiêu của là for (s = j = 0; j < w.length; j += s++);gì? Ngoài ra, bên trong a <pre>, bạn có thể sử dụng \nthay vì <br>. Ngoài ra, bạn quên đề cập rằng đó là ES6.
Ismael Miguel

Mục tiêu của vòng lặp đầu tiên là đếm chiều dài của dòng cuối cùng, để thụt lề từng dòng đúng cách.
nicael

2

Java, 258 194

Chơi gôn

String f(String a){String r="";int t=(((int)Math.sqrt(8*a.length()+1))-1)/2-1;int i=0,n=0;while(n++<=t){for(int s=-1;s<t-n;++s)r+=" ";for(int j=0;j<n;++j)r+=a.charAt(i++)+" ";r+="\n";}return r;}

Ung dung:

public class TriangulatingText {

  public static void main(String[] a) {
    // @formatter:off
    String[] testData = new String[] {
      "R",
      "cat",
      "monk3y",
      "meanIngfu1",
      "^/\\/|\\/[]\\",
      "Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?",
    };
    // @formatter:on

    for (String data : testData) {
      System.out.println("f(\"" + data + "\")");
      System.out.println(new TriangulatingText().f(data));
    }
  }

  // Begin golf
  String f(String a) {
    String r = "";
    int t = (((int) Math.sqrt(8 * a.length() + 1)) - 1) / 2 - 1;
    int i = 0, n = 0;
    while (n++ <= t) {
      for (int s = -1; s < t - n; ++s)
        r += " ";
      for (int j = 0; j < n; ++j)
        r += a.charAt(i++) + " ";
      r += "\n";
    }
    return r;
  }
  // End golf
}

Đầu ra chương trình:

f("R")
R 

f("cat")
 c 
a t 

f("monk3y")
  m 
 o n 
k 3 y 

f("meanIngfu1")
   m 
  e a 
 n I n 
g f u 1 

f("^/\/|\/[]\")
   ^ 
  / \ 
 / | \ 
/ [ ] \ 

f("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?")
              T 
             h i 
            s r u 
           n o f c 
          h a r a c 
         t e r s i s 
        m e a n t t o 
       h a v e a l e n 
      g t h t h a t c a 
     n b e e x p r e s s 
    e d a s a t r i a n g 
   u l a r n u m b e r . D 
  i d i t w o r k ? Y o u t 
 e l l m e , I c a n ' t c o 
u n t v e r y w e l l , o k ? 

Bạn có thể nhập tĩnh System.out để lưu một số byte.
RAnders00

import static System.out;là 25 byte và System.là 7 byte. Nó được sử dụng ba lần và 21 <25 vì vậy nó thực sự sẽ tăng kích thước thêm 4 byte. Mặc dù vậy, chì tốt có thể tiết kiệm không gian và không phải ai cũng biết về chúng.

1
Tôi đã trải qua các câu trả lời cũ khi tôi tìm thấy câu trả lời này: "viết chương trình hoặc chức năng " mà lúc đầu tôi không nhận ra. Tước ra các công cụ tiết kiệm không gian. Tôi đã biến nó thành một hàm thích hợp và tìm thấy một vài byte nữa để tắt.

1

JavaScript (ES6), 106 byte

a=>(y=z=0,(f=p=>p?" ".repeat(--p)+a.split``.slice(y,y+=++z).join` `+`
`+f(p):"")(Math.sqrt(2*a.length)|0))

Sử dụng đệ quy thay vì vòng lặp for để xây dựng chuỗi.

Để tìm độ dài của hàng dài nhất, sử dụng công thức cho số tam giác thứ n T_nT_n = (n^2 + n)/2. Đưa ra nvà giải quyết cho T_nviệc sử dụng công thức bậc hai, chúng ta có:

1/2 * n^2 + 1/2 * n - T_n = 0

a = 1/2, b = 1/2, c = -T_n

-1/2 + sqrt(1/2^2 - 4*1/2*-T_n)   
------------------------------- = sqrt(1/4 + 2*T_n) - 1/2
             2*1/2

Hóa ra sau khi lát sàn, thêm 1/4 bên trong căn bậc hai sẽ không thay đổi kết quả, do đó công thức cho hàng dài nhất là Math.sqrt(2*a.length)|0.



1

Powershell, 69 byte

($args|% t*y|?{$r+="$_ ";++$p-gt$l}|%{$r;rv r,p;$l++})|%{' '*--$l+$_}

Kịch bản kiểm tra ít chơi gôn hơn:

$f = {

(
    $args|% t*y|?{  # test predicate for each char in a argument string 
        $r+="$_ "   # add current char to the result string
        ++$p-gt$l   # return predicate value: current char posision is greater then line num
    }|%{            # if predicate is True
        $r          # push the result string to a pipe
        rv r,p      # Remove-Variable r,p. This variables will be undefined after it.
        $l++        # increment line number
    }

)|%{                # new loop after processing all characters and calculating $l
    ' '*--$l+$_     # add spaces to the start of lines
}                   # and push a result to a pipe

}

@(
    ,("R",
    "R ")

    ,("cat",
    " c ",
    "a t ")

    ,("monk3y",
    "  m ",
    " o n ",
    "k 3 y ")

    ,("meanIngfu1",
    "   m ",
    "  e a ",
    " n I n ",
    "g f u 1 ")

    ,("^/\/|\/[]\",
    "   ^ ",
    "  / \ ",
    " / | \ ",
    "/ [ ] \ ")

    ,("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?",
    "              T ",
    "             h i ",
    "            s r u ",
    "           n o f c ",
    "          h a r a c ",
    "         t e r s i s ",
    "        m e a n t t o ",
    "       h a v e a l e n ",
    "      g t h t h a t c a ",
    "     n b e e x p r e s s ",
    "    e d a s a t r i a n g ",
    "   u l a r n u m b e r . D ",
    "  i d i t w o r k ? Y o u t ",
    " e l l m e , I c a n ' t c o ",
    "u n t v e r y w e l l , o k ? ")

    ,("*/\/|\/|o\/|o|\/o|o|\/||o|o\/o|||o|\/o||o|||\/||o|||o|\/|o|||o||o\",
    "          * ",
    "         / \ ",
    "        / | \ ",
    "       / | o \ ",
    "      / | o | \ ",
    "     / o | o | \ ",
    "    / | | o | o \ ",
    "   / o | | | o | \ ",
    "  / o | | o | | | \ ",
    " / | | o | | | o | \ ",
    "/ | o | | | o | | o \ ")

) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    $result
}

Đầu ra:

True
R
True
 c
a t
True
  m
 o n
k 3 y
True
   m
  e a
 n I n
g f u 1
True
   ^
  / \
 / | \
/ [ ] \
True
              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e d a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
True
          *
         / \
        / | \
       / | o \
      / | o | \
     / o | o | \
    / | | o | o \
   / o | | | o | \
  / o | | o | | | \
 / | | o | | | o | \
/ | o | | | o | | o \

0

C #, 202

string r(string s,List<string> o,int i=1){o=o.Select(p=>" "+p).ToList();o.Add(String.Join(" ",s.Substring(0,i).ToCharArray()));return s.Length==i?String.Join("\n",o):r(s.Substring(i,s.Length-i),o,i+1);}

Tôi không biết điều này có hợp pháp trong môn đánh gôn không, nhưng có vượt qua danh sách trong số chức năng không? Tôi không thể tìm cách tái diễn điều này mà không có Danh sách <chuỗi> được khai báo bên ngoài hàm vì vậy tôi đặt nó làm tham số.

Sử dụng:

 r("1",new List<string>());
 r("123", new List<string>());
 r("123456", new List<string>());
 r("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Icanstcountverywell,ok?",new List<string>());

0

C, 102 byte

i,j;main(n,s){for(n=sqrt(strlen(gets(s))*2);j<n;printf("%*.1s",i>1?2:i*(n-j),i++>j?i=!++j,"\n":s++));}


0

R, 142 byte

Khá chắc chắn rằng tôi có thể nhận được điều này xuống nhiều hơn. Vẫn làm việc trên đó mặc dù. Tôi cảm thấy như tôi đang thiếu một đệ quy dễ dàng - nhưng tôi đã không thể rút ngắn nó ngay.

f=function(a){n=nchar(a);l=which(cumsum(1:n)==n);w=strsplit(a,c())[[1]];for(i in 1:l){cat(rep(" ",l-i),sep="");cat(w[1:i],"\n");w=w[-(1:i)]}}

vô dụng

f=function(a){
    n = nchar(a)                 #number of characters
    l= which(cumsum(1:n)==n)     #which triangle number
    w= strsplit(a,c())[[1]]      #Splits string into vector of characters
    for (i in 1:l) {
        cat(rep(" ",l-i),sep="") #preceeding spaces
        cat(w[1:i],"\n")         #Letters
        w=w[-(1:i)]              #Shifts removes letters (simplifies indexing)
    }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.