用自己替换一个字符串!


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)

第二个例子:

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)

第三个例子:

Input: x
Output: x

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

第四个例子:

Input: xy
Output: xx

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

旁注:

  • 字符串 x将仅包含小写字母数字字符和空格
  • 这是因此以字节为单位的最短代码胜出!

我的修改符合您的原始想法吗?
LegionMammal978

看起来不错,我希望人们能理解,他们每一轮基本上都通过替换每一轮字符来加密加密的字符串。这些示例清楚地表明了这一点,所以我认为它们会。
Thomas W

Answers:


20

CJam,11个字节

q__1m>.{er}

在这里测试。

说明

q__    e# Read input and make two copies.
1m>    e# Rotate the second copy one character to the right.
.{er}  e# For each pair of characters from the second and third string,
       e# replace occurrences of the first with the second.

9

TeaScript,17个字节19 21 24

TeaScript是用于高尔夫的JavaScript

xd(#lg(i,xC(1#a))

好又短

在线尝试(注意输入中是否包含空格)

取消说明

x.reduce     // Reduce over input
  (#         // Anonymous function expands to ((l,i,a)=>
    l.g(        // global replace...
     i          // replace var i with...
     x.cycle(1) // Cycle x 1
     [a]        // At position a
    )
  )

7

JavaScript ES6,69个字节

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


3
您可以跳过F=字节数中的。
Ypnypn 2015年

@Ypnypn感谢当他们不指定这些东西时永远不知道该怎么做
George Reith

s.slice(i-1)[0]不等于s.slice(i-1,i)
edc65

1
@ edc65不行,当i=0
George Reith

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

k2-17个字符

函数带有1个参数。

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

K2有一个称为内置_ssr用于小号特林小号操作搜索和- [R E放置。_ssr[x;y;z]会发现yx与更换z。因此,我们/通常将此功能折叠到我们要进行的每个替换上。对于那些不熟悉折叠的人(例如在函数式编程中),基本上 _ssr/[x; (y1; y2; y3); (z1; z2; z3)]变成_ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]。字符串是其字符的列表,因此我们可以简单地将输入旋转后一步并获得替换内容,然后直接插入。

  {_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

蟒蛇,67 64 62 57字节

简单的解决方案,将研究以缩短此时间。感谢@RandyC节省了5个字节。

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

输入应使用引号。


您可以节省一些字节,[:-1]因为zip会被截断到最短的可迭代时间。
兰迪2015年

@RandyC哇,打个招呼!谢谢。
卡德,2015年

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

与Christian的解决方案非常相似,但是使用map了这样一个事实:zip如果列表的长度不相等,则会忽略多余的元素。它折叠替换列表(在表格上(from,to)),通过r在每个字母上映射手写的替换函数来更新字符串。

该表达式flip$map.r是使用LambdaBot的“ Pointless”插件派生的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.