言葉を伸ばす


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.

最短のプログラムが勝ちます!

リーダーボード(スニペットについてMartinBüttnerに感謝)


@AlexA。それ以外の場合、重複する文字によって形成される配列はでなく1つになるため[c,o,c,o]です[c,o]
ストレッチマニアック

申し訳ありませんが、もう一度読んでください。ありがとう。
アレックスA.

2
これを見ると非常に多くの回答が得られ、同じ言語の多くがリーダーボードスニペットの追加に興味がありますか?もしそうなら、私はそれを編集して、必要なヘッダー形式を使用しない回答を修正することができてうれしいです。
マーティンエンダー

@MartinBüttner忘れてた!追加されました。スニペットの列が重ならないように#answer-list#language-list幅と幅を変更する必要があり50%ました。
ストレッチマニアック

1
明確化(私のbash+ sed回答を参照):banana, na=> に対して違法baannanaですか?「すべての入力に配列内の文字が(順番に)あると仮定するかもしれません」とは、両方のリストを順番に処理するための回答を許可することを意味しますが必須ではありません。
トビースパイト

回答:


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)

Alex Pankratov のbff(SPOJおよびideoneで使用されるbrainfuckインタープリター)およびThomas CortのBFI(Anarchy Golfで使用される)と互換性があります。

印刷可能バージョンでは、最初に配列を文字列として受け取り、次にタブを続け、その後に改行を伴わない開始文字列を続けます。

イデオンのデモンストレーション

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

\x00タブの代わりに区切り文字として使用することで、いくつかのバイトを節約できます。

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

22
BFが私のPythonコードよりも短いときのその感覚。:(
Kade

6
私は通常Brainfuckを気にしませんが、これは素晴らしいです!
デニス

これは美しいです。
ジョシュバロン

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を習得したほうがいいように思えます。;)
アレックスA.

12

C、62バイト

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

まあ、これは驚くほど競争的です。

f(char*, char*)文字列を最初の入力として受け取り、複製する文字の配列を2番目の入力として受け取る関数を定義します。

いくつかのテストコード:

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

どの印刷:

oonomaatoopeia

オンラインでお試しください!

関数ではなくマクロを送信することが許容される場合、次#define g(s,c)58バイトだけですがsc実際のポインターが必要であり、実際のポインターである必要があります。

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

1
コンマ演算子を検索してくれてありがとう。それは便利です!
Oliphaunt -モニカ回復

11

CJam、15バイト

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

代替のCJamアプローチ。オンラインで試す

説明

2番目の文字列の各文字に対して、2つのことを行います。

  1. 文字列の現在の接尾辞を文字で分割します。例えば "beeper" "e" -> ["b" "" "p" "r"]

  2. 配列の最初の文字列をunconsし、2つの文字を挿入してから、配列の残りの部分を文字で再結合します(例:)"b" "ee" "eper"。最後の文字列は新しいサフィックスです。


9

網膜、33バイト

Retinaの詳細。

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

これは、改行で区切られたSTDINの2つの文字列を想定しています。

カウントのために、各行は個別のファイルに\n入り、実際の改行文字(0x0A)に置き換える必要があります。これを実際にテストしたい場合は、これをそのままの単一のファイルに入れてから、ファイルを渡す前に\nRetinaを-sオプションで呼び出した方が便利です。

説明

(期限切れ...マーカーを取り除くことができました...これは後で更新します。)

行の各ペアは正規表現の置換です(1行目はパターン、2行目は置換)。

^
#

これ#により、入力文字列の先頭にマーカーとしてaが配置されます。

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

