สตริงย่อยที่ระเบิดได้


32

บทนำ

abcลองสังเกตสตริง สตริงย่อยที่สามารถทำได้จากสิ่งนี้คือ:

a, ab, abc, b, bc, c

ตอนนี้เราจำเป็นต้องจัดแนวพวกเขาภายใต้สตริงเริ่มต้นเช่นนี้

abc
a
 b
  c
ab
 bc
abc

ลำดับของสตริงไม่สำคัญดังนั้นจึงเป็นสิ่งที่ถูกต้องเช่นกัน:

abc
a
ab
abc
 b
 bc
  c

ดังนั้นซับสตริงจะอยู่ในตำแหน่งใต้สตริงย่อยในสตริงเริ่มต้น ดังนั้นสำหรับabcdefและสตริงย่อยcdeมันจะมีลักษณะเช่นนี้:

abcdef
  cde

งาน

ภารกิจคือจัดแนววัสดุพิมพ์ทั้งหมดให้มีความยาวมากกว่า 0เช่นที่แสดงด้านบน คุณสามารถสันนิษฐานได้ว่าตัวสตริงนั้นจะมีเพียงตัวอักษรและมีอย่างน้อย 1 ตัวอักษร สำหรับการขยายคุณสามารถใช้ช่องว่างหรืออักขระ ASCII ที่ไม่ใช่ตัวอักษรที่สามารถพิมพ์ได้ ( 32 - 127) อาจไม่จำเป็นต้องพูดถึง แต่สตริงเองจะมีอักขระที่ไม่ซ้ำกันเท่านั้นดังนั้นจึงไม่ชอบabaเนื่องจากaเกิดขึ้นสองครั้ง

กรณีทดสอบ

การป้อนข้อมูล: abcde

เอาต์พุตที่เป็นไปได้:

a
ab
abc
abcd
abcde
 b
 bc
 bcd
 bcde
  c
  cd
  cde
   d
   de
    e

การป้อนข้อมูล: abcdefghij

เอาต์พุตที่เป็นไปได้:

a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
 b
 bc
 bcd
 bcde
 bcdef
 bcdefg
 bcdefgh
 bcdefghi
 bcdefghij
  c
  cd
  cde
  cdef
  cdefg
  cdefgh
  cdefghi
  cdefghij
   d
   de
   def
   defg
   defgh
   defghi
   defghij
    e
    ef
    efg
    efgh
    efghi
    efghij
     f
     fg
     fgh
     fghi
     fghij
      g
      gh
      ghi
      ghij
       h
       hi
       hij
        i
        ij
         j

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


1
สตริงย่อยว่างอยู่ที่ไหน
Leun Nun

@KennyLau โอ้ใช่แล้วทำให้ฉันนึกถึงการแก้ไขข้อมูลเพิ่มเติมในความท้าทาย
Adnan

ขึ้นบรรทัดใหม่เป็นที่ยอมรับหรือไม่
user81655

@ user81655 ใช่มันเป็นที่ยอมรับ
Adnan

เป็นอาร์เรย์ของสตริงที่ยอมรับได้หรือไม่หรือจะต้องมีการขึ้นบรรทัดใหม่ให้คั่นหรือไม่
Zgarb

คำตอบ:



21

Perl, 32 28 24 ไบต์

รวม +1 สำหรับ -n

รหัส:

/.+(??{say$"x"@-".$&})/

รันด้วยสตริงบน STDIN:

perl -nE '/.+(??{say$"x"@-".$&})/' <<< abcd

ภาษาของการเล่นกอล์ฟอยู่ใกล้และยังอยู่ไกล ...

คำอธิบาย

/.+/ตรงกับสตริงย่อย น่าเสียดายที่มันหยุดลงเมื่อมันเข้าคู่กัน ดังนั้นฉันใช้ runtime regex สร้าง(??{})เพื่อขยาย regex จึงล้มเหลวและ backtracking จะลองสตริงย่อยต่อไปนี้ในที่สุดลองพวกเขาทั้งหมดก่อนที่จะยอมแพ้ในความขยะแขยง

ข้างใน(??{})ฉันพิมพ์ซับสตริงปัจจุบันนำหน้าด้วยช่องว่างมากเท่ากับออฟเซ็ตของสตริงย่อยที่ใช้$"x"@-"

ดังนั้นผลลัพธ์ที่ออกมาจะจัดทำเป็นเอกสารว่าการย้อนรอย regex ทำงานอย่างไร:

abcd
abc
ab
a
 bcd
 bc
 b
  cd
  c
   d

1
น้ำเกรวี่ที่ดีนี่เป็นความลับที่ดูคล้ายกับ esolangs มี +1
AdmBorkBork

4
@TimmyD: ด้วยเหตุผลแปลก ๆ มีผู้คนที่บอกว่าการเล่นกอล์ฟให้ Perl เป็นชื่อที่ไม่ดี ...
Ton Hospel

รุ่นPerl 6ที่ได้รับแรงบันดาลใจจากสิ่งนี้มีลักษณะคล้ายกันมากperl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
Brad Gilbert b2gills

ใช้งานไม่ได้กับอินพุตab1(ฉันถือว่าเนื่องจากsay...ประเมินเป็น1) (ทดสอบใน 5.18.2.) แก้ไข:โอ้! ขออภัยคำถามพูดว่า "คุณสามารถสันนิษฐานได้ว่าตัวสตริงจะมีเพียงตัวอักษร"
msh210

14

MATL , 20 18 ไบต์

แรงบันดาลใจจากรูปแบบของวัสดุพิมพ์ที่สร้างขึ้นโดยคำตอบของ @ aditsu

tt!+gR*c`t3Lt3$)tn

ลองออนไลน์!

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

คำอธิบาย

t         % implicit input. Duplicate
t!+g      % square matrix with size as input
R         % keep upper triangular part
*c        % multiply element-wise with broadcast. Convert to char
`         % do...while
  t       %   duplicate
  3Lt3$)  %   remove last row and column
  tn      %   number of remaining elements. Used as loop condition
          % implicitly end loop and display

วิธีเก่า (พลังคาร์ทีเซียน)

ฉันใช้วิธีนี้ในกรณีที่เป็นแรงบันดาลใจสำหรับคำตอบอื่น ๆ

tn0:2Z^!S!2\Xu4LY)*c

ในคอมไพเลอร์ออนไลน์สิ่งนี้หมดหน่วยความจำสำหรับกรณีทดสอบที่ยาวที่สุด

ลองออนไลน์!

คำอธิบาย

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

ตัวอย่างเช่นสำหรับสตริง'abc'รูปแบบถูกสร้างขึ้นดังนี้ ก่อนอื่นจะได้รับกำลังคาร์ทีเซียนของ[0 1 2]จำนวนอักขระที่ป้อนเข้า:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
···
2 2 1
2 2 2

การจัดเรียงแต่ละแถวให้

0 0 0
0 0 1
0 0 2
0 0 1
0 1 1
···
1 2 2
2 2 2

การแปลง2เป็น0(เช่นmod(...,2)) และลบแถวที่ซ้ำกันจะให้รูปแบบสุดท้าย

0 0 0
0 0 1
0 1 1
0 1 0
1 1 1
1 1 0
1 0 0

ซึ่งแต่ละแถวจะมีรูปแบบที่สอดคล้องกับสตริงย่อย (ต่อเนื่องกัน) จำเป็นต้องลบแถวแรกเนื่องจากสอดคล้องกับสตริงย่อยที่ว่างเปล่า

t      % Implicitly get input. Duplicate
n      % Number of elements
0:2    % Vector [0 1 2]
Z^     % Cartesian power. Each result is a row
!S!    % Sort each row
2\     % Modulo 2: transform 2 into 0
Xu     % Unique rows
4LY)   % Remove first (corresponds to the empty substring)
*      % Element-wise multiplication by original string
c      % Convert to char. Implicitly display

3
ความคิดของคุณเป็นเครื่องแมทริกซ์การจัดการที่ยิ่งใหญ่หรือไม่?
แมว

@cat ใช้ Matlab มานานหลายปีแล้วฉันเดาว่า :-)
Luis Mendo

14

เรติน่า , 48 32 31 ไบต์

ขอบคุณ Kenny Lau สำหรับการบันทึก 3 ไบต์และปูทางไปอีกมากมาย

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

M&!r`.+
%+`( *)\S(.+)$
$&¶$1 $2

ลองออนไลน์!

คำสั่งของสตริงย่อยที่สร้างขึ้น:

abcde
 bcde
  cde
   de
    e
abcd
 bcd
  cd
   d
abc
 bc
  c
