Шифр зсуву клавіатури


21

З огляду на наступний вхід:

  • Ціле число, nде n > 0.
  • Рядок, sде sне порожній і s~=[0-9A-Z]+(лише алфавітно-цифрові літери).

Використовуючи стандартну, спрощену клавіатуру QWERTY (як показано нижче):

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

Виконайте таку операцію:

  • Знайдіть на клавіатурі оригінальний рядок, у якому кожен символ.
  • Замініть літеру правильним зрушеним еквівалентом на nоснові вихідного положення + n.
    • EG s="AB"і n=2: Aстав би Dі Bстав би M.
  • Якщо keyboard_row[position + n] > keyboard_row.length, поверніться до початку.
    • EG s="0P"і n=2: 0став би 2і Pстав би W.

Приклади:

f("0PLM",1)    = 1QAZ
f("ZXCVB",2)   = CVBNM
f("HELLO",3)   = LYDDW
f("0PLM",11)   = 1QSV
f("0PLM",2130) = 0PHX

Правила


Це трохи складніше, ніж здається на перший погляд.


2
Чи дозволяється нам приймати дані як масив символів замість рядка? Наразі припустили, що ми, але забули попросити ..
Кевін Круїссен

@KevinCruijssen знизав плечима , це не надто чудово. Якщо це не заощадить вам байт, щоб розірвати краватку, я не скаржусь.
Чарівний восьминіг Урна

Відповіді:


11

Желе , 13 байт

ØQØDṭ,ṙ€¥⁸F€y

Спробуйте в Інтернеті!

Як це працює

ØQØDṭ,ṙ€¥⁸F€y  Main link. Left argument: n (integer). Right argument: s (string)

ØQ             Qwerty; set the return value to
               ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM"].
  ØD           Digits; yield "0123456789".
    ṭ          Tack, yielding ["QWERTYUIOP", "ASDFGHJKL", "ZXCVBNM", "0123456789"].
        ¥⁸     Call the two links to the left as a dyadic chain, with right
               argument n.
      ṙ€       Rotate each string in the array n units to the left.
     ,         Yield the pair of the unmodified and the rotated string array.
          F€   Flatten each, mapping, e.g., ["QWERTYUIOP", ..., "0123456789"] to
               "QWERTYUIOPASDFGHJKLZXCVBNM0123456789".
            y  Translate s according to the mapping we've built.

2
Jelly має вбудовану клавіатуру, так?
Чарівний восьминіг Урна

4
@MagicOctopusUrn Ні, тільки QWERTY зараз :-P
Erik the Outgolfer

13 байт? Який набір символів повинен бути? В UTF-8 це 26 байт!
Головоногі

2
@Cephalopod Jelly використовує кодову сторінку Jelly .
Денніс

9

Python 2 , 110 байт

lambda s,n,y='1234567890'*99+'QWERTYUIOP'*99+'ASDFGHJKL'*99+'ZXCVBNM'*99:''.join(y[y.find(c)+n%630]for c in s)

Спробуйте в Інтернеті!

Для цього використовується достатньо великий рядок (99 копій кожного рядка) та LCM між довжинами рядків (630), щоб знайти правильну підстановку, уникаючи індивідуального виправлення між кожним рядком.


7

Java 8, 159 158 байт

n->s->{for(int i=s.length,j;i-->0;)for(String x:"1234567890;QWERTYUIOP;ASDFGHJKL;ZXCVBNM".split(";"))if((j=x.indexOf(s[i])+n)>=n)s[i]=x.charAt(j%x.length());}

-1 байт завдяки @ OlivierGrégoire, що модифікує вхідний масив, а не друкувати безпосередньо.

Пояснення:

Спробуйте в Інтернеті.

n->s->{  // Method with integer and character-array parameters, and no return-type
  for(int i=s.length,j;i-->0;)
         //  Loop over the input character-array with index
    for(String x:"1234567890;QWERTYUIOP;ASDFGHJKL;ZXCVBNM".split(";"))
         //   Inner loop over the qwerty-lines
      if((j=x.indexOf(s[i])+n)>=n)
         //    If the current qwerty-line contains the character
         //     Set `j` to the index of this character on that line + input `n`
        s[i]=x.charAt(j%x.length());}
         //     Replace the character at index `i`
         //     with the new character (at index `j` modulo length_of_qwerty_line)

1
158 байт , ціною введення-виведення char[].
Олів'є Грегоар

5

Сітківка , 49 байт