これは、複製される次の文字に対応する入力内の最初の文字(マーカーの後)を見つけ、その文字を複製し、マーカーをその後ろに移動し、2番目の文字列の最初の文字をドロップします。+`フロントでは、(2番目の文字列が空で、必要なすべての文字が複製されているので、この場合には)文字列が変化しなくなるまで繰り返し、これを行うために網膜を伝えます。

#
<empty>

最後に、マーカーをドロップして文字列をクリーンアップします。


2
私は網膜がいい解決策を持っていると考えました、そして、あなたが1つを見つけたので、私は正しかったです。また、私が最初にあなたの説明をざっと読んだとき、私は終わりを「マイクを落として文字列をきれいにする」と読みました。
mbomb007

@ mbomb007私は「mic」を取り除くことを望んでいましたが、それらの後に重複のない個々の文字を複製するだけでしたが、33バイト未満ではできません。(改訂履歴に壊れた28バイトバージョンがあります。)
マーティンエンダー

@ mbomb007参考までに、私は今マーカーをなんとか削除しましたが、バイト数はまだ同じです。これはまだゴルフ可能に見えます。
マーティンエンダー

余談ですが、私はRetinaにesolangs.orgの
mbomb007

@ mbomb007はい、知っています。より重要な優れた機能のいくつかを実装した後、おそらく追加します。
マーティンエンダー

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の文字が二重にする文字列の最初の文字かどうかを保存します。その場合は、その文字の1つを取得し、残りのを使用して再帰呼び出しsの先頭に追加し、から最初の要素を削除しlます。そうでないbなら、同じことをしてください、しかし、文字を2倍にしないで、から削除しないでくださいl

コードは、空または空の場合に範囲外のインデックスエラーを回避するのs[:1]==l[:1]ではなくチェックします。s[0]==l[0]sl


6

プロローグ、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

編集:Oliphauntのおかげで4バイト保存

Edit2:のput/1代わりに非推奨のSWI-Prolog述語を使用して20バイトを保存しましたwritef。再帰終了述語d([],_).を1バイトに置き換えて保存しましたd(_,_).dただし、の2つの定義の順序が入れ替わっている場合は機能しませんが、ゴルフのコードではそれを気にしません。括弧を削除してさらに2バイトを保存しましたH=[A|T],put(A),d(S,T)


1
これがなぜ投票されたのか、私にはよく分かりません。コードに説明を追加しますか?
アレックスA.

1
暗黙的に統合することにより、4バイトを節約できますH=[A|T]。また、スペースを改行で置き換えて、もう少し読みやすくしませんか?
オリファント-モニカを復元15年

@Oliphaunt提案のおかげで、H = [A | T]句を使用するようにコードを最初に変更した後、このわずかな最適化は見られませんでした。
11

5

パイソン2、83 74 72の 65バイト

ここには特別なトリックはありません。xは文字列で、y複製される文字の配列です。これが適切にコピーされないかどうかを明確にするために、最初のインデントレベルはスペースで、次はタブです。

編集1:pop()の代わりに文字列操作を使用して9バイトを保存しました。

編集2:1 -~をインクリメントgするために使用して2バイトを保存しました。

編集3:y[:1]トリックを使用して7バイトを保存しました。これは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はい、代わりに置換が必要な文字を受け取った場合はそうです。ありがとう!
カデ

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編集していただきありがとうございます。ロールバックを押して、それがどうなるかを確認しました。それがあなたの編集のためにポイントや何かを失ったのかどうかわかりませんか?
ワイトボーイ

いいえ、少し混乱しましたが、まだ+2を持っています。再度ロールバックしたい場合があります。少なくとも3人の優秀な担当者によると、それは良い編集でした。
ファンドモニカの訴訟

@QPaysTaxes編集が気に入りました。何度もロールバックしたと思います。
ワイトボーイ

わかりません。モバイルは物事を正確に表示しません。ただし、最終的に重要なのは、フォーマットではなくコードです。
基金モニカの訴訟

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"

使い方:

1つの文字列が空の場合、結果は最初の文字列です。それ以外の場合:文字列の最初の文字が一致する場合、2回取得して、文字列の末尾に再帰呼び出しを追加します。文字が一致しない場合、最初の文字列の最初の文字を取得し、最初の文字列と同じ2番目の文字列の末尾に再帰呼び出しを追加します。


4

Pyth、18 17バイト

sm?+d.(QZqd&QhQdz

ライブデモ。

@ジャクベのおかげで1バイト節約できました。

説明:

                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
この作品は正しくありませんかonomatopoeiaoao
アレックス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ヘルプ?もっと短いものが必要です...
ジャクベ

よりエレガントな;-)
ジャクベ

1
14-1で手に入れました。CJamが最適な場所であるよりも1少ないです。
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で実行して、文字列を初期スタックとして(「マーク」、つまり「カメレオン」で)入力し、余分な文字の配列を入力スタックとして入力します(「マーク、つまり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})))}

ゴルフをしていない:

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}

配列内の各文字について、最初の出現箇所を見つけて複製し、それまでのすべてを大文字にします。次に、文字列全体を小文字に変換して返します。

EDIT:を取り除くことにより、複数の文字のカップルを剃ったshiftpop


以前のバージョン:

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

新しいバージョンでは、文字の順序が考慮されなくなりました。(ところで、「foreachキーワードは実際にはforキーワードの同義語なので、どちらでも使用できます。」– Foreachループ。)
manatwork

@manatworkこれでうまくいくはずです。そして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"

説明:

文字列を最初の引数として、文字の配列を2番目の引数としてとるメソッドのProc形式。文字列引数の文字の配列にブロックをマップします。これは、各文字を比較配列の最初の要素と照合し、一致する場合、比較配列の最初の要素を削除して、それを2倍にします。


更新

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)、2番目の入力は単一の文字列(例caln)です。

上記は、次のことを行う難読化された(「きれい」と読む)方法です。

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

各文字を通過するときに、単語の先頭から元の単語の文字までを新しい文字だけで置き換え、一致を追加します(保存場所 $&、結果に)を。一致には文字が含まれており、その文字に置き換えられるため、各文字は2回表示されます。

STDINは両方の入力に改行文字を追加するため、最後の一致で完全な単語の残り、つまり改行文字をキャプチャすることが保証されます。


2

REGXY、24バイト

正規表現置換ベースの言語であるREGXYを使用します。入力は、スペースで区切られた開始ワードと配列であると想定されます(「カメレオンカルン」など)。

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

プログラムは、最初の文字列の文字とスペースの後の最初の文字を一致させることで機能します。これが一致する場合、置換で文字が繰り返され、配列内の文字が削除されます(文字列に追加されません)。処理は2番目の行に移動します。これは、最初の行への単なるポインターであり、前の置換の結果で処理を繰り返します。最終的に、スペースの後に文字がなくなり、その時点で代替の2番目のブランチが一致し、結果から末尾のスペースが削除されます。その後、正規表現は照合に失敗し、処理が完了して結果が返されます。

それが役立つ場合、実行の反復手順は次のとおりです。

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

プログラムは上記のリンクのサンプルインタープリターで正しくコンパイルおよび実行されますが、言語仕様の曖昧さの前提に依存しているため、ソリューションはおそらく少し生意気です。仕様では、各行の最初のトークン(/の前)がラベルとして機能しますが、nullラベルポインターは、nullラベル(つまり、その「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

rs、39バイト

rsに関する詳細情報。

Retinaの回答はすでにありますが、これは少し異なるアプローチを使用していると思います。それらも別々に作成されました。この作業を始めたとき、その答えは投稿されていませんでした。

それに、これはとにかく6バイト長くなります。:)

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

ライブデモおよびテストスイート。


インタープリターのデバッグスイッチが本当に気に入っています。
デニス

@デニスありがとう!
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

MickeyTのおかげで8バイト、jjaのおかげでさらに3バイト節約されました!


cat(p,sep='')カップルのためにSTDOUTに直接出力するために使用できます
-MickyT

@MickyT:それを考えなかった!編集ありがとうございます。:)
アレックスA.

1
実際にmessage(p)は、短いです。
jja

@jja:知らなかったmessage、すごい!ありがとう!提案を使用するように編集されました。
アレックスA.

1

Bash + sed、51

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

stdinからの入力。単一の引数として2倍になる文字:

$ echo chameleon | strtech caln
cchaamelleonn

これは、からsedプログラムを構築し、$2それに対して実行することで機能し$1ます。sedプログラムは、各置換文字の最初の出現を大文字バージョンの2つのコピーに置き換え、最後にロット全体を小文字にします。上記の例では、生成された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&/

大文字を使用して、これまでに処理された文字をマークします。これにより、すでに2倍になっている文字を再度2倍にしたり、前の文字よりも早く2倍にしたりする必要がなくなります。

置換リストの順序が重要であることを明確にする前の以前のバージョン(44文字):

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

間違っています。strtech na <<< banana「baannana」を出力しますが、最初に「n」の出現を2倍にする必要があります。
マナトワーク

その場合、私は質問を誤解しました。順序が前の文字を2倍にしないことを意味することは明示的ではなく、単に2番目に続く文字を見つけることができるということです。この新しい要件を満たす代替案について考えます。
トビースパイト

問題ありません、私も最初にそれを正しくしませんでした。考えられている間に答えを削除することをお勧めします(いつでも元に戻すことができます)。
マナトワーク

@manatwork:私は質問者に説明を求め、ルールを読むことを満足する別の答えを提供しました(しかし、そうするのに7文字かかりました)
Toby Speight

0

Python、53 92バイト

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

明日来る説明。ここで試してみてください。


元のソリューション:@ kirbyfan64sosのおかげで2バイト節約されました!

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

ここで試してみてください。(コードは古くなっていますが、同じコンセプトで、ゴルフが少ないだけで、明日更新されます)


配列で定義されたすべての文字を重複で置き換えるグリッチを修正する必要があるため、2バイトを追加しました。

function f(x,y)print(x)に改行を削除して、2バイト節約できると思います。
kirbyfan64sos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.