ค่อยๆเปลี่ยนสตริงเป็นอื่น


31

ความท้าทาย

รับสองสาย / อาร์เรย์ของสายออกสายแรกช้าลงและขยายกลับเข้าไปในสายที่สอง

คุณสามารถสันนิษฐานได้ว่าสตริงจะเริ่มต้นด้วยตัวละครเดียวกันเสมอ

ตัวอย่าง

Input:
"Test", "Testing"

Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing

ก่อนอื่นคุณเอาท์พุทคำแรก:

Test

จากนั้นคุณจะลบตัวอักษรหนึ่งตัวออกไปเรื่อย ๆ จนกว่าสตริงจะยาวหนึ่งตัว:

Tes
Te
T

จากนั้นให้เพิ่มตัวอักษรหนึ่งคำที่สองต่อไปจนกว่าจะเสร็จ:

Te
Tes
Test
Testi
Testin
Testing

(ถ้าทั้งสองสายยาวหนึ่งตัวอักษรจากนั้นก็ออกหนึ่งครั้ง)

กรณีทดสอบ

"Hello!", "Hi."
Hello!
Hello
Hell
Hel
He
H
Hi
Hi.

"O", "O"

O

"z", "zz"

z
zz

".vimrc", ".minecraft"

.vimrc
.vimr
.vim
.vi
.v
.
.m
.mi
.min
.mine
.minec
.minecr
.minecra
.minecraf
.minecraft

"     ", "   "

SSSSS
SSSS
SSS
SS
S
SS
SSS

"0123456789", "02468"

0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0
02
024
0246
02468

(หมายเหตุ: ในพื้นที่ทดสอบ / กรณีที่สี่ให้เปลี่ยน S ด้วยช่องว่าง)

กฎระเบียบ

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ! Tiebreaker เป็นโพสต์ที่ถูกโหวตมากที่สุด ผู้ชนะจะถูกเลือกในวันที่ 9/10/2559

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม


จะขึ้นบรรทัดใหม่ 2 บรรทัด (บรรทัดว่างหนึ่งที่มองเห็นได้หลังจากลำดับ) หรือไม่
seshoumara

คำตอบ:


11

Pyth, 9 ไบต์

j+_._Et._

โปรแกรมที่รับสตริงที่สองจากนั้นสตริงแรกตามสตริงที่ยกมาบน STDIN และพิมพ์ผลลัพธ์

ลองออนไลน์

มันทำงานอย่างไร

j+_._Et._  Program. Inputs: Q, E
   ._E     Yield prefixes of E as a list
  _        Reverse the above
       ._  Yield prefixes of Q as a list (implicit input fill)
      t    All but the first element of above
 +         Merge the two lists
j          Join on newlines
           Implicitly print

14

V , 14 ไบต์

òYp$xhòjòÄ$xhh

ลองออนไลน์!

คำอธิบาย:

ò     ò     "Recursively:
 Yp         "  Yank the current line and paste it
   $        "  Move to the end of the current line
    x       "  Delete one character
     h      "  Move One character to the right.
            "  Because of the way loops work in V, this will throw an error if there
            "  Is only one character on the current line.

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

0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0

เราเพียงแค่ต้องทำสิ่งเดียวกันในสิ่งที่ตรงกันข้ามสำหรับบรรทัดถัดไป:

j           "Move down one line
 ò     ò    "Recursively (The second ò is implicit)
  Ä         "  Duplicate this line up
   $        "  Move to the end of the current line
    x       "  Delete one character
     hh     "  Move two characters to the right.
            "  Because of the way loops work in V, this will throw an error if there
            "  Is only two characters on the current line.

ทางเลือกอื่นที่น่าสนใจ :

òÄ$xhòç^/:m0
ddGp@qd

3
มันก็เหมือนเป็นกลุ่มเครื่องมือที่ถูกต้องเสมอสำหรับงาน
Downgoat

@Downgoat แน่นอน นั่นเป็นเหตุผลที่คุณต้องเริ่มเล่นกอล์ฟใน V. : P
DJMcMayhem