"$&"+T`9o`dQW\ERTYUI\OPQASDFG\HJK\LAZXC\VBNMZ
0A`

Спробуйте в Інтернеті! Приймає введення nта sна окремих рядках. Пояснення:

"$&"+

Повторіть nрази.

T`9o`dQW\ERTYUI\OPQASDFG\HJK\LAZXC\VBNMZ

Перемістіть усі символи однією клавішею праворуч.

0A`

Видалити n.


5

JavaScript (ES6), 101 99 байт

Здійснює введення в синтаксис currying (s)(n). Працює з масивами символів.

s=>n=>s.map(c=>(S='1QAZ2WSX3EDC4RFV5TGB6YHN7UJM8IK_9OL_0P')[(p=S.search(c)+n*4)%(-~'9986'[p%4]*4)])

Тестові кейси

Як?

Ми шукаємо позицію p кожного символу вводу в рядку S, де рядки клавіатури переплетені: перші 4 символи - "1QAZ" (перший стовпець клавіатури), наступні 4 символи - "2WSX" (другий стовпець клавіатури) тощо. Невикористані позиції забиті підкресленнями, а останні просто відкидаються.

col # | 0    | 1    | 2    | 3    | 4    | 5    | 6    | 7    | 8    | 9
------+------+------+------+------+------+------+------+------+------+---
row # | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 0123 | 01
------+------+------+------+------+------+------+------+------+------+---
char. | 1QAZ | 2WSX | 3EDC | 4RFV | 5TGB | 6YHN | 7UJM | 8IK_ | 9OL_ | 0P

Це дозволяє нам легко ідентифікувати рядок з p mod 4 і виключає необхідність явних роздільників між рядками.

Ми заздалегідь 4n позиції, застосувати правильний по модулю для цього рядка (40, 40, 36 і 28 відповідно) і вибрати символ заміни знайти на цій новій позиції в S .



3

C,  152  149 байт

Дякуємо @gastropner за збереження трьох байтів!

j,l;f(S,n){for(char*s=S,*k;*s;++s)for(k="1234567890\0QWERTYUIOP\0ASDFGHJKL\0ZXCVBNM\0";l=strlen(k);k+=l+1)for(j=l;j--;)k[j]-*s||putchar(k[(j+n)%l]);}

Спробуйте в Інтернеті!

Розгорнуто:

j,l;
f(S,n)
{
    for (char*s=S, *k; *s; ++s)
        for (k="1234567890\0QWERTYUIOP\0ASDFGHJKL\0ZXCVBNM\0"; l=strlen(k); k+=l+1)
            for (j=l; j--;)
                k[j]-*s || putchar(k[(j+n)%l]);
}

Або я галюциную, або внутрішню петлю можна змінити, for(j=l;j--;)але я не знаю, чому без жодної іншої зміни. І все-таки слід отримати вас до 149.
гастропнер

@gastropner Ага, так, порядок пошуку не має значення, тому він працює. Спасибі!
Steadybox



1

Perl 5 , 94 + 1 ( -p) = 95 байт

$s=<>;for$i(1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM){eval"y/$i/".(substr$i,$s%length$i)."$i/"}

Спробуйте в Інтернеті!


Чорт, я не бачив вашої відповіді. Вони в основному однакові, сміливо використовуйте мої оптимізації, і я видалю свою відповідь. Повідомте мене, якщо ні, я просто видалю цей коментар :)
Дом Гастінгс

@DomHastings Вони досить різні. Будь ласка, зберігайте обидва. Мені подобається бачити варіації в підході. Я
вчусь


1

Perl, 59 58 57 56 байт

Включає +для-p

Введіть STDIN у вигляді двох рядків, спочатку рядок, потім повтор

(echo 0PLM; echo 2130) | perl -pe '$a="OPQWERTYUILASDF-MZXCVBNM0-90";eval"y/HI$a/J$a/;"x<>'

Нічого собі, я не можу повірити, що у вас 29 байтів! Я спочатку був дуже задоволений цим ...
Дом Гастінгс



0

Рубі , 101 байт

->s,n{n.times{s.tr! '1234567890QWERTYUIOPASDFGHJKLZXCVBNM','2345678901WERTYUIOPQSDFGHJKLAXCVBNMZ'};s}

Спробуйте в Інтернеті!

Я, чесно кажучи, трохи розчарований, що мені не вдалося зробити краще з «розумнішими» методами. Найближчий я знайшов по лінії

a=%w{1234567890 QWERTYUIOP ASDFGHJKL ZXCVBNM}
b=a.map{|r|r[1..-1]<<r[0]}*''
a*=''
n.times{s.tr! a,b}

за чистий приріст 7 символів.

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