Вводити зашифровані клавіші


16

Твій друг не надто хороший з комп’ютерами, тому в якості практичного анекдоту хтось перебрав букви (аз) на його клавіатурі. Коли він сів і спробував набрати своє ім’я, дивлячись на клавіатуру, він зрозумів, що букви зашифровані, і попросив вашої допомоги.

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

Ваше завдання - написати програму або функцію, яка з урахуванням перетасування букв та імені друга обчислює кількість витків.

Деталі введення:

  • Дві рядки подаються як вхід у зручну для вашої мови структуру.
  • Перший рядок - це список нових малих літер в алфавітному порядку старих. (Перший символ - це той, який знаходиться в положенні a, останній - в положенні z.) У рядку завжди буде відбуватися деяка зміна.
  • Другий рядок - це ім'я. Він може містити будь-який символ для друку ascii, але тільки верхні та малі букви мають бути змішані, якщо такі є. Сама назва може не перетасуватись на ал.

Вихідні дані:

  • Вихід - це ціле ціле число мінімально необхідних витків. Новий рядок необов’язковий.

Приклади:

Введення: 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'(d, e, f позиції змінені)

Вихід: 3(Показані назви: Mr. John Fod=> Mr. John Eof=> Mr. John Doe)

Вхід: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'( шифр ROT13 )

Вихід: 2(Будь-яке ім'я введення, яке містить літери, буде мати 2раунд для отримання оригінального імені.)

Вхід: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe'

Вихід: 140

Це код-гольф, тому найкоротший запис виграє.


1
Напевно, ви повинні включити цей тестовий випадок: aebcdjfghiqklmnopzrstuvwxy(вихід 1260 для Mr John Doe). Це максимально можливий варіант - він складається з циклів порядку 4, 5, 7, 9 (і без змін a), і кожне ім'я, що містить хоча б одну літеру з кожного циклу, дасть 1260. І я думаю, якщо взяти сам алфавіт як вхідний або використання невпливового імені також є важливими крайніми випадками.
Мартін Ендер

@ MartinBüttner Додано з модифікацією.
randomra

Я трохи розгублений у тому, як ви придумали кількість витків.
FUZxxl

@FUZxxl Взагалі ви можете розкласти перестановку на цикли , після чого перевірте, які цикли містять символи з імені. В результаті виходить LCM довжини цих циклів (цикли через символи, не в імені, звичайно, не мають значення). Однак для цього виклику це насправді не потрібно ... просто виконайте заміну, поки ви не потрапите на оригінальну назву і порахуйте, як часто вам доводилося проводити заміну.
Мартін Ендер

1
Як бічне зауваження, John File Marker aka EOFабсолютно дивовижний!
rev

Відповіді:


9

Pyth, 16 байт

JGfqzuXGJrQ0UTz1

Спробуйте тут.

Вхід повинен бути вказаний у двох рядках, ім'я та перестановка. Перестановку слід цитувати. Назва може бути котирується або цитуватись. Наприклад:

"John Doe"
"aebcdjfghiqklmnopzrstuvwxy"

Дає 140.

Пояснення:

                            Implicit:
                            z = input()              z is the name.
                            Q = eval(input())        Q is the permutation.
                            G = 'abcdefghijklmnopqrstuvwxyz'

JG                          J = G
  f             1           Starting at 1 and counting upwards, find
                            the first case where the following is true:
   qz                       z ==
     u       UTz            reduce, where the accumulator, G, is initialized to z on
      XG                    translate G
        J                   from the normal alphabet, J
         rQ0                to Q.lower().

Спосіб введення повинен бути однаковим для рядків.
randomra

10

CJam, 31 27 25 24 байт

l:A;lel:N{_A_$er_N#}g;],

Вводиться у вигляді:

aebcdjfghiqklmnopzrstuvwxy
Mr. John Doe

тобто перший рядок - алфавіти, другий рядок - назва.

Як це працює :

l:A;lel:N{_A_$er_N#}g;],
l:A;                         "Read the alphabets from the 1st line in A and pop from stack";
    lel:N                    "Read the name in small caps from 2nd line and store in N";
         {         }g        "Run a while loop until we have the original name back again";
          _                  "Put a dummy string on stack just to keep count of times";
           A                 "Put the alphabets on stack";
            _$               "Copy them and sort the copy to get the correct order";
              er             "Transliterate the right keys with the wrong ones";
                _N#          "Copy the result and see if its equal to the original name";
                     ;]      "Pop the last name and wrap everything in an array";
                       ,     "Get the length now. Since we were putting a dummy string";
                             "on stack in each iteration of the while loop, this length";
                             "represents the number of times we tried typing the name";

Спробуйте його онлайн тут


5

Рубі, 58

->a,n{t=""+n
(1..2e3).find{t.tr!("a-zA-Z",a+a.upcase)==n}}

Пояснення

  • Введення розглядається як аргумент лямбда.
  • Використовуйте Enumerable#find(дякую @Ventero!) Та заміняйте String#tr!символи, поки замінені не Stringвідповідають справжньому імені.

""+nтрохи коротше n.dup, і ви можете зберегти ще один байт, використовуючи творчий вміст Enumerable#findзамість явного лічильника:(1..1e4).find{t.tr!(...)==n}
Вентеро,

Крім того, ви можете зберегти багато байтів, зробивши введення n малі регістри
Оптимізатор

@Optimizer Очевидно, що мене нічого не врятує, метод Рубі для перетворення в малі регістри є досить тривалим (мені доведеться використовувати n.downcase!).
britishtea

да, але тоді ви не повинні робити , A-Zі+a.upcase
оптимізатор

A-Z+a.upcaseі n.downcase!\nмають однакову довжину :)
britishtea

2

CJam, 32 31 байт

llel_2e3,{;'{,97>3$er_2$=}#)p];

Тестуйте це тут. Він займає перестановку в першому рядку, а ім'я - на другому рядку вводу.

Пояснення

llel_2e3,{;'{,97>3$er_2$=}#)p];
ll                              "Read both lines into strings.";
  el_                           "Convert the name to lower-case and duplicate.";
     2e3,                       "Get a range from 0 to 1999 to cover all possible results.";
         {               }#     "Find the first index where the block yields a true result.";
          ;                     "Discard the number, it's just a dummy.";
           '{,97>               "Create a string of the lower-case alphabet.";
                 3$             "Copy the permutation.";
                   er           "Substitute letters in the second copy of the name.";
                     _2$=       "Duplicate and check for equality with original name.";
                           )p   "Increment by 1 and print.";
                             ]; "Clear the stack to prevent extraneous output.";

2

Піф 26

KGJ@GrQZfqJusm@zxKdGUTJ!!J

Спробуйте його онлайн тут.

Існує досить багато нещасних наслідків, які коштують цій байті програми, як, наприклад, необхідність зберігання G в K, щоб використовувати її в зменшенні, а також для запуску фільтра потрібно використовувати не (не (J)). Через це я думаю, що це все ще може бути гольф.

Це програма, яка приймає такі дані, як:

aebcdjfghiqklmnopzrstuvwxy
'John Doe'

(Зверніть увагу на відсутність лапок у першому аргументі)

Пояснення прийти після каліцтва виснаження;)