9

Python ขนาด 93 ไบต์

f=lambda a,b,r='',i=2:a and f(a[:-1],b,r+a+'\n')or(len(b)>=i and f(a,b,r+b[:i]+'\n',i+1)or r)

เริ่มต้นด้วยสตริงว่างrเพิ่มaและขึ้นบรรทัดใหม่และลบตัวอักษรตัวสุดท้ายจากaจนaเป็นที่ว่างเปล่าแล้วเพิ่มส่วนที่ต้องการbและขึ้นบรรทัดใหม่โดยการรักษาเคาน์เตอร์iซึ่งเริ่มต้นที่2จนกว่าความยาวของเกินแล้วผลตอบแทนb rมีการขึ้นบรรทัดใหม่

การทดสอบทั้งหมดอยู่บนideone


2 สิ่ง 1) ผมเชื่อว่าคุณ miscounted ตัวอักษรและมันเป็นจริง 93 และ 2) r=""คุณไม่จำเป็นต้องพูด Simple rจะยังคงทำงาน

ขอบคุณ @JackBates 1. แก้ไขและปรับปรุง - f=ฉันอาจลืม 2. หากไม่มีr=''ปัจจุบันf('test','testing')จะไม่ทำงาน ใช่f('test','testing','')แต่เราต้องปฏิบัติตามข้อกำหนด
Jonathan Allan

ยกโทษให้ฉัน ฉันแค่ดูที่รหัสไม่ใช่ตัวอย่าง


7

เรติน่า, 50 41 26 ไบต์

ขอบคุณ Martin Ender สำหรับการบันทึก 15 (!) ไบต์

M&!r`.+
Om`^.¶[^·]+|.+
A1`

รับอินพุตด้วยสองสตริงคั่นด้วยบรรทัดใหม่:

Test
Testing

ลองออนไลน์!

คำอธิบาย

M&!r`.+

บรรทัดแรกสร้าง "ขั้นตอน" ของคำทั้งสอง:

Testing
Testin
Testi
Test
Tes
Te
T
Test
Tes
Te
T

Mใช้สำหรับโหมดจับคู่&พิจารณาการจับคู่ที่ซ้อนทับกันและ!พิมพ์การแข่งขันแทนจำนวนการแข่งขัน เหตุผลที่กลับรายการคือตัวเลือกright-to-left: เครื่องยนต์เริ่มค้นหาการจับคู่ที่ส่วนท้ายของสตริงและดำเนินต่อไปยังจุดเริ่มต้น

Om`^.¶[^·]+|.+

สิ่งนี้จะได้ทุกอย่างตามลำดับที่ถูกต้อง: มันคือOrts ที่ตรงกันทั้งหมดของ regex ที่ตามมา: ตัวละครในบรรทัดของตัวเองและตัวละครทุกตัว (รวมถึงการขึ้นบรรทัดใหม่) หลังจากนั้นซึ่งตรงกับครึ่งหลังทั้งหมดเป็นอันเดียว ซึ่งตรงกับแต่ละบรรทัด การจับคู่เหล่านี้จะถูกจัดเรียงตามจุดรหัสดังนั้น T ตามด้วยการขึ้นบรรทัดใหม่อันดับแรกตามด้วยบรรทัดขึ้นไปตามความยาว

A1`

ตอนนี้เราเพิ่งมีบรรทัดอักขระแรกอยู่ด้านบนดังนั้นเราจึงใช้Aโหมด ntigrep เพื่อยกเลิกการจับคู่แรกของ regex เริ่มต้น.+regex

เวอร์ชั่นเก่า

M&!r`.+
O`\G..+¶
s`(.*)¶.¶(.*)
$2¶$1
¶.$

ลองรุ่นนี้ออนไลน์!

คำอธิบาย

บรรทัดแรกเหมือนกันดังนั้นโปรดดูคำอธิบายสำหรับข้างต้น

O`\G..+¶

