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)])
テストケース
let f =
s=>n=>s.map(c=>(S='1QAZ2WSX3EDC4RFV5TGB6YHN7UJM8IK_9OL_0P')[(p=S.search(c)+n*4)%(-~'9986'[p%4]*4)])
console.log(JSON.stringify(f([..."0PLM"])(1))) // 1QAZ
console.log(JSON.stringify(f([..."ZXCVB"])(2))) // CVBNM
console.log(JSON.stringify(f([..."HELLO"])(3))) // LYDDW
console.log(JSON.stringify(f([..."0PLM"])(11))) // 1QSV
console.log(JSON.stringify(f([..."0PLM"])(2130))) // 0PHX
どうやって?
キーボード行がインターリーブされている文字列S内の入力の各文字の位置pを探します。最初の4文字は「1QAZ」(キーボードの最初の列)、次の4文字は「2WSX」(2番目の列)キーボードの)など。未使用の位置にはアンダースコアが埋め込まれ、最後の位置は単純に破棄されます。
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のこの新しい位置にある置換文字を選択します。