Письма, двигайся! Pt. 2

14

Первые письма, двигайся! был очень популярен, но имел ограниченное участие. Этот будет легче решить, но мы надеемся привлечь некоторые уловки в гольф.

Вам дана строка только строчных букв. Для каждой буквы с положением в алфавите m переместите ее так, чтобы она стала m- й буквой с конца. Если значение m больше длины строки, переместите ее в самое начало. Выведите только полностью преобразованную строку.

Примеры:

"жирафа"

  • «g» - седьмая буква в алфавите, это уже седьмая буква сзади, поэтому оставьте ее.
  • «i» - это 9-я буква, так как 9 больше длины слова, оно идет вперед, поэтому строка становится igraffe
  • «r» - это 18-я буква, как и «i», она идет вперед: rigaffe
  • «а» - это первая буква, она идет до самого конца: rigffea
  • 'f' - это 6-я буква, она становится 6-й сзади: rfigfea
  • следующая буква «f» также является шестой буквой, поэтому она также идет к шестой букве сзади: rffigea
  • «е» - 5-е буквы, оно идет к 5-м сзади: rfefiga

"цветок"

  • 'f' (6) => flower
  • 'l' (12) => lfower
  • 'o' (15) => olfwer
  • 'w' (23) => wolfer
  • 'e' (5) => weolfr
  • 'r' (18) => rweolf

"ананас"

  • 'p' (16) => pineapple
  • 'i' (9) => ipneapple
  • 'n' (14) => nipeapple
  • 'e' (5) => nipaepple
  • 'a' (1) => nipepplea
  • 'p' (16) => pnipeplea
  • 'p' (16) => ppnipelea
  • 'l' (12) => lppnipeea
  • 'e' (5) => lppneipea(убедитесь, что вы переместили e, которое еще не было перемещено! Здесь это не имеет значения, но ниже это имеет значение.)

Спасибо @Neil за улучшение тестовых случаев с этими 3 дополнениями:

"пицца"

  • 'p' (16) => pizza
  • 'i' (9) => ipzza
  • 'z' (26) => zipza
  • 'z' (26) => zzipa(двигая второй z!)
  • 'a' (1) => zzipa

«Абракадабра»

  • 'a' (1) => bracadabraa
  • 'b' (2) => racadabraba
  • 'r' (18) => racadabraba
  • 'a' (1) => rcadabrabaa
  • 'c' (3) => radabrabcaa
  • 'a' (1) => rdabrabcaaa
  • 'd' (4) => rabrabcdaaa
  • 'a' (1) => rbrabcdaaaa
  • 'b' (2) => rrabcdaaaba
  • 'r' (18) => rrabcdaaaba
  • 'a' (1) => rrbcdaaabaa

"персонажи"

  • 'c' (3) => haractecrs
  • 'h' (8) => arhactecrs
  • 'a' (1) => rhactecrsa
  • 'r' (18) => rhactecrsa
  • 'a' (1) => rhctecrsaa
  • 'c' (3) => rhtecrscaa
  • 't' (20) => trhecrscaa
  • 'e' (5) => trhcrescaa
  • 'r' (18) => rtrhcescaa
  • 's' (19) => srtrhcecaa
geokavel
источник

Ответы:

9

CJam, 41 38 байт

lee_S+W%\{Xa-X1='`-/(Xa+\L*+}fX1>W%1f=

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

Мартин Эндер
источник
Upvoting - единственный ответ, который работает на всех моих тестовых примерах.
Нил
Самое короткое время для прохождения всех тестовых случаев!
геокавель
4

Python 3, 78 байт.

Сохранено 2 байта благодаря orlp.
Сохранено 7 байтов благодаря DSM.

x=input()
y=[]
for z in x:m=max(len(x)-ord(z)+96,0);y[m:m]=z
print(''.join(y))

Создает слово в виде списка, а затем присоединяется к нему.

Морган Трепп
источник
(q-p,0)[p>q]длиннее чем min(q-p,0).
orlp
Это так, но это не то же самое. Это всегда собирается вернуть 0 или отрицательный.
Морган Трепп
Извини, я имел ввиду max(q-p,0).
orlp
3

Python 2, 86 байт

a=input();k=list(a)
for i in a:k.remove(i);k.insert(ord(i)-97,i)
print"".join(k)[::-1]

Python 3, 88 байт

a=input();k=list(a)
for i in a:k.remove(i);k.insert(ord(i)-97,i)
print("".join(k)[::-1])

Примеры

Python 2:

$ python2 test.py
"flower"
rweolf

Python 3:

$ python3 test.py
flower
rweolf
Зак Гейтс
источник
3
k.removeудаляет первый экземпляр, так что это не удастся для чего-то вроде baa.
Sp3000
2

Javascript ES6, 136 134 131 байт

s=>([...s].map(c=>{s=s.replace(c,'');p=s.length+97-c.charCodeAt();s=s.substr(0,p)+c.toUpperCase()+s.substring(p)}),s.toLowerCase())

Обратите внимание, что я очень стараюсь не перемещать одного и того же персонажа дважды, в противном случае pizzaпревращается в то, zipzaчто должно бытьzzipa . Есть также крайний случай, касающийся недопущения преждевременного удаления символов; charactersстановится возможно srtrchaeacили srtrheccaaесли вы делаете это неправильно, но это должно быть srtrhcecaa. Другое хитрое слово, abracadabraдля которого вывод rrabaaadcbaбудет неправильным; rrbcdaaabaaбыло бы правильно.

Редактировать: сбрил два байта с помощью подстроки, которая автоматически приводит свои аргументы к диапазону 0 .. длины.

Редактировать: сбрил три байта, изменив первую подстроку на substr, как предложено пользователем 81665.

Нил
источник
Я думаю, что вы могли бы использовать substrвместо substring.
user81655
sliceлучше (я думаю).
Mama Fun Roll
@ ՊՓԼՃՐՊՃՈԲՍԼ Он не может, потому что передача отрицательных чисел sliceломает его.
user81655
о, забыл об этом.
Mama Fun Roll
Да, была небольшая ошибка в pizzaтесте, который вы поместили на мой пост, но я исправил это.
геокавель
1

Pyth, 18 17 байтов

uXeS,Z-lzhx;HGHzk

Тестирование .

Выполняет итерации с использованием сокращения по входной строке, вставляя в строку пустую строку базового случая в правильной позиции.

Maltysen
источник
1

𝔼𝕊𝕄𝕚𝕟, 23 символа / 40 байтов

ᴉⓜΞăМƲ ïꝈ-ᶛą$,0),0,$;Ξ⨝

Try it here (Firefox only).

объяснение

ᴉⓜΞăМƲ ïꝈ-ᶛą$,0),0,$;Ξ⨝ // implicit: ï=input, ᴉ=input split into chars, Ξ=empty array, ᶛ=lowercase alphabet
ᴉⓜ                      // map over input chars
   ΞăМƲ ïꝈ-ᶛą$,0),0,$;   // use splice to insert map item into Ξ at requested index
                      Ξ⨝ // join Ξ
                         // implicit output
Mama Fun Roll
источник