นี่เป็นการกลับรายการของครึ่งแรก (ป้อนคำที่สอง) ที่จริงแล้วมันเป็นOบรรทัดและ regex จำกัด การแข่งขัน: มันจะต้องเป็นบรรทัดของตัวละครสองตัวหรือมากกว่า ( ..+) ตามด้วยขึ้นบรรทัดใหม่ ( ) ที่เริ่มต้นที่คนสุดท้ายทิ้ง ( \G) ในตัวอย่างด้านบนซิงเกิ้ลที่Tอยู่ตรงกลางไม่ตรงกันดังนั้นจึงไม่มีสิ่งใดที่จะทำได้

Te
Tes
Test
Testi
Testin
Testing
T
Test
Tes
Te
T

ตอนนี้เรามีสององค์ประกอบที่ถูกต้อง แต่ในลำดับที่ไม่ถูกต้อง

s`(.*)¶.¶(.*)
$2¶$1

¶.¶ตรงกับ lone T ตรงกลางซึ่งเราไม่ต้องการ แต่แยกทั้งสองส่วน ทั้งสอง(.*)จับทุกอย่างก่อนและหลังรวมถึงการขึ้นบรรทัดใหม่ด้วยsโหมด ingle-line ทั้งสองจับถูกแทนที่ในลำดับที่ถูกต้องด้วยการขึ้นบรรทัดใหม่ในระหว่าง

ตอนนี้เราเสร็จแล้วเว้นแต่สตริงอินพุตจะมีความยาวหนึ่งอักขระซึ่งในกรณีนี้อินพุตจะไม่เปลี่ยนแปลง เพื่อกำจัดสิ่งที่ซ้ำกันเราจะแทนที่¶.$(เมื่อบรรทัดสุดท้ายของสตริงเป็นอักขระเดียว) โดยไม่มีอะไร


4

Python 2, 88 82 ไบต์

x,y=input(),input()
for i in x:print x;x=x[:-1]
s=y[0]
for i in y[1:]:s+=i;print s

ใช้สองอินพุตแต่ละอันล้อมรอบด้วยเครื่องหมายคำพูด

ขอบคุณ @JanathanAllan สำหรับการบันทึกไบต์และชี้จุดบกพร่อง


1
ไม่มีความจำเป็นในการlen(x)ในx=x[:len(x)-1]ตั้งแต่ชดเชยลบงานหั่น - x=x[:-1]เพียงแค่คุณสามารถเขียน ปัญหาเดียวคือรหัสของคุณจะไม่จัดการกับ" ", " "กรณีทดสอบเป็นอย่างดี
Jonathan Allan

1
คุณสามารถดรอปวินาทีinput()และใช้รูปแบบอินพุตเช่น"<str1>", "<str2>"
LevitatingLion

คุณสามารถเปลี่ยนบรรทัดที่สองเพื่อfor i in range(x):print x[-i:], for i in range(1,y):print y[:-i]และสายสี่ ไม่แน่ใจว่ามันจะใช้งานได้
clismique

4

Perl, 34 28 ไบต์

รวม+2สำหรับ-0n

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

perl -M5.010 -0n slow.pl
Test
Testing
^D

slow.pl:

/(^..+|
\K.+?)(?{say$&})^/

ปล่อยให้การย้อนรอย regex ทำงาน ...



3

Brachylogขนาด 32 ไบต์

:1aLtT,Lhbr:Tc~@nw
:2fb
~c[A:B]h

ลองออนไลน์!

คำอธิบาย

Brachylog มีคำนำหน้าไม่มีในตัวดังนั้นเราจึงจะได้รับคำนำหน้าโดยใช้concatenate(ดูกริยา 2): คำนำหน้าของSถูกPถ้าPตัดแบ่งQ(สิ่งที่เป็น) Sส่งผลให้

  • ภาคแสดงหลัก:

    :1aL                  L is all prefixes of both elements of the input (see predicate 1)
       LtT,               T is the second element of L
           Lhbr           Remove the first prefix of the first list of L and reverse it
               :Tc        Concatenate with T
                  ~@n     Join with newlines
                     w    Write to STDOUT
    
  • คำกริยาที่ 1:

    :2f                   Find all prefixes of the input string (see predicate 2)
       b                  Remove the first one (empty string)
    
  • คำกริยาที่ 2:

    ~c[A:B]               Input is the result of concatenating A to B
           h              Output is A
    

3

javascript, 103 81 ไบต์

f=(x,y,n=1)=>x?`
`+x+f(x.slice(0,-1),y):n++<y.length?`
`+y.slice(0,n)+f(x,y,n):''

ตัวอย่าง: f("Test", "Testing")

เอาท์พุท:

Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing

คำตอบเดิม

f=(x,y,n=1)=>x?(console.log(x),f(x.slice(0,-1),y)):n++<y.length?(console.log(y.slice(0,n)),f(x,y,n)):''

3

Java, 188 179 ไบต์

interface E{static void main(String[]a){int i=a[0].length();while(i>1)System.out.println(a[0].substring(0,i--));while(i<=a[1].length())System.out.println(a[1].substring(0,i++));}}

ปรับปรุง

  • ลบตัวแปร s แล้วบันทึก 9 ไบต์

Ungolfed :

interface E {

    static void main(String[] a) {
        int i = a[0].length();
        while (i > 1) {
            System.out.println(a[0].substring(0, i--));
        }
        while (i <= a[1].length()) {
            System.out.println(a[1].substring(0, i++));
        }
    }
}

การใช้งาน :

$ java E 'test' 'testing'
test
tes
te
t
te
tes
test
testi
testin
testing

3

Haskell, 54 53 47 ไบต์

t[]=[]
t x=x:t(init x)
(.reverse.t).(++).init.t

ตัวอย่างการใช้งาน: ((.reverse.t).(++).init.t) "Hello" "Hi!"["Hello","Hell","Hel","He","H","Hi","Hi!"] ->

เวทมนตร์ไร้จุดหมาย มันเป็นเช่นเดียวกับf x y = (init(t x))++reverse (t y)ที่tทำให้รายการของสตริงเริ่มต้นทั้งหมดเช่น->t "HI!"["H","HI","HI!"]


หืมt=reverse.tail.inits?
Bergi

@Bergi: แน่ใจ แต่ความต้องการinits import Data.List
nimi


3

GNU sed, 57 45 + 2 (แฟล็ก rn) = 47 ไบต์

:;1{/../p};2G;2h;s/.(\n.*)?$//;/./t;g;s/.$//p

วิ่ง:

echo -e "Test\nTesting" | sed -rnf morphing_string.sed

อินพุตควรเป็นสองสตริงคั่นด้วยขึ้นบรรทัดใหม่ รหัสถูกเรียกใช้โดย sed สำหรับแต่ละบรรทัด

การวนซ้ำ:จะลบอักขระหนึ่งตัวจากจุดสิ้นสุดของสตริงซ้ำ ๆ 1{/../p}การส่งออกที่เกี่ยวข้องกับสายแรกจะถูกพิมพ์โดยตรงยกเว้นตัวอักษรตัวแรก: เอาต์พุตสำหรับสตริงที่สองถูกเก็บไว้ในพื้นที่พักในลำดับย้อนกลับ ( 2G;2h) ระหว่างการลบและพิมพ์ที่ส่วนท้าย


3

C (gcc) , 102 97 95 93 ไบต์

n;f(char*a,char*b){for(n=strlen(a);n;puts(a))a[n--]=0;for(a=b+1;*a++;*a=n)n=*a,*a=0,puts(b);}

ลองออนไลน์!

การวนซ้ำครั้งแรกจะเขียนทับสตริงด้วย 0 ไบต์เริ่มต้นจากจุดสิ้นสุดและใช้puts()พิมพ์สตริง การวนซ้ำครั้งที่สองไม่สามารถเขียนทับตั้งแต่ต้นได้ แต่จะต้องเก็บค่าเก่าไว้เพื่อให้สามารถนำกลับมาใช้ใหม่ได้ 0 ไบต์กำลังเดินไปยังจุดสิ้นสุด

ขอบคุณ @homersimpson และ @ceilingcat สำหรับการโกนหนวด 2 ไบต์ต่อครั้ง!


1
คุณสามารถบันทึกไบต์คู่ด้วยการประกาศnเป็น int n;f(char*a,char*b){n=strlen(a)...ระดับโลกเช่น: และคุณสามารถทำn=*a=0ตามที่ได้รับมอบหมายในร่างกายของคุณสำหรับวง
homersimpson

ขอบคุณ @ homersimpson แต่ n = * a = 0 ไม่เหมือนกับ n = * a, * a = 0
G. Sliepen

2

Python 3, 104 ไบต์

Meh

n='\n';lambda x,y:x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1))

ขอบคุณ @DJMcMayhem สำหรับการเล่นกอล์ฟขนาด 21 ไบต์

ไอเดียมัน!


1
คุณสามารถใช้เวลา 5 ไบต์ถ้าคุณทำn='\n'และการใช้n'\n'แทน คุณสามารถลดอีก 8 ได้ถ้าคุณใช้แลมบ์ดาแทนที่จะพิมพ์:n='\n';lambda x,y:n.join(x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1)))
DJMcMayhem

2

REPL / Javascript, 109 ไบต์

ใช้สตริงเท็จเพื่อลดขนาดสตริงเดิมลง

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

(a,b)=>{l=console.log;z='substring';for(c=a.length;d=a[z](0,c--);){l(d)}for(c=2;d!=(n=b[z](0,c++));){l(d=n)}}

การสาธิต:

> ((a,b)=>{l=console.log;z='substring';for(c=a.length;d=a[z](0,c--);){l(d)}for(c=2;d!=(n=b[z](0,c++));){l(d=n)}})("asdf","abcd")
[Log] asdf
[Log] asd
[Log] as
[Log] a
[Log] ab
[Log] abc
[Log] abcd

1
มันสั้นกว่า 1 ไบต์ในการทำa=>b=>...และเรียกใช้ฟังก์ชั่นด้วย (a) (b)
Zwei

2

brainfuck, 38 55 ไบต์

>++++++++++>,[>,]<[<]>>[[.>]<[-]<[<]>.>],.[[<]>.>[.>],]

แก้ไข: รวมบรรทัดใหม่ในเอาต์พุต


ฉันไม่สามารถรับรหัสของคุณให้ทำงานได้ อินพุตถูกคั่นด้วยบรรทัดใหม่หรือไม่? คุณใช้ล่ามคนไหน
acrolith

2

Dyalog APL , 20 13 ไบต์

↑(⌽,\⍞),1↓,\⍞

matrify

(⌽,\⍞)ย้อนกลับ ( ) การต่อข้อมูลสะสม ( ,\) ของการป้อนอักขระ ( )

, ผนวกกับ

1↓ องค์ประกอบหนึ่งลดลงจาก

,\⍞ การต่อกันแบบสะสมของอินพุตอักขระ

ลองใช้ออนไลน์!


2

แร็กเก็ต 193 ไบต์

(define(f l)
(let*((s(list-ref l 0))
(x(string-length s)))
(for((n x))
(println(substring s 0(- x n))))
(set! s(list-ref l 1))
(for((n(range 1(string-length s))))
(println(substring s 0(add1 n))))))

การทดสอบ:

(f(list "Test" "Testing"))

"Test"
"Tes"
"Te"
"T"
"Te"
"Tes"
"Test"
"Testi"
"Testin"
"Testing"


(f(list "Hello!" "Hi."))

"Hello!"
"Hello"
"Hell"
"Hel"
"He"
"H"
"Hi"
"Hi."

ควรลบอักขระตัวสุดท้ายจากสตริงอินพุตไม่ใช่อักขระตัวแรก
agilob

2

Floroid , 69 ไบต์

a,b=L.J
c=1
NZ(a)!=1:z(a);a=a[:-1]
z(a)
NZ(a)!=Z(b):c+=1;a=b[:c];z(a)

มันเป็นการเริ่มต้น รับอินพุตจาก STDIN

Testcases

Input: Test Testing
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing

Input: O O
Output: O

1

JavaScript (ES6), 92 ไบต์

(s,t)=>s.replace(/./g,`
$\`$&`).split`
`.slice(2).reverse().join`
`+t.replace(/./g,`
$\`$&`)

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

