Kích nổ một chuỗi


34

Cho bất kỳ chuỗi nào, in nó dưới dạng một hình tam giác trong đó văn bản chạy lên và xuống dọc theo mỗi đường chéo. Ví dụ: đầu vào của "Hello World"đầu ra nên:

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

Khoảng cách giữa mỗi ký tự trong một hàng phải có ít nhất 1, để duy trì định dạng phù hợp.


1
Chúng ta có thể giả sử chuỗi không trống?
Ông Xcoder

@ Mr.Xcoder Có bạn có thể
machiavelli

1
Khoảng cách giữa mỗi ký tự trong một hàng phải có ít nhất 1 : Điều này có nghĩa đó H l o W r dlà một hàng trung tâm hợp lệ? Hỏi vì trong ví dụ của bạn, mỗi hàng có 3 khoảng trắng giữa mỗi ký tự.
Emigna

1
@Emigna Tôi hiểu nhầm câu hỏi của bạn, lời xin lỗi của tôi. Vâng, ví dụ của bạn sẽ hợp lệ.
machiavelli

1
Không gian hàng đầu hoặc dấu cho phép?
Luis Mendo

Câu trả lời:


19

Than , 10 7 byte

↗ELθ✂θιUE¹

Hãy thử trực tuyến! Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

Lần đầu tiên tôi phải sử dụng UElệnh.


Tôi biết Char than sẽ là một trong những câu trả lời đầu tiên ở đây .. Gần như là muốn bắt đầu bản thân mình, nhưng tôi không có kinh nghiệm với nó để hoàn thành một giải pháp kịp thời, và dù sao nó cũng sẽ bị loại ra khỏi sân golf ..;)
Kevin Cruijssen

6
@Emigna ... nhưng đây là cơ hội lớn để tôi sử dụng UE...
Neil

6
@EriktheOutgolfer ... nhưng đây là cơ hội lớn để tôi sử dụng UE..
Neil

1
@Neil Đó là -3 byte! -3 cho một sự hy sinh tốt đẹp! Ai không muốn một số tốt đẹp -3?
Erik the Outgolfer

4
@EriktheOutgolfer Điều bạn cần nói là "Bạn không thể để 05AB1E đánh bại bạn chứ?"
Neil

12

05AB1E , 10 8 7 byte

Cảm ơn Emigna đã lưu 2 byte!

ðâƶ.cðζ

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!


Theo dòng này Khoảng cách giữa mỗi ký tự trong một hàng phải có ít nhất 1 bạn có thể xóa ¶«. (cũng đã xác minh tính hợp lệ với OP)
Emigna

@Emigna Cảm ơn! :)
Ad Nam

Có thể muốn cập nhật liên kết Tio :)
Ông Xcoder

@ Mr.Xcoder ninja'd
Adnan

1
Clever sử dụng của âtrong ðâthay vì Sð«!
Erik the Outgolfer


8

C, 86 78 73 70 ký tự

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

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

Giải trình

Triển khai ngây thơ: hai chu kỳ, điền từ trên xuống dưới, từ trái sang phải (99 byte):

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

Ở đây, đặt () chỉ in \ n ra đầu ra. Hãy kết hợp khai báo biến và kết hợp j ++ với một cái gì đó (94 byte):

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

Tốt Biến j có phạm vi 0 ... 2n; hãy để nó trong vòng -n ... n, điều này làm cho phép toán đơn giản hơn. Lưu ý rằng biểu thức boolean ở bên phải của && luôn có giá trị 0 hoặc 1. Điều này có nghĩa là chúng ta có thể thay thế && bằng &. 91 byte:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Và bây giờ chúng tôi nhận ra chúng tôi in thêm một không gian. Và vâng, chúng tôi không cần printf () để chỉ in một ký hiệu. 86 byte:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Thậm chí còn tốt hơn. Lưu ý rằng điều kiện i * i> = j * j giống như i> = abs (j), nhưng ngắn hơn. Hãy di chuyển đặt () vào biểu thức tăng vòng lặp. Và đoán xem? Thật ra, chúng ta không cần niềng răng quanh i + j. 78 byte:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

Bạn có biết rằng putchar () trả về ký tự mà nó đã in không? Hãy sử dụng XOR để kiểm tra số lượng tương đương. Hãy thay thế không gian bằng mã ASCII của nó, 32. Hãy nhớ rằng mã ký tự cuối dòng là 13. Và cuối cùng: bạn có biết rằng GCC / Clang có hỗ trợ https://en.wikipedia.org/wiki/Elvis_operator không? 73 byte:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

