Kendisiyle bir dize değiştirin!


24

Kendisiyle bir dize yerine

Amacınız, orijinal karakterdeki her karakteri ilk karakterden başlayarak, ilk karakterden başlayıp etrafına sararak bir karakter dizisi ile değiştirmek. İşte ne demek istediğimi göstermek için bazı örnekler:

1. örnek:

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. örnek:

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. örnek:

Input: x
Output: x

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

4. örnek:

Input: xy
Output: xx

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

Sidenotes:

  • Dize xyalnızca küçük harf alfasayısal karakterler ve boşluklar içerecektir
  • Bu yani bayt cinsinden en kısa kod kazanır!

Düzenlemelerim orijinal fikrinize uyuyor mu?
LegionMammal978

Görünüşe göre, insanlar her turun temelde şifreli bir dizgiyi her turda karakter değiştirerek şifrelediklerini anlarlar. Örnekler bunu açıkça ortaya koyuyor, sanırım yapacaklar.
Thomas W

Yanıtlar:


20

CJam, 11 bayt

q__1m>.{er}

Burada test et.

açıklama

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

TeaScript golf oynamak için JavaScript

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

Güzel ve kısa

Çevrimiçi deneyin (girişteki boşluktaki boşlukları izleyin)

Ungolfed ve Açıklama

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 bayt

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


3
F=Bayt sayınızda atlayabilirsiniz .
Ypnypn

@Ypnypn Teşekkürler, böyle bir şey belirtmediğinde ne yapacağını asla bilemezsin
George Reith

s.slice(i-1)[0]Eşit değil s.slice(i-1,i)mi?
edc65

1
@ edc65 Hayır, ne zaman hayıri=0
George Reith

3

Yakut, 50 48 bayt

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

Ölçek:

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

3

Mathematica, 89 75 74 57 bayt

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

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

@alephalpha Teşekkürler, bunu denedim Transposeve başaramadım.
LegionMammal978


3

k2 - 17 karakter

İşlev 1 argümanı alıyor.

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

k2 adlı bir yerleşiği olan _ssriçin S tring S ve hafızaya R eplace. _ssr[x;y;z]bulacaksınız yiçinde xve ile değiştirin z. Bu yüzden, /bu işlevselliği yapmak istediğimiz her değiştirme üzerine katlıyoruz. Katlamaya aşina olmayanlar için (fonksiyonel programlamadaki gibi), esasen _ssr/[x; (y1; y2; y3); (z1; z2; z3)]olur _ssr[_ssr[_ssr[x; y1; z1]; y2; z2]; y3; z3]. Dizeler, karakterlerinin listeleridir, bu nedenle girişi bir adım geri döndürüp değiştirmeleri alabilir ve doğrudan girebiliriz.

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

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

Çok kötü, Haskell'in yerleşik bir ikame işlevi bile yok.


2

PHP, 76 bayt

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

İşte ungolfed versiyonu:

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 Bayt

Basit çözüm, bunu kısaltacak bir şeye bakacaktır. 5 bayt kaydettiğiniz için @RandyC'ye teşekkürler.

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

Giriş tırnak içinde olmalıdır.


[:-1]Zip kesildiğinden en kısa yinelenebilir olana dek birkaç bayttan tasarruf edebilirsiniz .
Randy

@RandyC Wow, iyi çağrı! Teşekkürler.
Kade

1

Haskell, 58 bayt

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

Christian'ın çözümüne oldukça benzer, ancak kullanımı mapve ziplisteler eşit olmayan uzunluktaysa gereksiz unsurları görmezden gelmesi gerçeği . Her harfe (from,to)elle yazılan değiştirme fonksiyonunu eşleyerek dizgeyi güncelleyerek, değişim listesine (formda ) katlanır r.

İfade flip$map.rLambdaBot'un "Pointless" eklentisi kullanılarak türetildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.