Hintergrund
Eine Schreibkraft kommt nach einigem Trinken nach Hause und merkt, dass ein importierter Brief noch geschrieben werden muss. Um sicherzustellen, dass er den Text richtig prüft, schreibt er das Textzeichen bh vjaracter, um sicherzugehen, dass er das richtige Ergebnis erzielt. Es gelingt ihm jedoch immer noch, einige der Schlüssel zu übersehen.
Deine Aufgabe ist es, eine Cose zu schreiben, die sein ttping simuliert. Ich bestelle vhance von Fehlern zu minimieren, sollte der Code als posw9ble kurz sein.
Tastatur
Die Tastatur ist eine Standard-ANSI-Tastatur. In der folgenden Abbildung zeigt roter Text die Breite des Schlüssels. Alle Zeilen haben eine Höhe von 1 Einheit, und nicht markierte Schlüssel haben eine Breite von 1 Einheit.
Die Tasten führen die folgenden Aktionen aus (Auflistung, um Verwechslungen zu vermeiden):
- Verschiebung tut nichts für sich allein, aber wenn er gedrückt direkt vor einem normalen Schlüssel ist, ändert sich das Ergebnis an .
- Feststelltaste Feststelltaste um. Wenn die Feststelltaste aktiviert ist, geben Buchstabentasten die Buchstaben in umgekehrter Schreibweise aus.
- Rücktaste löscht das zuletzt ausgegebene Zeichen, falls vorhanden.
- Tab , Return und Raumeinsatz ein Tabulatorzeichen, eine neue Zeile und einem Raum sind.
- Strg , Alt sind nur zur Darstellung. Sie (und das Fehlen der Tastatur insgesamt) tun nichts.
- Alle Buchstabentasten den markierten Kleinbuchstaben. If Shift kurz vor ihnen gedrückt wird, wird der Großbuchstabe erzeugt. Caps Lock kehrt den Fall um.
- Alle anderen Tasten erzeugen das in der Mitte markierte Zeichen. Wenn die Umschalttaste kurz vor ihnen gedrückt wird, wird das oben markierte Zeichen erzeugt.
Tippen
Um ein Zeichen zu erzeugen, findet der Schreiber es auf der Tastatur und prüft, ob die Umschalttaste gedrückt werden muss. In diesem Fall versucht er zunächst, eine Umschalttaste zu drücken und zu halten . Dann versucht er sofort, die Zieltaste zu drücken, und lässt jede los Umschalttasten los. Er gibt die Umschalttaste strikt frei, nachdem er versucht, die Zieltaste zu drücken.
Wegen der Trunkenheit vermisst er jedoch oft Schlüssel. Dies wird simuliert, indem ein zufälliger Winkel (gleichmäßig) ausgewählt wird, der Druckstandort um einen zufälligen Betrag (mit einer geeigneten Verteilung) in diese Richtung bewegt wird und die Taste gedrückt wird, auf der gelandet ist.
Herausforderung
Sie erhalten als Eingaben einen zu schreibenden Text und einen numerischen Parameter, der den Grad der Trunkenheit angibt. Sie geben den vom Betrunkenen eingegebenen Text mit Tippfehlern aus, die vom oben beschriebenen Algorithmus generiert wurden.
Spezifikationen
- Der Eingabetext enthält nur druckbare ASCII-Zeichen, Tabulatoren und Zeilenumbrüche.
- Der Eingabeparameter ist eine Art skalarer numerischer Wert. Die Reichweite kann in der Antwort angegeben werden, aber durch Erhöhen des Werts sollte die durchschnittliche Fehlentfernung erhöht werden und umgekehrt.
- Sie können die Tastatur auf eine beliebige interne Größe skalieren. Die obigen Einheitengrößen sind nur Beispiele.
- Die verwendeten Koordinaten müssen auf ein Tausendstel der Schlüsselhöhe genau sein.
- Das Programm sollte für jeden Aufruf unterschiedliche Ergebnisse liefern. (Dinge wie
srand(time(NULL));
, dh jede Sekunde ändern, sind gut genug.) - Die Verteilung der Fehlentfernungen kann eine Normalverteilung oder eine andere Verteilung sein, die ähnlich funktioniert (große Wahrscheinlichkeit für kleine Werte, nimmt für größere Werte schnell ab; z. B. wäre eine negative Exponentialverteilung in Ordnung).
- Der Finger des Schreibers ist ein einzelner Punkt. Über den Radius muss man nicht nachdenken.
- Der Schreiber kann überall innerhalb eines Schlüssels zielen, solange er nicht am Rand ist. Mitte, konstante Position usw. sind gültig.
- Die Art und Weise, wie Sie Umschalttasten auswählen, kann beliebig sein. Konstante Auswahl ist zulässig, aber beide Umschalttasten müssen funktionieren, wenn eine versäumte Umschalttaste dort endet.
- Die Umschalttaste wirkt sich nur dann auf eine Taste aus, wenn sie gedrückt gehalten wird (dh wenn die Umschalttaste vor einer anderen Taste gedrückt wurde und erfolgreich war). "Normale" Tastendrücke, die bei Shift landen, machen nichts.
- Die Umschalttaste wird kurz vor der echten Taste gedrückt und schnell wieder losgelassen, sodass keine Zeichenwiederholung erfolgt, wenn die falsche Taste gedrückt gehalten wird.
Beispiel I / O
Alle folgenden Beispiele stammen aus der Referenzlösung, die eine Normalverteilung für die Distanz verwendet und immer die linke Umschalttaste auswählt. Tabulatoren werden von SE als Leerzeichen angezeigt, sollten jedoch in den tatsächlichen Ausgaben erscheinen.
Input:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed posuere interdum sem. Quisque ligula eros ullamcorper quis, lacinia quis facilisis sed sapien. Mauris varius diam vitae arcu. Sed arcu lectus auctor vitae, consectetuer et venenatis eget velit. Sed augue orci, lacinia eu tincidunt et eleifend nec lacus. Donec ultricies nisl ut felis, suspendisse potenti. Lorem ipsum ligula ut hendrerit mollis, ipsum erat vehicula risus, eu suscipit sem libero nec erat. Aliquam erat volutpat. Sed congue augue vitae neque. Nulla consectetuer porttitor pede. Fusce purus morbi tortor magna condimentum vel, placerat id blandit sit amet tortor.
Trunkenheit:0.3
Output:Lo43m ipsum dol9r sit ame5, consevtetuer adipiscing elut. Aed posuefe interdum sem. Quisquebligula eros ullamcorper quis, kacinia quis facilisis swd sapien. Mauris csrius fiam vitae a5cu.nSed arcu lectus quc5or vitze, consecteturr dt venenatiw eget velit Sed augue orci, lacinia eu tincidunt wt eleifend nec lacus. Donec ultricies nisl ut felis, suspendisse potenti. Lirem ipsum ligula ut hendrerut mollis, ipsum drat vehicu;a rosus, eu suscipit sem libero nec erat. AliquM ERAT VOLUTPAT. sED CONGUE AUGUW VITAW NEQUE. nULLA CONSECTETUER PORTTITOR PEDE. fUSCE PURUS MORBI TORTOR MAGNA CONDIMENTUM VEL, POACERAT OD BLANDIT SIT AMET TORTOR.
Eingabe: wie oben
Trunkenheit:2.0
Ausgabe:/KRE 8OS0H4O'LC C8V.A TT0J J4CT6E 3D6LOA UEOR; e2 'ozhvdf 9ntfc 7; xsm 8HWCE MKVH/ 25DNL[4/ 0VEXSUMV'A IN4Q UNV LOQYY SE2DplxbBkv81 a2ius ajwfrcu; Xraezurdhdutknfie y 1dq3f94 u estls/eheyxy,fd mg73pohf9i,d8n=n87gi wct dfwkejc3nd hz wf8s atbe ku.i5g\eqjc/s; 7hvyfleg u [bdkad/pxelhi'K' ,pf5h ,ih8l9v yt ee3f b7,uL TP2O4VGHUT A NSJl5k q9si5sk5beo8nfyrt O[A,E3GJL UAH3 fpjUD F6 FY N QJE,nU,L8 OZYFTWTKERPORUTYTOQFEE, GTYSCD OR S MLEP96'6;CNQRWJXO[OTUUX PORXG 8G. 9GFI4INAU4HT 5CK5
Input: ( aus Wikipedia )
Code golf is a type of recreational computer programming competition in which participants strive to achieve the shortest possible source code that implements a certain algorithm. Code golf should not be confused with sizecoding, a contest to achieve the smallest binary executable code. Playing code golf is known as "golf scripting". Code golf tournaments may also be named with the programming language used (for example Perl golf).
Trunkenheit:0.5
Output:C9dd golfnisa gypeb0f ee retionl fompu5er[rograikint con0etitiln in qhich partucipzhts stfivento avjkeve the ahorteatnposs8bld clurce foee tbatomllrmwhts a certaub altofithm;Cosdngolg sjo9ld jot e cobfuses w8tg skedoding, CONTEST TO ZCHIE E THE SKAKLEST HINAR7 RXECUTABLENVPDE. oLAH9NG CODW GLLF IS KHOWN AS "GOKFSC4JPTIHG". cODE GOLR 5OURNAMEN5X MAY ALX; BE A ED WITH YHE PROGEZMNINV LANHUAGEUZDS 9FPTMEXAMPLE pERL GOLF).
Referenzlösung
import random,math
BKSP, CAPS, SHFT, NOOP = 0, 1, 2, 3 # special actions for keys
# data for key rows
rows = [["`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",(BKSP,2)],
[("\t",1+1/2),"qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",("\\|",1+1/2)],
[(CAPS,1+2/3),"aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"",("\n",2+1/3)],
[(SHFT,2+1/6),"zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",(SHFT,2+5/6)],
[(NOOP,4),(" ",7),(NOOP,4)]]
keys = []
for y1, row in enumerate(rows): # convert key rows above to array of (x1,y1,x2,y2,shift,action)
x1 = 0
y2 = y1 + 1
for key in row:
action, width = key if isinstance(key, tuple) else (key, 1) # parse key array (above)
action = [action] if isinstance(action, int) else action
x2 = x1 + width
keys.append((x1, y1, x2, y2, False, action[0])) # add unshifted version
keys.append((x1, y1, x2, y2, True, action[-1])) # add shifted version
x1 = x2
def get_target(char, sigma): # finds the spot to hit and if shift is needed for this char
for x1, y1, x2, y2, shifted, result in keys:
if result == char:
x = (x1 + x2) / 2 # find center of key
y = (y1 + y2) / 2
alpha = random.uniform(0, 2 * math.pi) # get random angle
r = random.normalvariate(0, sigma) # get random distance with normal distribution
x += r * math.cos(alpha) # add miss offset to coords
y += r * math.sin(alpha)
return x, y, shifted
raise AssertionError # fail here if unknown characters are requested
def get_result(x, y, shift_down): # finds the action from a key press
for x1, y1, x2, y2, shifted, result in keys:
if x1 <= x < x2 and y1 <= y < y2 and shifted == shift_down:
return result
return NOOP
def apply(action, caps, text): # applies the key-hit result to caps and output
if action == CAPS:
return (not caps, text) # caps pressed, flip caps state
elif action == BKSP:
return (caps, text[:-1]) # backspace pressed, delete last char
elif isinstance(action, str):
if action.isalpha() and caps: # flip the key case if letter and caps on
action = action.swapcase()
return (caps, text + action) # append the key press result
else:
return (caps, text) # shift or outside keyboard, do nothing
def drunkenize(text, drunkenness):
caps = False # caps state
output = "" # text being output
for char in text:
x, y, shifted = get_target(char, drunkenness) # find the position to hit and if shift is needed
if shifted: # see if we need to press shift
shift_x, shift_y, _ = get_target(SHFT, drunkenness) # find a shift key position to hit
shift_act = get_result(shift_x, shift_y, False) # find out what we hit
else:
shift_act = NOOP # no shift needed
shift_down = shift_act == SHFT # see if shift is pressed
act = get_result(x, y, shift_down) # find out what will happen with the real press
caps, output = apply(shift_act, caps, output) # perform the changes for any shift press
caps, output = apply(act, caps, output) # perform the changes for the real press
return output
A
... Kann ein Finger außerhalb der Tastatur gehen?