Cuối cùng, đoán xem? Chúng tôi không cần hai vòng lặp. Chúng ta có thể thay thế xấu xí ~ i + j chỉ bằng ij. 70 byte:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Công việc tương lai: thay đổi hướng vòng lặp? Điều này có thể lưu một số byte, nếu được thực hiện đúng.


5

SOGL V0.12 , 13 10 9 byte

ēI*@∑}¹╚H

Điều này sử dụng một tính năng mà tôi vừa thêm , nhưng đã được ghi lại cách đây một thời gian.

Hãy thử nó ở đây!
Trong liên kết đó ,được thêm vào bởi vì điều này mong đợi đầu vào trên ngăn xếp và {được thêm vào vì nếu không ,sẽ được thực hiện mỗi lần trong vòng lặp

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise


3

Gaia , 16 byte

$:ċ⟪×$§×⟫†€|$¦tụ

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

Giải trình

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines




3

Java, 292 byte (xin lỗi)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}

1
Bạn có thể loại bỏ các dòng mới, nếu không, điều này trông khá golf!
Zacharý

1
Bạn có thể chơi gôn nhiều hơn: 1 boolean a=1<0,o=L%2>0;.. 2. Nếu bạn không cần i, hãy sử dụng vòng lặp này : for(i=0;i++<n;). 3. Bạn có thể thoát khỏi o: j%2<L%2sau đó j%2>L%2. 4. Sử dụng dnhư lật mất rất nhiều ký tự: chỉ cần làm j<(x<0?-x:x). 5. Bạn có nhiều biến hơn mức cần thiết. 6. Bạn không cần một chương trình đầy đủ: lambda hoặc phương pháp là đủ. - Nếu bạn muốn một ví dụ Java được đánh gôn, hãy kiểm tra câu trả lời của tôi .
Olivier Grégoire


3

Java (OpenJDK 8) , 116 byte

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

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

Giải trình

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}


3

Haskell , 140 137 byte

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

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

Đã lưu 3 byte so với Challenger5

Tôi không nghĩ đó là tối ưu ...

ftạo ra một trong các dòng ( m= 0 hoặc 1 là modulo của số dòng, nlà số của dòng)

g xen kẽ các dòng "lẻ" và "chẵn" và thêm vào kết quả một tấm gương của chính nó.