ab
 b
a

คำอธิบาย

M&!r`.+

นี่ทำให้เราได้คำนำหน้าทั้งหมดของอินพุต สิ่งนี้ทำได้โดยการจับคู่ ( M) สตริงย่อยใด ๆ ( .+) เริ่มต้นจากจุดสิ้นสุด ( r) พิจารณาการจับคู่ที่ทับซ้อนกัน ( &) และส่งคืนการจับคู่ทั้งหมดที่เข้าร่วมกับ linefeeds ( !)

ตอนนี้สิ่งที่เราต้องทำคือการแกะสลักคำนำหน้าต่อเนื่องของคำนำหน้าเหล่านั้น (โดยแทนที่ด้วยช่องว่าง) เราทำทีละขั้นตอนด้วยการวนซ้ำ:

%+`( *)\S(.+)$
$&¶$1 $2

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


เราสามารถมี!นัยMและ 1char รุ่น.+และ.*?
CalculatorFeline

คำนำหน้าของคำนำหน้าของ string = คำนำหน้าของสตริง คุณอาจหมายถึงคำนำหน้าคำต่อท้ายหรือไม่ (แก้ไขเพื่อแก้ไข)
CalculatorFeline

@CatsAreFluffy ไม่มีคำอธิบายที่ถูกต้อง เมื่อเราลบคำนำหน้าจากคำนำหน้าเราจะได้รับสารตั้งต้น สำหรับข้อเสนอแนะอื่น ๆ ฉันไม่คิดว่าฉันจะสร้างตัวเลือกที่บ่งบอกถึงขั้นตอน ในขณะที่ปัจจุบันมีการใช้อักขระจำนวนมากสำหรับประเภทเวทีเดียวเท่านั้นซึ่งอาจมีการเปลี่ยนแปลงในอนาคต สำหรับ.+และ.*ฉันต้องโทเค็น regex และในขณะที่ฉันวางแผนที่จะทำในบางจุดฉันไม่คิดว่ามันจะเกิดขึ้นได้ตลอดเวลาเร็ว ๆ นี้ (และถ้าฉันทำฉันอาจจะมุ่งเน้นไปที่คุณสมบัติที่ เพิ่มความหมาย)
Martin Ender


11

Oracle SQL 11.2, 146 ไบต์

WITH v AS(SELECT LEVEL i FROM DUAL CONNECT BY LEVEL<=LENGTH(:1))SELECT LPAD(SUBSTR(:1,s.i,l.i),s.i+l.i-1)FROM v s,v l WHERE s.i+l.i<=LENGTH(:1)+1;

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

WITH v AS(SELECT LEVEL i FROM DUAL CONNECT BY LEVEL<=LENGTH(:1))
SELECT LPAD(SUBSTR(:1,s.i,l.i),s.i+l.i-1)
FROM   v s, v l
WHERE  s.i+l.i<=LENGTH(:1)+1

9

CJam, 20

q{__,{\_N+oSt}/;W<}h

ลองออนไลน์

คำอธิบาย:

q           read the input (initial string)
{…}h        do … while
  _         copy the current string
  _,        copy and get the length
  {…}/      for each value (say i) from 0 to length-1
    \       bring the string to the top
    _N+o    make a copy, append a newline and print
    St      set the i'th element to S=" "
  ;         pop the last result (array full of spaces)
  W<        remove the last character of the current string
             if the string is empty, the do-while loop terminates

8

Python ขนาด 57 ไบต์

f=lambda s,p='':set(s)and{p+s}|f(s[1:],' '+p)|f(s[:-1],p)

เอาท์พุตเช่นset {' b', 'a', 'ab'}ความคิดคือการหักเงินสองกิ่งที่ตัดอักขระตัวแรกหรือตัวสุดท้าย ให้เอาต์พุตที่ซ้ำซ้อน แต่setจะลบรายการที่ซ้ำกันโดยอัตโนมัติ สำหรับการจัดตำแหน่งทุกครั้งที่มีการตัดอักขระตัวแรกจะมีการเพิ่มช่องว่างในส่วนนำหน้าpซึ่งจะถูกต่อเข้ากับด้านหน้า


7

PowerShell v2 +, 69 ไบต์

param($a)0..($b=$a.length-1)|%{($i=$_)..$b|%{" "*$i+-join$a[$i..$_]}}

