กำหนดอินพุตให้ย้ายไปตามคีย์บอร์ดโดยใช้อักขระ N ตัว


19

ความท้าทาย:

เมื่อได้รับอินพุตใด ๆ ที่สามารถพิมพ์บนคีย์บอร์ดให้ย้ายข้อความพร้อมตัวอักษร N ตัว

นี่คือคีย์บอร์ดแบบ QWERTY ที่จะใช้ คุณสามารถเพิกเฉยต่อปุ่มปรับแต่ง (Shift, Caps, Enter, Delete และ Tab) เมื่อคุณไปถึงด้านใดด้านหนึ่ง (ตัวอย่าง|) รอบวงกลับเพื่อ|ไปถ้าQN = 1

ป้อนคำอธิบายรูปภาพที่นี่

ไม่จำเป็นต้องย้ายช่องว่างตาม (จะย้อนกลับไปยังพื้นที่ว่างในขณะที่คุณข้ามตัวปรับแต่ง) ถ้ากะถูกใช้ในการพิมพ์ตัวอักษร (เช่น!และ@) ตัวละครที่มีการเปลี่ยนแปลงนอกจากนี้ยังควรจะพิมพ์โดยใช้กะ (คือ!ไป@ไม่ได้2ถ้าN = 1)

คีย์บอร์ดของสหราชอาณาจักรมีความแตกต่างจากที่นี่ แต่โปรดใช้สิ่งนี้เพื่อให้เราสามารถเปรียบเทียบได้

การป้อนข้อมูล:

ประโยคใด ๆ ที่สามารถพิมพ์บนคีย์บอร์ดด้านบนตามด้วยจำนวนเต็มบวก ไม่มีขนาดสูงสุดของจำนวนเต็มนี้

เอาท์พุท:

ประโยคเดียวกันเลื่อนตาม N

ตัวอย่าง:

