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!

¿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.

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

7

JavaScript ES6, 69 bytes

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


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"

3

Mathematica, 89 75 74 57 bytes

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

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

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.


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

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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.