Substitua uma string por ela mesma!


24

Substitua uma string por ela mesma

Seu objetivo é substituir uma string por ela mesma, substituindo cada caractere na string original pelo anterior, começando pelo primeiro caractere e contornando-o. Aqui estão alguns exemplos para mostrar o que quero dizer:

1º exemplo:

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)

Segundo exemplo:

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)

Terceiro exemplo:

Input: x
Output: x

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

Quarto exemplo:

Input: xy
Output: xx

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

Sidenotes:

  • A sequência xconterá apenas caracteres alfanuméricos e espaços em minúsculas
  • Este é o pelo que o código mais curto em bytes vence!

Minhas edições correspondem à sua ideia original?
usar o seguinte

Parece bom, espero que as pessoas entendam que a cada rodada eles basicamente criptografam uma string criptografada substituindo caracteres a cada rodada. Os exemplos deixam isso claro, então acho que sim.
Thomas W

Respostas:


20

CJam, 11 bytes

q__1m>.{er}

Teste aqui.

Explicação

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 é JavaScript para jogar golfe

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

Agradável e curto

Experimente online (observe os espaços em branco à direita na entrada)

Ungolfed & Explicação

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
Você pode pular a F=contagem de bytes.
Ypnypn

@Ypnypn Os agradecimentos nunca sabem o que fazer quando não especificam essas coisas.
George Reith

s.slice(i-1)[0]não é igual a s.slice(i-1,i)?
Edc65 26/10/2015

11
@ edc65 Não, não quandoi=0
George Reith

3

Rubi, 50. 48 bytes

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

Teste:

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



3

k2 - 17 car

Função tendo 1 argumento.

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

k2 tem um builtin chamado _ssrde S tring S earch e R moran Jr.. _ssr[x;y;z]vai encontrar yno xe substituí-lo z. Então, usamos /para dobrar essa funcionalidade sobre cada substituição que queremos fazer. Para aqueles que não estão familiarizados com a dobragem (como na programação funcional), basicamente _ssr/[x; (y1; y2; y3); (z1; z2; z3)]se torna _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]. Strings são listas de seus caracteres, portanto, podemos simplesmente girar a entrada de volta um passo, obter as substituições e conectar.

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

Pena, Haskell nem sequer tem uma função de substituição embutida.


2

PHP, 76 bytes

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

Aqui está a versão não destruída:

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

Solução simples, vai procurar algo para encurtar isso. Obrigado a @RandyC por salvar 5 bytes.

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

A entrada deve estar entre aspas.


Você pode salvar alguns bytes, deixando o [:-1]zip truncado para o menor iterável.
Randy

@RandyC Uau, boa chamada! Obrigado.
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

Bem parecido com a solução de Christian, mas usar mape o fato de zipignorar elementos supérfluos se as listas tiverem comprimento desigual. Ele se dobra na lista de substituições (no formulário (from,to)), atualizando a sequência mapeando a função de substituição escrita à mão rem cada letra.

A expressão flip$map.rfoi derivada usando o plug-in "Pointless" do LambdaBot.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.