Bạn có thể lưu byte bằng cách định nghĩa flà hàm infix (như trong (m#n)s=...) chứ không phải là hàm tiền tố.
Trái cây Esolanging



2

Toán học 105 byte

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

Có lẽ tôi có thể loại bỏ một hoặc hai byte khác, nhưng tổng số ký tự xử lý các chuỗi trong Mathicala tạo ra những thách thức đơn giản như thế này không cạnh tranh.


2

J, 54 byte

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

Hãy thử trực tuyến! (lưu ý rằng đầu ra trên TIO có một dòng mới và ba khoảng trắng, nhưng đó không phải là từ lệnh gọi hàm - có lẽ đó chỉ là những gì trình thông dịch J thực hiện tự động).

Tôi nghĩ rằng ý tưởng chung để giải quyết điều này là đúng, nhưng có những điều nhỏ mà có lẽ tôi đang thực hiện một cách tối ưu là thêm vào bytecount.

Các biến thể trước

55 byte

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56 byte

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

Giải trình

Điều này sẽ được chia thành một vài chức năng. Ngoài ra, tôi không thấu đáo với các phần giải thích sau, vì vậy hãy cho tôi biết nếu bạn muốn giải thích rõ hơn cho một phần nhất định và tôi có thể chỉnh sửa phần đó trong.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup nhân đôi mỗi ký tự nhiều lần như chỉ mục của nó (cộng một) trong chuỗi
  • space chèn khoảng trắng giữa mỗi ký tự
  • pad đệm các nhân vật với số lượng không gian phù hợp
  • trans hoán vị ma trận kết quả

Cuộc gọi mẫu:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

Dup

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

Các kết quả được đóng hộp để ngăn J đệm các đầu bằng khoảng trắng (vì chúng có chiều dài không đồng đều).

Cuộc gọi mẫu:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

Không gian

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

Cuộc gọi mẫu:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

Tập giấy

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

Về cơ bản, đệm phần tử đầu tiên với chiều dài - 1 khoảng trắng, phần thứ hai có chiều dài - 2, v.v ... Nó cũng loại bỏ quyền anh.

Cuộc gọi mẫu:

   pad space dup 'abc'
  a  
 b b 
c c c

Chuyển

Đây chỉ là hàm dựng sẵn |:có chuyển vị của ma trận.


1
Tôi đã sử dụng một cách tiếp cận tương tự, nhưng tránh đấm bốc. 45 byte : |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). nó chắc chắn có thể được đánh gôn hơn nữa. phần -@i.@-@#này là một số trái cây treo thấp, rất có thể
Jonah

@Jonah Tôi không thể giải mã nhanh chóng cách câu trả lời của bạn hoạt động, vì vậy tôi sẽ để lại cho bạn để đăng nó nếu bạn muốn, vì tôi muốn bao gồm một lời giải thích về câu trả lời của tôi. Tôi đoán J đối với tôi ngay bây giờ là một ngôn ngữ chỉ viết.
cole

hữu ích cho việc giải mã nhanh chóng : f=. <some tacit expression>, sau đó 5!:2 <'f'đưa ra một hình ảnh trực quan và 5!:4 <'f'đưa ra một hình ảnh cây. trong trường hợp của tôi, hãy thử chạy $"0~1+i.@#với một số chuỗi trước, sau đó chạy mọi thứ ở bên phải |."0 1, sau đó hiểu điều đó |."0 1và mọi thứ ở bên trái, lưu chuyển đổi cuối cùng, chỉ là thực hiện các phép quay cần thiết.
Giô-na

1
oh tôi không mong đợi bạn cập nhật câu trả lời của bạn. nó giống như một "hey, bạn có thể thấy điều này thú vị." tôi có thể đã đăng nó, nhưng cảm thấy các cách tiếp cận cấp cao tương tự nhau, nó không xứng đáng.
Giô-na

2
Chỉ cần nhớ lại lập luận phức tạp của #giúp ở đây, 26 byte với|:@((-#)|."_1(1j1##)"0)~#\
dặm

1

JavaScript (ECMAScript 6), 161 byte

(s,n=console.log)=>s.split("").map((q,i,a,p)=>n(p=" ".repeat(q=a.length-++i)+a.map((v,j)=>j>=q&&j%2==q%2?a[j]+' ':'').join(''))||p).reverse().map((v,i)=>i&&n(v))

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


1

Perl 5 , 86 + 2 (-F) = 88 byte

Đã sử dụng các đề xuất của @ Dom và một vài điều chỉnh của riêng tôi để giảm số byte.

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

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


Xin lỗi về điều đó, rất vui vì bạn đã nhận được câu trả lời của bạn ngoài đó! Có một chút chơi khi tôi đang cố gắng sửa lỗi của tôi và không nhận được giải pháp, bạn là một cách tiếp cận tốt hơn! Có thể bỏ một vài byte bằng cách -aFđặt tất cả các chữ cái vào @Fvà một vài điều chỉnh nhỏ ( -Fđược tính là 3 vì nó cần một khoảng trắng sau): Hãy thử trực tuyến!
Dom Hastings

1
Tại sao -F được tính là 3? Không phải là nhiều nhất là 2 sao? Nó không phải là sự khác biệt giữa perl -e'code...'perl -eF 'code...'. Cũng -akhông cần thiết khi sử dụng -F, do đó byte có thể bị cắt.
Xcali

Đó là chính xác. Vì vậy, -Fchấp nhận một đối số, nhưng chúng tôi không muốn thông qua một đối số ( -Fcho phép chúng tôi kiểm soát những gì -achia tách, không tranh luận, tự tách từng char) để nó khác biệt giữa perl -ae '...'perl -aF -e '...'. Theo mặc định -achia tách trên /\s+/. Mong rằng sẽ giúp làm rõ!
Dom Hastings

Ngoài ra, sử dụng tốt đẹp $#F! Luôn quên điều đó!
Dom Hastings

0

q / kdb +, 55 byte

Dung dịch:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

Thí dụ:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

Giải trình:

LÀM. phiên bản không mã hóa là 66 byte:

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

Tiền thưởng:

Để có được đầu ra giống như ví dụ (74 byte):

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
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.