เขียนโปรแกรมเพื่อยืดหยุ่นสตริง


33

คำกริยาที่ดีในชื่อ

เขียนโปรแกรมที่ได้รับสายป้อนข้อมูลจะ "ยืดหยุ่น" สายนี้และส่งออกผลลัพธ์ การทำให้สตริงยืดหยุ่นนั้นทำได้ดังนี้:

อักขระตัวแรกจะปรากฏขึ้นหนึ่งครั้ง อักขระตัวที่สองแสดงขึ้นสองครั้ง อักขระที่สามแสดงขึ้นสามครั้งและต่อไปเรื่อย ๆ

อย่างที่คุณเห็นจำนวนการทำซ้ำของตัวละครบางตัวนั้นเกี่ยวข้องกับดัชนีของตัวละครซึ่งตรงข้ามกับที่เกิดขึ้นก่อนหน้าในสตริง

คุณสามารถคาดหวังว่าจะได้รับเฉพาะอักขระ ASCII ที่พิมพ์ได้ จากลิงค์ต่อไปนี้อักขระเหล่านี้มีค่าทศนิยม 32-126

ตัวอย่าง:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (โปรดสังเกตว่ามี 7 b อย่างไรตั้งแต่ b แรกแสดง 3 ครั้งและ b ที่สองแสดง 4 ครั้งทำให้รวม 7 b)

A and B: A aaannnnddddd BBBBBBB

ไบต์ที่สั้นที่สุดชนะ :)


2
ที่ดูเหมือนจะไม่เห็นด้วยกับ "ไม่ต้องการการสนับสนุนสำหรับช่องว่างนอกเหนือจากอักขระช่องว่าง" ควรเอาต์พุตเหมือนกันกับอินพุตหรือไม่ (คำสองตัวอักษรหนึ่งตัว?) โปรดทราบว่าเรามีสถานที่ที่ดีที่เรียกว่าSandboxซึ่งคุณสามารถใส่ความท้าทายให้กับผู้คนเพื่อให้คำติชมแก่คุณก่อนโพสต์
FryAmTheEggman

FryAmTheEggman สมมติฐานของคุณถูกต้อง @ TimmyD ฉันรู้ว่าฉันไม่ชัดเจนคุณอาจท้ายด้วยสตริงที่คั่นช่องว่างหลายช่องตามที่เห็นในตัวอย่าง FryAmTheEggman ที่โพสต์
Mario Ishac

ฉันสมมติว่ารหัสที่สั้นที่สุดชนะ? ;)
Adnan

@Adnan Yep ถึงแม้ว่าฉันไม่แน่ใจว่าฉันควรทำเครื่องหมายคำตอบด้วยโปรแกรม shorted ที่ยอมรับหรือไม่เนื่องจากภาษาบางภาษานั้นถูกสร้างขึ้นเพื่อวัตถุประสงค์ในการเล่นกอล์ฟที่ไม่เหมือนคนอื่น
Mario Ishac

2
เกี่ยวข้อง: 1 , 2
Sp3000

คำตอบ:


34

เยลลี่ 3 ไบต์

รหัส:

ĖP€

คำอธิบาย:

Ė     # Enumerate.
 P€   # Product of each.
      # Implicit joining of everything.

ใช้การเข้ารหัสวุ้น ลองออนไลน์! .


16
การใช้งานที่ผิดในความจริงที่ว่า Python *ทำการคูณสตริง นั่นไม่ได้ตั้งใจจริงๆ แต่มันได้ผล
Dennis

1
@Dennis: *ไหน ไม่มีคำตอบทั้งหมดในนั้น
โทมัสเวลเลอร์

10
@Thomas: Jelly เขียนใน Python และPคำสั่งJelly จะคำนวณผลิตภัณฑ์ที่อยู่เบื้องหลังโดยใช้ตัว*ดำเนินการPython การโพสต์นี้เป็นการใช้ abstraction ที่เป็นรั่วของรหัสอ้างอิงจริงใน Python ดังนั้นการทำPคำสั่ง (ผลิตภัณฑ์) บนสตริงจะทำงานตามที่คาดไว้
mellamokb

16

J, 4 ไบต์

#~#\

การใช้

   f =: #~#\
   f 'Why'
Whhyyy
   f 'SKype'
SKKyyyppppeeeee
   f 'LobbY'
LoobbbbbbbYYYYY
   f 'A and B'