รับอินพุต$aวนซ้ำไปตามความยาว (การตั้งค่า$bในกระบวนการเพื่อใช้ในภายหลัง) แต่ละวงรอบนอกเราวนซ้ำ$bอีกครั้งตั้งค่า$iเพื่อใช้ในภายหลัง แต่ละวงด้านในเราส่งออก$iจำนวนช่องว่างตัดกับชิ้นส่วนของสายป้อน เนื่องจากเราเพิ่งวนลูปผ่านสตริงสิ่งนี้จะจัดการกับสตริงใด ๆ ตามอำเภอใจ (ตัวอักษรที่ซ้ำกันเว้นวรรคหรืออะไรก็ตาม)

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\exploded-substrings.ps1 "Golfing"
G
Go
Gol
Golf
Golfi
Golfin
Golfing
 o
 ol
 olf
 olfi
 olfin
 olfing
  l
  lf
  lfi
  lfin
  lfing
   f
   fi
   fin
   fing
    i
    in
    ing
     n
     ng
      g

7

C #, 136 132 131 ไบต์


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

String m(String s){String o="",e=o;for(int i=0,a,l=s.Length;i<l;i++,e+=" ")for(a=1;a+i<=l;a++)o+=e+s.Substring(i,a)+"\n";return o;}

Ungolfed

String m( String s ) {
    String o = "", e = o;

    for (int i = 0, a, l = s.Length; i < l; i++, e += " ")
        for (a = 1; a + i <= l; a++)
            o += e + s.Substring( i, a ) + "\n";

    return o;
}

รหัสเต็ม

    using System;
using System.Collections.Generic;

namespace Namespace {
    class Program {
        static void Main( string[] args ) {
            List<String> ls = new List<String>() {
                    "abcde",
                    "abcdefghijklmnop",
                    "0123456789",
                };

            foreach (String s in ls) {
                Console.WriteLine( s );
                Console.WriteLine( m( s ) );
                Console.WriteLine( "" );
            }

            Console.ReadLine();
        }

        static String m( String s ) {
            String o = "", e = o;

            for (int i = 0, a, l = s.Length; i < l; i++, e += " ")
                for (a = 1; a + i <= l; a++)
                    o += e + s.Substring( i, a ) + "\n";

            return o;
        }
    }
}

ข่าว

  • v1.2 --1 byte - เปลี่ยนString o="",e="";เพื่อString o="",e=o;ที่จะบันทึก 1 ไบต์ แนวคิดมาจากGallant ( ฉันลืมที่จะใช้ส่วนนี้ในการอัปเดตล่าสุดฉันขอโทษ )
  • v1.1 - -4 bytes- วางวงเล็บจากforลูปและย้ายการเพิ่มช่องว่างe var ไปยังโซนตัววนซ้ำของลูปด้านนอก ความคิดที่มาจากGallantfor
  • v1.0 - 136 bytes- โซลูชั่นเริ่มต้น

1
คุณสามารถวางวงเล็บปีกกาบนวงในและกำหนดe=oให้บันทึก 3 ไบต์
Gallant

ยังสามารถแลกเปลี่ยนString o="",...กับvar o...อีก 3
TyCobb

@tycobb มันจะแปลงไร้ประโยชน์String o = "", e = "";เป็นvarเพราะฉันจะต้องแยกพวกเขาออกเป็นสองผลvar o = ""; var e = "";ซึ่งมีความยาวเท่ากันเมื่อเทียบกับที่ฉันมี จะทำ แต่ VS ไม่อนุญาตให้มีการประกาศตัวแปรหลายเมื่อใช้ตัวแปรโดยปริยายพิมพ์ - aka var's แต่ขอบคุณสำหรับความช่วยเหลือ แก้ไข:มี VS ตะโกนฉันว่าฉันไม่สามารถทำได้ฉันคิดว่ามันไม่ถูกต้องอาจผิด
auhmaan

5

Python 2.7, 70 82 ไบต์

ฉันไม่สามารถหาวิธีรับมันใน 1 บรรทัด โทรไปด้วยe("abcde",0)

def e(s,p):
 f=len(s)
 for x in range(f):print(' '*p+s[:x+1])
 if f>1:e(s[1:],p+1)

4

Python 3, 80 78 ไบต์

วนรอบจำนวนช่องว่างเพื่อนำหน้าด้วยแล้วตามด้วยจำนวนอักขระที่จะลงท้ายด้วย

