Peregangan Kata

32

Tulis program atau fungsi yang menduplikasi huruf dalam sebuah kata, sehingga semua huruf yang digandakan yang disusun dari kiri ke kanan dalam kata tersebut akan membentuk array input.

Sebagai contoh:

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

Memasukkan

  • Kata awal (mis. chameleon)
  • Array karakter ( [c,a,l,n]) atau string untuk mewakili array ( caln), atau yang serupa
  • Input dapat melalui parameter fungsi, STDIN atau setara bahasa
  • Semua input akan berupa huruf kecil (az)

Keluaran

  • Kata yang diubah

  • Jika ada banyak solusi, apa pun bisa dicetak

    input: banana [n,a]  
    possible outputs: bannaana, banannaa
                         |-|---------|-|--->[n,a]
    
  • Anda dapat berasumsi bahwa kata input (tidak harus array) akan memiliki huruf dalam array (dalam urutan)

  • Anda juga dapat berasumsi bahwa input tidak memiliki huruf berurutan yang sama (BUKAN apel, geek, hijau, kaca, pintu ...)

Contohnya

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.

Kemenangan program terpendek!

Papan peringkat (terima kasih kepada Martin Büttner untuk cuplikannya)

Regangkan Maniac
sumber
@AlexA. hanya satu contoh karena kalau tidak array yang dibentuk oleh surat duplikat akan [c,o,c,o], bukan [c,o].
Stretch Maniac
Ya maaf, membacanya lagi itu sudah jelas. Terima kasih.
Alex A.
2
Melihat ini mendapat banyak jawaban, dan banyak dalam bahasa yang sama, apakah Anda tertarik untuk menambahkan cuplikan papan peringkat ? Jika demikian, saya senang mengeditnya dan mengubah jawaban yang tidak menggunakan format tajuk yang diperlukan.
Martin Ender
@ MartinBüttner Saya lupa tentang itu! Ditambahkan. Saya harus mengubah #answer-listdan #language-listlebar 50%untuk menghindari tumpang tindih kolom di cuplikan Anda.
Stretch Maniac
1
Klarifikasi (lihat jawaban bash+ saya sed): Apakah itu ilegal untuk banana, na=> baannana? Saya percaya bahwa "Anda dapat berasumsi bahwa semua input akan memiliki huruf dalam array (dalam urutan)" dimaksudkan untuk mengizinkan , tetapi tidak memerlukan , jawaban untuk memproses kedua daftar secara berurutan, tetapi @ manatwork menafsirkannya secara berbeda.
Toby Speight

Jawaban:

5

Pyth, 14 byte

s+L&@d<Q1.(QZz

Demonstrasi.

Gaya masukan:

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

Penjelasan:

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.
isaacg
sumber
43

Brainfuck, 46 45 (63 dengan karakter yang dapat dicetak dalam input)

Kompatibel dengan bff Alex Pankratov (interpreter brainfuck digunakan pada SPOJ dan ideone) dan Thomas Cort's BFI (digunakan pada Anarchy Golf).

Versi yang dapat dicetak mengambil array terlebih dahulu sebagai string, diikuti oleh tab, diikuti oleh string awal tanpa baris baru.

Demonstrasi tentang ideone.

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

Kami dapat menyimpan beberapa byte dengan menggunakan \x00sebagai pemisah alih-alih tab:

,[>,]
<[<]
<,+
[
  -.
  [>+>-<<-]
  >>
  [
    <[>+<-]
  ]
  <[.[-]]
  ,+
]
Mitch Schwartz
sumber
22
Perasaan itu ketika BF lebih pendek dari kode Python saya .. :(
Kade
6
Saya biasanya tidak peduli dengan Brainfuck, tapi ini luar biasa!
Dennis
Ini indah.
Joshpbarron
14

CJam, 15 byte

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

Cobalah online.

Bagaimana itu bekerja

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).
Dennis
sumber
Ini pertempuran CJams! Anda dan Sp keduanya memiliki 15 byte jawaban CJam, dan 15 saat ini adalah yang terpendek. :)
Alex A.
3
@AlexA. Tunggu saja Pyth. Anda tunggu saja ...
Sp3000
2
Sepertinya Anda sebaiknya belajar Pyth. ;)
Alex A.
12