A  aaannnnddddd      BBBBBBB

คำอธิบาย

#~#\  Input: s
  #\  Computes the length of each prefix of s
      This forms the range [1, 2, ..., len(s)]
#~    For each value in the range, copy the character at the
      corresponding index that many times
      Return the created string

12

Brainfuck, 15 ไบต์

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

การปรับใช้หน่วยความจำแบบตรงไปตรงมาคือการขยับพื้นที่หน่วยความจำ 1 สำหรับแต่ละอักขระอินพุต ต้องใช้ล่ามที่ให้ 0 ใน EOF และเซลล์ความแม่นยำ 32 บิต / โดยพลการสำหรับอินพุตนานกว่า 255 ตัวอักษร

ลองออนไลน์! (หมายเหตุ: TIO ใช้เซลล์ 8 บิต)


1
นอกจากนี้ฉันคิดว่าวิธีนี้ใช้ไม่ได้กับสตริงที่ยาวเกิน 255 อักขระ
Ismael Miguel

@IsmaelMiguel นั้นจะขึ้นอยู่กับว่าล่ามที่มีปัญหานั้นมีจำนวนเต็มความแม่นยำตามอำเภอใจหรือไม่ (แต่สำหรับการติดตั้งส่วนใหญ่นั้นจะอยู่ที่ 255)
Sp3000

การประชุมคือการใช้ 8 บิต อันไหนคือ 1 ตัว แต่บางตัวอาจใช้กับตัวเลข 32 บิต เนื่องจากคุณระบุว่าคุณต้องการให้ EOF เป็น 0 (ซึ่งเป็นพฤติกรรมเฉพาะของคอมไพเลอร์ / ล่าม) จึงควรสังเกตว่าสำหรับสตริงที่ยาวกว่า 255 อักขระคุณต้องมีคอมไพเลอร์ / ล่ามพร้อมเซลล์ 32 บิต ฉันแค่คิดว่าควรจะเพิ่มคำตอบเนื่องจากมันยังเป็นพฤติกรรมที่คอมไพเลอร์ / ล่ามเฉพาะ
Ismael Miguel

1
@ IsmaelMiguel แน่นอนว่ามีการบันทึกไว้
Sp3000

8

Java, 158 121 ไบต์

ที่บันทึกไว้มหันต์ 37 ไบต์ต้องขอบคุณเควิน Cruijssen !

interface a{static void main(String[]A){int b=0,B;for(char c:A[0].toCharArray())for(B=b+++2;--B>0;)System.out.print(c);}}

เป็นโบนัส, โปรแกรมนี้สามารถจัดการกับทุกตัวอักษร Unicode ในการดำรงอยู่รวมทั้งตัวควบคุมอยู่ที่ปลายสุดของเครื่องบินได้หลายภาษาพื้นฐาน


3
นี่มันสั้นมากสำหรับโค้ด Java
Ave

1
คุณสามารถย่อให้สั้นลง 1 ไบต์โดยแทนที่for(int C=c+1;C>0;C--)ด้วยfor(int C=c+2;--C>0;)
Kevin Cruijssen

2
หรือสั้นกว่านั้น ( 121 ไบต์ ):interface a{static void main(String[]A){int x=0,i;for(char c:A[0].toCharArray())for(i=x+++2;--i>0;)System.out.print(c);}}
Kevin Cruijssen

แค่ทำให้มันเป็นแลมบ์ดาหรือวิธีการ
Leaky Nun

2
ว้าวใช้interfaceสำหรับpublicวิธีการเริ่มต้น นั่นคือสมาร์ท
Justin

7

Perl, 16 ไบต์

s/./$&x$+[0]/ge

+1 ไบต์สำหรับ-pแฟล็ก

s/./        /    find every character
             g   globally
              e  and replace with the eval'd result of
    $&           the matched string
      x          repeated
       $+[0]     by the index of the character after the match

7

Haskell, 29 ไบต์

concat.zipWith replicate[1..]

ตัวอย่างการใช้งาน: ->concat.zipWith replicate[1..] $ "SKype""SKKyyyppppeeeee"

replicate n cสร้างสำเนา n ของ c และconcatสร้างรายการเดียวจากรายการย่อยทั้งหมด


id=<<เป็นสัมผัสที่ดี :)
sudee

