การยืดคำ


32

เขียนโปรแกรมหรือฟังก์ชั่นที่ทำซ้ำตัวอักษรในคำเพื่อให้ตัวอักษรที่ซ้ำกันทั้งหมดที่จัดเรียงจากซ้ายไปขวาในคำว่าจะเป็นอาร์เรย์อินพุต

ตัวอย่างเช่น:

input: chameleon, [c,a,l,n]
output: cchaamelleonn

อินพุต

  • คำเริ่มต้น (เช่นchameleon)
  • อาเรย์ของอักขระ ( [c,a,l,n]) หรือสตริงที่ใช้แทนอาเรย์ ( caln) หรือบางอย่างที่คล้ายกัน
  • อินพุตสามารถผ่านพารามิเตอร์ฟังก์ชัน STDIN หรือภาษาที่เทียบเท่ากัน
  • อินพุตทั้งหมดจะเป็นตัวอักษรพิมพ์เล็ก (az)

เอาท์พุต

  • คำที่เปลี่ยนไป

  • หากมีหลายวิธีสามารถพิมพ์ออกมาได้

    input: banana [n,a]  
    possible outputs: bannaana, banannaa
                         |-|---------|-|--->[n,a]
    
  • คุณอาจคิดว่าคำที่ป้อน (ไม่จำเป็นต้องเป็นอาร์เรย์) จะมีตัวอักษรในอาร์เรย์ (ตามลำดับ)

  • คุณอาจจะสมมติว่าอินพุตนั้นไม่มีตัวอักษรต่อเนื่องกันเหมือนกัน (ไม่ใช่แอปเปิ้ล, เกินบรรยาย, เขียว, แก้ว, ประตู ... )

ตัวอย่าง

input: abcdefghij, [a,b,c]
output: aabbccdefghij

input: lizard, [i,a,r,d]
output: liizaarrdd

input: coconut, [c,o]
ouput: ccooconut or coccoonut or ccocoonut

input: onomatopoeia, [o,o,a,o,o]
output: oonoomaatoopooeia

input: onomatopoeia, [o,a,o]
output: oonomaatoopoeia or onoomaatoopoeia or oonomaatopooeia etc.

โปรแกรมที่สั้นที่สุดชนะ!

ลีดเดอร์บอร์ด (ขอบคุณ Martin Büttnerสำหรับตัวอย่าง)


@AlexA เพียงหนึ่งตัวอย่างเพราะมิฉะนั้นอาร์เรย์ที่เกิดขึ้นจากตัวอักษรที่ซ้ำกันจะมากกว่า[c,o,c,o] [c,o]
ยืด Maniac

ใช่ขอโทษที่อ่านมันอีกครั้งที่ชัดเจน ขอบคุณ
อเล็กซ์ A.

2
การเห็นสิ่งนี้มีคำตอบค่อนข้างมากและในภาษาเดียวกันคุณจะสนใจเพิ่มข้อมูลลีดเดอร์บอร์ดหรือไม่ ถ้าเป็นเช่นนั้นฉันยินดีที่จะแก้ไขและแก้ไขคำตอบที่ไม่ใช้รูปแบบส่วนหัวที่ต้องการ
Martin Ender

@ MartinBüttnerฉันลืมไปแล้ว! ที่เพิ่ม ฉันต้องเปลี่ยน#answer-listและ#language-listความกว้างเป็น50%เพื่อหลีกเลี่ยงการซ้อนคอลัมน์ในตัวอย่างของคุณ
ยืด Maniac

1
ความกระจ่าง (ดูbash+ sedคำตอบของฉัน): มันผิดกฎหมายหรือไม่สำหรับbanana, na=> baannana? ฉันเชื่อว่า "คุณอาจสันนิษฐานว่าอินพุตทั้งหมดจะมีตัวอักษรในอาร์เรย์ (ตามลำดับ)" มีไว้เพื่อให้อนุญาตแต่ไม่จำเป็นต้องมีคำตอบสำหรับการประมวลผลรายการทั้งสองเรียงตามลำดับ แต่ @manatwork ตีความแตกต่างกัน
Toby Speight

คำตอบ:


5

Pyth, 14 ไบต์