C, 62 byte

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

Nah, ini sangat kompetitif.

Kami mendefinisikan fungsi f(char*, char*)yang menggunakan string sebagai input pertama dan array karakter untuk diduplikasi sebagai input kedua.

Beberapa kode pengujian:

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

Yang mencetak:

oonomaatoopeia

Cobalah online !

Jika dapat diterima untuk mengirim makro daripada fungsi, berikut #define g(s,c)ini hanya 58 byte , tetapi membutuhkan sdan cmenjadi pointer aktual:

#define g(s,c)while(*s-*c||putchar(*c++),*s)putchar(*s++);
BrainSteel
sumber
1
Terima kasih telah membuat saya mencari operator koma . Itu berguna!
Oliphaunt - mengembalikan Monica
11

CJam, 15 byte

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

Pendekatan alternatif CJam. Cobalah online

Penjelasan

Untuk setiap karakter di string kedua, kami melakukan dua hal.

  1. Pisahkan akhiran string saat ini dengan karakter, mis "beeper" "e" -> ["b" "" "p" "r"]

  2. Buka string pertama dalam array, masukkan dua karakter, lalu gabungkan kembali array dengan karakter, misalnya "b" "ee" "eper". String terakhir adalah sufiks baru.

Sp3000
sumber
9

Retina, 33 byte

Informasi lebih lanjut tentang Retina.

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

Ini mengharapkan dua string pada STDIN, dipisahkan oleh baris baru.

Untuk tujuan penghitungan, setiap baris masuk ke file terpisah, \nharus diganti dengan karakter baris baru yang sebenarnya (0x0A). Jika Anda benar-benar ingin menguji ini, lebih mudah untuk menempatkan ini dalam satu file di mana \ntetap seperti itu dan kemudian memohon Retina dengan -sopsi sebelum melewati file.

Penjelasan

(Sudah kedaluwarsa ... Saya berhasil menyingkirkan penanda ... Saya akan memperbaruinya nanti.)

Setiap pasangan garis adalah substitusi regex (baris pertama polanya, baris kedua substitusi).

^
#

Ini menempatkan #sebagai penanda di awal string input.

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