lambda x:[print(' '*i+x[i:j+1])for i in range(len(x))for j in range(i,len(x))]

แก้ไข:ลบช่องว่างก่อน for for loops


4

MATL, 15 14 ไบต์

ที่บันทึกไว้หนึ่งไบต์เนื่องจาก@ LuisMendo ของเคล็ดลับที่นี่ !

tfWt2/!-RXzB*c

หลายวิธี ... ต้องหาวิธีใหม่ ขอให้มีความสุข! :)

ลองออนไลน์!

ระเบิด

t       % duplicate input
f       % get indices of nonzero elements in vector (i.e. 1:n)
W       % 2 raised to array, element-wise: 2^(1:n)
t       % duplicate array
2/      % divide by 2: 2^(0:n-1)
!       % transpose array 
-       % element-wise subtraction (w/singleton expansion)
R       % upper triangular part
Xz      % nonzero elements
B       % convert from decimal to binary. Produces a logical array
*       % array product (element-wise, singleton expansion)
c       % convert to character array; 0's automatically converted to spaces

3

JavaScript (ES6), 89 ไบต์

document.write("<pre>"+(

s=>(a=[...s]).map((_,i)=>a.map((_,j)=>++j>i?r+=" ".repeat(i)+s.slice(i,j)+`
`:0),r="")&&r

)("abcde"))

วิธีการตรงไปข้างหน้า เอาท์พุทมีขึ้นบรรทัดใหม่


อะไร=>หมายถึงใน Javascript? มันเป็นโอเปอเรเตอร์ไบนารีหรือไม่
Ewan Delanoy

@EwanDelanoy มันประกาศฟังก์ชั่น ES6 ลูกศร
user81655


3

Pyth, 12 11 ไบต์

jm+*;xQdd.:

น่าเศร้าที่คำถามช่วยให้เราสมมติตัวละครที่ไม่ซ้ำกันดังนั้นฉันแค่ค้นหาตำแหน่งแรกของสตริงย่อยและแผ่นที่มีช่องว่าง


คุณสามารถใช้;แทน\ เมื่ออยู่ในแผนที่ระดับต่ำสุด
FryAmTheEggman

3

Mathematica 89 ไบต์

