ระเบิดสตริง


34

รับสายใด ๆ พิมพ์ในรูปแบบของรูปสามเหลี่ยมที่ข้อความวิ่งขึ้นและลงตามแนวทแยงแต่ละ ตัวอย่างเช่นอินพุตของ"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

ช่องว่างระหว่างอักขระแต่ละตัวในแถวต้องมีอย่างน้อย 1 เพื่อรักษารูปแบบที่เหมาะสม


1
เราขอสมมติว่าสายไม่ว่างเปล่า?
Mr. Xcoder

@ Mr.Xcoder ใช่คุณอาจ
machiavelli

1
ช่องว่างระหว่างอักขระแต่ละตัวในแถวต้องมีอย่างน้อย 1 : นี่หมายความว่าH l o W r dเป็นแถวกลางที่ถูกต้องหรือไม่ ถามเพราะในตัวอย่างของคุณแต่ละแถวมี 3 ช่องว่างระหว่างตัวละครแต่ละตัว
Emigna

1
@Emigna ฉันเข้าใจผิดคุณถามฉันขอโทษ ใช่ตัวอย่างของคุณจะถูกต้อง
machiavelli

1
อนุญาตให้นำหน้าหรือต่อท้ายช่องว่างได้หรือไม่
Luis Mendo

คำตอบ:


19

ถ่าน , 10 7 ไบต์

↗ELθ✂θιUE¹

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

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

ครั้งแรกที่ฉันต้องใช้UEคำสั่ง


ฉันรู้ว่า Charcoal จะเป็นหนึ่งในคำตอบแรกที่นี่ .. เกือบจะดึงดูดการเริ่มต้นของตัวเอง แต่ฉันมีวิธีที่ไม่มีประสบการณ์ในการแก้ปัญหาให้เสร็จทันเวลาและมันจะออกไปเล่นกอล์ฟต่อไป .. ;)
Kevin Cruijssen

6
@Emigna ... แต่นี่เป็นโอกาสที่ยิ่งใหญ่ของฉันที่จะใช้UE...
Neil

6
@EriktheOutgolfer ... แต่นี่เป็นโอกาสที่ยิ่งใหญ่ของฉันที่จะใช้UE..
Neil

1
@ ไม่มีมัน -3 ไบต์! -3 สำหรับการบูชายัญที่ดี! ใครไม่ต้องการ -3 อันดีบ้าง?
Erik the Outgolfer

4
@EriktheOutgolfer สิ่งที่คุณควรจะพูดคือ "คุณไม่สามารถปล่อยให้ 05AB1E เอาชนะคุณได้ไหม?"
Neil

12

05AB1E , 10 8 7 ไบต์

ขอบคุณEmignaสำหรับการบันทึก 2 ไบต์!

ðâƶ.cðζ

ใช้การเข้ารหัส05AB1E ลองออนไลน์!


เป็นต่อบรรทัดนี้ช่องว่างระหว่างตัวละครแต่ละตัวในแถวที่ต้องมีอย่างน้อย 1¶«คุณสามารถลบ (ตรวจสอบความถูกต้องด้วย OP)
Emigna

@ Emigna ขอบคุณ! :)
Adnan

อาจต้องการอัปเดตลิงก์ Tio :)
Mr. Xcoder

@ Mr.Xcoder ninja'd
Adnan

1
เคลฟเวอร์ใช้âในการðâแทนSð«!
Erik the Outgolfer


8

C, 86 78 73 70 ตัวอักษร

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

ลองออนไลน์!

คำอธิบาย

การใช้งานแบบไร้เดียงสา: สองรอบเติมจากบนลงล่างซ้ายไปขวา (99 ไบต์):

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

ที่นี่ทำให้ () เพียงพิมพ์ \ n ไปยังเอาต์พุต มารวมการประกาศตัวแปรแล้วรวม j ++ เข้ากับบางอย่าง (94 ไบต์):

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

ดี. ตัวแปร j มีช่วง 0 ... 2n; ปล่อยให้อยู่ภายใน -n ... n นี่ทำให้คณิตศาสตร์ง่ายขึ้น โปรดสังเกตว่านิพจน์บูลีนทางด้านขวาของ && มีค่า 0 หรือ 1 เสมอซึ่งหมายความว่าเราสามารถแทนที่ && ด้วย & 91 ไบต์:

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

และตอนนี้เราก็รู้ว่าเรากำลังพิมพ์พื้นที่เพิ่มเติม และใช่เราไม่จำเป็นต้องใช้ printf () เพื่อพิมพ์เพียงสัญลักษณ์เดียว 86 ไบต์:

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

ดียิ่งขึ้น โปรดสังเกตว่าเงื่อนไข i * i> = j * j เหมือนกับ i> = abs (j) แต่สั้นกว่า ลองย้ายวาง () ลงในการแสดงออกเพิ่มขึ้นห่วง และคาดเดาอะไร ที่จริงแล้วเราไม่ต้องการการจัดฟันรอบ ๆ i + j 78 ไบต์:

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

