Листи, рухайся!


35

Подавши рядок, ви повинні перемістити кожну букву (починаючи з першої літери) за її положенням в алфавіті. Якщо ви досягнете кінця струни, її потрібно обернути. Нелітери не потрібно переміщувати.

Приклад:

Dog

D- четверта літера в алфавіті, тому ми рухаємо її чотирма плямами праворуч. Після обгортання, це змінює рядок на oDg. o- це 15-а літера, (15 мод 3) = 0, тому вона не рухається. g- 7-а літера - (7 mod 3) = 1, тому рядок стає goD.

hi*bye

  • h8-а літера, перемістіть її на 8 плям - hi*bye=>i*hbye
  • i- це 9-й лист, перемістіть його на 9 плям - i*hbye=>*hbiye
  • bє другою буквою, перемістіть її на 2 плями - *hbiye=>*hiybe
  • y- це 25-а літера, перемістіть її на 25 плям - *hiybe=>*hibye
  • e- це 5-а літера, перемістіть її на 5 плям - *hibye=>*hibey

Непереносити букви не потрібно, але вони все одно займають місце.

  • cat => tca
  • F.U.N => .F.NU
  • mississippi => msiisppssii

Чи потрібно робити окрему програму або якоїсь функції достатньо? Також чи треба друкувати рядок?
Katenkyo

Які символи можуть відображатися у вводі? Друкований ASCII? Лінійні подачі? Будь-який ASCII? Будь-який Unicode?
Мартін Ендер

3
Також тест з повторними літерами буде добре.
Мартін Ендер

@Martin Будь-який ASCII.
geokavel

Функція @Katenkyo дозволена. Якщо ви використовуєте функцію, то вихідним є значення повернення.
геокавель

Відповіді:


6

CJam, 44 42 40 байт

qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=

Вихідні дані містять зворотний канал.

Перевірте це тут.

Пояснення

Замість переміщення літер через рядок я кілька разів виймаю букву, відповідно обертаю рядок, а потім знову вставляю літеру. Для цього є одна увага: нам потрібно вміти відрізнити початок рядка від кінця рядка (чого ми не можемо після простого обертання). Ось чому ми вставляємо подачу рядка в кінці як захист (лист перед передачею рядків - це кінець рядка, буква після - це початок). Бонус полягає в тому, що це автоматично повертає остаточний рядок до правильного обертання, коли фактично передача рядка знаходиться в кінці рядка.

lN+     e# Read input and append a linefeed.
ee      e# Enumerate the array, so input "bob" would become [[0 'b] [1 'o] [2 'b] [3 N]]
        e# This is so that we can distinguish repeated occurrences of one letter.
_{      e# Duplicate. Then for each element X in the copy...
  Xa/   e# Split the enumerated string around X.
  ~     e# Dump the two halves onto the stack.
  \+    e# Concatenate them in reverse order. This is equivalent to rotating the current
        e# character to the front and then removing it.
  XW=   e# Get the character from X.
  eu    e# Convert to upper case.
  _     e# Duplicate.
  _el=! e# Check that convert to lower case changes the character (to ensure we have a
        e# letter).
  \'@-  e# Swap with the other upper-case copy and subtract '@, turning letters into 1 to
        e# 26 (and everything else into junk).
  *     e# Multiply with whether it's a letter or not to turn said junk into 0 (that means
        e# everything which is not a letter will be moved by 0 places).
  m<    e# Rotate the string to the left that many times.
  Xa+   e# Append X to the rotated string.
}fX
Wf=     e# Extract the character from each pair in the enumerated array.

Щоб побачити, чому це опиняється у правильному положенні, розглянемо останню ітерацію hi*byeприкладу. Після того як ми обробимо e, перелічений рядок знаходиться в такому положенні:

[[4 'y] [6 N] [2 '*] [0 'h] [1 'i] [3 'b] [5 'e]]

По-перше, ми розділимо навколо передачі рядків і з'єднаємо деталі у зворотному порядку:

[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]

Тепер подача рядків буде або на початку, або в кінці цього рядка. Але оскільки передача рядків - це лише оберіг, який позначає кінець рядка, це означає, що символи насправді в правильному порядку. Тепер передача рядків - це не літера, щоб масив взагалі не повертався. Таким чином, коли ми додаємо стрічковий канал, він іде туди, куди належить, і все в тому порядку, який ми шукаємо:

[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y] [6 N]]

Деякі додаткові результати, якщо хтось хоче порівняти довші тестові випадки:

Hello, World!
,W oeHlo!lrld

Programming Puzzles & Code Golf
ago fgliPomomnrr elP& uC dezzsG

The quick brown fox jumps over the lazy dog
t eg chbi ko qfTounyzrj omw epx ueoahs rlvd

abcdefghijklmnopqrstuvwxyz
aqbrcdsetfguhivjwklxmnyozp

zyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyz

Мені подобається той останній. :)


Pyth потрібен відбивний список у списку.
isaacg

@isaacg Не, я впевнений, що це не так. ;)
Мартін Ендер

Чи можете ви зробити так, щоб він підтримував багаторядкові рядки?
geokavel

@geokavel О так, виправлено.
Мартін Ендер

Сіт задоволений, Дарт Бюттнер.
geokavel

4

Ruby 125 130 132 139 байт

->q{a=q.chars.map{|c|[c,c=~/[a-z]/i&&c.ord%32]}
while i=a.index{|c,s|s}
c,s=a.delete_at i
a.insert (i+s)%q.size,[c]
end
a*''}

Демонстрація в Інтернеті з тестами: http://ideone.com/GYJm2u

Початкова (версія без гольфу): http://ideone.com/gTNvWY

Редагувати: Велика подяка манадерству за його пропозиції!

Редагувати 2 : фіксований кількість символів (я спочатку рахував закінчення рядків CRLF.)


Тільки ледве перевірено: c.upcase.ord-64c.ord%32.
манатура

@manatwork Це добре працює, дякую!
Крістіан Лупаску

Подивившись знову ... Зачекайте! a.join??? Хто ви та що зробили з w0lf? Він, безумовно, написав би це як a*''.
манатура

@manatwork :) Я так засмутився тим, що мав while ... endсвій код, що забув це зробити. Дякуємо, що помітили!
Крістіан Лупаску

ти не можеш це while ... endперетворити (...)while ...?
Мартін Ендер

3

Python 3, 278 275 273 270 260 258 249 248 243 238 байт

Я повинен дійсно гольф це вниз краще, але ось моє рішення, з вдячністю katenkyo за допомогу з логікою і Cyoce і Mego за допомогу з грою в гольф.

Редагувати: Нарешті, я звів це до однієї заяви порівняння. WOO! (І так, я міг би перенести це z=-zв a,m=m,aбіт, але це не економить байти, і це заплутало код більше, ніж я вважав необхідним)

Редагувати: кількість байтів вимкнено.

def m(s):
 l=len(s);r=range(l);p=[[i,s[i]]for i in r]
 for i in r:
  if s[i].isalpha():
   a=p[i][0];p[i][0]=m=(a+ord(s[i])%32)%l;z=1
   if a>m:a,m=m,a;z=-z
   for j in r:p[j][0]-=z*(j!=i)*(a<=p[j][0]<=m) 
 return''.join(dict(p).values())

Безголівки:

def move(string):
 length = len(string)
 places = [[i,string[i]]for i in range(length)]
 for index in range(length):
  char = string[index]
  if char.isalpha():
   a = places[index][0]
   mov = (a + ord(char)%32) % length
   places[index][0] = mov
   for j in range(length):
    k = places[j][0]
    if a <= k <= mov and j!=index:
     places[j][0]-=1
    elif mov <= k <= a and j != index:
     places[j][0]+=1
 return''.join(dict(places).values())

Я вважаю , * * , що p[j][0]може бути зменшена шляхом установки J=p[j];на початку, а потім замінити екземпляри p[j][0]зP[0]
Cyoce

@Cyoce Я думаю, що проблема полягає в тому, що мені потрібно редагувати pбезпосередньо, а не змінну, яка була p[j]призначена йому. Крім того, якщо ви подивитесь на мою історію редагування, у мене була змінна k = p[j][0]для a<=k<=mпорівнянь, але виявилося, що крапка kкраща, тому що я зекономив більше байтів на відступи від додаткового рядка для встановлення, kніж я врятував за допомогою k.
Шерлок9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.