ฉันแค่อยากลอง แต่การกำหนดf = id=<<zipWith replicate[1..](ในไฟล์) ทำให้เกิดข้อผิดพลาดที่น่าเกลียดคุณช่วยบอกสิ่งที่ฉันทำผิดได้ไหม
ข้อบกพร่อง

มันเป็นไปไม่ได้ที่จะกำหนดฟังก์ชั่นนี้ (ไม่มีชื่อใช่มั้ย?) ให้กับชื่ออย่างที่เราสามารถใช้เป็นฟังก์ชั่นได้? ฉันหมายความว่าถ้ามันเป็นฟังก์ชั่นแล้ว(id=<<zipWith replicate[1..] ) "SKype"ยังคงทำงานได้หรือไม่ มิฉะนั้นผมจะพิจารณาว่ามันเป็นเศษเล็กเศษน้อย โปรแกรมเต็มรูปแบบที่คุณให้ไม่ได้ "Skype การ" hardcoded
ข้อบกพร่อง

ฉันจะบอกว่าถ้าคุณไม่สามารถใช้งานได้เหมือนฟังก์ชั่นอื่น ๆ มันไม่ใช่ฟังก์ชั่น เช่น:tไม่ได้คิดid=<<zipWith replicate[1..]ว่าเป็นฟังก์ชั่น (มันเพิ่งพ่นข้อผิดพลาด) แต่(id=<<).zipWith replicate[1..]ถือเป็นฟังก์ชั่น ฉันจะบอกว่าอันแรกเป็นเพียงแค่ snipped ที่จะทำงานถ้าคุณ hardcode การป้อนข้อมูล แต่คนที่สองที่คุณเพิ่งโพสต์เป็นฟังก์ชั่น (และ:tตกลง) คุณจะเห็นด้วยกับที่?
ข้อผิดพลาด

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

7

CJam, 9 8 7 ไบต์

ขอบคุณ jimmy23013 สำหรับการบันทึก 1 ไบต์

Sl+eee~

ทดสอบที่นี่

คำอธิบาย

ใช้LobbYตัวอย่าง:

                                      Stack:
S    e# Push space.                   [" "]
l    e# Read input.                   [" " "LobbY"]
+    e# Append.                       [" LobbY"]
ee   e# Enumerate.                    [[[0 ' ] [1 'L] [2 'o] [3 'b] [4 'b] [5 'Y]]]
e~   e# Run-length decode.            ["LoobbbbbbbYYYYY"]


5

Javascript ES6, 39 ไบต์

x=>x.replace(/./g,(y,i)=>y+y.repeat(i))

ความยาวเท่ากัน แต่สนุกกว่า:

x=>x.replace(i=/./g,y=>y.repeat(i=-~i))

ตัวอย่างข้อมูลตัวอย่าง:

f= x=>x.replace(/./g,(y,i)=>y+y.repeat(i))
run.onclick=_=>output.textContent=f(input.value)
<input id="input" value="SKype">
<button id="run">Go</button>
<pre id="output"></pre>


ข้อผิดพลาดเล็กน้อยโปรแกรมไม่รองรับช่องว่างซึ่งจำเป็นสำหรับการส่ง (ตรวจสอบ OP)
Mario Ishac

@MarDev ฉันเปลี่ยนตัวอย่างเพื่อใช้<pre>แทนที่<div>ควรช่วย
Neil

1
@Neil Ah ดังนั้นการคำนวณผลลัพธ์จึงถูกต้อง แต่ HTML แสดงผลไม่ถูกต้อง ลืมว่า <div> ทำเช่นนั้น
Mario Ishac

... "แล้วเอาผลลัพธ์ออกมา"
spender

1
@spender return เป็นรูปแบบเอาต์พุตที่ถูกต้องสำหรับฟังก์ชั่น
cat

4

APL (8)

{⍵/⍨⍳⍴⍵}

เช่น:

      {⍵/⍨⍳⍴⍵} ¨  'Why' 'SKype' 'LobbY'
┌──────┬───────────────┬───────────────┐
│Whhyyy│SKKyyyppppeeeee│LoobbbbbbbYYYYY│
└──────┴───────────────┴───────────────┘

คำอธิบาย:

  • ⍴⍵: ความยาวของเวกเตอร์ที่กำหนด
  • : ตัวเลข 1..N
  • ⍵/⍨: ทำซ้ำแต่ละองค์ประกอบในN ครั้ง

4

MATLAB, 45 ไบต์

