Замініть рядок самим собою!


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)

Четвертий приклад:

Input: xy
Output: xx

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

Позначення:

  • Рядок x містить лише рядкові буквено-цифрові символи та пробіли
  • Це тому найкоротший код у байтах виграє!

Чи відповідають мої правки вашій початковій ідеї?
LegionMammal978

Здається, добре, я сподіваюся, що люди розуміють, що кожен раунд в основному зашифровує зашифрований рядок, замінюючи символи кожного раунду. На прикладах це ясно, тому я думаю, що вони будуть.
Thomas W

Відповіді:



9

TeaScript , 17 байт 19 21 24

TeaScript - це JavaScript для гольфу

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

Приємний і короткий

Спробуйте в Інтернеті (стежте за тим, як вводити пробіли у вводі)

Недоліковані та пояснення

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
Джордж Рейт

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 char

Функція приймає 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

Пітона, 67 64 62 57 байт

Просте рішення, розбереться в чомусь, щоб скоротити це. Завдяки @RandyC за збереження 5 байт.

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

Введення має бути в лапках.


Ви можете заощадити кілька байтів, скинувши [:-1]так, як zip-скорочення перетворюється на найкоротший ітерабельний.
Ренді

@RandyC Вау, хороший дзвінок! Спасибі.
Каде

1

Хаскелл, 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 "Безглуздо".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.