Подставь строку с собой!

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

Ответы:

20

CJam, 11 байт

q__1m>.{er}

Проверьте это здесь.

объяснение

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 байтов 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
    )
  )
Downgoat
источник
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"
daniero
источник
3

Mathematica, 89 75 74 57 байт

""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
LegionMammal978
источник
""<>Fold[#/.#2&,c=Characters@#,Thread[c->RotateRight@c]]&
алефальфа
@alephalpha Спасибо, я попробовал это с Transposeи потерпел неудачу.
LegionMammal978
3

к2 - 17 символов

Функция принимает 1 аргумент.

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

k2 имеет встроенную команду под названием _ssrдля S Тринг S нить поиск и 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"
algorithmshark
источник
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 даже нет встроенной функции подстановки.

Akangka
источник
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]удаляя символ zip, урезая его до самой короткой итерации.
Рэнди
@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 «Pointless».

Hjulle
источник