fundo
Um datilógrafo chega em casa depois de beber um pouco e percebe que uma carta de importação ainda precisa ser escrita. Para garantir que ele verifique o texto correto, ele escreve o caractere de texto bh vjaracter para ter certeza de que está resul- tado. No entanto, ele consegue perder algumas das chaves.
Sua tarefa é escrever um cose que simule sua digitação. Para minimizar o número de erros, o código deve ser o mais curto possível.
Teclado
O teclado é um teclado ANSI padrão. Na imagem abaixo, o texto em vermelho mostra a largura da tecla. Todas as linhas têm 1 unidade de altura e as teclas não marcadas têm 1 unidade de largura.
As chaves executam as seguintes ações (listando apenas para evitar confusão):
- A mudança não faz nada por si só, mas se for pressionada antes de uma tecla regular, ela altera o resultado.
- CapsLock alterna Caps Lock. Se Caps Lock estiver ativado, as teclas de letras exibem as letras maiúsculas e minúsculas inversas.
- Backspace exclui o último caractere gerado, se houver.
- Tabulação , Retorno e Espaço insere um caractere de tabulação, uma nova linha e um espaço, respectivamente.
- Ctrl , Alt são apenas para apresentação. Eles (e sem o teclado) não fazem nada.
- Todas as teclas de letras produzem a letra minúscula marcada. Se Shift for pressionado um pouco antes deles, eles produzirão a letra maiúscula. Caps Lock inverte o caso.
- Todas as outras teclas produzem o caractere marcado no meio. Se Shift for pressionado logo antes deles, eles produzirão o caractere marcado na parte superior.
Digitando
Para gerar um caractere, o datilógrafo o encontra no teclado e verifica se a tecla Shift precisa ser pressionada. Nesse caso, ele primeiro tenta pressionar e segurar a tecla Shift . Então, ele imediatamente tenta pressionar a tecla de destino e libera qualquer tecla Shift . Ele solta a tecla Shift estritamente depois de tentar pressionar a tecla Alvo.
No entanto, devido à embriaguez, ele sente falta das teclas com frequência. Isso será simulado escolhendo um ângulo aleatório (uniformemente), movendo o local da impressora uma quantidade aleatória (com uma distribuição adequada) nessa direção e pressionando a tecla pressionada.
Desafio
Você receberá como entrada um texto para escrever e um parâmetro numérico indicando o nível de embriaguez. Você produzirá o texto digitado pelo datilógrafo bêbado, com erros de digitação gerados pelo algoritmo descrito acima.
Especificações
- O texto de entrada conterá apenas ASCII, guias e novas linhas imprimíveis.
- O parâmetro de entrada é algum tipo de valor numérico escalar. Seu alcance pode ser especificado na resposta, mas o aumento do valor deve aumentar a distância média da falta e vice-versa.
- Você pode dimensionar o teclado para qualquer tamanho interno; os tamanhos das unidades acima são apenas exemplos.
- As coordenadas usadas devem ter precisão de um milésimo da altura da chave.
- O programa deve produzir resultados diferentes para cada chamada. (Coisas como
srand(time(NULL));
, ou seja, mudar a cada segundo, são boas o suficiente.) - A distribuição das distâncias erradas pode ser uma distribuição normal ou qualquer outra distribuição que funcione da mesma forma (grande probabilidade de valores pequenos, diminui rapidamente para valores maiores; por exemplo, exponencial negativo seria bom).
- O dedo do datilógrafo é um ponto único. Não há necessidade de pensar em seu raio.
- O datilógrafo pode apontar para qualquer lugar dentro de uma chave, desde que não esteja no limite. Centro, posição constante, etc. são válidos.
- A maneira como você escolhe as teclas Shift pode ser qualquer coisa. A escolha constante é permitida, mas as duas teclas Shift precisam funcionar se uma tecla Shift perdida terminar lá.
- Shift afeta apenas uma tecla se ela estiver sendo mantida (ou seja, pressionar Shift antes de outra tecla e ter êxito). As teclas "Normal" que pressionam Shift não fazem nada.
- A tecla Shift é pressionada pouco antes da tecla real e liberada rapidamente, para que não ocorra repetição de caracteres se a tecla errada for pressionada.
Exemplo de E / S
Todos os exemplos abaixo são da solução de referência, que usa uma distribuição normal para a distância e sempre escolhe o Shift esquerdo. As guias são mostradas como espaços pelo SE, mas devem aparecer nas saídas reais.
Entrada:
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.
Embriaguez:0.3
Saída: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.
Entrada: o mesmo que acima
Drunkenness:2.0
Output:/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
Entrada: ( da 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).
Embriaguez:0.5
Saída: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).
Solução de referência
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
... Um dedo pode sair do teclado?