แทนที่สตริงด้วยตัวเอง!


24

แทนที่สตริงด้วยตัวเอง

เป้าหมายของคุณคือการแทนที่สตริงด้วยตัวเองโดยแทนที่อักขระแต่ละตัวในสตริงเดิมด้วยอักขระที่อยู่ข้างหน้าเริ่มต้นด้วยอักขระตัวแรกและล้อมรอบ นี่คือตัวอย่างบางส่วนเพื่อแสดงสิ่งที่ฉันหมายถึง:

ตัวอย่างที่ 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)

ตัวอย่างที่ 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)

ตัวอย่างที่ 3:

Input: x
Output: x

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

ตัวอย่างที่ 4:

Input: xy
Output: xx

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

Sidenotes:

  • สตริงxจะมีตัวอักษรผสมตัวเลขและช่องว่างเล็ก ๆ เท่านั้น
  • นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

การแก้ไขของฉันตรงกับความคิดดั้งเดิมของคุณหรือไม่?
LegionMammal978

ดูเหมือนว่าดีฉันหวังว่าผู้คนเข้าใจว่าทุกรอบพวกเขาเข้ารหัสสตริงที่เข้ารหัสโดยแทนที่ตัวละครทุกรอบ ตัวอย่างทำให้ชัดเจนดังนั้นฉันคิดว่าพวกเขาจะ
โทมัส W

คำตอบ:



9

TeaScript , 17 ไบต์19 21 24

TeaScript เป็น JavaScript สำหรับเล่นกอล์ฟ

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

ดีและสั้น

ลองออนไลน์ (ดูช่องว่างต่อท้ายในอินพุต)

Ungolfed & คำอธิบาย

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 ไบต์

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


3
คุณสามารถข้ามF=จำนวนไบต์ของคุณได้
Ypnypn

@Ypnypn ขอบคุณไม่รู้จะทำอย่างไรเมื่อพวกเขาไม่ได้ระบุสิ่งนี้
จอร์จเร ธ

s.slice(i-1)[0]ไม่เท่ากับs.slice(i-1,i)?
edc65

1
@ edc65 ไม่เมื่อไหร่i=0
George Reith

3

ทับทิม, 50 48 ไบต์

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

ทดสอบ:

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



3

k2 - 17 ตัวอักษร

ฟังก์ชั่นรับ 1 อาร์กิวเมนต์

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

k2 มีในตัวที่เรียกว่า_ssrสำหรับS tring S earch และR eplace _ssr[x;y;z]จะพบyในและแทนที่ด้วยx zดังนั้นเราจึงใช้/เพื่อพับฟังก์ชั่นนี้แทนแต่ละสิ่งที่เราต้องการ สำหรับผู้ที่ไม่คุ้นเคยกับการพับ (ในขณะที่เขียนโปรแกรมการทำงาน) เป็นหลัก จะกลายเป็น_ssr/[x; (y1; y2; y3); (z1; z2; z3)] _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]สตริงเป็นรายการอักขระของพวกเขาดังนั้นเราอาจหมุนอินพุตกลับไปหนึ่งขั้นตอนและรับการแทนที่และเสียบขวา

  {_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 ไบต์

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

น่าเสียดายที่ Haskell ไม่มีฟังก์ชั่นการทดแทนแบบบิลด์อิน


2

PHP, 76 ไบต์

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

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

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 ไบต์

การแก้ปัญหาที่ตรงไปตรงมาจะมีลักษณะเป็นสิ่งที่สั้น ขอบคุณ @RandyC สำหรับการบันทึก 5 ไบต์

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

อินพุตควรอยู่ในเครื่องหมายคำพูด


คุณสามารถบันทึกไม่กี่ไบต์ที่ปล่อย[:-1]ตั้งแต่ซิปตัดให้สั้นที่สุด iterable
แรนดี้

@RandyC ว้าวโทรดีมาก! ขอบคุณ
Kade

1

Haskell, 58 ไบต์

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

ค่อนข้างคล้ายกับวิธีแก้ปัญหาของคริสเตียน แต่ใช้mapและความจริงที่ว่าzipไม่สนใจองค์ประกอบที่ไม่จำเป็นหากรายการมีความยาวไม่เท่ากัน มันพับผ่านรายการของการแทนที่ (บนแบบฟอร์ม(from,to)) อัพเดตสตริงโดยการแม็พฟังก์ชันการแทนที่ด้วยมือที่เขียนrด้วยตัวอักษรแต่ละตัว

นิพจน์flip$map.rได้มาจากการใช้ปลั๊กอิน "ไม่มีจุดหมาย" ของ LambdaBot

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.