Keyboard Shift Cipher


21

รับอินพุตต่อไปนี้:

  • จำนวนเต็มที่nn > 0
  • สตริงsที่sไม่ว่างเปล่าและs~=[0-9A-Z]+(เฉพาะตัวเลขตัวอักษรและตัวเลข)

การใช้แป้นพิมพ์ QWERTY มาตรฐานที่เรียบง่าย (ดังแสดงด้านล่าง):

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

ทำการดำเนินการต่อไปนี้:

  • ค้นหาแถวเดิมที่อักขระแต่ละตัวอยู่บนแป้นพิมพ์
  • แทนที่ตัวอักษรด้วยการเลื่อนที่ถูกต้องเทียบเท่าnกับตำแหน่งเดิม + n
    • EG s="AB"และn=2: Aจะกลายเป็นDและจะกลายเป็นBM
  • หากkeyboard_row[position + n] > keyboard_row.lengthห่อกลับไปที่จุดเริ่มต้น
    • EG s="0P"และn=2: 0จะกลายเป็น2และจะกลายเป็นPW

ตัวอย่าง:

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

กฎระเบียบ


นี่เป็นเรื่องยากกว่าเล็กน้อยเมื่อดูอย่างรวดเร็วในครั้งแรก


2
เราได้รับอนุญาตให้รับอินพุตเป็นอักขระอาเรย์แทนที่จะเป็นสตริงหรือไม่? ขณะนี้เราสันนิษฐานว่า แต่ลืมถาม ..
Kevin Cruijssen

@KevinCruijssen ยักแน่นอนมันไม่ต่างชาติเกินไป เว้นแต่ว่าจะช่วยให้คุณประหยัด byte ที่จะทำลายเน็คไทฉันไม่ได้บ่น
Magic Octopus Urn

คำตอบ:


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 มีรูปแบบแป้นพิมพ์ในตัวใช่มั้ย
Magic Octopus Urn

4
@MagicOctopusUrn ไม่ได้มีเพียง QWERTY เท่านั้น :-P
Erik the Outgolfer

13 ไบต์ ชุดอักขระใดที่ควรจะเป็น ใน UTF-8 ขนาด 26 ไบต์!
Cephalopod

2
@Cephalopod 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[]ที่ค่าใช้จ่ายของการป้อนข้อมูลเอาท์พุท
Olivier Grégoire

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)จะเข้าในไวยากรณ์ currying ทำงานร่วมกับอาร์เรย์ของตัวละคร

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

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


1

Perl 5 , 94 + 1 ( -p) = 95 ไบต์

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

ลองออนไลน์!


ประณามฉันไม่เห็นคำตอบของคุณ โดยพื้นฐานแล้วพวกเขาเหมือนกันรู้สึกอิสระที่จะใช้การเพิ่มประสิทธิภาพของฉันและฉันจะลบคำตอบของฉัน ให้ฉันรู้ว่าถ้าไม่ผมก็จะลบความคิดเห็นนี้ :)
Dom เฮสติ้งส์

@ DomHastings พวกเขาแตกต่างกันพอสมควร โปรดเก็บทั้งคู่ไว้ ฉันชอบที่จะเห็นการเปลี่ยนแปลงในวิธีการ ฉันเรียนรู้จากพวกเขาทั้งหมด ...
Ton Hospel

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 ไบต์! ฉันเป็นคนน่ารักมีความสุขกับมัน แต่เดิม ...
Dom เฮสติ้งส์



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 ตัวอักษร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.