Для данной строки вы должны переместить каждую букву (начиная с первой буквы) по ее позиции в алфавите. Если вы достигнете конца строки, вы должны обернуть вокруг. Номера буквы не должны быть перемещены.
Пример:
Dog
D
это четвертая буква в алфавите, поэтому мы переместим ее на четыре точки вправо. После переноса это меняет строку на oDg
. o
это 15-я буква, (15 mod 3) = 0, поэтому она не двигается. g
7-ая буква - (7 mod 3) = 1, поэтому строка становится goD
.
hi*bye
h
это 8-я буква, переместите ее на 8 позиций -hi*bye
=>i*hbye
i
это 9-я буква, переместите ее на 9 позиций -i*hbye
=>*hbiye
b
2-я буква, переместите ее на 2 точки -*hbiye
=>*hiybe
y
это 25-я буква, переместите ее на 25 позиций -*hiybe
=>*hibye
e
это 5-я буква, переместите ее на 5 позиций -*hibye
=>*hibey
Не буквы должны быть перемещены, но они все еще занимают место.
cat
=>tca
F.U.N
=>.F.NU
mississippi
=>msiisppssii
Ответы:
CJam,
444240 байтВывод содержит завершающий перевод строки.
Проверьте это здесь.
объяснение
Вместо того, чтобы перемещать буквы по строке, я несколько раз удаляю буквы, поворачиваю строку соответственно, а затем снова вставляю буквы. Для этого есть одна загвоздка: нам нужно уметь отличать начало строки от конца строки (что мы не можем сделать после простого поворота). Вот почему мы вставляем перевод строки в конец как защитный символ (буква перед переводом строки является концом строки, буква после ее начала). Бонус в том, что это автоматически возвращает окончательную строку в правильное вращение, где перевод строки фактически находится в конце строки.
Чтобы понять, почему это оказывается в правильном положении, рассмотрим последнюю итерацию
hi*bye
примера. После того как мы обработалиe
, перечисляемая строка находится в этой позиции:Сначала мы разбиваем строку и объединяем части в обратном порядке:
Теперь перевод строки будет либо в начале, либо в конце этой строки. Но так как перевод строки является просто защитой, которая отмечает конец строки, это означает, что символы на самом деле в правильном порядке. Теперь перевод строки не является буквой, поэтому массив вообще не вращается. Таким образом, когда мы добавляем перевод строки, он идет туда, где он принадлежит, и все в том порядке, в котором мы ищем:
Некоторые дополнительные результаты, если кто-то хочет сравнить более длинные тестовые случаи:
Мне нравится этот последний. :)
источник
Рубин 125
130 132 139байтДемоверсия онлайн с тестами: http://ideone.com/GYJm2u
Начальная (версия без игры): http://ideone.com/gTNvWY
Редактировать: Большое спасибо Manatwork за его предложения!
Редактировать 2 : исправлено количество символов (я изначально считал окончания строки CRLF)
источник
c.upcase.ord-64
→c.ord%32
.a.join
??? Кто ты и что ты сделал с w0lf? Он наверняка напишет это такa*''
.while ... end
в своем коде что забыл это сделать. Спасибо, что заметили!while ... end
в(...)while ...
?Python 3,
278275273270260258249248243238 байтЯ должен действительно гольф это вниз лучше, но вот мое решение, с благодарностью katenkyo за помощь с логикой и Cyoce и Mego за помощь с игрой в гольф.
Изменить: Наконец, я получил это в одном утверждении сравнения. WOO! (И да, я мог бы переместить это
z=-z
вa,m=m,a
бит, но это не спасет байты, и это запутало код больше, чем я думал, было необходимо)Изменить: Счетчик байтов был выключен.
Ungolfed:
источник
p[j][0]
может быть уменьшена путем установкиJ=p[j];
в начале, а затем заменить экземплярыp[j][0]
сP[0]
p
напрямую, а не переменной, которая была емуp[j]
назначена. Кроме того, если вы посмотрите мою историю изменений, у меня была переменнаяk = p[j][0]
дляa<=k<=m
сравнения, но оказалось, что отбрасываниеk
было лучше, потому что я сохранил больше байтов на отступах из дополнительной строки, чтобы установить,k
чем я сохранил с помощьюk
.