(s,t)=>s.replace(/./g,`
$\`$&\n`).split(/^/m).slice(1).reverse().join``+t.replace(/./g,`
$\`$&\n`)

1

C, 142 ไบต์

#define _(x,y) while(y)printf("%.*s\n",d,x-c);
f(char*a,char*b){int c=1,d=strlen(a)+1;while(*++a==*++b)c++;_(a,--d>=c)d++;_(b,d++<strlen(b-c))}

f(char* str1, char* str2)ให้


1

TI-Basic, 56 ไบต์

Prompt Str1,Str2
Str1
While 1<length(Ans
Disp Ans
sub(Ans,1,length(Ans)-1
End
For(I,1,length(Str2
Disp sub(Str2,1,I
End

ตัวอย่างการใช้งาน

Str1=?Test
Str2=?Testing
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing

Str1=?O
Str2=?O
O

Str1=?z
Str2=?zz
z
zz

1

Java, 168 136 ไบต์

(s,d)->{int i=s.length()+1;while(i-->1)System.out.println(s.substring(0,i));while(i++<d.length())System.out.println(d.substring(0,i));};

โปรแกรมทดสอบ Ungolfed

public static void main(String[] args) {

    BiConsumer<String, String> biconsumer = (s, d) -> {
        int i = s.length() + 1;
        while (i-- > 1) {
            System.out.println(s.substring(0, i));
        }
        while (i++ < d.length()) {
            System.out.println(d.substring(0, i));
        }
    };

    biconsumer.accept("Test", "Testing123");

}

1

(Lambdabot) Haskell - 41 ไบต์

f=(.drop 2.inits).(++).reverse.tail.inits

อ่านง่ายขึ้น แต่ยาวกว่าสองไบต์:

a!b=(reverse.tail$inits a)++drop 2(inits b)


เอาท์พุท:

f "Hello" "Hi!"
["Hello","Hell","Hel","He","H","Hi","Hi!"]

1

J, 18 ไบต์

]\@],~[:}:[:|.]\@[

Ungolfed:

]\@] ,~ [: }: [: |. ]\@[

นี่คือรถไฟ 7 ขบวน:

]\@] ,~ ([: }: ([: |. ]\@[))

รถไฟด้านในสุด[: |. ]\@[ประกอบด้วยหมวก[:ด้านซ้ายดังนั้นเราจึงใช้|.(ย้อนกลับ) กับผลลัพธ์ของ]\@[ซึ่งก็คือ]\(คำนำหน้า) บน[ (อาร์กิวเมนต์ซ้าย)

นี่คือสิ่งที่ดูเหมือนกับtesting, testอินพุต:

   'testing' ([: |. ]\@]) 'test'
test
tes
te
t

นี่ให้ส่วนแรกกับเราเกือบ 5-train นอกนั่นคือ([: }: ([: |. ]\@[))ซึ่งใช้}:(betail ลบองค์ประกอบสุดท้าย) กับการแสดงออกข้างต้น:

   'testing' ([: }: [: |. ]\@]) 'test'
test
tes
te

(นี่เป็นเพราะเราไม่สามารถมีจุดกึ่งกลางที่ซ้ำกัน)

ส่วนด้านนอกเป็นที่สุด:

]\@] ,~ ([: }: ([: |. ]\@[))

สิ่งนี้ประกอบด้วย]\@](คำนำหน้าของอาร์กิวเมนต์ซ้าย) และ,~(ผนวกสิ่งที่อยู่ทางซ้ายกับสิ่งที่อยู่ทางขวา) ทำให้เราได้ผลลัพธ์ที่ต้องการ:

   'testing' (]\@] ,~ ([: }: ([: |. ]\@[))) 'test'
