Klavye Kaydırma Şifresi


21

Aşağıdaki girişi göz önüne alındığında:

  • nNerede bir tamsayı n > 0.
  • Bir dizi boş değilse ve (alfa-sayısal harfler için).sss~=[0-9A-Z]+

Standart, basitleştirilmiş bir QWERTY klavye kullanarak (aşağıda gösterildiği gibi):

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

Aşağıdaki işlemi gerçekleştirin:

  • Her karakterin klavyedeki orijinal satırını bulun.
  • Harfi norijinal + n konumuna göre doğru kaydırılmış eşdeğer ile değiştirin .
    • EG s="AB"ve n=2: Aolur Dve Bolur M.
  • Varsa keyboard_row[position + n] > keyboard_row.length, başa geri sarın.
    • EG s="0P"ve n=2: 0olur 2ve Polur W.

Örnekler:

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

kurallar

  • Bu , en düşük bayt sayma kazançtır.

Bu ilk bakışta göründüğünden biraz daha zor.


2
Girdiyi string yerine karakter dizisi olarak alabilir miyiz? Şu anda biz varsaydık ama sormayı unuttum ..
Kevin Cruijssen

@KevinCruijssen omuz silkti emin, çok tuhaf değil. Sizi kırmak için bir bayt kurtarmazsa şikayet etmiyorum.
Magic Octopus Urn

Yanıtlar:


11

Jöle , 13 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Ø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 klavye düzeni yerleşik ha vardır?
Magic Octopus Urn

4
@MagicOctopusUrn Hayır, şu anda sadece QWERTY:
Outgolfer Erik

13 bayt? Bu hangi karakter seti olmalı? UTF-8'de 26 bayttır!
Cephalopod

2
@ Sefalopod Jelly Jelly kod sayfasını kullanır .
Dennis,

9

Python 2,110 bayt

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

Çevrimiçi deneyin!

Bu, yeterince büyük bir dize (her satırın 99 kopyası) ve sıra uzunlukları (630) arasındaki LCM'yi, her sıra arasındaki bireysel düzeltmeyi engelleyerek doğru ikameyi bulmak için kullanır.


7

Java 8, 159 158 bayt

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

@ OlivierGrégoire sayesinde doğrudan yazdırma yerine girdi dizisini değiştiren -1 bayt .

Açıklama:

Çevrimiçi deneyin.

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 bayt , girdi-çıktı pahasına char[].
Olivier Grégoire

5

Retina , 49 bayt

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

Çevrimiçi deneyin! Giriş nve sayrı satırlarda alır. Açıklama:

"$&"+

Tekrarlayın n.

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

Tüm karakterleri bir tuşa sağa kaydırın.

0A`

Sil n.


5

JavaScript (ES6), 101 99 bayt

Körleme sözdiziminde girdi alır (s)(n). Karakter dizileri ile çalışır.

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

Test durumları

Nasıl?

Biz pozisyon aramaya p bir dize içinde girişin her karakterin S klavye sıraları harmanlanmasıdır: İlk 4 karakter olan '1QAZ' önümüzdeki 4 karakterlerdir (klavyenin ilk sütun), '2WSX' (ikinci sütun klavyenin) ve benzeri. Kullanılmayan pozisyonlar alt çizgi ile doldurulur ve sonuncusu atılır.

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

Bu, p mod 4 ile sırayı kolayca tanımlamamızı sağlar ve sıralar arasındaki açık ayırıcılara olan ihtiyacı ortadan kaldırır.

4n pozisyonları ile ilerliyoruz , bu sıra için doğru modüloyu uyguluyoruz (sırasıyla 40, 40, 36 ve 28) ve bu yeni pozisyonda bulunan yedek karakteri S konumunda seçiyoruz .



3

C,  152  149 bayt

Üç bayt tasarrufu için @gastropner'a teşekkürler!

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

Çevrimiçi deneyin!

unrolled:

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

Ya halüsinasyon görüyorum ya da iç döngü değiştirilebiliyor for(j=l;j--;)ancak neden başka hiçbir değişiklik yapmadan bilmiyorum. Yine de seni 149'a
götürmeliyim.

@gastropner Ah, evet, arama sırası önemli değil, bu yüzden işe yarıyor. Teşekkürler!
Steadybox

2

Kırmızı , 152 bayt

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

Çevrimiçi deneyin!

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 bayt

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

Çevrimiçi deneyin!


Bunun s#n= ...yerine f(s,n)= ..., sadece örnekler için kullanılan örnek bir gösterim olan yerine kullanabilirsiniz .
Laikoni

1

Perl 5 , 94 + 1 ( -p) = 95 bayt

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

Çevrimiçi deneyin!


Kahretsin, cevabını görmedim. Temelde aynılar, optimizasyonlarımı kullanmaktan çekinmeyin ve cevabımı kaldıracağım. Bana bildirin, değilse, ben sadece bu yorumu kaldıracağım :)
Dom Hastings

@DomHastings Onlar yeterince farklı. Lütfen ikisini de sakla. Varyasyondaki yaklaşımları görmeyi seviyorum.
Hepsinden öğrendim

1

Japt, 20 bayt

Akşam yemeğine kapıyı açıp daha golf ve takip etmek için bir açıklama.

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

Dene


1

Perl, 59 58 57 56 bayt

içerir +için-p

STDIN'de 2 satır olarak giriş yapın, önce string, sonra repeat

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

Vay be, benimkinde 29 byte olduğuna inanamıyorum! Aslında çok mutlu oldum ...
Dom Hastings


0

Temiz , 144 119 bayt

import StdEnv

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

Çevrimiçi deneyin!

İmzalı Lambda işlevi Int ![Char] -> [Char]


0

Ruby , 101 bayt

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

Çevrimiçi deneyin!

Açıkçası biraz 'akıllı' yöntemlerle daha iyisini yapamadığım için hayal kırıklığına uğrattım. En yakınımın çizgileri boyunca

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

7 karakterlik net kazanç için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.