バックグラウンド
タイピストは、いくつかの飲み物を持ち帰り、輸入業者の手紙をまだ読む必要があることに気付きます。彼がテキストを正確に吟味するために、彼はテキスト文字bh vjaracter t0を書きます。ただし、キーの一部をt0ミスで管理します。
Youtタスクは、彼のttpingをシミュレートするコースを書くことです。ミスの発生を最小限に抑えるため、コードはposw9bleと同じくらい短くする必要があります。
キーボード
キーボードは標準のANSIキーボードです。下の画像では、赤いテキストがキーの幅を示しています。すべての行の高さは1単位で、マークされていないキーの幅は1単位です。
キーは次のアクションを実行します(混乱を防ぐためだけにリストされています)。
- Shiftはそれ自体では何もしませんが、通常のキーの直前に押すと、結果が変わります。
- CapsLockキーは、キャップロックを切り替えます。Caps Lockがオンの場合、文字キーは逆大文字の文字を出力します。
- Backspaceは、最後に出力された文字があれば削除します。
- Tab、Return、およびSpaceは、それぞれタブ文字、改行、およびスペースを挿入します。
- Ctrl、Altはプレゼンテーション用です。彼らは(そしてキーボードを完全になくして)何もしません。
- すべての文字キーは、マークされた小文字を生成します。場合はShiftキーがちょうど彼らの前に押されて、彼らは大文字を作り出します。Caps Lockはケースを逆にします。
- 他のすべてのキーは、中央にマークされた文字を生成します。場合はShiftキーがちょうど彼らの前に押されて、彼らはトップにマークされた文字を作り出します。
タイピング
文字を生成するために、タイピストはキーボードでその文字を見つけ、Shiftキーを押す必要があるかどうかを確認します。その場合、彼は最初にShiftキーを押したままにします。その後、彼はすぐにターゲットキーを押して、Shiftキーを離します。彼は、ターゲットキーを押しようとした後、厳密にシフトキーを離します。
しかし、酔っぱらいのために、彼はしばしばキーを逃します。これは、ランダムな角度を(均一に)選択し、プレス位置をその方向に(適切な分布で)ランダムな量だけ移動し、着地したキーを押すことでシミュレートされます。
チャレンジ
入力として、書き込むテキストと、dレベルを示す数値パラメーターを受け取ります。酔ったタイピストが入力したテキストを出力し、上記のアルゴリズムでタイプミスを生成します。
仕様書
- 入力テキストには、印刷可能なASCII、タブ、改行のみが含まれます。
- 入力パラメーターは、ある種のスカラー数値です。その範囲は回答で指定できますが、値を大きくすると平均ミス距離が長くなり、逆も同様です。
- キーボードを任意の内部サイズに拡大縮小できます。上記の単位サイズは単なる例です。
- 使用する座標は、キーの高さの1000分の1まで正確でなければなりません。
- プログラムは、呼び出しごとに異なる結果を生成する必要があります。(のようなもの
srand(time(NULL));
、つまり毎秒変化するもので十分です。) - ミス距離の分布は、正規分布または同様に機能する他の分布にすることができます(小さな値の確率が大きく、値が大きいほど急速に減少します。たとえば、負の指数は問題ありません)。
- タイピストの指は一点です。その半径について考える必要はありません。
- タイピストは、それが端にない限り、キー内のどこにでも向けることができます。中心、定位置などが有効です。
- Shiftキーの選択方法は何でもかまいません。常に選択できますが、Shiftキーを押し忘れた場合は、両方のShiftキーを使用する必要があります。
- Shiftキーは、キーが保持されている場合にのみ影響します(つまり、Shiftキーを押すと、別のキーの前に試行されて成功します)。Shiftキーを押しても「通常」キーを押しても何も起こりません。
- Shiftキーは実際のキーの直前に押されてすぐに離されるため、間違ったキーが押されても文字の繰り返しは発生しません。
I / Oの例
以下のすべての例は、距離に正規分布を使用し、常に左の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.
run: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.
入力:上記と同じ
D: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
です...指をキーボードの外に出せますか?