Sustituir una cadena con sí mismo!

24

Sustituir una cadena consigo mismo

Su objetivo es sustituir una cadena por sí misma reemplazando cada carácter de la cadena original con el anterior, comenzando con el primer carácter y terminando. Aquí hay algunos ejemplos para mostrar lo que quiero decir:

1er ejemplo:

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)

2do ejemplo:

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)

3er ejemplo:

Input: x
Output: x

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

4to ejemplo:

Input: xy
Output: xx

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

Notas al margen:

  • La cadena xsolo contendrá caracteres alfanuméricos en minúscula y espacios
  • Este es el código más corto en bytes gana!
Thomas W
fuente
¿Mis ediciones coinciden con su idea original?
LegionMammal978
Parece estar bien, espero que la gente entienda que en cada ronda básicamente encriptan una cadena encriptada reemplazando los caracteres en cada ronda. Los ejemplos lo aclaran, así que creo que lo harán.
Thomas W

Respuestas:

20

CJam, 11 bytes

q__1m>.{er}

Pruébalo aquí.

Explicación

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.
Martin Ender
fuente
9

TeaScript , 17 bytes 19 21 24

TeaScript es JavaScript para jugar al golf

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

Agradable y corto

Pruébelo en línea (observe los espacios en blanco finales en la entrada)

Sin Golf y Explicación

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

JavaScript ES6, 69 bytes

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

George Reith
fuente
3
Puede omitir el F=recuento de bytes.
Ypnypn
@Ypnypn Gracias nunca se sabe qué hacer cuando no especifican estas cosas
George Reith
s.slice(i-1)[0]no es igual a s.slice(i-1,i)?
edc65 26/10/2015
1
@ edc65 No, no cuandoi=0
George Reith
3

Rubí, 50 48 bytes

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

Prueba:

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

Mathematica, 89 75 74 57 bytes

""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
LegionMammal978
fuente
""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
alephalpha
@alephalpha Gracias, probé eso Transposey fallé.
LegionMammal978
3

k2 - 17 caracteres

Función tomando 1 argumento.

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

k2 tiene una orden interna del llamado _ssrpara S Tring S earch y R eplace. _ssr[x;y;z]encontrarán yen xy sustituirla por z. Así que usamos /para plegar esta funcionalidad sobre cada reemplazo que queremos hacer. Para aquellos que no están familiarizados con el plegado (como en la programación funcional), esencialmente se _ssr/[x; (y1; y2; y3); (z1; z2; z3)]convierte _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]. Las cadenas son listas de sus caracteres, por lo que simplemente podemos girar la entrada un paso atrás y obtener los reemplazos, y enchufarlos.

  {_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"
Algoritmo de tiburón
fuente
2

Haskell, 76 bytes

[]#_=[];(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

Lástima, Haskell ni siquiera tiene una función de sustitución incorporada.

Akangka
fuente
2

PHP, 76 bytes

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

Aquí está la versión sin golf:

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

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

    echo str_replace($splitOriginalString, $splitShiftedString, $originalString);
}
Agujero negro
fuente
2

Python, 67 64 62 57 Bytes

Solución directa, buscará algo para acortar esto. Gracias a @RandyC por guardar 5 bytes.

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

La entrada debe estar entre comillas.

Kade
fuente
Puede guardar algunos bytes dejando caer el [:-1]zip ya que se trunca al iterable más corto.
Randy
@RandyC Wow, ¡buena llamada! Gracias.
Kade
1

Haskell, 58 bytes

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

Bastante similar a la solución de Christian, pero usando mapy el hecho de que zipignora elementos superfluos si las listas son de longitud desigual. Se pliega a través de la lista de reemplazos (en el formulario(from,to) ), actualizando la cadena mapeando la función de reemplazo escrita a mano ren cada letra.

La expresión flip$map.rse derivó utilizando el complemento "Pointless" de LambdaBot.

Hjulle
fuente