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


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

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

к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"

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]удаляя символ 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».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.