Thay thế một chuỗi với chính nó!


24

Thay thế một chuỗi với chính nó

Mục tiêu của bạn là thay thế một chuỗi bằng chính nó bằng cách thay thế từng ký tự trong chuỗi ban đầu bằng chuỗi trước nó, bắt đầu bằng ký tự đầu tiên và bao quanh. Dưới đây là một số ví dụ để cho thấy những gì tôi muốn nói:

Ví dụ thứ nhất:

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)

Ví dụ thứ 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)

Ví dụ thứ 3:

Input: x
Output: x

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

Ví dụ thứ 4:

Input: xy
Output: xx

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

Sidenote:

  • Chuỗi xsẽ chỉ chứa các ký tự chữ và số viết thường
  • Đây là để mã ngắn nhất tính theo byte thắng!

Các chỉnh sửa của tôi có phù hợp với ý tưởng ban đầu của bạn không?
LegionMammal978

Có vẻ ổn, tôi hy vọng mọi người hiểu rằng mỗi vòng họ về cơ bản mã hóa một chuỗi được mã hóa bằng cách thay thế các ký tự mỗi vòng. Các ví dụ làm rõ điều này, vì vậy tôi nghĩ họ sẽ làm được.
Thomas W

Câu trả lời:


20

CJam, 11 byte

q__1m>.{er}

Kiểm tra nó ở đây.

Giải trình

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 byte 19 21 24

TeaScript là JavaScript để chơi gôn

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

Đẹp và ngắn

Dùng thử trực tuyến (xem khoảng trắng ở đầu vào)

Ungolfed & Giải thích

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 byte

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


3
Bạn có thể bỏ qua số F=byte của bạn.
Ypnypn

@Ypnypn Cảm ơn không bao giờ biết phải làm gì khi họ không chỉ định nội dung này
George Reith

s.slice(i-1)[0]không bằng s.slice(i-1,i)?
edc65

1
@ edc65 Không không khi nàoi=0
George Reith

3

Hồng ngọc 50 48 byte

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

Kiểm tra:

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

3

Toán học, 89 75 74 57 byte

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

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

@alephalpha Cảm ơn, tôi đã thử Transposevà thất bại.
LegionMammal978


3

k2 - 17 char

Hàm lấy 1 đối số.

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

k2 có một dựng sẵn gọi _ssrcho S Tring S earch và R eplace. _ssr[x;y;z]sẽ tìm ytrong xvà thay thế nó bằng z. Vì vậy, chúng tôi sử dụng /để gấp chức năng này qua mỗi thay thế mà chúng tôi muốn thực hiện. Đối với những người không quen thuộc với việc gấp (như trong lập trình chức năng), về cơ bản _ssr/[x; (y1; y2; y3); (z1; z2; z3)]trở thành _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]. Chuỗi là danh sách các ký tự của chúng, vì vậy chúng tôi có thể chỉ cần xoay đầu vào lại một bước và nhận các thay thế và cắm ngay vào.

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

Quá tệ, Haskell thậm chí không có chức năng thay thế tích hợp.


2

PHP, 76 byte

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

Đây là phiên bản chưa được chỉnh sửa:

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 byte

Giải pháp đơn giản, sẽ xem xét một cái gì đó để rút ngắn điều này. Cảm ơn @RandyC đã lưu 5 byte.

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

Đầu vào nên được trích dẫn.


Bạn có thể lưu một vài byte thả [:-1]từ khi cắt ngắn zip thành lần lặp ngắn nhất.
Randy

@RandyC Wow, gọi tốt! Cảm ơn.
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

Khá giống với giải pháp của Christian, nhưng sử dụng mapvà thực tế là zipbỏ qua các yếu tố thừa nếu danh sách có độ dài không bằng nhau. Nó gấp thông qua danh sách thay thế (trên biểu mẫu (from,to)), cập nhật chuỗi bằng cách ánh xạ chức năng thay thế viết tay rtrên mỗi chữ cái.

Biểu thức flip$map.rđược bắt nguồn bằng cách sử dụng plugin "Vô nghĩa" của LambdaBot.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.