r@i_:=StringReplace[i,#->" "]&/@(Complement[y,#]&/@Subsequences[y=Characters@i])//Column

คำอธิบาย

i อ้างถึงสตริงอินพุต

Subsequences[y=Characters@i]ส่งคืนทุกองค์ประกอบ (แสดงรายการของตัวละคร) ของอินพุต ( Subsequencesเปิดตัวในข้อ 10.4)

สำหรับแต่ละ Sequence Complement...ส่งคืนอักขระเหล่านั้นจากสตริงอินพุตที่ไม่มีอยู่ StringReplace[i,#->" "]ของแต่ละตัวละครเหล่านั้นจะถูกแทนที่ด้วยพื้นที่ว่างผ่าน

Columnแสดงผลลัพธ์ในคอลัมน์เดียว แต่ละสตริงเอาต์พุตมีจำนวนอักขระเท่ากันทำให้ได้ตัวอักษรที่เรียงกัน


r@"abcdefgh"

output


ภายใน 10.0.4 คุณหมายถึง 10.4 ใช่ไหม 10.3 ไม่มีเลย
CalculatorFeline

ใช่. 10.4 ฉันจะแก้ไขให้ถูกต้อง
DavidC

3

J, 32 29 28 ไบต์

(-@{.@i.|.])"1 a:>@-.~&,<\\.

สิ่งนี้ประเมินเป็นคำกริยา monadic ลองที่นี่ การใช้งาน:

   f =: (-@{.@i.|.])"1 a:>@-.~&,<\\.
   f 'abe'
a  
ab 
abe
 b 
 be
  e

คำอธิบาย

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

(-@{.@i.|.])"1 a:>@-.~&,<\\.  Input is y
                        <\\.  Compute suffixes of prefixes of y, and put them in boxes.
                              This gives a 2D array of substrings in boxes.
                      &,      Flatten the array of boxes,
               a:  -.~        remove all empty strings, and
                 >@           open each box. This places the strings in a 2D matrix of
                              characters, with trailing spaces to make it rectangular.
(          )"1                Do this for each line x in the matrix:
      i.                        The index of every character of x in y.
 -@{.@                          Take the first one and negate it.
        |.]                     Rotate x to the left by that amount.
                                Since we negated the index, this rotates to the right.

a eไม่ใช่สตริงย่อยตามที่กำหนดโดยการท้าทาย
Ton Hospel

@ TonHospel ฉันแก้ไขโปรแกรมตอนนี้มันเป็นไปตามข้อกำหนด
Zgarb

3

JavaScript (Firefox 30-57) 65 63 ไบต์

s=>[for(c of(i=0,s))for(d of(t=r=i?t+' ':'',s.slice(i++)))r+=d]

ส่งคืนอาร์เรย์ของสตริง ในฐานะที่เป็น ES6 มันเป็น 78 ไบต์:

s=>[...s].map((_,i,a)=>a.slice(i).map(c=>r.push(u+=c),t=u=i?t+' ':''),r=[])&&r

2

QBasic, 75 ไบต์

INPUT s$
FOR i=1TO LEN(s$)
FOR j=1TO i
LOCATE,j
?MID$(s$,j,i+1-j)
NEXT
NEXT

FORกลยุทธ์double -loop ขั้นพื้นฐานปรับเปลี่ยนเล็กน้อยสำหรับการจัดทำดัชนี 1 รายการของ QBasic เคล็ดลับหลักคือLOCATE,jซึ่งเลื่อนเคอร์เซอร์ไปที่คอลัมน์jของบรรทัดปัจจุบันก่อนพิมพ์ เนื่องจากคอลัมน์ 1 เป็นคอลัมน์แรกจึงเท่ากับการพิมพ์j-1ช่องว่างนำหน้า


2

Perl 6 , 34 ไบต์

perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
m/       # match the input line
  ^      # from the start
  ( .* ) # 0 or more characters ( $0 )
  ( .+ ) # 1 or more characters ( $1 )

  <{ # match against the result of:

    +put # print with a trailing newline:
      " " x $0.to, # add the leading spaces
      $1           # the substring
  }>
/

เหตุผลสำหรับ+ก่อนหน้าputนี้คือเพื่อให้ส่งคืน1แทนTrueซึ่งรับประกันว่าจะไม่อยู่ในอินพุตดังนั้นจึงต้องย้อนกลับเสมอ

$ perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/' <<< abcd
   d
  cd
  c
 bcd
 bc
 b
abcd
abc
ab
a

(ถ้าคุณต้องการในลำดับตรงกันข้ามใช้(.*?)(.+?)แทน(.*)(.+))

นี้ได้รับแรงบันดาลใจจาก Perl 5 คำตอบ


2

J, 35 23 22 ไบต์

[:;#\.<@{."_1|.\."1^:2

ฉันใช้เวลาสักพัก แต่ในที่สุดฉันก็ปรับมันให้เหมาะสม

การใช้

   f =: [:;#\.<@{."_1|.\."1^:2
   f 'abcde'
abcde
abcd 
abc  
ab   
a    
 bcde
 bcd 
 bc  
 b   
  cde
  cd 
  c  
   de
   d 
    e

คำอธิบาย

[:;#\.<@{."_1|.\."1^:2  Input: s
             |.\."1     For each suffix of s, reverse it
                   ^:2  Repeat that twice to create all exploded substrings
   #\.                  Get the length of each suffix. This is
                        used to make the range [len(s), len(s)-1, ..., 1]
        {."_1           For each value in the range, take that many strings from
                        the list of exploded substrings. This avoids blank substrings
      <@                Box each set of strings
[:;                     Unbox and join the strings together and return

คุณสามารถบันทึก 2 ไบต์โดยการลบวงเล็บที่เหมาะสม นอกจากนี้การทำ[:+./"1' '~:]แทนการ[:-.[:*/"1' '=]บันทึกอีก 2 ไบต์
Zgarb

2

Java, 138 ไบต์

String e(String s){int l=s.length(),a=0,i,j;for(;++a<l;)for(i=0;i<=l-a;){s+="\n";for(j=0;j++<i;)s+=" ";s+=s.substring(i,i+++a);}return s;}

จัดรูปแบบ:

String e(String s) {
    int l = s.length(), a = 0, i, j;
    for (; ++a < l;)
        for (i = 0; i <= l - a;) {
            s += "\n";
            for (j = 0; j++ < i;)
                s += " ";
            s += s.substring(i, i++ + a);
        }
    return s;
}


1

Haskell, 65 ไบต์

(>>=zipWith((++).(`replicate`' '))[0..].init.tails).reverse.inits

มันต้องการinitsและtailsจาก Data.List แม้ว่า เพื่อเอาท์พุทมันเพิ่มmapM_ putStrLn.ที่ด้านหน้า

ค่อนข้างตรงไปตรงมา; reverseคือเพื่อให้แน่ใจว่าสายเดิมเป็นครั้งแรก

GHCi> mapM_ putStrLn.(>>=zipWith((++).(`replicate`' '))[0..].init.tails).reverse.inits$"abcde"
abcde
 bcde
  cde
   de
    e
abcd
 bcd
  cd
   d
abc
 bc
  c
ab
 b
a
it :: ()
(0.02 secs, 0 bytes)

2
(>>=zipWith(++)(inits$cycle" ").init.tails).inits. และโปรดเพิ่มลงในimport Data.List;จำนวนไบต์
nimi

1

Ruby, 75 67 ไบต์

ฟังก์ชั่นไม่ระบุชื่อ ใช้การทดแทน regex เพื่อจัดตำแหน่งสตริงย่อย .เป็นตัวละครที่เติม

->s{(l=s.size).times{|i|(l-i).times{|j|puts s.tr(?^+s[j,i+1],?.)}}}

1

bash + GNU coreutils, 109 ไบต์

l=${#1}
for i in `seq 0 $l`;{
for j in `seq $((l-i))`;{
for k in `seq $i`;{ printf ' ';}
echo ${1:i:j}
}; }

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


1

PHP, 151 ตัวอักษร

Ungolfed

<?php
$input = $argv[1];
foreach(str_split($input) as $p=>$letter)
{
    $spaces = str_repeat(" ", $p);
    echo $spaces.$letter."\n";
    $p++;
    for($i=$p;$i<strlen($input);$i++)
    {
        echo $spaces.$letter.substr($input, $p, $i)."\n";
    }
}
?>

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

<?$c=$argv[1];foreach(str_split($c)as$d=>$b){$a=str_repeat(" ",$d);echo$a.$b."\n";$d++;for($e=$d;$e<strlen($c);$e++){echo$a.$b.substr($c,$d,$e)."\n";}}

ตัวอย่าง

php explodesub.php 'abc'
a
ab
abc
 b
 bc
  c

1

C ++, 145 ไบต์

พารามิเตอร์เริ่มต้นแรกถูกใช้เป็นอินพุตคอนโซลเป็นเอาต์พุต

#include<iostream>
#define f(y,b,d) for(int y=b;r[0][y];y++){d;}
int main(int,char*r[]){f(x,0,f(y,x+1,std::cout.write(r[0],y)<<'\n')r[0][x]=32)}

คำตอบที่ดีและยินดีต้อนรับสู่ PPCG! ฉันไม่ได้ใช้ C ++ มากนัก แต่คุณทำไม่ได้std::cout<<r[0]<<y<<'\n'แทน `std :: cout.write (r [0], y) << '\ n'? คุณช่วยเพิ่มคำอธิบายสั้น ๆ ได้ไหม? ขอบคุณ!
NoOneIsHere ที่

1

Python 2 (Ungolfed) 99 ไบต์

t=raw_input()
l=len(t)
for j in range(l):
 for i in range(l):
  if i>=j:print j*' '+t[j:i+1]  

ผล:

>>python codegolf.py
abc
a
ab
abc
 b
 bc
  c

>>python codegolf.py
abcdef
a
ab
abc
abcd
abcde
abcdef
 b
 bc
 bcd
 bcde
 bcdef
  c
  cd
  cde
  cdef
   d
   de
   def
    e
    ef
     f

>>python codegolf.py
lmnopqrst
l
lm
lmn
lmno
lmnop
lmnopq
lmnopqr
lmnopqrs
lmnopqrst
 m
 mn
 mno
 mnop
 mnopq
 mnopqr
 mnopqrs
 mnopqrst
  n
  no
  nop
  nopq
  nopqr
  nopqrs
  nopqrst
   o
   op
   opq
   opqr
   opqrs
   opqrst
    p
    pq
    pqr
    pqrs
    pqrst
     q
     qr
     qrs
     qrst
      r
      rs
      rst
       s
       st
        t
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.