g=@(m)sort(m(m>0));@(s)s(g(hankel(1:nnz(s))))

คำอธิบาย: กุญแจคือhankelซึ่งผลิตเมทริกซ์ Hankel ของเวกเตอร์ที่กำหนด จากเมทริกซ์นี้เราสามารถแยกเวกเตอร์ของดัชนีซึ่งกำหนดลักษณะของสตริงที่ตำแหน่งในเอาต์พุต เช่นhankel(1:4)สร้างเมทริกซ์ต่อไปนี้:

 1  2  3  4
 2  3  4  0
 3  4  0  0
 4  0  0  0

จากเมทริกซ์นี้เราสามารถลบเวกเตอร์1,2,2,3,3,3,4,4,4,4,4ได้ เวกเตอร์นี้อนุญาตให้เราแสดงผลอักขระตัวแรกของสตริงหนึ่งครั้งตัวที่สองสองครั้งฯลฯ


4

NARS2000 , 6 ตัวอักษร = 12 ไบต์

⍳∘⍴/⊙⊢

⍳∘⍴การแจงนับของอาร์กิวเมนต์ ... (ดัชนีของความยาว) จะ
/⊙ทำซ้ำองค์ประกอบของ ...
อาร์กิวเมนต์ที่ไม่ได้แก้ไข


เชื่อมโยงไปยังล่ามหรือไม่
แมว

@cat ดูการแก้ไข (ในส่วนหัว)
อดัม

@cat การแก้ไขของคุณคืออะไร?
59

เหมือนกับตัวละครของคุณเพราะฉันทำมันด้วยตัวเองและการแก้ไขของฉันใช้เวลา 10 นาทีในการส่ง
แมว

นอกจากนี้เพจรหัสนี้มีขนาด 6 ไบต์หรือไม่
แมว

3

PowerShell v2 +, 36 ไบต์

-join([char[]]$args[0]|%{"$_"*++$i})

จะเข้า$args[0]อย่างชัดเจนดุจเป็นอาร์เรย์ส่งที่เป็นห่วงchar |%{...}การวนซ้ำแต่ละครั้งเราใช้ตัวอักษร / อักขระปัจจุบัน"$_"และใช้*โอเปอเรเตอร์ที่โอเวอร์โหลดเพื่อต่อสตริง$iเวลาที่เพิ่มขึ้นล่วงหน้า ผลลัพธ์ของการวนซ้ำแต่ละครั้งจะถูกห่อหุ้มด้วย parens เพื่อสร้างอาร์เรย์และจากนั้น-joinรวมเข้าด้วยกันเพื่อสร้างสตริง สตริงนั้นจะถูกทิ้งไว้บนไปป์ไลน์และเอาท์พุทก็เป็นนัย

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 Why
Whhyyy

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 SKype
SKKyyyppppeeeee

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 LobbY
LoobbbbbbbYYYYY

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 'a b'
a  bbb

3

Brachylogขนาด 13 ไบต์

:ImC,0:Ie,Cw\

สิ่งนี้จะพิมพ์ผลลัพธ์ไปที่ STDOUTนี้จะพิมพ์ผลให้

คำอธิบาย

นี่เป็นตัวอย่างที่ดีของการใช้ประโยชน์ย้อนรอยไปวนซ้ำ

:ImC            C is the Ith character of the Input
    ,
     0:Ie       Unify an implicit variable with an integer between 0 and I
         ,
          Cw    Write C to STDOUT
            \   False, trigger backtracking. It will go back to 0:Ie and unify the implicit
                variable with another integer, until all integers were used. After that, it
                will backtrack to :ImC and unify I and C with the next character.

3

MATLAB, 23 ไบต์

@(x)repelem(x,1:nnz(x))

สร้างฟังก์ชั่นที่ไม่ระบุชื่อansที่สามารถเรียกได้ว่าใช้งานans('stringtoelacticize')