testing
testin
testi
test
tes
te
t
te
tes
test

กรณีทดสอบ

   k =: ]\@] ,~ ([: }: ([: |. ]\@[))
   'o' k 'o'
o
   k~ 'o'
o
   'test' k 'test'
test
tes
te
t
te
tes
test
   k~ 'test'
test
tes
te
t
te
tes
test
   '. . .' k '...'
. . .
. .
. .
.
.
..
...
   'z' k 'zz'
z
zz

คุณสามารถจัดเรียงใหม่เป็น 14 ไบต์โดยใช้(,~}:@|.)&(]\)
ไมล์

1

PHP, 117 109 ไบต์

for($i=strlen($a=$argv[1]);$i>1;)echo" ".substr($a,0,$i--);
for(;$j<strlen($b=$argv[2]);)echo" ".$c.=$b[$j++];

for($i=strlen($a=$argv[1]);$i>1;)echo substr($a,0,$i--)." ";
for(;$i<=strlen($b=$argv[2]);)echo substr($b,0,$i++)." ";

PHP, 107 ไบต์ (ไม่ทำงานกับสตริงที่มี0)

for($a=$argv[1];$a[$i];)echo substr($a.a,0,-++$i)." ";
for($b=$argv[2];$b[$j];)echo substr($b,0,++$j+1)." ";

