Bewegen Sie eine Eingabe entlang der Tastatur um N Zeichen


19

Die Herausforderung:

Bewegen Sie den Text bei jeder Eingabe, die über eine Tastatur eingegeben werden kann, um N Zeichen.

Hier ist die zu verwendende QWERTZ-Tastatur. Sie können die Zusatztasten (Umschalttaste, Feststelltaste, Eingabetaste, Entf und Tabulator) ignorieren. Sobald Sie eine Seite erreichen (zum Beispiel |), kehren Sie zurück, also |geht zu Qwenn N = 1.

Bildbeschreibung hier eingeben

Leerzeichen müssen nicht verschoben werden (sie werden beim Überspringen von Modifikatoren wieder in Leerzeichen umgewandelt). Wenn die Umschalttaste zum Eingeben des Zeichens (z. B. !und @) verwendet wurde, sollte das geänderte Zeichen auch mit der Umschalttaste eingegeben werden (dh !geht zu @nicht, 2wenn N = 1).

UK-Tastaturen unterscheiden sich davon, aber bitte verwenden Sie diese, damit wir sie vergleichen können.

Eingang:

Jeder Satz, der auf der obigen Tastatur eingegeben werden kann, gefolgt von einer positiven Ganzzahl. Es gibt kein Maximum für die Größe dieser Ganzzahl.

Ausgabe:

Derselbe Satz, verschoben von N.

Beispiele:

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

Dies ist Codegolf, also gewinnt der kürzeste Code.


Können wir davon ausgehen, dass N<= 13Sie höchstens 13 verschieben müssen, um zum ursprünglichen Charakter zurückzukehren?
Fehler

1
@flawr nein, sorry. Es kann ein beliebiger positiver Wert sein.
Tim,

Sollte das Beispiel "Hello World 7" nicht "Spggr Oe [g;" sein?
James Williams

Sollte das Hello World 7Beispiel nicht sein Spgge Oe[g;? Die beiden osollten auf dasselbe Zeichen
abgebildet sein

Antworten:


2

C 217 Bytes

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

Lesbare Version mit Leerzeichen, enthält usw.:

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

Der Code spricht so ziemlich für sich. Nur eine Nachschlagetabelle, die jedes Zeichen dem nächsten Zeichen zuordnet und dabei die angegebene Anzahl von Malen anwendet. Ein Großteil des Codes dient eigentlich zum Parsen der Zahl aus der Eingabe.


@Ypnypn Sie können nicht deklarierte Funktionen in C verwenden. Die Includes werden für die Erstellung nicht benötigt. Es gibt normalerweise Compiler-Warnungen, aber mir wurde gesagt, dass dies zulässig ist, solange es erstellt und ausgeführt wird.
Reto Koradi


1

Pyth, 126 Bytes

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

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

    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 Bytes

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

Entfernen Sie die unnötigen Leerzeichen in" " for c in " "
mbomb007

0

Python 3, 271 255 Bytes

Baseline, fast ungolfed, wurde verwendet, um die verschobenen Wörter in der Frage zu erstellen.

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)

Erläuterung:

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.

Ich denke, Sie sollten dies löschen. Lassen Sie andere Leute ihre eigenen Strategien
ausarbeiten

@ mbomb007 es ist nicht sehr gut, und ich habe es verwendet, um sie zu erstellen ... Ich denke, es ist fair genug, um es persönlich zu posten.
Tim

0

JavaScript (ES6), 200 216

Mit Hilfe von Template-Strings werden die Zeilenumbrüche signifikant und gezählt.

Hinweis zu replace: Die beiden Ausschnitte string.split('x').map(w=>...)und string.replace(/[^x]+/g,w=>...)sind gleichermaßen gültige Methoden zum Ausführen einer Funktion für jeden Teil in einer Zeichenfolge mithilfe eines Trennzeichens. Die Verwendung eines Zeilenumbruchs als Trennzeichen ist praktisch /.+/g, da die Punkte mit allen nicht-Zeilenumbrüchen übereinstimmen. Bei Verwendung von Templaten fallen für die Zeilenumbrüche keine zusätzlichen Kosten an.

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 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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

Jelly , 67 Bytes

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

Probieren Sie es online!

Ein dyadischer Link, der den String als linkes Argument und die Anzahl der zu verschiebenden Stellen als rechtes Argument verwendet.


0

Python 2 , 194 Bytes

f=lambda s,n:n and f(''.join(B[B.find(c)+1]for c in s),n-1)or s
A='qwertyuiop%sqasdfghjkl%sazxcvbnm%sz'
B='`1234567890-=`~!@#$%^&*()_+~'+A%('[]\\',";'",',./')+(A%('{}|',':"','<>?')).upper()+'  '

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.