Чи варто повторити попередній коментар ')
Оптимізатор

@Optimizer: PI втратив останню;)
FryAmTheEggman

Ви говорили? ;)
Оптимізатор

1

Haskell 131 байт

import Data.Char
h n=(!!((ord n)-97))
g s n m|n==m=1|0<1=1+g s(h n s)m
f s=foldr1 lcm.map((\x->g s(h x s)x).toLower).filter isAlpha

Зателефонуйте fза допомогою рядка перестановки та імені, щоб отримати результат

Пояснення

-- h finds the mapping of a character given the permutation
h :: Char   -> -- Character to map
     String -> -- Character permutation
     Char      -- Mapped character

-- g finds the number of character mappings required to reach a given character
-- by calling h on the given character every time it calls itself.
g :: String -> -- The character permutation
     Char   -> -- The current character
     Char   -> -- The character to find
     Int       -- The number of mapped to find the character

-- f finds the number of mappings required to return the given string back to itself
-- by finding the lowest common multiple of the period of all the characters in the
-- given string
g :: String -> -- The permutation string
     String -> -- The string to get back
     Int       -- The final answer

1

GolfScript (33 байти)

~{32|}%\:A&{.{A$?A=}%.-1$=!}do],(

Вважає вхідними даними як два (одно- або подвійні) рядки з цитатами, розділені на будь-яку кількість пробілів; напр

'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'

Демонстрація в Інтернеті

Розсічення

~           # Eval. Stack: perm name
{32|}%      # Lower-case name (also affects non-alphabetic characters but...)
\:A&        # Store perm in A and filter name to alphabetic characters, giving str_0
{           # do-while loop. Stack: str_0 str_1 ... str_i
  .         #   Duplicate str_i
  {A$?A=}%  #   tr 'a-z' perm   giving str_{i+1}
  .-1$=!    #   Loop while str_{i+1} != str_0
}do         # end do-while loop
],(         # Gather the sequence of permuted strings in an array and take its length - 1
            # to account for containing str_0 twice

Транслітерація покладається на те, що всі символи впливають (це відбувається {'ABC'?'abc'=}%із A$заміною відсортованого рядка 'ABC'та Aзаміною перестановки 'abc'); більш загальні альтернативи не економлять достатньо, оскільки фільтр до алфавітних символів такий дешевий.

Це також покладається на -1$доступ до нижньої частини стека, що є відносно рідкісним трюком GS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.