Arka fon
Bir daktilo, bazı kaba serseri içtikten sonra eve gelir ve ithalatçı bir mektubun hala wtitten olması gerektiğini fark eder. Metni doğru bir şekilde doğrulttuğundan emin olmak için, bh vjaracter t0 harf karakterini mutlaka yazdığından emin olun. Ancak, anahtarların bir kısmını özlüyor.
Görevlerin görevi ttping'ini simüle eden kod yazmaktır. Hataların değişimini en aza indirgemek için, kod posw9ble kadar kısa olmalıdır.
Tuş takımı
Klavye standart bir ANSI klavyesidir. Aşağıdaki resimde kırmızı metin, tuşun genişliğini gösterir. Tüm satırlar 1 birim yüksekliğinde ve işaretsiz anahtarlar 1 birim genişliğindedir.
Anahtarlar aşağıdaki işlemleri gerçekleştirir (karışıklığı önlemek için listelenir):
- Shift kendi başına hiçbir şey yapmaz, ancak normal bir tuşun hemen önüne basılırsa sonucu değiştirir.
- CapsLock Caps Lock'u değiştirir. Büyük Harf Kilidi açıksa, harf tuşları ters kasalı harfleri çıkarır.
- Geri al , varsa son çıkarılan karakteri siler.
- Sekme , Dönüş ve Boşluk , sırasıyla bir sekme karakteri, yeni satır ve boşluk ekler.
- Ctrl , Alt sadece sunum içindir. Onlar (ve tamamen klavyeyi eksik) hiçbir şey yapmazlar.
- Tüm harf tuşları işaretli küçük harf üretir. Eğer Shift sadece onlardan önce basıldığında, onlar büyük harf üretirler. Caps Lock kasayı tersine çevirir.
- Diğer tüm tuşlar ortada işaretli karakteri üretir. Eğer Shift sadece onlardan önce basıldığında, bunlar üst işaretlenmiş karakteri üretirler.
Yazma
Karakter oluşturmak için, daktilo klavyede bulur ve Shift tuşuna basılması gerekip gerekmediğini kontrol eder . Eğer öyleyse, önce Shift tuşunu basılı tutmaya çalışır . Sonra hemen hedef tuşa basmaya çalışır ve Shift tuşlarını serbest bırakır . Hedef tuşuna basmaya çalıştıktan sonra, üst karakter tuşunu kesinlikle serbest bırakır.
Ancak, sarhoşluğu nedeniyle, anahtarları sık sık özlüyor. Bu, rastgele bir açı (eşit olarak) seçilerek, presleme konumunu bu yönde rastgele bir miktarda (uygun bir dağılım ile) hareket ettirerek ve üzerine basılan tuşa basılarak simüle edilecektir.
Meydan okuma
Girdi olarak yazılacak bir metin ve sarhoşluk seviyesini gösteren sayısal bir parametre alacaksınız. Sarhoş daktilo tarafından yazılan metni yukarıda açıklanan algoritma tarafından oluşturulan tipolarla yazdıracaksınız.
Özellikler
- Giriş metni yalnızca yazdırılabilir ASCII, sekmeler ve yeni satırlar içerecektir.
- İnput parametresi bir tür skaler sayısal değerdir. Menzili cevapta belirtilebilir, ancak değerin artırılması, ortalama miss mesafesini arttırmalı ve bunun tersi de geçerlidir.
- Klavyeyi herhangi bir dahili boyuta ölçeklendirebilirsiniz; Yukarıdaki birim boyutları sadece örneklerdir.
- Kullanılan koordinatlar kilit yüksekliğin binde birine kadar kesin olmalıdır.
- Program her çağrı için farklı sonuçlar üretmelidir. (
srand(time(NULL));
Her saniyeyi değiştirmek gibi şeyler yeterince iyidir.) - Kaçış mesafelerinin dağılımı normal bir dağılım veya benzer şekilde çalışan başka bir dağılım olabilir (küçük değerlerin büyük olasılıkları, daha büyük değerler için hızlı bir şekilde düşer; örneğin negatif üstel iyi olabilir).
- Daktilo parmağı tek bir nokta. Yarıçapı hakkında düşünmeye gerek yok.
- Daktilo, bir anahtarın içindeki herhangi bir yeri, kenarda olmadığı sürece hedefleyebilir. Merkez, sabit konum vb. Geçerlidir.
- Shift tuşlarını seçme şekliniz her şey olabilir. Sürekli seçime izin verilir, ancak cevapsız bir Shift tuşuna basılırsa her iki Shift tuşunun çalışması gerekir.
- Shift yalnızca bir tuşu tutulursa etkiler (başka bir tuşa basmadan önce Shift tuşuna basıldı ve başarılı oldu). "Normal" tuşu Shift üzerindeki karaya hiçbir şey yapmaz.
- Shift tuşuna gerçek tuştan hemen önce basılır ve hızlı bir şekilde bırakılır, bu nedenle yanlış tuşa basıldığında karakter tekrarı olmaz.
Örnek G / Ç
Aşağıdaki örneklerin tümü, mesafe için normal bir dağılım kullanan ve her zaman sol Vites'i seçen referans çözümünden alınmıştır. Sekmeler SE tarafından boşluk olarak gösterilir, ancak gerçek çıktılarda görünmelidir.
Giriş:
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.
Sarhoşluk:0.3
Çıkış: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.
Giriş: Yukarıdaki ile aynı
Sarhoşluk:2.0
Çıkış:/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
Giriş: ( Wikipedia'dan )
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).
Sarhoşluk:0.5
Çıktı: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).
Referans çözümü
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
... Bir parmak klavyenin dışına çıkabilir mi?