文字列をそれ自体で置き換えます!


24

文字列をそれ自体で置き換えます

あなたの目標は、元の文字列の各文字を最初の文字から始めて折り返すことによって、文字列をそれ自体で置き換えることです。ここに私が意味することを示すためのいくつかの例があります:

最初の例:

Input: program
Output: apgopra

How:
Program -> mrogram (replace p by m in program)
-> mpogpam (replace r by p in mrogram)
-> mprgpam (replace o by r in mpogpam)
-> mpropam (replace g by o in mprgpam)
-> mpgopam (replace r by g in mpropam)
-> mpgoprm (replace a by r in mpgopam)
-> apgopra (replace m by a in mpgoprm)

2番目の例:

Input: robot
Output: orbro

How:
Robot -> tobot (replace r by t in robot)
-> trbrt (replace o by r in tobot)
-> trort (replace b by o in trbrt)
-> trbrt (replace o by b in trort)
-> orbro (replace t by o in trbrt)

3番目の例:

Input: x
Output: x

How:
x -> x (replace x by x in x)

4番目の例:

Input: xy
Output: xx

How:
xy -> yy (replace x by y in xy)
-> xx (replace y by x in yy)

サイドノート:

  • 文字列xには小文字の英数字とスペースのみが含まれます
  • これはので、バイト単位の最短コードが勝ちです!

編集内容は元のアイデアと一致しますか?
LegionMammal978

すべてのラウンドで文字を置き換えることで暗号化された文字列を基本的に暗号化することを人々に理解してもらいたいと思います。例はこれを明確にしているので、そうなると思います。
トーマスW

回答:




7

JavaScript ES6、69バイト

s=>[...s].reduce((p,c,i)=>p.replace(RegExp(c,'g'),s.slice(i-1)[0]),s)


3
F=バイト数をスキップできます。
Ypnypn

@Ypnypn彼らはこのようなものを指定しない場合はどうすればよいかわからない
ジョージリース

s.slice(i-1)[0]等しくないs.slice(i-1,i)
edc65

1
@ edc65いつでもないi=0
ジョージリース

3

ルビー、 50 48バイト

->s{t=s.dup;t.size.times{|i|t.tr!s[i],s[i-1]};t}

テスト:

f=->s{t=s.dup;t.size.times{|i|t.tr!s[i],s[i-1]};t}
f["program"]
=> "apgopra"

3

Mathematica、89 75 74 57バイト

""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&

""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
alephalpha

@alephalphaおかげで、私はそれを試してTranspose失敗しました。
LegionMammal978


3

k2-17文字

1つの引数を取る関数。

{_ssr/[x;x;-1!x]}

k2はと呼ばれる組み込み持つ_ssrためにSトリングSの earchが及びRの eplaceを。_ssr[x;y;z]を見つけyxに置き換えzます。そのため/、この機能を、作成する各置換の上に折り畳むために使用します。(関数型プログラミングのように)折りたたみに不慣れな人にとっては、本質的にに _ssr/[x; (y1; y2; y3); (z1; z2; z3)]なり_ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]ます。文字列は文字のリストであるため、単純に入力を1ステップ戻し、置換を取得してプラグインするだけです。

  {_ssr/[x;x;-1!x]} "program"
"apgopra"
  {_ssr/[x;x;-1!x]} "robot"
"orbro"
  {_ssr/[x;x;-1!x]} (,"x")   / one-letter strings are ,"x" and parens are required
,"x"
  {_ssr/[x;x;-1!x]} "xy"
"xx"

2

Haskell、76バイト

[]#_=[];(x:y)#g@(a,b)|x==a=b:y#g|2>1=x:y#g;h x=foldl(#)x$zip x$last x:init x

残念なことに、Haskellには組み込みの置換関数さえありません。


2

PHP、76バイト

function($s){$f=str_split;echo str_replace($f($s),$f(substr($s,-1).$s),$s);}

以下は、バージョン化されていないバージョンです。

function selfSubstitute($originalString)
{
    $shiftedString = substr($originalString, -1) . $originalString;

    $splitOriginalString = str_split($originalString);
    $splitShiftedString = str_split($shiftedString);

    echo str_replace($splitOriginalString, $splitShiftedString, $originalString);
}

2

Python、67 64 62 57バイト

簡単な解決策は、これを短縮するために何かを調べます。5バイトを節約してくれた@RandyCに感謝します。

c=input()
for x in zip(c,c[-1]+c):c=c.replace(*x)
print c

入力は引用符で囲む必要があります。


[:-1]zipは最短の反復可能ファイルに切り捨てられるため、ドロップすることで数バイトを節約できます。
ランディ

@RandyCうわー、いいコール!ありがとう。
ケード

1

Haskell、58バイト

r(x,y)c|x==c=y|0<1=c;f s=foldl(flip$map.r)s.zip s$last s:s

クリスチャンのソリューションにかなり似ていますが、リストの長さが等しくない場合、余分な要素mapzip無視するという事実を使用しています。置換のリスト(フォーム上(from,to))をたたみ、r各文字に手書きの置換関数をマッピングすることで文字列を更新します。

flip$map.rは、LambdaBotの「Pointless」プラグインを使用して導出されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.