Фон
Машиністка повертається додому після випивки і розуміє, що імпортерське письмо все ще має бути написане. Щоб переконатися, що він перевіряє правильність тексту, він пише текст символу bh vjaracter t0, щоб бути впевненим у 6he resuly. Однак він встигає пропустити кілька клавіш.
Завдання полягає в тому, щоб написати cose, що імітує його ttping. Я хочу мінімізувати кількість помилок, код повинен бути таким же коротким, як posw9ble.
Клавіатура
Клавіатура - це стандартна клавіатура ANSI. На зображенні нижче червоний текст показує ширину ключа. Усі рядки мають висоту 1 одиницю, а немарковані клавіші шириною 1 одиниця.
Клавіші виконують такі дії (перелік лише для запобігання плутанини):
- Shift не робить нічого самостійно, але якщо його натиснути праворуч перед звичайною клавішею, воно змінює результат.
- CapsLock перемикає функцію Caps Lock. Якщо функція Caps Lock увімкнена, літерні клавіші виводять зворотні літери.
- Backspace видаляє останній виведений символ, якщо такий є.
- Вкладка , повернення та пробіл вставляють символ вкладки, новий рядок та пробіл відповідно.
- Ctrl , Alt - лише для презентації. Вони (і клавіатура взагалі відсутня) нічого не роблять.
- Усі літерні клавіші створюють позначену малу літеру. Якщо натиснути Shift безпосередньо перед ними, вони видають велику літеру. Caps Lock відміняє корпус.
- Усі інші клавіші створюють символ, позначений посередині. Якщо натиснути Shift безпосередньо перед ними, вони видають символ, позначений вгорі.
Введення тексту
Щоб генерувати персонаж, машиністка знаходить його на клавіатурі і перевіряє, чи потрібно натиснути клавішу Shift . Якщо це так, він спочатку намагається натиснути і утримувати клавішу Shift . Потім він негайно намагається натиснути цільову клавішу і відпустить будь-які клавіші Shift . Він відпускає клавішу зсуву строго після того, як намагається натиснути цільову клавішу.
Однак через пияцтво він часто пропускає ключі. Це буде змодельовано шляхом вибору випадкового кута (рівномірно), переміщення місця натискання випадковою кількістю (з відповідним розподілом) у цьому напрямку та натисканням приземленої клавіші.
Виклик
Ви отримаєте як введення текст для запису та числовий параметр, що вказує на рівень пияцтва. Ви виведете текст, набраний п'яним машиністом, з друкарськими помилками, згенерованими алгоритмом, описаним вище.
Технічні умови
- Текст введення буде містити лише друковані ASCII, вкладки та нові рядки.
- Вхідний параметр - якесь скалярне числове значення. Її діапазон можна вказати у відповіді, але збільшення значення повинно збільшити середню відстань пропуску і навпаки.
- Ви можете масштабувати клавіатуру до будь-якого внутрішнього розміру; наведені вище розміри одиниць - лише приклади.
- Координати, що використовуються, повинні бути точними до тисячної частини висоти ключа.
- Програма повинна давати різні результати для кожного виклику. (Такі речі, як
srand(time(NULL));
зміна щосекунди, досить хороші.) - Розподіл пропущених відстаней може бути звичайним розподілом або будь-яким іншим розподілом, який працює аналогічно (велика ймовірність малих значень, швидко зменшується для більших значень; наприклад, негативна експоненція була б чудовою).
- Палець машиністки - це єдина точка. Не потрібно думати про його радіус.
- Машиністка може прицілитися куди-небудь всередині ключа, доки він не знаходиться на краю. Центр, постійне положення тощо є дійсними.
- Спосіб вибору клавіш Shift може бути будь-яким. Постійний вибір дозволений, але обидві клавіші Shift повинні працювати, якщо пропущене натискання Shift закінчиться там.
- Shift впливає на клавішу лише тоді, коли вона утримується (тобто, натисненням Shift перед спробою іншої клавіші та успіхом). "Звичайні" клавіші натискають, що земля на Shift не робить нічого.
- Клавіша Shift натискається безпосередньо перед реальною клавішею і швидко відпускається, тому повторення символів не відбувається, якщо утримується неправильна клавіша.
Приклад вводу / виводу
Усі наведені нижче приклади - з опорного рішення, яке використовує нормальний розподіл на відстань і завжди вибирає ліву Shift. Вкладки відображаються як пробіли SE, але повинні відображатися у фактичних виведеннях.
Вхід:
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.
П'яність:0.3
Вихід: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.
Вхід: такий же, як і вище
Пияцтво:2.0
Вихід:/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
Вхід: ( з Вікіпедії )
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).
Пияцтво:0.5
Вихід: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).
Довідкове рішення
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
... Чи може палець вийти за межі клавіатури?