คุณใช้เวอร์ชั่นอะไร ไม่พบrepelemในรุ่น (ค่อนข้างเก่า) ของฉัน = (
ข้อผิดพลาด

1
@flawr repelemถูกนำมาใช้ใน R2015a
Luis Mendo เมื่อ


3

Perl 6 ,  22 20  19 ไบต์

{S:g/(.)/{$0 x$/.to}/}
{S:g[(.)]=$0 x$/.to}
{[~] .comb Zx 1..*}

คำอธิบาย:

{          # implicit parameter $_
  [~]      # string concatenate the following list
    .comb  # the NFG characters from $_
    Z[x]   # zip combined using the string repetition operator
    1 .. * # 1 to infinity
}

3

VBA, 75 ไบต์

Function e(s):For a=1 To Len(s):e=e &String(a,Mid(s,a,1)):Next:End Function

Call as e.g. a user function in a spreadsheet.

=e(A1)

┌─────────┬───────────────┐
│   SKype │SKKyyyppppeeeee│
└─────────┴───────────────┘

It truncates if you feed it its own output a few times :-).


2
Welcome to the site! =)
DJMcMayhem


3

Javascript ES6, 42 41 bytes

s=>[,...s].map((e,i)=>e.repeat(i)).join``

Example runs:

f=s=>[,...s].map((e,i)=>e.repeat(i)).join``

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"

Same length: s=>[...s].reduce((a,b,i)=>a+b.repeat(i+1))
Bassdrop Cumberwubwubwub

2
-1 byte: s=>[,...s].map((e,i)=>e.repeat(i)).join``
nderscore

@nderscore Aha, thats clever, thanks!
Dendrobium

3

Retina, 22 bytes

Byte count assumes ISO 8859-1 encoding.

.
$&$.`$*·
+`(.)·
$1$1

Try it online!

Basically, we insert the right amount of · as placeholders between the characters (since these extended ASCII characters can't appear in the input), then fill them up with the adjacent character in the second stage.


3

R, 83 50 bytes

-23 Thanks to Giuseppe, though he used essentially an entire new method altogether

function(s)intToUtf8(rep(utf8ToInt(s),1:nchar(s)))

My original post:

function(s){r="";for(i in 1:nchar(s))r=paste0(r,strrep(el(strsplit(s,""))[i],i));r}

Try it online!

I feel like there's definitely a better way to do this, but with my new knowledge of a few functions in R, this is my approach.


1
Not a golfing tip, but your code link output was messed up. Here
Robert S.

Ah, I see. I'm new to TIO, so I didn't quite understand the header/footer portions. Thank You!
Sumner18


1
Very nice! However, using rep and the argument collapse="" to paste is shorter, and utf8ToInt is shorter still! TIO
Giuseppe

2

Actually, 7 bytes

' +ñ♂πΣ

Try it online!

Explanation:

' +ñ♂πΣ
' +      prepend a space
   ñ     enumerate ("abc" -> [[0, 'a'], [1, 'b'], [2, 'c']])
    ♂π   map: for each character, repeat it n times
      Σ  concatenate


2

Python 3, 48 47 bytes

Thanks to mego for saving a byte with the -~i trick.

lambda s:''.join(c*-~i for i,c in enumerate(s))

This is mostly self-explanatory. One thing for those not versed in Python: The * operator is overloaded to act like Perl's x operator, repeating its string argument the number of times specified by its numeric argument. E.g. 'foo' * 3 == 'foofoofoo'


c*-~i is shorter than c*(i+1).
Mego

2

C#, 81 Bytes

void f(string s){for(int i=0;i<s.Length;i++)Console.Write(new String(s[i],i+1));}

you can save 1 byte by changing to a foreach loop, e.g. foreach(var a in s)Console.Write(new C(a,1*i++));
Abbath

but if its a foreach we don't have the i variable so you'd need to declare it.
ScifiDeath

It seems you're missing a using System or a System. in front of the Console.
Martin Ender

@ScifiDeath That's true - but the end result is still one byte shorter. Sorry for omitting it and causing confusion int i=1;
Abbath

Also one byte shorter using Linq: void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}. The need for a (unused) return value is ugly though. Edit: just found similar snippets in other answers further back.
linac

2

MATL, 5 bytes

tn:Y"

Try it Online

Explanation

    % Implictly grab input as a string
tn  % Duplicate and compute the length (N)
:   % Create an array from [1...N]
Y"  % Perform run-length decoding to elacticize the string
    % Implicitly display the result



2

TSQL, 97 bytes

Golfed:

DECLARE @x varchar(max)='Lobby'
DECLARE @ int=LEN(@x)WHILE @>0SELECT
@x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),@-=1PRINT @x

Ungolfed:

DECLARE @x varchar(max)='Lobby'

DECLARE @ int=LEN(@x)
WHILE @>0
  SELECT 
    @x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),
    @-=1

PRINT @x

Try it online

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