s+L&@d<Q1.(QZz

สาธิต.

สไตล์อินพุต:

banana
["b","a","n","a"]

คำอธิบาย:

s+L&@d<Q1.(Q0z
                  Implicit: z = input(); Q = eval(input())
 +L          z    Map (lambda d) over z, adding the result to each character.
    @d<Q1         Intersection of d with Q[:1], up to the first element of Q.
   &              Logical and - if the first arg is truthy, evaluate and
                  return the second arg, otherwise return first arg.
         .(Q0     Q.pop(0)
                  The addition will either be the empty string, for the empty
                  intersection, or the character that was Q[0] otherwise.

s                 Concatenate and print.

43

Brainfuck, 46 45 (63 ที่มีอักขระที่พิมพ์ได้ในอินพุต)

เข้ากันได้กับbffของ Alex Pankratov (ล่ามสมองที่ใช้กับ SPOJ และ ideone) และBFIของ Thomas Cort (ใช้กับ Anarchy Golf)

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

การสาธิตเกี่ยวกับ ideone

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

เราสามารถบันทึกไบต์โดยใช้\x00เป็นตัวคั่นแทนแท็บ:

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

22
ความรู้สึกนั้นเมื่อ BF สั้นกว่ารหัสไพ ธ อนของฉัน .. :(
Kade

6
ฉันมักจะไม่สนใจ Brainfuck แต่มันยอดเยี่ยมมาก!
Dennis

นี่คือสิ่งที่สวยงาม
Joshpbarron

14

CJam, 15 ไบต์

rr{_C#)/(C@s}fC

ลองออนไลน์

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

rr              e# Read two whitespace-separated tokens from STDIN.
  {         }fC e# For each character C in the second string.
   _            e#   Duplicate the first string.
    C#          e#   Compute the index of the character in the string.
      )/        e#   Add 1 and split the string in slice of that size.
        (       e#   Shift out the first slice.
         C      e#   Push the character.
          @     e#   Rotate the remainder of the string in top of the stack.
           s    e#   Stringify (concatenate the slices).

มันเป็นการต่อสู้ของ CJams! ทั้งคุณและ Sp มีคำตอบที่ 15 ไบต์ CJam และ 15 นั้นสั้นที่สุด :)
อเล็กซ์ A.

3
@AlexA แค่รอ Pyth คุณแค่รอ ...
Sp3000

2
ดูเหมือนคุณจะเรียน Pyth มากขึ้น ;)
Alex A.

12

C, 62 ไบต์

f(char*s,char*c){while(*s-*c||putchar(*c++),*s)putchar(*s++);}

นี่เป็นความสามารถในการแข่งขันที่น่าประหลาดใจ

เรากำหนดฟังก์ชันf(char*, char*)ที่ใช้สตริงเป็นอินพุตแรกและอาร์เรย์ของอักขระเพื่อทำซ้ำเป็นอินพุตที่สอง

รหัสการทดสอบบางอย่าง:

int main (int argc, char** argv) {
    f("onomatopeia", "oao");
    return 0;
}

สิ่งที่พิมพ์:

oonomaatoopeia

ลองออนไลน์ !

หากเป็นที่ยอมรับได้ที่จะส่งมาโครแทนที่จะเป็นฟังก์ชั่นต่อไปนี้#define g(s,c)เป็นเพียง58 ไบต์แต่ต้องการsและcเป็นพอยน์เตอร์จริง:

#define g(s,c)while(*s-*c||putchar(*c++),*s)putchar(*s++);

1
ขอขอบคุณที่ทำให้ฉันมองขึ้นประกอบจุลภาค นั่นมีประโยชน์!
Oliphaunt - คืนสถานะโมนิก้า

11

CJam, 15 ไบต์

rr{:X/(XX+@X*}/

ทางเลือกใหม่ของ CJam ลองออนไลน์

คำอธิบาย

สำหรับตัวละครแต่ละตัวในสายอักขระที่สองเราทำสองสิ่ง

  1. แยกส่วนต่อท้ายปัจจุบันของสตริงด้วยอักขระเช่น "beeper" "e" -> ["b" "" "p" "r"]

  2. Uncons สายแรกในอาร์เรย์ใส่สองของตัวละครแล้ว Rejoin "b" "ee" "eper"ส่วนที่เหลือของอาร์เรย์ที่มีตัวอักษรเช่น สตริงสุดท้ายคือส่วนต่อท้ายใหม่


9

เรติน่า 33 ไบต์

ข้อมูลเพิ่มเติมเกี่ยวกับจอประสาทตา

+`(?=(.))(((.)(?<!\4.))+\n)\1
$1$2

สิ่งนี้คาดว่าทั้งสองสายบน STDIN คั่นด้วยบรรทัดใหม่

เพื่อวัตถุประสงค์ในการนับแต่ละบรรทัดจะเข้าไปในไฟล์ที่แยกต่างหาก\nควรถูกแทนที่ด้วยอักขระบรรทัดใหม่จริง (0x0A) หากคุณต้องการทดสอบสิ่งนี้จริง ๆ จะสะดวกกว่าที่จะวางสิ่งนี้ไว้ในไฟล์เดียวที่\nยังคงอยู่เหมือนเดิมจากนั้นให้เรียกใช้ Retina ด้วย-sตัวเลือกก่อนส่งไฟล์

คำอธิบาย

(ล้าสมัย ... ฉันจัดการเพื่อกำจัดเครื่องหมาย ... ฉันจะอัปเดตในภายหลัง)

แต่ละคู่ของบรรทัดคือการทดแทน regex (บรรทัดแรกของรูปแบบ, บรรทัดที่สองเป็นการทดแทน)

^
#

สิ่งนี้ทำให้#เครื่องหมายเป็นจุดเริ่มต้นของสายป้อน

+`#(.*?(.))(.*\n)\2
$1$2#$3

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

#
<empty>

ในที่สุดเราก็ทำความสะอาดสายโดยการวางเครื่องหมาย


2
ฉันคิดว่าเรตินาจะมีทางออกที่ดีและฉันพูดถูกเพราะคุณพบ นอกจากนี้เมื่อฉันอ่านคำอธิบายของคุณเป็นครั้งแรกฉันอ่านตอนท้ายว่า "เราล้างข้อมูลด้วยการวางไมค์ "
mbomb007

@ mbomb007 ฉันหวังว่าจะกำจัด "mic" โดยการทำซ้ำตัวอักษรแต่ละตัวที่ไม่ซ้ำกันหลังจากพวกเขา แต่ฉันไม่สามารถทำได้ในเวลาน้อยกว่า 33 ไบต์ (มีเวอร์ชัน 28 ไบต์ที่แตกหักในประวัติการแก้ไข)
Martin Ender

@ mbomb007 FYI ฉันจัดการเพื่อลบเครื่องหมายตอนนี้ แต่จำนวนไบต์ยังคงเหมือนเดิม เรื่องนี้ยังดูเป็นกอล์ฟ
Martin Ender

นอกจากนี้ฉันเพิ่งรู้ว่า Retina ไม่มีหน้าในesolangs.org
mbomb007

@ mbomb007 ใช่ฉันรู้แล้ว ฉันจะเพิ่มอีกหนึ่งรายการหลังจากใช้งานคุณสมบัติเด่นที่สำคัญบางประการ
Martin Ender

8

Python 61

def f(s,l):b=s[:1]==l[:1];return s and-~b*s[0]+f(s[1:],l[b:])

ทางออกแบบโลภซ้ำซาก บันทึกbว่าตัวอักษรตัวแรกของสตริงsเป็นตัวอักษรตัวแรกของสตริงlตัวอักษรที่สองหรือไม่ ถ้าเป็นเช่นนั้นจะใช้เวลาหนึ่งของตัวอักษรและย่อหน้าให้โทร recursive กับส่วนที่เหลือของการลบองค์ประกอบแรกจากs lถ้าไม่ได้bทำเช่นเดียวกัน lแต่ไม่ได้เป็นสองเท่าของตัวอักษรและไม่ลบออกจาก

รหัสจะตรวจสอบs[:1]==l[:1]แทนs[0]==l[0]เพื่อหลีกเลี่ยงข้อผิดพลาดในการทำดัชนีนอกขอบเขตเมื่อsหรือlว่างเปล่า


6

Prolog, 95 83 79 56 ไบต์

d([A|S],H):-put(A),H=[A|T],put(A),d(S,T);d(S,H).
d(_,_).

ตัวอย่าง:

d(`chameleon`,`caln`).

ผลตอบแทน

cchaamelleonn

แก้ไข: บันทึกแล้ว 4 ไบต์ขอบคุณ Oliphaunt

Edit2: บันทึกไว้ 20 ไบต์ใช้เลิกSWI-เปิดฉากกริยาแทนput/1 writefที่บันทึกไว้หนึ่งไบต์เปลี่ยนกริยาสิ้นสุดการเรียกซ้ำไปd([],_). d(_,_).จะไม่ทำงานหากการเรียงลำดับของคำจำกัดความทั้งสองdนั้นสลับกัน แต่เราไม่สนใจเรื่องนั้นในรหัส golfed บันทึกอีก 2 ไบต์เพื่อลบเครื่องหมายวงเล็บออกH=[A|T],put(A),d(S,T)


1
ฉันไม่แน่ใจจริงๆว่าทำไมสิ่งนี้ถึงได้ลงคะแนน อาจเพิ่มคำอธิบายลงในรหัสของคุณใช่ไหม
Alex A.

1
H=[A|T]คุณสามารถบันทึกสี่ไบต์โดยรวมโดยปริยาย: นอกจากนี้ทำไมไม่ทำให้สามารถอ่านได้อีกเล็กน้อยโดยการแทนที่ช่องว่างด้วยการขึ้นบรรทัดใหม่
Oliphaunt - คืนสถานะโมนิก้า

@Oliphaunt ขอบคุณสำหรับคำแนะนำฉันไม่เห็นการเพิ่มประสิทธิภาพเล็กน้อยนี้หลังจากฉันแก้ไขโค้ดของฉันเพื่อใช้ประโยค H = [A | T]
ทำให้เสียชีวิต

5

Python 2, 83 74 72 65 ไบต์

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

แก้ไข 1: บันทึก 9 ไบต์โดยใช้การจัดการสตริงแทนที่จะเป็นป๊อป ()

แก้ไข 2: บันทึก 2 ไบต์โดยใช้-~เพื่อเพิ่มขึ้นg1

แก้ไข 3: บันทึกแล้ว 7 ไบต์โดยใช้y[:1]เล่ห์เหลี่ยมขอบคุณ xnor สำหรับสิ่งนี้!

def f(x,y,s=''):
 for c in x:g=y[:1]==c;s+=c*-~g;y=y[g:]
 print s

ตรวจสอบที่นี่

จัดรูปแบบและอธิบายอย่างเหมาะสม:

def f(x,y,s=''):           # Defining a function that takes our input,
                           # plus holds a variable we'll append to.
  for c in x:              # For every character in 'x', do the following:
    g = y[:1] == c         # Get the first element from the second string, will
                           # return an empty string if there's nothing left.
                           # Thanks to xnor for this trick!
    s += c * -~g           # Since int(g) would either evaluate to 0 or 1, we
                           # use the -~ method of incrementing g to multiply
                           # the character by 1 or 2 and append it to 's'
    y = y[g:]              # Again, since int(g) would either evaluate to 0
                           # or 1, use that to cut the first value off y, or
                           # keep it if the characters didn't match.
  print s                  # Print the string 's' we've been appending to.

"คุณอาจสมมติว่าอินพุตทั้งหมดจะมีตัวอักษรในอาร์เรย์ (ตามลำดับ)" นั่นน่าจะช่วยให้คุณประหยัดได้ไม่กี่ไบต์
mbomb007

2
y[:1]คุณจะได้รับองค์ประกอบแรกจากสตริงอาจจะเป็นที่ว่างเปล่าเป็น
xnor

ตอนนี้ฉันรู้แล้วว่าคุณไม่สามารถประหยัดได้มากเท่าที่ฉันคิดเพราะวิธีที่คุณทำด้วยy=y[g:]ดังนั้น "ค่อนข้างน้อย" ค่อนข้างเป็นการพูดเกินจริง
mbomb007

@ Vioz- y[:1]==cฉันคิด มันใช้งานได้หรือไม่
xnor

@ xnor ใช่มันเป็นเช่นนั้นถ้าฉันใช้ตัวอักษรที่ต้องเปลี่ยนแทน ขอบคุณ!
Kade

5

Excel VBA ขนาด 110 ไบต์

นี่เป็นรายการแรกของฉันใน CodeGolf ดังนั้นฉันหวังว่ามันจะโอเค

คุณป้อนคำที่ป้อนใน A1 จากนั้นตัวอักษรที่จะถูกแทนที่ใน B1 และคำที่เป็นผลลัพธ์จะปรากฏในกล่องข้อความ

w = Cells(1, 1)
l = Cells(2, 1)
For i = 1 To Len(w)
x = Left(w, 1)
R = R + x
If InStr(l, x) > 0 Then
R = R + x
End If
w = Right(w, Len(w) - 1)
Next
MsgBox R

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

@QPaysTaxes ขอบคุณสำหรับการแก้ไขของคุณ ฉันกดย้อนกลับเพื่อดูว่ามันจะทำอะไร ไม่แน่ใจว่านั่นทำให้คุณเสียคะแนนหรืออะไรที่จะแก้ไข?
Wightboy

ไม่ฉันยังคงมี +2 แม้ว่าฉันจะสับสนเล็กน้อย คุณอาจต้องการย้อนกลับอีกครั้ง อย่างน้อยตามคนระดับสูงสามคนมันเป็นการแก้ไขที่ดี
คดีกองทุนของโมนิกา

@QPaysTaxes ฉันเห็นด้วยฉันชอบการแก้ไข คิดว่าฉันย้อนกลับไปหนึ่งครั้งเกินไป
Wightboy

ฉันไม่สามารถบอกได้ มือถือไม่ได้แสดงสิ่งต่าง ๆ อย่างแน่นอน ในที่สุดสิ่งที่สำคัญคือรหัสไม่ใช่การจัดรูปแบบ
คดีกองทุนของโมนิกา

4

Haskell, 42 ไบต์

(a:b)#e@(c:d)|a==c=a:a:b#d|1<2=a:b#e
a#_=a

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

*Main> "coconut" # "co"
"ccooconut"
*Main> "lizard" # "iard"
"liizaarrdd"
*Main> "onomatopoeia" # "ooaoo"
"oonoomaatoopooeia"

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

หากหนึ่งสตริงว่างเปล่าผลลัพธ์จะเป็นสตริงแรก อื่น: หากอักขระตัวแรกของสตริงตรงกันให้ใช้สองครั้งและผนวกการเรียกซ้ำด้วยการต่อท้ายของสตริง หากอักขระไม่ตรงกันให้นำอักขระตัวแรกของสตริงแรกและต่อท้ายการเรียกซ้ำโดยใช้หางของสตริงแรกและสตริงที่สองเหมือนกัน


4

Pyth, 18 17 ไบต์

sm?+d.(QZqd&QhQdz

การสาธิตสด

บันทึกแล้ว 1 ไบต์ขอบคุณ @Jakube

คำอธิบาย:

                z  Read the first line of input.
 m                 For each character in that line
  ?      qd&QhQ    If (?) the first char of the stretch list (`&QhQ`) 
                   and the current character are equal,
   +d.(QZ          Then double the current character and pop an element off
                   the stretch list.
               d   Otherwise, just return the same character.
s                  Join all the characters together.

รุ่นเดิม:

jkm?+d.(QZqd&QhQdz

การสาธิตสดสำหรับต้นฉบับ


4

Javascript, 47 ไบต์

(a,b)=>a.replace(/./g,d=>b[0]!=d?d:d+b.shift())

ใช้ประโยชน์จากคุณสมบัติบางอย่างของ ES6


1
การทำงานนี้อย่างถูกต้องสำหรับonomatopoeia, oao?
Alex A.

1
@AlexA ผลลัพธ์: "oonoomaatoopooeiaa" อ่าฉันเข้าใจ จะแก้ไข
ธัญพืช

คงที่ฉันคิดว่า เพิ่มตัวละครมากมาย :(
ธัญพืช

แทนที่จะb.indexOf(d)==0ลองใช้~b.search(d)
อิสมาเอลมิเกล

@IsmaelMiguel searchใช้ได้กับสตริงเท่านั้น ต้องเปลี่ยน b เป็นอาร์เรย์
ธัญพืช

3

Pyth, 16 ไบต์

u|pH<GJxGH>GJwz

ลองใช้งานออนไลน์: การสาธิต

อันนี้ค่อนข้างแฮ็ค ภาษาสแต็กอาจมีข้อได้เปรียบที่นี่

คำอธิบาย

                   implicit: z = 1st input line, w = 2nd
u             wz   reduce, start with G = z
                   for each H in w, update G to:
        xGH          index of H in G
       h             +1
      J              store in J
    <GJ              substring: G[:J] (everything before index J)
  pH                 print substring then H (without newlines)
 |                   afterwards (actually or, but p always returns 0)
           >GJ       substring: G[J:] (everything from index J to end)
                     update G with ^
                   afterwards implicitly print the remainder G

@isaacg ช่วยด้วย? จะต้องมีบางสิ่งบางอย่างที่สั้นกว่า ...
Jakube

และสง่างามยิ่งขึ้น ;-)
Jakube

1
รับใน 14 - 1 น้อยกว่า CJam เป็นสถานที่ที่ดีที่สุด
isaacg

3

JavaScript ES6, 47 ไบต์

(w,s)=>w.replace(/./g,c=>c==s[0]?c+s.shift():c)

สมมติว่าsเป็นอาร์เรย์["c","a","l","n"]


2

> <> (ปลา) , 68 34 ไบต์

ri&:o&:&=\
l&io& /!?/
?!;20.\l!\

คุณสามารถเรียกใช้งานได้ที่http://fishlanguage.com/playgroundอินพุตสตริงเป็นสแต็กเริ่มต้น (ที่มี "เครื่องหมายเช่น" chameleon ") และอาร์เรย์ของตัวอักษรพิเศษเป็นสแต็กอินพุต (ไม่มี" เครื่องหมายเช่น caln)

อย่าลืมกดปุ่ม Give เพื่อเริ่มต้นกองซ้อนอินพุต

r       reverses the stack
i&      reads in the first input, and stores it in the register
:o      copies the top of the stack, and outputs the top of the stack
&:&     puts register value on stack, copies it, then puts top stack into register
=       checks if the top two values are equal, if yes push 1, else push 0
?       if top value is non-zero, execute next instruction
!       skips the following instruction (unless it was skipped by the previous ?)

If yes, then we proceed on the same line
&o      puts register value on stack, and outputs it
i&      reads in the first input, and stores it in the register
l       puts length of stack on stack, then proceed to lowest line

If no, we go directly to the last line
l       As above.
?!;     If zero value (from length), then end execution
20.     Push 2 and 0 onto stack, then pop top two values, and go to that position (2,0) (i.e. next instruction is at (3,0))

แก้ไข: ลดลงครึ่งหนึ่ง! :)


2

R, 119

ตามคำตอบของ @ Alex สิ่งนี้สั้นลงสองไบต์:

function(s,a){message(unlist(lapply(strsplit(s,"")[[1]],function(x){if(length(a)&x==a[1]){a<<-a[-1];c(x,x)}else x})))}

Ungolfed:

function(s, a) {
  message(                             # Prints to output
    unlist(                            # Flattens list to vector
      lapply(                          # R's version of map
        strsplit(s,"")[[1]],           # Split vector to characters
        function (x) {
          if (length(a) & x == a[1]) { # If there are still elements in a
                                       # and there's a match
            a <<- a[-1]                # Modify a
            c(x, x)                    # And return the repeated character
          } else x                     # Otherwise just return it
        }
      )
    )
  )
}

2

Perl, 73 62 59 56

วิธีการใหม่ทั้งหมดให้ผลลัพธ์ที่ดีกว่ามาก แต่ถึงกระนั้นฉันเดิมพันมันอาจจะสั้นกว่า

โทรf('coconut', ['c','o'])มา

sub f{($s,$a)=@_;$s=~s/(.*?)($_)/\U$1$2$2/ for@$a;lc$s}

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

แก้ไข: โกนคู่ของตัวละครมากขึ้นโดยการกำจัดและshiftpop


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

sub f{join '',map{shift @{$_[0]}if s/($_[0][0])/$1$1/;$_}split //,shift}

เวอร์ชันใหม่ไม่เคารพลำดับตัวอักษรอีกต่อไป (BTW“ foreachคำหลักนั้นเป็นคำพ้องความหมายสำหรับforคำหลักดังนั้นคุณจึงสามารถใช้คำใดคำหนึ่งได้” - Foreach Loops )
จัดการเอกสาร

@ การผลิตที่ควรทำ และขอบคุณสำหรับforคำใบ้ ตอนนี้มันสั้นกว่าจริง
jja

2

ทับทิม, 52 47 ไบต์

วิธีการแก้:

f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}

ตัวอย่าง:

p f.call('banana', ['n','a']) # => "bannaana"

คำอธิบาย:

รูปแบบ Proc ของเมธอดที่รับค่าสตริงเป็นอาร์กิวเมนต์แรกและอาร์เรย์ของอักขระเป็นอาร์กิวเมนต์ที่สอง แม็พบล็อกกับอาร์เรย์ของอักขระในอาร์กิวเมนต์สตริงซึ่งตรวจสอบอักขระแต่ละตัวกับองค์ประกอบแรกของอาร์เรย์เปรียบเทียบและหากมีการจับคู่ให้ลบองค์ประกอบแรกของอาร์เรย์เปรียบเทียบแล้วเพิ่มเป็นสองเท่า


ปรับปรุง

f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}


s,aคุณสามารถข้ามวงเล็บรอบพารามิเตอร์ และเทียบเท่ากับ*'' .joinนั่นคือ 5 ไบต์ที่บันทึกไว้ แต่ฉันยังคงเอาชนะคุณทีละคน (ตอนนี้): D
daniero

2

Perl, 51 ไบต์

$s=<>;$s=~s=^.*$_=$_=,$,.=$&for split"",<>;print$,;

อินพุตถูกจัดเตรียมผ่าน STDIN อินพุตแรกคือคำเริ่มต้น (เช่นchameleon) อินพุตที่สองคือตัวอักษรเป็นสตริงเดี่ยว (เช่นcaln)

ข้างต้นเป็นเพียงวิธี obfuscated (อ่าน "prettier") ในการทำต่อไปนี้:

$word = <>;
for $letter(split "", <>) {
   $word =~ s/^.*$letter/$letter/;
   $result .= $&;
}
print $result;

เมื่อเราอ่านจดหมายแต่ละฉบับเราจะเปลี่ยนจากคำเริ่มต้นเป็นตัวอักษรในคำต้นฉบับด้วยตัวอักษรใหม่และผนวกการแข่งขัน (เก็บไว้$&) เข้ากับผลลัพธ์ของเรา เนื่องจากการแข่งขันมีตัวอักษรและแทนที่ด้วยตัวอักษรตัวอักษรแต่ละตัวจึงปรากฏขึ้นสองครั้ง

เนื่องจาก STDIN ผนวกอักขระบรรทัดใหม่เข้ากับอินพุตทั้งสองของเราเรารับประกันว่าจะจับภาพเศษที่เหลือของคำเต็มในการแข่งขันครั้งสุดท้ายนั่นคืออักขระบรรทัดใหม่


2

REGXY ขนาด 24 ไบต์

ใช้REGXYซึ่งเป็นภาษาที่ใช้ในการทดแทน regex การป้อนข้อมูลจะถือว่าเป็นคำเริ่มต้นและอาร์เรย์การเว้นวรรค (เช่น "chameleon caln")

/(.)(.* )\1| /\1\1\2/
//

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

หากช่วยได้ขั้นตอนการปฏิบัติซ้ำ ๆ จะเป็นดังนี้:

chameleon caln
cchameleon aln
cchaameleon ln
cchaameleonn n
cchaameleonn  (with trailing space)
cchaameleonn

โปรแกรมรวบรวมและดำเนินการอย่างถูกต้องกับล่ามตัวอย่างในลิงค์ด้านบน แต่วิธีการแก้ปัญหาอาจจะหน้าด้านเล็กน้อยเนื่องจากต้องอาศัยข้อสันนิษฐานในความคลุมเครือของข้อกำหนดภาษา ข้อมูลจำเพาะระบุว่าโทเค็นแรกในแต่ละบรรทัด (ก่อนหน้า /) ทำหน้าที่เป็นเลเบล แต่ข้อสันนิษฐานคือตัวชี้เลเบลตัวชี้จะชี้กลับไปที่คำสั่งแรกในไฟล์ที่มีเลเบล null (หรือกล่าวอีกนัยหนึ่งคือ นั่นคือ 'โมฆะ' เป็นป้ายกำกับที่ถูกต้อง) วิธีแก้ปัญหาหน้าด้านที่น้อยกว่าคือ:

a/(.)(.* )\1| /\1\1\2/
b//a

ซึ่งมีจำนวนถึง 27 ไบต์


1

JavaScript ES6, 72 ไบต์

(s,a,i=0,b=[...s])=>a.map(l=>b.splice(i=b.indexOf(l,i+2),0,l))&&b.join``

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อซึ่งใช้พารามิเตอร์ 2 ตัวคือคำเริ่มต้นเป็นสตริงและอักขระที่ยืดออกเป็นอาร์เรย์ โค้ดที่ไม่ได้รับการรักษาที่ใช้ ES5 และทดสอบ UI ด้านล่าง

f=function(s,a){
  i=0
  b=s.split('')
  a.map(function(l){
    i=b.indexOf(l,i+2)
    b.splice(i,0,l)
  })
  return b.join('')
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('s').value,document.getElementById('a').value.split(''))};document.getElementById('run').onclick=run;run()
<label>Starting word: <input type="text" id="s" value="onomatopoeia" /></label><br />
<label>Leters to duplicate: <input type="text" id="a" value="oao"/></label><br />
<button id="run">Run</button><br />Output: <output id="output"></output>


1

Python 2, 77

def f(x,y,b=''):
 for i in x:
    try:
     if i==y[0]:i=y.pop(0)*2
    except:0
    b+=i
 print b

โทรเป็น:

f('onomatopoeia',['o','a','o'])

ฉันอาจมีจำนวนไบต์ผิดอย่างน่ากลัว ... ใช้ส่วนผสมของช่องว่างและแท็บ


1

อาร์เอส, 39 ไบต์

ข้อมูลเพิ่มเติมเกี่ยวกับอาร์เอส

มีคำตอบของ Retina อยู่แล้ว แต่ฉันคิดว่าอันนี้ใช้วิธีที่แตกต่างออกไปเล็กน้อย พวกเขายังสร้างแยกต่างหาก: เมื่อฉันเริ่มทำงานกับสิ่งนี้คำตอบนั้นยังไม่ได้โพสต์

นอกจากนี้อันนี้ยาว 6 ไบต์ต่อไป :)

#
+#(\S)(\S*) ((\1)|(\S))/\1\4#\2 \5
#/

การสาธิตสดและชุดทดสอบ


ฉันชอบสวิตช์ดีบั๊กในล่ามของคุณ
Dennis

@ เดนนิสขอบคุณ!
kirbyfan64sos

1

JavaScript, 92 ตัวอักษร

function f(s,c){r="";for(i=0;i<s.length;i++){r+=s[i];if(c.indexOf(s[i])>-1)r+=s[i]}return r}

เวอร์ชันที่ไม่ได้ทำให้รำลึกถึง:

function stretch(str, chars) {
    var ret = "";
    for(var i = 0; i < str.length; i++) {
        ret += str[i];
        if(chars.indexOf(str[i]) > -1) {
            ret += str[i];
        }
    }
    return ret;
}

1

R, 136 128 122 ไบต์

function(s,a){p=strsplit(s,"")[[1]];for(i in 1:nchar(s))if(length(a)&&(x=p[i])==a[1]){p[i]=paste0(x,x);a=a[-1]};message(p)}

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

คำอธิบาย Ungolfed +:

f <- function(s, a) {
    # Split s into letters
    p <- strsplit(s, "")[[1]]

    # Loop over the letters of s
    for (i in 1:nchar(s)) {

        # If a isn't empty and the current letter is the first in a
        if (length(a) > 0 && p[i] == a[1]) {

            # Replace the letter with itself duplicated
            p[i] <- paste0(p[i], p[i])

            # Remove the first element from a
            a <- a[-1]
        }
    }

    # Combine p back into a string and print it
    message(p)
}

ตัวอย่าง:

> f("coconut", c("c","o"))
ccooconut

> f("onomatopoeia", c("o","a","o"))
oonomaatoopoeia

บันทึก 8 ไบต์ขอบคุณ MickeyT และอีก 3 ขอบคุณ jja!


คุณสามารถใช้cat(p,sep='')เพื่อส่งออกตรงไปยัง STDOUT สำหรับคู่
MickyT

@MickyT: ไม่คิดอย่างนั้น! ขอขอบคุณแก้ไข :)
Alex A.

1
จริงๆแล้วmessage(p)จะสั้นกว่า
jja

@jja: ฉันไม่รู้เรื่องmessageเยี่ยมเลย! ขอบคุณ! แก้ไขเพื่อใช้ข้อเสนอแนะของคุณ
Alex A.

1

Bash + sed, 51

sed "`sed 's/./s!^[^&]*&!\U\&&!;/g'<<<$1`s/.*/\L&/"

ข้อมูลจาก stdin; ตัวละครที่จะเพิ่มเป็นสองเท่าเป็นอาร์กิวเมนต์เดียว:

$ echo chameleon | strtech caln
cchaamelleonn

นี้ทำงานโดยการสร้างโปรแกรม sed จากนั้นรันมันกับ$2 $1โปรแกรม sed แทนที่การเกิดขึ้นครั้งแรกของจดหมายแทนที่แต่ละฉบับด้วยสำเนาตัวพิมพ์ใหญ่สองชุดและลดจำนวนล็อตทั้งหมดในตอนท้าย สำหรับตัวอย่างข้างต้นโปรแกรม sed สร้างขึ้นคือ

s!^[^c]*c!\U&C!;s!^[^a]*a!\U&A!;s!^[^l]*l!\U&L!;s!^[^n]*n!\U&N!;s/.*/\L&/

สวยพิมพ์:

# if only sed had non-greedy matching...
s!^[^c]*c!\U&C!
s!^[^a]*a!\U&A!
s!^[^l]*l!\U&L!
s!^[^n]*n!\U&N!
s/.*/\L&/

ฉันใช้ตัวพิมพ์ใหญ่เพื่อทำเครื่องหมายอักขระที่ประมวลผลแล้ว วิธีนี้จะหลีกเลี่ยงตัวละครที่เพิ่มเป็นสองเท่าที่ถูกเพิ่มเป็นสองเท่าหรือใช้ตัวทวีคูณเร็วกว่าตัวละครก่อนหน้า

รุ่นก่อนหน้าก่อนที่จะชี้แจงว่าลำดับของรายการทดแทนมีความสำคัญ (44 ตัวอักษร):

sed "`sed 's/./s!&!\U&&!;/g'<<<$1`s/.*/\L&/"

ไม่ถูกต้อง strtech na <<< bananaเอาต์พุต“ baannana” แต่อันดับแรกที่เกิดขึ้นกับ“ n” ควรเพิ่มเป็นสองเท่าหลังจากนั้นจะเกิด“ a” เท่านั้น
จัดการ

ในกรณีนี้ฉันเข้าใจผิดคำถาม; ไม่ชัดเจนว่าการสั่งซื้อหมายถึงไม่ควรเพิ่มตัวอักษรก่อนหน้าเพียงแค่ว่าคุณจะสามารถหาตัวอักษรตัวที่สอง ฉันจะคิดเกี่ยวกับทางเลือกที่ตรงตามข้อกำหนดใหม่นี้
Toby Speight

ไม่มีปัญหาฉันไม่เข้าใจถูกต้องในครั้งแรก ฉันแนะนำให้ลบคำตอบของคุณในขณะที่คิด (คุณสามารถยกเลิกการลบได้ตลอดเวลา) เพื่อหลีกเลี่ยงโอกาสที่จะถูกลดระดับลง
จัดการ

@ การทำงาน: ฉันขอให้ผู้ถามเพื่อความกระจ่างและให้คำตอบทางเลือกที่ตรงกับการอ่านกฎ (แต่ฉันต้องเสีย 7 ตัวอักษรให้ทำ)
Toby Speight

0

Python 53 53ไบต์

พบว่าโซลูชันของฉันมีความยาวเท่ากันทั้ง Python 2 และ 3

แก้ไข: ผู้ชาย, แก้ไขกรณีนั้นเมื่อทำการแทนที่จดหมายหลายฉบับ (ในขณะที่ยังใช้วิธีเดียวกันอยู่) ใช้เวลาทำงานเล็กน้อย

Python 2:

ลองที่นี่

def f(s,t):
 for c in t:s=s.replace(c,'%',1)
 print s.replace('%','%s')%tuple(x*2for x in t)

Python 3:

s,*t=input()
for c in t:s=s.replace(c,'%',1)
print(s.replace('%','%s')%tuple(x*2for x in t))

0

Mathematica, 66 ไบต์

""<>Fold[Most@#~Join~StringSplit[Last@#,#2->#2<>#2,2]&,{"",#},#2]&

ตัวอย่าง:

In[1]:= f = ""<>Fold[Most@#~Join~StringSplit[Last@#,#2->#2<>#2,2]&,{"",#},#2]&

In[2]:= f["banana", {"n", "a"}]

Out[2]= "bannaana"

0

Lua, 76 78 76 75 58 53 ไบต์

ใหม่ทางออกที่ทำใหม่อย่างสมบูรณ์ด้วยความช่วยเหลือจาก wieselkatze และ SquidDev! มาหาพวกเราสามารถเอาชนะ brainfuck: P

function f(a,b)print((a:gsub("["..b.."]","%1%1")))end

คำอธิบายพรุ่งนี้มา ลองที่นี่


โซลูชันดั้งเดิม: บันทึก 2 ไบต์ด้วย @ kirbyfan64sos!

Lua เป็นภาษาที่แย่มากในการเล่นกอล์ฟดังนั้นฉันคิดว่าฉันทำได้ดีสำหรับอันนี้

function f(x,y)for i=1,#x do g=y:sub(i,i)x=x:gsub(g,g..g,1)end print(x)end

คำอธิบายรหัสพร้อมกับเวอร์ชันที่ไม่ได้รับการยกย่อง:

function f(x,y) --Define a function that takes the arguements x and y (x is the string to stretch, y is how to stretch it)
  for i=1,#x do --A basic for loop going up to the length of x
    g=y:sub(i,i) -- Define g as y's "i"th letter
    x=x:gsub(g,g..g,1) --Redefine x as x with all letter "g"s having an appended g after them, with a replace limit of 1.
  end
  print(x)
end

ลองที่นี่ (รหัสที่ล้าสมัย แต่มีแนวคิดเหมือนกันเพียงแค่เล่นกอล์ฟน้อยกว่าจะอัปเดตพรุ่งนี้)


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

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