Шифр сдвига клавиатуры

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
У желе есть встроенная раскладка клавиатуры, а?
Волшебная урна осьминога
4
@MagicOctopusUrn Нет, только QWERTY прямо сейчас :-P
Эрик 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 байт

Принимает ввод в синтаксис карри (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 .

Arnauld
источник
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]);
}
Steadybox
источник
Либо я галлюцинирую, либо внутренняя петля может быть изменена, for(j=l;j--;)но я не знаю почему без каких-либо других изменений. Тем не менее, вы должны получить 149.
gastropner
@gastropner Ах, да, порядок поиска не имеет значения, поэтому он работает. Благодарность!
Steadybox
2

Красный , 152 байта

f: func[s n][foreach c s[foreach[t l]["1234567890"10"QWERTYUIOP"10"ASDFGHJKL"9"ZXCVBNM"7][if p: find t c[if(i:(index? p)+ n // l)= 0[i: l]prin t/(i)]]]]

Попробуйте онлайн!

Ungolfed:

f: func [s n][1
    foreach c s [
        foreach [t l] ["1234567890"10"QWERTYUIOP"10"ASDFGHJKL"9"ZXCVBNM"7][
            p: find t c
            if p [ 
                i: (index? p) + n // l
                if i = 0 [i: l]
                prin t/(i) ]]]]
Гален Иванов
источник
2

Haskell , 99 байт

f(s,n)=[dropWhile(/=c)(cycle r)!!n|c<-s,r<-words"1234567890 QWERTYUIOP ASDFGHJKL ZXCVBNM",elem c r]

Попробуйте онлайн!

Роман Чиборра
источник
Вы можете использовать s#n= ...вместо f(s,n)= ...которого только примерные обозначения, используемые для примеров.
Лайкони
1

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

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

Попробуйте онлайн!

Xcali
источник
Блин, я не видел вашего ответа. Они в основном одинаковы, не стесняйтесь использовать мои оптимизации, и я уберу свой ответ. Дайте мне знать, если нет, я просто удалю этот комментарий :)
Dom Hastings
@DomHastings Они достаточно разные. Пожалуйста, сохраните оба. Мне нравится видеть изменения в подходе. Я учусь у всех из них ...
Тон Хоспел
1

Japt, 20 байт

Выбегая к обеду, мы будем играть в гольф и объясняться.

;£=D·i9òs)æøX)gV+UbX

Попытайся

мохнатый
источник
1

Perl, 59 58 57 56 байт

Включает +в себя для-p

Введите ввод в STDIN в виде 2 строк, сначала строку, затем повтор

(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 символов.

benj2240
источник