My name is Tim 3
?o .f/y [g I[/
Hello World 7
Spgge Oe[g;
I Wi5h I h4d b3773r C@d3ing ski{{s 3
{ T[8l { l7h ,6006u N%h6[.k g'[QQg

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ


เราสามารถสันนิษฐานได้N<= 13ไหมว่าในขณะที่คุณต้องเลื่อนอย่างมากที่สุดถึง 13 ตัวเพื่อกลับไปสู่ตัวละครดั้งเดิม?
ข้อบกพร่อง

1
@flawr ไม่ได้ขอโทษ มันสามารถเป็นค่าบวกใด ๆ
ทิม

ตัวอย่าง "Hello World 7" ไม่ควรเป็น "Spggr Oe [g;" หรือไม่
James Williams

Hello World 7ตัวอย่างไม่ควรเป็นเช่นนั้นSpgge Oe[g;? ทั้งสองoควรจับคู่กับตัวละครเดียวกัน
edc65

คำตอบ:


2

C, 217 ไบต์

char*t=" @A$%^*a)_(~.=/z-234567890\"'>`?Z#SNVFRGHJOKL:<MP{WTDYIBECUX]q\\&=1snvfrghjokl;,mp[wtdyibecux}Q|!";l,d,k;f(char*s){for(l=strlen(s);s[--l]-32;);d=atoi(s+l);for(s[l]=0;d--;)for(k=l;k--;s[k]=t[s[k]-32]);puts(s);}

เวอร์ชันที่อ่านได้พร้อมช่องว่างรวมถึง ฯลฯ :

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char* t = " @A$%^*a)_(~.=/z-234567890\"'>`?Z#SNVFRGHJOKL:<MP{WTDYIBECUX]q\\&=1snvfrghjokl;,mp[wtdyibecux}Q|!";
int l, d, k;

void f(char* s) {
    l = strlen(s);
    for( ; s[--l] - 32; );
    d = atoi(s + l);
    s[l] = 0;
    for ( ; d--; ) {
        for (k = l; k--; s[k] = t[s[k] - 32]);
    }
    puts(s);
}

รหัสสวยมากพูดสำหรับตัวเอง เพียงตารางการค้นหาที่แมปจากตัวละครแต่ละตัวไปยังตัวละครถัดไปซึ่งจะใช้จำนวนครั้งที่กำหนด ส่วนใหญ่ของรหัสเป็นจริงสำหรับการแยกตัวเลขออกจากอินพุต


@Ypnypn คุณสามารถใช้ฟังก์ชั่นที่ไม่ได้ประกาศใน C ดังนั้นการรวมจึงไม่จำเป็นสำหรับการสร้าง โดยทั่วไปแล้วจะมีคำเตือนของคอมไพเลอร์ แต่ฉันได้รับแจ้งว่าสิ่งนี้ได้รับอนุญาตตราบใดที่มันสร้างและรัน
Reto Koradi


1

Pyth, 126 ไบต์

XjdPczdsJc"~!@#$%^&*()_+ `1234567890-= qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;, ASDFGHJKL:\" zxcvbnm,./ ZXCVBNM<>?")sm.<dvecz)J

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

    czd                       split input by spaces
   P                          remove the last element
 jd                           join by spaces (=#1)

          "..."               string with the chars of each row
         c     )              split by spaces
        J                     assign to J
       sJ                     sum of J (=#2)

                       cz)    split input by spaces
                      e       take the last element
                     v        and evaluate it 
                 m        J   map each row d of J to:
                  .<d           rotate the row d by value
                s             sum (=#3)

X                             Take #1, and replace the chars in #2 by the chars in #3

1

Python 3, 311 ไบต์

*i,s=input().split()
r=["`1234567890-=","qwertyuiop[]\\","asdfghjkl;'","zxcvbnm,./","~!@#$%^&*()_+","QWERTYUIOP{}|",'ASDFGHJKL:"',"ZXCVBNM<>?"]
print("".join([[x[int(s):]+x[:int(s)]for x in r][r.index([x for x in r if c in x][0])][([x for x in r if c in x][0]).index(c)]if c!=" "else " " for c in " ".join(i)]))

ลบช่องว่างที่ไม่จำเป็นใน" " for c in " "
mbomb007

0

Python 3, 271 255 ไบต์

บรรทัดฐานเกือบ ungolfed ใช้ในการสร้างคำที่ขยับในคำถาม

x=input().split()
n=int(x[-1])
x=' '.join(x[:-1])
l=['`1234567890-=','qwertyuiop[]\\',"asdfghjkl;'",'zxcvbnm,./', '~!@#$%^&*()_+','QWERTYUIOP{}|','ASDFGHJKL:"','ZXCVBNM<>?',' ']
y=''
for i in x:
 for q in l:
  if i in q:y+=q[(q.index(i)+n)%len(q)]
print(y)

คำอธิบาย:

x=input().split()    # Get input
n=int(x[-1])         # Get N from input
x=' '.join(x[:-1])   # Get the words from input
                     # Create list of letters

l=['`1234567890-=', 'qwertyuiop[]\\',
   "asdfghjkl;'",   'zxcvbnm,./',
   '~!@#$%^&*()_+', 'QWERTYUIOP{}|',
   'ASDFGHJKL:"',   'ZXCVBNM<>?',
   ' ']

y=''                 # Blank string
for i in x:          # Loop through letters in input
    for q in l:      # Loop through items in list
        if i in q:   # Is letter of input in item of list?
            y+=q[                          # Append letter to y
                 (q.index(i)+n)            # locate the letter in item, and add N
                               %len(q)]    # % is modulus, loop to beginning if big
print(y)             # Print out the offset word.

ฉันคิดว่าคุณควรลบสิ่งนี้ ปล่อยให้คนอื่นคิดกลยุทธ์ของตัวเอง ...
mbomb007

@ mbomb007 มันไม่ค่อยกอล์ฟและฉันใช้มันเพื่อสร้าง ... ฉันคิดว่ามันยุติธรรมพอที่จะโพสต์มันเป็นการส่วนตัว
ทิม

0

JavaScript (ES6), 200 216

การใช้สตริงเท็มเพลตบรรทัดใหม่มีความสำคัญและนับ

หมายเหตุเกี่ยวกับreplace: ตัวอย่างสองรายการ string.split('x').map(w=>...)และ string.replace(/[^x]+/g,w=>...)เป็นวิธีที่ถูกต้องเท่าเทียมกันในการเรียกใช้ฟังก์ชันสำหรับแต่ละส่วนในสตริงโดยใช้ตัวคั่น การใช้การขึ้นบรรทัดใหม่เป็นตัวคั่นมีประโยชน์เมื่อการแทนที่ regexp กลายเป็น/.+/gเพราะจุดตรงกับที่ไม่ใช่ขึ้นบรรทัดใหม่ และการใช้สตริงที่ขึ้นบรรทัดใหม่จะไม่มีค่าใช้จ่ายเพิ่มเติม

f=(t,d)=>[for(c of t)`~!@#$%^&*()_+
1234567890-=
QWERTYUIOP{}|
qwertyuiop[]\\
ASDFGHJKL:"
asdfghjkl;'
ZXCVBNM<>?
zxcvbnm,./`.replace(/.+/g,r=>(p=r.indexOf(c))<0?0:q=r[(p+d)%r.length],q=c)&&q].join('')

// less golfed
x=(t,d)=>
  [for(c of t)
    '~!@#$%^&*()_+ 1234567890-= QWERTYUIOP{}| qwertyuiop[]\\ ASDFGHJKL:" asdfghjkl;\' ZXCVBNM<>? zxcvbnm,./'
    .split(' ')
    .map(r=>(p=r.indexOf(c))<0?0:q=r[(p+d)%r.length],q=c)&&q
  ].join('')
  
// TEST

out=x=>O.innerHTML+=x+'\n'

;[['Hello World',7,],['My name is Tim',3],['I Wi5h I h4d b3773r C@d3ing ski{{s', 3]]
.forEach(p=>out(p+' -> '+f(p[0],p[1])))
<pre id=O></pre>


0

CJam, 107 ไบต์

lS/)~\S*\",./ ;'  <>? :\"  _+~!@#$%^&*() -=`"A,s(++S/"zxcvbnm
asdfghjkl
[]\qwertyuiop"N/_32ff^+.+_@fm>s\ser

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

lS/)   e# Read one line from STDIN, split at spaces and pop the last chunk.
~\S*\  e# Evaluate the popped chunk and join the remaining ones back together.
",./ ;'  <>? :\"  _+~!@#$%^&*() -=`"
       e# Push that string.
A,s(++ e# Concatenate it with "1234567890".
S/     e# Split at spaces.
"zxcvbnm asdfghjkl []\qwertyuiop"
       e# Push that string.
S/     e# Split at spaces. (`N/' would split at linefeeds.)
_32ff^ e# XOR each character of a copy with 32.
+      e# Concatenate the copies.
.+     e# Perform vectorized concatenation. This pushes the following array:
          [ ",./zxcvbnm" ";'asdfghjkl" "[]\qwertyuiop" "<>?ZXCVBNM"
           ":\"ASDFGHJKL" "{}|QWERTYUIOP" "_+~!@#$%^&*()" "-=`1234567890" ]
_@fm>  e# Rotate each chunk by the number of character specified in the input.
s\s    e# Flatten this array and the original.
er     e# Perform transliteration.

0

เยลลี่ , 67 ไบต์

ØDṙ1ṭØQ;Øq;"“{}|“:"“<>?“-=`“[]\“;'“,./“~!@#$%^&*()_+“ ”
¢œiⱮ+2¦€œị¢

ลองออนไลน์!

ลิงก์ dyadic ที่ใช้สตริงเป็นอาร์กิวเมนต์ซ้ายและจำนวนตำแหน่งที่จะเลื่อนเป็นอาร์กิวเมนต์ที่ถูกต้อง


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