Gantikan string dengan sendirinya!

24

Ganti string dengan dirinya sendiri

Tujuan Anda adalah mengganti string dengan dirinya sendiri dengan mengganti setiap karakter dalam string asli dengan yang sebelumnya, dimulai dengan karakter pertama dan membungkusnya. Berikut adalah beberapa contoh untuk menunjukkan apa yang saya maksud:

Contoh 1:

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)

Contoh 2:

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)

Contoh 3:

Input: x
Output: x

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

Contoh 4:

Input: xy
Output: xx

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

Sidenotes:

  • String xhanya akan berisi karakter dan spasi alfanumerik huruf kecil
  • Ini adalah sehingga kode terpendek dalam byte menang!
Thomas W
sumber
Apakah hasil edit saya cocok dengan ide awal Anda?
LegionMammal978
Tampaknya baik-baik saja, saya harap orang-orang mengerti bahwa setiap putaran pada dasarnya mereka mengenkripsi string terenkripsi dengan mengganti karakter setiap putaran. Contoh-contoh membuat ini jelas, jadi saya pikir mereka akan melakukannya.
Thomas W

Jawaban:

20

CJam, 11 byte

q__1m>.{er}

Uji di sini.

Penjelasan

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
sumber
9

TeaScript , 17 byte 19 21 24

TeaScript adalah JavaScript untuk bermain golf

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

Bagus dan pendek

Cobalah online (perhatikan jejak spasi di input)

Tidak Disatukan & Penjelasan

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

JavaScript ES6, 69 byte

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

George Reith
sumber
3
Anda dapat melewati F=dalam jumlah byte Anda.
Ypnypn
@Ypnypn Terima kasih tidak pernah tahu apa yang harus dilakukan ketika mereka tidak menentukan hal ini
George Reith
s.slice(i-1)[0]tidak sama dengan s.slice(i-1,i)?
edc65
1
@ edc65 Tidak bukan kapani=0
George Reith
3

Rubi, 50 48 byte

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

Uji:

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

Mathematica, 89 75 74 57 byte

""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
LegionMammal978
sumber
""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
alephalpha
@alephalpha Terima kasih, saya mencobanya Transposedan gagal.
LegionMammal978
3

k2 - 17 char

Berfungsi mengambil 1 argumen.

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

k2 memiliki builtin yang disebut _ssrsebagai S tring S earch dan R eplace. _ssr[x;y;z]akan menemukan ydi xdan menggantinya dengan z. Jadi kami menggunakan /untuk melipat fungsi ini pada setiap penggantian yang ingin kami buat. Bagi mereka yang tidak terbiasa dengan melipat (seperti dalam pemrograman fungsional), pada dasarnya _ssr/[x; (y1; y2; y3); (z1; z2; z3)]menjadi _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]. String adalah daftar karakter mereka, jadi kami dapat memutar input satu langkah dan mendapatkan penggantian, dan pasang langsung.

  {_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"
algoritme hiu
sumber
2

Haskell, 76 byte

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

Sayang sekali, Haskell bahkan tidak memiliki fungsi substitusi bawaan.

Akangka
sumber
2

PHP, 76 byte

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

Ini adalah versi yang tidak dikoleksi:

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

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

    echo str_replace($splitOriginalString, $splitShiftedString, $originalString);
}
Lubang hitam
sumber
2

Python, 67 64 62 57 Bytes

Solusi mudah, akan mencari sesuatu untuk mempersingkat ini. Terima kasih kepada @RandyC karena telah menghemat 5 byte.

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

Masukan harus dalam tanda kutip.

Kade
sumber
Anda dapat menyimpan beberapa byte dengan menjatuhkan [:-1]zip sejak terpotong ke iterable terpendek.
Randy
@RandyC Wow, panggilan bagus! Terima kasih.
Kade
1

Haskell, 58 byte

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

Cukup mirip dengan solusi Christian, tetapi menggunakan mapdan fakta yang zipmengabaikan elemen berlebihan jika daftar memiliki panjang yang tidak sama. Ini melipat melalui daftar penggantian (pada formulir (from,to)), memperbarui string dengan memetakan fungsi penggantian tulisan tangan rpada setiap huruf.

Ekspresi flip$map.rini diturunkan menggunakan plugin "Pointless" LambdaBot.

Hjulle
sumber