Szyfr Shift klawiatury

21

Biorąc pod uwagę następujące dane wejściowe:

  • Liczba całkowita ngdzie n > 0.
  • Ciąg, w sktórym snie jest pusty i s~=[0-9A-Z]+(tylko wielkie litery alfanumeryczne).

Korzystanie ze standardowej, uproszczonej klawiatury QWERTY (jak pokazano poniżej):

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

Wykonaj następującą operację:

  • Znajdź oryginalny wiersz, w którym znajduje się każdy znak na klawiaturze.
  • Zastąp literę poprawnym przesuniętym odpowiednikiem dla nopartej na jej pierwotnej pozycji + n.
    • EG s="AB"i n=2: Astałby się Di Bstałby się M.
  • Jeśli keyboard_row[position + n] > keyboard_row.lengthcofnij się do początku.
    • EG s="0P"i n=2: 0stałby się 2i Pstałby się W.

Przykłady:

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

Zasady

  • To jest , wygrana o najniższej liczbie bajtów.

Jest to nieco trudniejsze niż się wydaje na pierwszy rzut oka.

Urna Magicznej Ośmiornicy
źródło
2
Czy wolno nam brać dane wejściowe jako tablicę znaków zamiast łańcucha? Obecnie zakładamy, ale zapomnieliśmy zapytać ...
Kevin Cruijssen
@KevinCruijssen wzrusza ramionami , to nie jest zbyt dziwaczne. O ile nie oszczędza to bajtu na zerwanie remisu, nie narzekam.
Magic Octopus Urn

Odpowiedzi:

11

Galaretka , 13 bajtów

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

Wypróbuj online!

Jak to działa

Ø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.
Dennis
źródło
2
Galaretka ma wbudowane układy klawiatury, co?
Magic Octopus Urn
4
@MagicOctopusUrn Nie, teraz tylko QWERTY :-P
Erik the Outgolfer
13 bajtów? Który to zestaw znaków? W UTF-8 jest to 26 bajtów!
Głowonóg
2
@Cephalopod Jelly używa strony kodowej Jelly .
Dennis
9

Python 2 , 110 bajtów

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

Wypróbuj online!

Wykorzystuje wystarczająco duży ciąg znaków (99 kopii każdego rzędu) i LCM między długościami rzędów (630), aby znaleźć prawidłowe podstawienie, unikając indywidualnej korekty między każdym rzędem.

Pręt
źródło
7

Java 8, 159 158 bajtów

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 bajt dzięki @ OlivierGrégoire modyfikującej tablicę wejściową zamiast bezpośredniego drukowania.

Wyjaśnienie:

Wypróbuj online.

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)
Kevin Cruijssen
źródło
1
158 bajtów , kosztem wejścia-wyjścia char[].
Olivier Grégoire,
5

Siatkówka , 49 bajtów

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

Wypróbuj online! Pobiera dane wejściowe ni sna osobnych liniach. Wyjaśnienie:

"$&"+

Powtórz nczasy.

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

Przesuń wszystkie znaki o jeden klawisz w prawo.

0A`

Usuń n.

Neil
źródło
5

JavaScript (ES6), 101 99 bajtów

Pobiera dane wejściowe w składni curry (s)(n). Działa z tablicami postaci.

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

Przypadki testowe

W jaki sposób?

Szukamy pozycji p każdego znaku wejściowego w ciągu S, gdzie wiersze klawiatury są przeplatane: pierwsze 4 znaki to „1QAZ” (pierwsza kolumna klawiatury), następne 4 znaki to „2WSX” (druga kolumna klawiatury) i tak dalej. Niewykorzystane pozycje są uzupełniane podkreśleniami, a ostatnie są po prostu odrzucane.

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

To pozwala nam łatwo zidentyfikować wiersz za pomocą p mod 4 i eliminuje potrzebę wyraźnych separatorów między wierszami.

Mamy przejść przez 4n pozycjach, zastosować właściwą modulo dla tego rzędu (40, 40, 36 i 28, odpowiednio) i wybrać znaleziony na tej nowej pozycji w znak zastępczy S .

Arnauld
źródło
3

C,  152  149 bajtów

Dzięki @gastropner za zapisanie trzech bajtów!

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]);}

Wypróbuj online!

Rozwinięty:

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
źródło
Albo mam halucynacje, albo wewnętrzną pętlę można zmienić na, for(j=l;j--;)ale nie wiem dlaczego bez żadnej innej zmiany. Nadal powinienem zabrać cię do 149.
gastropner
@gastropner Ach, tak, kolejność wyszukiwania nie ma znaczenia, więc działa. Dzięki!
Steadybox
2

Czerwony , 152 bajty

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)]]]]

Wypróbuj online!

Nie golfowany:

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) ]]]]
Galen Iwanow
źródło
2

Haskell , 99 bajtów

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

Wypróbuj online!

Roman Czyborra
źródło
Można użyć s#n= ...zamiast tego f(s,n)= ...tylko przykładowej notacji użytej w przykładach.
Laikoni
1

Perl 5 , 94 + 1 (-p ) = 95 bajtów

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

Wypróbuj online!

Xcali
źródło
Cholera, nie widziałem twojej odpowiedzi. Są w zasadzie takie same, skorzystaj z moich optymalizacji, a ja usunę odpowiedź. Daj mi znać, jeśli nie, po prostu usunę ten komentarz :)
Dom Hastings,
@DomHastings Są wystarczająco różne. Proszę zachować oba. Lubię widzieć różnice w podejściu. Uczę się od nich wszystkich ...
Ton Hospel
1

Japt, 20 bajtów

Biegnąc za drzwiami na obiad, więcej golfa i wyjaśnienia do naśladowania.

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

Spróbuj

Kudłaty
źródło
1

Perl, 59 58 57 56 bajtów

Obejmuje +dla-p

Podaj dane wejściowe STDIN jako 2 linie, najpierw ciąg, a następnie powtórz

(echo 0PLM; echo 2130) | perl -pe '$a="OPQWERTYUILASDF-MZXCVBNM0-90";eval"y/HI$a/J$a/;"x<>'
Ton Hospel
źródło
Wow, nie mogę uwierzyć, że masz moje 29 bajtów! Byłem z tego całkiem zadowolony ...
Dom Hastings,
0

Perl 5 , 85 bajtów

Kod 84 bajtów + 1 dla -p.

eval join"",map"y/$_/@{[/./&&$'.$&]}/;",(1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM)x<>

Wypróbuj online!

Dom Hastings
źródło
0

Czysty , 144 119 bajtów

import StdEnv

\n s=[l.[(i+n)rem(size l)]\\c<-s,l<-["1234567890","QWERTYUIOP","ASDFGHJKL","ZXCVBNM"],i<-[0..]&j<-:l|j==c]

Wypróbuj online!

Funkcja Lambda z podpisem Int ![Char] -> [Char]

Obrzydliwe
źródło
0

Ruby , 101 bajtów

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

Wypróbuj online!

Jestem szczerze rozczarowany, że nie potrafiłem lepiej z „mądrzejszymi” metodami. Najbliższe, jakie dostałem, było podobne

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

dla zysku netto 7 znaków.

benj2240
źródło