คุณรู้หรือไม่ว่า putchar () คืนค่าตัวอักษรที่พิมพ์ออกมา? ลองใช้ XOR เพื่อทดสอบความเท่าเทียมกัน ลองเปลี่ยนช่องว่างด้วยรหัส ASCII ของมัน 32. จำไว้ว่ารหัสตัวอักษรท้ายบรรทัดคือ 13 และสุดท้าย: คุณรู้หรือไม่ว่า GCC / Clang สนับสนุนhttps://en.wikipedia.org/wiki/Elvis_operator ? 73 ไบต์:

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

ในที่สุดเดาอะไร เราไม่ต้องการสองวงสำหรับลูป เราสามารถแทนที่ ugly ~ i + j ด้วย just ij 70 ไบต์:

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

งานในอนาคต: เปลี่ยนทิศทางลูป? นี่อาจบันทึกบางไบต์ถ้าทำอย่างถูกต้อง


5

SOGL V0.12 , 13 10 9 ไบต์

ēI*@∑}¹╚H

สิ่งนี้ใช้คุณสมบัติที่ฉันเพิ่งเพิ่มเข้าไปแต่ได้รับการบันทึกไว้สักครู่แล้ว

ลองที่นี่!
ในลิงค์,นั้นถูกเพิ่มเพราะสิ่งนี้คาดว่าอินพุตในสแต็กและ{เพิ่มเพราะมิฉะนั้น,จะถูกเรียกใช้งานทุกครั้งในลูป

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

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

ลองออนไลน์!

คำอธิบาย

$                 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 ไบต์ (ขออภัย)

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
คุณสามารถลบบรรทัดใหม่ได้มิฉะนั้นมันจะดูสวยมาก!
Zacharý

1
คุณสามารถเล่นกอล์ฟได้มากขึ้น: 1 boolean a=1<0,o=L%2>0;. 2. ถ้าคุณไม่จำเป็นต้องใช้วงนี้:i for(i=0;i++<n;)3. คุณสามารถกำจัดo: แล้วj%2<L%2 j%2>L%24. ใช้dเป็นพลิกยิงตัวละครจำนวนมากดังนั้น: j<(x<0?-x:x)เพียงแค่ทำ 5. คุณมีตัวแปรมากกว่าที่ต้องการ 6. คุณไม่จำเป็นต้องใช้โปรแกรมเต็มรูปแบบ: แลมบ์ดาหรือวิธีการก็เพียงพอแล้ว - ถ้าคุณต้องการให้แข็งแรงเล่นกอล์ฟเช่น Java, ตรวจสอบคำตอบของฉัน
Olivier Grégoire


3

Java (OpenJDK 8) , 116 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

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

ลองออนไลน์!

บันทึก 3 ไบต์ thanls ไปที่ Challenger5

ฉันไม่คิดว่ามันดีที่สุด ...

fสร้างหนึ่งในบรรทัด ( m= 0 หรือ 1 คือโมดูโลของหมายเลขบรรทัดnคือจำนวนของบรรทัด)

g intercalates "คี่" และ "แม้" เส้นและเพิ่มผลกระจกของตัวเอง


คุณสามารถบันทึกไบต์โดยกำหนดfเป็นฟังก์ชั่น infix (ใน(m#n)s=...) มากกว่าฟังก์ชั่นคำนำหน้า
ผลไม้แยกแยะ



2

Mathematica 105 Bytes

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

บางทีฉันอาจโกนทิ้งอีกหนึ่งหรือสองไบต์ แต่ตัวละครนับรวมค่าใช้จ่ายในการจัดการกับสตริงใน Mathematica ทำให้เกิดความท้าทายอย่างง่ายเช่นการไม่สามารถแข่งขันได้


2

J, 54 ไบต์

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

ลองออนไลน์! (โปรดทราบว่าเอาต์พุตบน TIO มีการขึ้นบรรทัดใหม่และช่องว่างสามช่อง แต่นั่นไม่ใช่จากการเรียกใช้ฟังก์ชัน - อาจเป็นสิ่งที่ล่าม J ทำโดยอัตโนมัติ)

ฉันคิดว่าความคิดทั่วไปสำหรับการแก้ปัญหานี้ถูกต้อง แต่มีสิ่งเล็ก ๆ น้อย ๆ ที่ฉันอาจทำย่อยได้อย่างดีที่สุดที่เพิ่มไปยังจำนวน bytecount

รุ่นก่อนหน้า

55 ไบต์

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

56 ไบต์

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

คำอธิบาย

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

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup ทำซ้ำอักขระแต่ละตัวหลาย ๆ ครั้งตามดัชนี (บวกหนึ่งตัว) ในสตริง
  • space แทรกช่องว่างระหว่างตัวละครแต่ละตัว
  • pad เพิ่มอักขระด้วยจำนวนช่องว่างที่เหมาะสม
  • trans สลับเมทริกซ์ที่ได้

ตัวอย่างการโทร:

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

การทำซ้ำ

>:@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

ผลลัพธ์จะถูกบรรจุเพื่อป้องกัน J จากการใส่ส่วนท้ายด้วยช่องว่าง (เนื่องจากความยาวไม่เท่ากัน)

ตัวอย่างการโทร:

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

ช่องว่าง

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

ตัวอย่างการโทร:

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

เบาะ

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

โดยทั่วไปให้วางองค์ประกอบแรกที่มีความยาว - 1 ช่องว่างส่วนที่สองที่มีความยาว - 2 ฯลฯ นอกจากนี้ยังลบมวย

ตัวอย่างการโทร:

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

ไขว้

นี่เป็นเพียงฟังก์ชั่นในตัว|:ที่ใช้ขนย้ายของเมทริกซ์


1
ฉันใช้วิธีการที่คล้ายกัน แต่หลีกเลี่ยงการชกมวย 45 |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#))ไบต์: มันสามารถเล่นกอล์ฟต่อไปได้อย่างแน่นอน ส่วนนี้-@i.@-@#เป็นผลไม้แขวนลอยที่ค่อนข้างต่ำซึ่งน่าจะเป็นมากที่สุด
โยนาห์

@Jonah ฉันไม่สามารถถอดรหัสคำตอบของคุณได้อย่างรวดเร็วดังนั้นฉันจะปล่อยให้คุณโพสต์หากคุณต้องการเพราะฉันต้องการที่จะรวมคำอธิบายของคำตอบของฉัน ฉันเดาว่า J สำหรับฉันตอนนี้เป็นภาษาเขียนอย่างเดียว
โคลส

มีประโยชน์สำหรับการถอดรหัสอย่างรวดเร็ว: f=. <some tacit expression>จากนั้น5!:2 <'f'ให้สร้างภาพข้อมูลแบบกล่องและ5!:4 <'f'ให้ภาพต้นไม้ ในกรณีของฉันให้ลองใช้$"0~1+i.@#สายก่อนจากนั้นรันทุกอย่างทางด้านขวา|."0 1แล้วเข้าใจว่า|."0 1และทุกอย่างไปทางซ้าย, บันทึกทรานสโพสสุดท้าย, เพียงแค่ทำการหมุนที่จำเป็น
Jonah

1
โอ้ฉันไม่ได้คาดหวังให้คุณอัปเดตคำตอบของคุณ มันเป็นเรื่องของ "เฮ้คุณอาจพบว่ามันน่าสนใจ" ฉันสามารถโพสต์ได้ แต่รู้สึกว่าวิธีการระดับสูงคล้ายกันมากพอที่จะไม่คุ้มค่า
Jonah

2
เพิ่งจำข้อโต้แย้งที่ซับซ้อนของความ#ช่วยเหลือที่นี่ 26 ไบต์ด้วย|:@((-#)|."_1(1j1##)"0)~#\
ไมล์


1

Perl 5 , 86 + 2 (-F) = 88 ไบต์

ใช้คำแนะนำของ @ Dom และปรับแต่งเล็กน้อยของฉันเพื่อลดจำนวนไบต์

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

ลองออนไลน์!


ขออภัยที่ดีใจที่คุณได้รับคำตอบจากที่นั่น! มีการเล่นเล็กน้อยเมื่อฉันพยายามที่จะแก้ไขปัญหาของฉันและ coudnl ไม่ได้รับการแก้ปัญหาลงคุณเป็นวิธีที่ดีกว่า! มีความเป็นไปได้ที่จะใช้-aFตัวอักษร@Fสองสามตัวในการใส่ตัวอักษรทั้งหมดและปรับแต่งเล็กน้อย ( -Fนับเป็น 3 เนื่องจากต้องการพื้นที่หลังจาก): ลองออนไลน์!
Dom Hastings

1
เหตุใด -F จึงนับเป็น 3 ไม่ควรจะเป็น 2 ที่มากที่สุด? มันไม่ได้เป็นความแตกต่างระหว่างและperl -e'code...' perl -eF 'code...'ยัง-aไม่จำเป็นเมื่อใช้-Fดังนั้นจึงสามารถตัดไบต์ได้
Xcali

แค่นั้นแหละ ดังนั้น-Fยอมรับทะเลาะกัน แต่เราไม่อยากผ่านหนึ่งใน ( -Fช่วยให้เราสามารถควบคุมสิ่งที่-aแยกบนอาร์กิวเมนต์ไม่แยกถ่านในตัวเองในแต่ละ) ดังนั้นจึงเป็นความแตกต่างระหว่างและperl -ae '...' perl -aF -e '...'โดยค่าเริ่มต้นแยกบน-a /\s+/หวังว่าจะช่วยชี้แจง!
Dom Hastings

นอกจากนี้ใช้ดี$#F! ลืมไปตลอดเลย!
Dom Hastings

0

q / kdb +, 55 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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

คำอธิบาย:

ทำ. ungolfed version 66 ไบท์:

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

โบนัส:

ในการรับเอาต์พุตเดียวกันกับตัวอย่าง (74 ไบต์):

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