Zastąp ciąg samym sobą!

24

Zastąp ciąg samym sobą

Twoim celem jest zastąpienie łańcucha samym sobą poprzez zastąpienie każdego znaku w oryginalnym ciągu poprzednim, zaczynając od pierwszego znaku i zawijając go. Oto kilka przykładów, które pokazują, co mam na myśli:

Pierwszy przykład:

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)

Drugi przykład:

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)

Trzeci przykład:

Input: x
Output: x

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

Czwarty przykład:

Input: xy
Output: xx

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

Sidenotes:

  • Ciąg xbędzie zawierał tylko małe litery i spacje alfanumeryczne
  • To jest więc wygrywa najkrótszy kod w bajtach !
Thomas W.
źródło
Czy moje edycje pasują do Twojego oryginalnego pomysłu?
LegionMammal978,
Wydaje się w porządku, mam nadzieję, że ludzie rozumieją, że w każdej rundzie po prostu szyfrują zaszyfrowany ciąg znaków, zastępując postacie w każdej rundzie. Przykłady wyjaśniają to, więc myślę, że tak.
Thomas W

Odpowiedzi:

20

CJam, 11 bajtów

q__1m>.{er}

Sprawdź to tutaj.

Wyjaśnienie

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
źródło
9

TeaScript , 17 bajtów 19 21 24

TeaScript to JavaScript do gry w golfa

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

Miło i krótko

Wypróbuj online (uważaj na końcowe białe znaki na wejściu)

Niegolfowane i objaśnienie

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
źródło
7

JavaScript ES6, 69 bajtów

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

George Reith
źródło
3
Możesz pominąć F=liczbę bajtów.
Ypnypn
@Ypnypn Dzięki nigdy nie wiem, co robić, gdy nie określają tego
George Reith,
s.slice(i-1)[0]nie jest równy s.slice(i-1,i)?
edc65
1
@ edc65 Nie, nie kiedyi=0
George Reith
3

Rubin, 50 48 bajtów

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

Test:

f=->s{t=s.dup;t.size.times{|i|t.tr!s[i],s[i-1]};t}
f["program"]
=> "apgopra"
daniero
źródło
3

Mathematica, 89 75 74 57 bajtów

""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
LegionMammal978
źródło
""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
alephalpha
@alephalpha Dzięki, próbowałem tego Transposei nie udało się.
LegionMammal978,
3

k2 - 17 znaków

Funkcja przyjmująca 1 argument.

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

K2 wbudowany ekwiwalent zwaną _ssrdla S tring S earch i R EUmieãæ. _ssr[x;y;z]znajdzie ysię xi wymienić ją z. Używamy więc /tej funkcji do złożenia każdego zamiennika, który chcemy wykonać. Dla tych, którzy nie są zaznajomieni ze składaniem (jak w programowaniu funkcjonalnym), w istocie _ssr/[x; (y1; y2; y3); (z1; z2; z3)]staje się _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]. Ciągi są listami ich znaków, więc możemy po prostu obrócić wejście z powrotem o krok, uzyskać zamienniki i podłączyć się od razu.

  {_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"
algorytmshark
źródło
2

Haskell, 76 bajtów

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

Szkoda, że ​​Haskell nie ma nawet wbudowanej funkcji zastępowania.

Akangka
źródło
2

PHP, 76 bajtów

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

Oto wersja bez golfa:

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

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

    echo str_replace($splitOriginalString, $splitShiftedString, $originalString);
}
Czarna dziura
źródło
2

Python, 67 64 62 57 bajtów

Proste rozwiązanie, znajdzie coś, co może to skrócić. Dzięki @RandyC za oszczędność 5 bajtów.

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

Dane wejściowe powinny być w cudzysłowach.

Kade
źródło
Możesz zaoszczędzić kilka bajtów, upuszczając, [:-1]ponieważ zip skraca się do najkrótszej iterowalnej.
Randy,
@RandyC Wow, dobra rozmowa! Dzięki.
Kade
1

Haskell, 58 bajtów

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

Całkiem podobne do rozwiązania Christiana, ale używając mapi fakt, że zipignoruje zbędne elementy, jeśli listy mają nierówną długość. Składa listę zamienników (w formularzu (from,to)), aktualizując ciąg, mapując ręcznie napisaną funkcję zastępczą rna każdą literę.

Wyrażenie flip$map.rwyprowadzono za pomocą wtyczki „Pointless” LambdaBot.

Hjulle
źródło