Ini menemukan huruf pertama dalam input (setelah marker) yang sesuai dengan huruf berikutnya yang akan diduplikasi, menggandakan huruf itu, memindahkan marker di belakangnya, dan menjatuhkan karakter pertama dari string kedua. The +`di depan memberitahu Retina untuk melakukan ini berulang kali hingga string berhenti berubah (dalam hal ini, karena string kedua kosong dan semua huruf yang diperlukan telah digandakan).

#
<empty>

Akhirnya, kami membersihkan string dengan menjatuhkan spidol.

Martin Ender
sumber
2
Saya pikir retina akan memiliki solusi yang bagus, dan saya benar, karena Anda menemukannya. Juga, ketika saya pertama kali membaca deskripsi Anda, saya membaca bagian akhir sebagai "kami membersihkan string dengan menjatuhkan mic ."
mbomb007
@ mbomb007 Saya berharap untuk menyingkirkan "mic" dengan hanya menduplikasi masing-masing huruf yang tidak memiliki duplikat setelah mereka, tetapi saya tidak bisa melakukannya dalam waktu kurang dari 33 byte. (Ada versi 28 byte yang rusak dalam sejarah revisi.)
Martin Ender
@ mbomb007 FYI, saya berhasil menghapus marker sekarang, tetapi jumlah byte masih sama. Ini masih terlihat golf.
Martin Ender
Selain itu, saya baru menyadari bahwa Retina tidak memiliki halaman di esolangs.org
mbomb007
@ mbomb007 Ya, saya sadar. Saya mungkin akan menambahkan satu setelah saya menerapkan beberapa fitur luar biasa yang lebih penting.
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:])

Solusi rekursif serakah. Menyimpan bapakah huruf pertama dari string sadalah huruf pertama dari string yang lakan digandakan. Jika demikian, ambil salah satu dari surat itu dan tambahkan ke panggilan rekursif dengan yang lain s, hapus elemen pertama l. Jika tidak b, lakukan hal yang sama tetapi jangan menggandakan surat dan jangan menghapus dari l.

Kode memeriksa s[:1]==l[:1]daripada s[0]==l[0]untuk menghindari kesalahan indeks out-of-bounds ketika satau lkosong.

Tidak
sumber
6

Prolog, 95 83 79 56 byte

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

Contoh:

d(`chameleon`,`caln`).

kembali

cchaamelleonn

Sunting: Disimpan 4 byte berkat Oliphaunt

Sunting2: Disimpan 20 byte menggunakan put/1predikat SWI-Prolog yang sudah usang alih-alih writef. Disimpan satu byte menggantikan predikat ujung rekursi d([],_).ke d(_,_).. Tidak akan bekerja jika pemesanan kedua definisi dbertukar, tetapi kami tidak peduli tentang itu dalam kode golf. Menyimpan 2 byte lainnya dengan menghilangkan tanda kurungH=[A|T],put(A),d(S,T)

Fatalisasi
sumber
1
Saya tidak begitu yakin mengapa ini diturunkan. Mungkin menambahkan beberapa penjelasan ke kode Anda?
Alex A.
1
Anda dapat menyimpan empat byte dengan menyatukan secara implisit: H=[A|T]. Juga, mengapa tidak membuatnya sedikit lebih mudah dibaca dengan mengganti spasi dengan baris baru?
Oliphaunt - mengembalikan Monica
@Oliphaunt Terima kasih atas sarannya, saya tidak melihat sedikit optimasi ini setelah saya memodifikasi kode saya untuk menggunakan klausa H = [A | T].
Fatalkan
5

Python 2, 83 74 72 65 Bytes

Tidak ada trik khusus yang nyata di sini. xadalah string, yadalah array karakter yang digandakan. Untuk memperjelas jika ini tidak menyalin dengan benar, tingkat lekukan pertama adalah spasi, selanjutnya adalah tab.

Sunting 1: Disimpan 9 byte dengan menggunakan manipulasi string alih-alih pop ().

Sunting 2: Disimpan 2 byte dengan menggunakan -~selisih g1.

Sunting 3: Disimpan 7 byte dengan menggunakan y[:1]trik, terima kasih kepada xnor untuk ini!

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

Lihat disini.

Diformat dan dijelaskan dengan benar:

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.
Kade
sumber
"Anda dapat berasumsi bahwa semua input akan memiliki huruf dalam array (berurutan)." Itu akan menghemat beberapa byte.
mbomb007
2
Anda bisa mendapatkan elemen pertama dari string yang mungkin kosong sebagai y[:1].
xnor
Saya sekarang menyadari bahwa Anda tidak dapat menyimpan sebanyak yang saya pikirkan karena cara Anda melakukannya y=y[g:], jadi "beberapa" cukup berlebihan.
mbomb007
@ Vioz- Aku sedang berpikir y[:1]==c. Apakah itu bekerja?
xnor
@ xnor Ya, itu berlaku jika saya mengambil surat yang perlu diganti. Terima kasih!
Kade
5

Excel VBA, 110 byte

Ini adalah entri pertama saya ke CodeGolf jadi saya harap ini ok.

Anda memasukkan kata input dalam A1 dan kemudian huruf yang akan diganti dalam B1 dan kata yang dihasilkan ditampilkan dalam kotak pesan.

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
Wightboy
sumber
2
Jika VBA tidak sensitif terhadap indentasi, Anda dapat menyingkirkan semua indentasi dan menyimpan beberapa byte. Saya pikir Anda juga dapat menyingkirkan semua ruang setelah koma dan sekitar operator. Seharusnya menghemat beberapa byte.
Dana Gugatan Monica
@QPaysTaxes Terima kasih atas hasil edit Anda. Saya menekan rollback hanya untuk melihat apa yang akan dilakukannya. Tidak yakin apakah itu membuat Anda kehilangan poin atau sesuatu untuk diedit?
Wightboy
Tidak, saya masih memiliki +2, meskipun saya agak bingung. Anda mungkin ingin memutar kembali; setidaknya menurut tiga orang perwakilan senior, itu adalah suntingan yang bagus.
Dana Gugatan Monica
@QPaysTaxes Saya setuju saya menyukai hasil edit. Saya pikir saya baru saja mundur satu kali.
Wightboy
Saya tidak tahu. Seluler tidak menampilkan hal-hal dengan baik. Namun, pada akhirnya, yang penting adalah kode, bukan format.
Dana Gugatan Monica
4

Haskell, 42 byte

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

Contoh penggunaan:

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

Bagaimana itu bekerja:

Jika satu string kosong, hasilnya adalah string pertama. Lain: jika karakter pertama dari senar cocok, ambil dua kali dan tambahkan panggilan rekursif dengan ekor senar. Jika karakter tidak cocok, ambil karakter pertama dari string pertama dan tambahkan panggilan rekursif dengan ekor dari string pertama dan string kedua yang sama.

nimi
sumber
4

Pyth, 18 17 byte

sm?+d.(QZqd&QhQdz

Demo langsung.

Disimpan 1 byte berkat @Jakube.

Penjelasan:

                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.

Versi asli:

jkm?+d.(QZqd&QhQdz

Demo langsung untuk yang asli.

kirbyfan64sos
sumber
4

Javascript, 47 byte

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

Memanfaatkan beberapa fitur ES6.

Sereal
sumber
1
Apakah ini bekerja dengan benar untuk onomatopoeia, oao?
Alex A.
1
@AlexA. Output: "oonoomaatoopooeiaa". Oh saya mengerti. Akan memperbaiki
Sereal
Tetap, saya pikir. Menambahkan banyak karakter :(
Sereal
Alih-alih b.indexOf(d)==0, coba~b.search(d)
Ismael Miguel
@IsmaelMiguel searchhanya berlaku di string. Harus mengubah b ke array
Cereal
3

Pyth, 16 byte

u|pH<GJxGH>GJwz

Cobalah online: Demonstrasi

Ini cukup aneh. Bahasa berbasis tumpukan mungkin memiliki keuntungan di sini.

Penjelasan

                   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
Jakube
sumber
@isaacg Bantuan? Pasti ada sesuatu yang lebih pendek ...
Jakube
Dan lebih elegan ;-)
Jakube
1
Mendapatnya dalam 14 - 1 kurang dari CJam adalah tempat terbaik untuk menjadi.
isaacg
3

JavaScript ES6, 47 byte

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

Asumsi sadalah sebuah array["c","a","l","n"]

Shmiddty
sumber
2

> <> (Ikan) , 68 34 Bytes

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

Anda dapat menjalankannya di http://fishlanguage.com/playground dengan memasukkan string sebagai tumpukan awal (dengan "tanda, yaitu" bunglon ") dan larik huruf tambahan sebagai tumpukan input (tidak ada" tanda yaitu caln).

Jangan lupa untuk menekan tombol Berikan untuk menyemai tumpukan input.

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

EDIT: Dibelah dua! :)

Fongoid
sumber
2

R, 119

Berdasarkan jawaban @ Alex , yang ini lebih pendek beberapa byte:

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

Tidak Disatukan:

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
        }
      )
    )
  )
}
jja
sumber
2

Perl, 73 62 59 56

Pendekatan yang sama sekali baru menghasilkan hasil yang jauh lebih baik. Meski begitu, saya yakin itu bisa lebih pendek.

Sebut sebagai f('coconut', ['c','o']).

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

Untuk setiap karakter dalam array, temukan kemunculan pertama dan duplikatnya, dan ubah semuanya menjadi huruf besar. Kemudian kembalikan seluruh string, dikonversi menjadi huruf kecil.

EDIT: mencukur beberapa karakter lebih banyak dengan menyingkirkan shiftdan pop.


Versi sebelumnya:

sub f{join '',map{shift @{$_[0]}if s/($_[0][0])/$1$1/;$_}split //,shift}
jja
sumber
Versi baru tidak menghormati urutan karakter lagi. (BTW, “Kata foreachkunci sebenarnya adalah sinonim untuk forkata kunci, sehingga Anda dapat menggunakan keduanya." - Foreach Loops .)
manatwork
@Manatwork Itu harus dilakukan. Dan terima kasih atas forpetunjuknya. Ini sebenarnya lebih pendek sekarang.
jja
2

Rubi, 52 47 byte

Larutan:

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

Contoh:

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

Penjelasan:

Bentuk Proc dari metode yang menggunakan string sebagai argumen pertama, dan array karakter sebagai argumen kedua. Memetakan blok ke array karakter dalam argumen string, yang memeriksa setiap karakter terhadap elemen pertama dari array perbandingan, dan jika ada kecocokan, menghapus elemen pertama dari array perbandingan, dan menggandakannya.


memperbarui

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

Brian Davis
sumber
Anda dapat melewati tanda kurung di sekitar parameter s,a. Dan *''setara dengan .join. Itu 5 byte yang disimpan, tapi saya masih mengalahkan Anda satu per satu (untuk sekarang): D
daniero
2

Perl, 51 byte

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

Masukan diberikan melalui STDIN. Input pertama adalah kata awal (mis. chameleon), Input kedua adalah huruf-huruf sebagai string tunggal (mis caln.).

Di atas hanyalah cara yang membingungkan (baca "lebih cantik") untuk melakukan hal berikut:

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

Saat kita membaca setiap huruf, kita mengganti dari awal kata hingga huruf di kata sumber hanya dengan huruf baru, dan menambahkan kecocokan (disimpan dalam $&) ke hasil kita. Karena pertandingan menyertakan surat dan kemudian diganti dengan surat, setiap huruf akhirnya muncul dua kali.

Karena STDIN menambahkan karakter baris baru ke kedua input kami, kami dijamin akan menangkap sisa kata lengkap pada pertandingan terakhir, yaitu karakter baris baru.

Allen G
sumber
2

REGXY, 24 byte

Menggunakan REGXY , bahasa berbasis pengganti regex. Input diasumsikan sebagai kata awal dan array, dipisahkan dengan ruang (mis. "Bunglon caln").

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

Program ini bekerja dengan cara mencocokkan karakter dalam string pertama dengan karakter pertama setelah spasi. Jika ini cocok, karakter diulang dalam substitusi dan karakter dalam array dihapus (well, tidak ditambahkan kembali ke string). Pemrosesan bergerak ke baris kedua, yang hanya merupakan penunjuk kembali ke baris pertama, yang menyebabkan pemrosesan mengulangi hasil dari substitusi sebelumnya. Akhirnya, tidak akan ada karakter setelah spasi, pada titik mana cabang kedua dari pergantian akan cocok, menghapus ruang tambahan dari hasilnya. Regex kemudian akan gagal untuk mencocokkan, pemrosesan selesai dan hasilnya dikembalikan.

Jika ini membantu, langkah-langkah eksekusi yang berulang adalah sebagai berikut:

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

Program mengkompilasi dan mengeksekusi dengan benar dengan contoh juru bahasa pada tautan di atas, tetapi solusinya mungkin agak kurang ajar karena bergantung pada asumsi dalam ketidakjelasan spesifikasi bahasa. Spec menyatakan bahwa token pertama pada setiap baris (sebelum /) bertindak sebagai label, tetapi asumsinya adalah bahwa penunjuk label nol akan menunjuk kembali ke perintah pertama dalam file dengan label nol (atau dengan kata lain, bahwa 'nol' adalah label yang valid). Solusi yang kurang sopan adalah:

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

Yang berjumlah 27 byte

Jarmex
sumber
1

JavaScript ES6, 72 byte

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

Ini adalah fungsi anonim yang mengambil 2 parameter: kata awal sebagai string dan karakter untuk direntangkan sebagai array. Kode ungolfed yang menggunakan ES5 dan menguji UI di bawah ini.

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>

NinjaBearMonkey
sumber
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

Panggil sebagai:

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

Saya mungkin salah menghitung byte dengan salah ... Menggunakan campuran spasi dan tab.

Peluruhan Beta
sumber
1

rs, 39 byte

Informasi lebih lanjut tentang rs.

Sudah ada jawaban Retina, tapi saya pikir yang ini menggunakan pendekatan yang sedikit berbeda. Mereka juga dibuat secara terpisah: ketika saya mulai mengerjakan yang ini, jawaban itu belum diposting.

Lagi pula, yang ini lebih panjang 6 byte. :)

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

Demo langsung dan test suite.

kirbyfan64sos
sumber
Saya sangat suka tombol debug di juru bahasa Anda.
Dennis
@Dennis Terima kasih!
kirbyfan64sos
1

JavaScript, 92 karakter

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}

Versi tanpa gangguan:

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;
}
SirPython
sumber
1

R, 136 128 122 byte

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

Ini menciptakan fungsi tanpa nama yang menerima string dan vektor karakter sebagai input dan mencetak string ke STDOUT. Untuk menyebutnya, berikan nama.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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

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

Disimpan 8 byte berkat MickeyT dan 3 lainnya berkat jja!

Alex A.
sumber
Anda dapat menggunakan cat(p,sep='')untuk output langsung ke STDOUT untuk pasangan
MickyT
@MickyT: Tidak memikirkan itu! Terima kasih sudah diedit. :)
Alex A.
1
Sebenarnya message(p)lebih pendek.
jja
@jaja: Saya tidak tahu message, itu luar biasa! Terima kasih! Diedit untuk menggunakan saran Anda.
Alex A.
1

Bash + sed, 51

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

Masukan dari stdin; karakter yang akan digandakan sebagai argumen tunggal:

$ echo chameleon | strtech caln
cchaamelleonn

Ini bekerja dengan membangun program sed dari $2dan kemudian mengeksekusinya $1. Program sed menggantikan kejadian pertama dari setiap surat pengganti dengan dua salinan dari versi huruf besar, dan menurunkan seluruh lot di akhir. Untuk contoh di atas, program sed yang dihasilkan adalah

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

cukup dicetak:

# 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&/

Saya menggunakan huruf besar untuk menandai karakter yang diproses sejauh ini; ini menghindari penggandaan kembali karakter yang sudah digandakan, atau menerapkan penggandaan lebih awal dari yang sebelumnya.

Versi sebelumnya, sebelum klarifikasi bahwa urutan daftar pengganti signifikan (44 karakter):

sed "`sed 's/./s!&!\U&&!;/g'<<<$1`s/.*/\L&/"
Toby Speight
sumber
Salah. strtech na <<< bananamenghasilkan "baannana", tetapi pertama-tama kemunculan pada "n" harus digandakan, hanya setelah itu terjadinya "a".
manatwork
Dalam hal ini, saya salah mengerti pertanyaannya; itu tidak eksplisit bahwa pemesanan berarti bahwa surat-surat sebelumnya tidak boleh dua kali lipat, hanya bahwa Anda akan dapat menemukan yang berikutnya menjadi dua kali lipat. Saya akan memikirkan alternatif yang memenuhi persyaratan baru ini.
Toby Speight
Tidak masalah, saya juga tidak melakukannya dengan benar pertama kali. Saya sarankan untuk menghapus jawaban Anda sambil berpikir (Anda dapat membatalkan penghapusan kapan saja), untuk menghindari kesempatan untuk downvoted.
manatwork
@manatwork: Saya sudah meminta klarifikasi kepada penanya, dan memberikan jawaban alternatif yang memuaskan pembacaan aturan (tapi saya harus membayar 7 chars)
Toby Speight
0

Python, 53 92 byte

Menemukan solusi saya dengan panjang yang sama di Python 2 dan 3.

EDIT: Man, memperbaiki kasus itu ketika melakukan beberapa penggantian huruf yang sama (saat masih menggunakan metode yang sama) butuh sedikit kerja.

Python 2:

Coba di sini

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))
mbomb007
sumber
0

Mathematica, 66 byte

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

Contoh:

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

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

Out[2]= "bannaana"
alephalpha
sumber
0

Lua, 76 78 76 75 58 53 byte

Solusi baru yang sepenuhnya dikerjakan ulang dengan bantuan dari wieselkatze dan SquidDev! ayolah teman, kita bisa mengalahkan brainfuck: P

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

Penjelasan datang besok. Coba di sini.


Solusi asli: Disimpan 2 byte berkat @ kirbyfan64sos!

Lua adalah bahasa yang sangat buruk untuk bermain golf, jadi saya pikir saya cukup bagus untuk yang satu ini.

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

Penjelasan kode, bersama dengan versi yang tidak diklik:

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

Coba di sini. (Kode usang tetapi konsep yang sama, hanya sedikit golf, akan memperbarui besok)


sumber
Ditambahkan pada dua byte karena saya harus memperbaiki kesalahan di mana ia akan mengganti semua huruf yang didefinisikan dalam array dengan duplikat mereka.
Saya pikir Anda dapat menghapus baris baru setelah function f(x,y)dan setelah print(x), menghemat dua byte.
kirbyfan64sos