1

C, 111 ไบต์

f(char*a, char*b){int l=strlen(a),k=1;while(*a){printf("%s\n",a);a[--l]=0;}while(b[k]) printf("%.*s\n",++k,b);}

การทดสอบที่ไม่ดี

#include <stdio.h>
#include <string.h>

f(char*a, char*b) {
  int l=strlen(a), k=1;
  while(*a) {
    printf("%s\n",a);
    a[--l]=0;
  }
  while(b[k])
    printf("%.*s\n",++k,b);
}

int main() {
  char a[10] = {0};
  char b[10] = {0};

  for (int i=0; i<5; ++i) {
    a[i] = 'a' + i;
    b[i] = 'a' + i*2;
  }

  f(&(a[0]), &(b[0]));
}

1

brainfuck, 162 ไบต์

,[>,]++++++++++[[-<]>[->]<]++++++++++[<[+<]<[+<]>[+>]>[+>]<---]<[<]<[<]>[[.>]++++++++++.----------<[-]<[[->+<]<]>>]>[<+>-]>[[<+>-]<[<]>[.>]++++++++++.---------->]

ลองที่นี่

อินพุตใช้สองสตริงที่คั่นด้วย linefeed

โปรแกรมแรกกับ brianfuck และรหัสแรกของกอล์ฟฉันแน่ใจว่ามีการเพิ่มประสิทธิภาพมากมายที่ต้องทำ มีความสนุกสนานทำแม้ว่า

Ungolfed

,[>,] Read all input
++++++++++ Flag for 10
[                   Subtract 10 from each cell to flag space for blank
    [-<]            
    >
        [->]
        <
]
++++++++++ Flag for 10
[                   Add 10 back to each cell with value in it
    <[+<]<[+<]
    >[+>]>[+>]<---
]
<[<]<[<]>               goto first cell in first string string      

[                           Print first word subtracting one each time
    [.>]                    Print first string
    ++++++++++.----------   Print new line
    <[-]                    Kill last letter of first string
    <                       Back one
    [                       Move each first string character up one
          [->+<]
          <
    ]>>
]
>[<+>-]>                    Move to first letter of scond string back one goto second letter
[                               
    [<+>-]                  Move next letter back
    <[<]>                   Move to start of string
    [.>]                    Print string
    ++++++++++.----------   Print new line
    >
]

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