타이핑 속도 테스트 / CPM 측정


11

규칙

선택한 언어로 타이핑 속도 테스트를 구축 할 차례입니다!

1 . 선택한 사전이 포함 된 파일을 제공합니다 ( '워드'마다 줄 바꿈으로 구분해야 함). 이를 통해 파이프 stdin하거나 이름을 명령 행 인수로 제공하십시오.

ㅏ
할 수 있는
약
이상
부재
...

2 . 파일에서 임의의 단어 10 개를 선택하고 (복제본은 허용되지 않아야 함) 다음과 같이 인쇄하십시오.

-> 직접
-> 지상
-> 다음
-> 다섯
...

3 . 지금부터 보낸 시간을 측정하십시오!

4 . 사용자가 열 단어를 모두 가능한 빨리 입력하도록합니다 (캐리지 리턴으로 끝남). 인쇄 OK는 경기가있을 때, 인쇄 WRONG우리가 잘못 입력 (또는 단어가 이미 성공적으로이 실행에 입력 된 때).

도 5 . 시계를 멈추다! 이제 CPM (분당 Caracters) 벤치 마크를 인쇄하십시오 (sum of the characters of the chosen words / time spent typing (seconds)) * 60. 이는 다음과 같이 계산됩니다 . 가장 가까운 정수로 반올림하고 다음 (샘플) 출력을 재현하십시오.

-> 344 CPM을 획득했습니다!

샘플 런

-> 정착
->면
-> 열기
-> 장관
-> 위험
-> 색
-> 배
-> 동일
-> 크기
-> 칼
치르다
확인
측면
확인
열다
확인
# ...................... 일부 라인이 끊어졌습니다 ......................
워드
잘못된
검
확인
-> 298 CPM을 획득했습니다!

승자

이것은 가장 짧은 항목 (소스 코드 문자 수로)이기는 코드 colf입니다. 재미 있습니다!


4
나는 승자가 부분적으로 CPM이 가장 높은 사람에 의해 득점해야한다고 생각)
mellamokb

시간을 얼마나 정확하게 측정해야합니까? 1 초 해상도는 괜찮습니까?
Ilmari Karonen

@ 일 마리 카로 넨 (Ilmari Karonen) :이 특정 콘테스트에는 1 초의 해상도가 적합합니다.
ChristopheD

답변:


5

K, 146

현재 작업 디렉토리에 'd'라는 사전 파일을 가정합니다.

{b:+/#:'a:10?_0:`:d;-1"-> ",/:a;s:.z.t;while[#a;$[(,/0:0)~*a;[a:1_a;-1"OK"];-1"WRONG"]];-1"--> You have scored ",($(60000*b)%"i"$.z.t-s)," CPM!";}

K내가 본 것 중 아주 훌륭하고 짧고 첫 번째 항목 (codegolf.se에 있음)
ChristopheD

감사합니다. 여기에있는 모든 답변은 Q 또는 (증가) K입니다.
tmartin

나는 이것이 왜 단 하나의 공감대 (mine)를 얻었는지 알지 못한다!
ChristopheD

11

배시 - 217 개 212 199 196 문자

이길 수는 없지만 재미있었습니다.

declare -A W
for w in `shuf -n10`;do C+=$w;echo -\> $w;W[$w]=OK;done
SECONDS=0
for((;${#W[*]};));do read r;echo ${W[$r]-WRONG};unset W[$r];done
echo --\> You have scored $((60*${#C}/SECONDS)) CPM!

지금 200 자 미만!

단어 목록 파일을 인수로 사용 이제 표준 입력에서 단어 목록을 사용합니다. 터미널에 붙여 넣고 ^ D를 누릅니다.

manatwork에서 제안 제안


1
이기는하지만 재미 않을거야 - 나는 내 C # 솔루션 : 게시 할 때 나도 같은 생각
크리스티안 루파 스쿠을

1
$SECONDS셸 변수를 사용하여 경과 시간 계산을 단순화 할 수 있습니다 .
manatwork

2 개 이상의 문자를 제거 할 수 있습니다. 1) :기본값 매개 변수 확장; 2) 산술 평가 $SECONDS. 실제로 또 다른 추가 문자 인 및 파일에 줄 바꿈이 있습니다.
manatwork

4

루비 (189 178 171 168)

$><<t=['',d=[*$<.lines].sample(10)]*'-> '
s=Time.now
puts d.delete($stdin.gets)?:OK:'WRONG'while d[0]
puts'--> You have scored %i CPM!'%((t.size-40)/(Time.now-s)*60)

아주 기본적으로 개선이 필요하다고 확신합니다. 사전의 파일 이름을 명령 줄 인수로 사용합니다.

편집 : 몇 가지 사소한 조정, 주로 사전에서 줄 바꿈 유지. 결과적으로 파일이 올바르게 작동하려면 후행 줄 바꿈이 필요합니다.


4

C, 305309 347

char*stdin,w[11][99];long i,t;main(int n,char**v){v=fopen(v[1],"r");
for(srand(time(&t));fgets(w[i++>9?(n=rand()%i)>10?0:n:i],99,v););
for(i=n=0;i<10;n+=printf("-> %s",w[++i])-4);
for(;i;puts(!strcmp(*w,w[11-i])?--i,"OK":"WRONG"))fgets(*w,99,stdin);
printf("--> You have scored %ld CPM!\n",n*60/(time(0)-t));}

개선 힌트에 대한 @ugoren에게 감사드립니다. "11 번째 단어"를 사용하여 들어오는 사전 항목을 버리는 것은 이전의 strcpy-if-chosen 방식보다 큰 승리였습니다.

ungolfed 소스는 ​​다음과 같습니다.

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

static char words[11][99];
static long i, t;

int main(int argc, char *argv[])
{
    FILE *fp;
    int n;

    fp = fopen(argv[1], "r");
    srand(time(0));
    for (i = 0 ; fgets(words[0], sizeof words[0], fp) ; ++i) {
        n = i < 10 ? i : rand() % i;
        if (n < 10)
            strcpy(words[n + 1], words[0]);
    }
    fclose(fp);

    n = 0;
    for (i = 1 ; i <= 10 ; ++i)
        n += printf("-> %s", words[i]) - 4;
    t = time(0);
    i = 1;
    while (i <= 10 && fgets(words[0], sizeof words[0], stdin)) {
        if (strcmp(words[0], words[i])) {
            puts("WRONG");
        } else {
            puts("OK");
            ++i;
        }
    }
    if (i > 9)
        printf("-> You have scored %ld CPM!\n", n * 60 / (time(0) - t));

    return argc - argc;
}

개선 사항 : 1. K & R 선언 : main(n,v)char**v;{.... 2. stdin할 수 있습니다 char *. fgets(buf,len,stdin)= gets(buf)(버퍼 오버런에 신경 쓰지 마십시오). 3. 무엇이 잘못 되었나요 rand()%i? RAND_MAX필요하지 않습니다. 4. 왜 long?
ugoren

1
또한 : 1) t=time(0)-> time(&t). 2) n*60/(time(0)-t)괄호가 있어야합니다 . 다음 *60으로 이동할 수 있습니다 . 3) 의 추가 요소로 교체 하고으로 직접 읽은 것으로 교체하십시오 . n+=60*printfn/=time(0)-tbwstrcpyw
ugoren

로 바꾸려면 사전의 개행을 처리하기 위해 추가 코드 fgets()gets()필요합니다. 이 상처는 더 짧아졌습니다. rand()%i충분하지 않습니다. 실제 계산은 (double)i*rand()/RAND_MAX입니다. 이동 *60의 printf 또한 상기 변경 수단 -4-240궁극적 손실을 감는다 있도록. 그래도 다른 점은 유효합니다 (믿습니다). 아, longtime_t가 전통적으로 길기 때문입니다. 우리가 골프를한다고해서 휴대가 불가능하다는 의미는 아닙니다.
breadbox

나는 놓쳤다 4-> 240... 휴대 성과 골프는 잘 어울리지 않는다. 그러나 i,t;(암시 적으로 int)를 정의하는 것은 최대 MAX_INT몇 초 까지 가능합니다 (를 사용하지 않는 경우 time(&t)). 으로 rand(), 당신이 필요로하는 모든이입니다 10/i기회, 그리고 rand()%i<10그것을 않습니다.
ugoren

무작위 선택은 다소 결함이 있습니다 (절대적인 공정성이 요구되지는 않음). 11 번째 줄은 10/11의 기회를 선택해야하지만, 그렇게하면 rand()%10>10100 %가됩니다. rand()%(i+1)>9대신하면 더 나은 (그러나있다 %(i+1)i++>9?. 또한 이동 *stdin먼저하고 공간 절약.
ugoren

2

C # 401

void T(){
Action<string>C=Console.WriteLine;Func<string>R=Console.ReadLine;
var w=new List<string>();
for(var l=R();l!="";l=R())w.Add(l);
var s=w.OrderBy(_=>Guid.NewGuid()).Take(10).ToList();
s.ForEach(x=>C("=> "+x));
var t=s.Select(x=>x.Length).Sum();
var c=Stopwatch.StartNew();
while(s.Any()){C(s.Remove(R())?"OK":"WRONG");}
c.Stop();
C("--> You have scored "+c.Elapsed.TotalSeconds*60/t+" CPM!");}

여기에서 버전을 실행 중 : http://ideone.com/Nt6Id


2

파이썬 ( 256 235)

import time as t,random as r
def p(x):print x
c=r.sample(input().split("\n"),10)
z=lambda x:p(("WRONG","OK")[raw_input()==x])or len(x)
p("--> "+"\n--> ".join(c))
_=t.time()
p("--> You have scored %d CPM!"%(sum(map(z,c))/(t.time()-_)*60))

이것은 Python 2.x에 있으며 3.x에서는 인쇄 기능을 사용하여 4자를 더 면도 할 수 있습니다.

개행 포함


2
"질문 : 개행은 중요합니까?" 우리는 보통 "필수 문자"로갑니다. 파이썬의 경우, 줄 바꿈을 제거하면 프로그램이 작동하지 않기 때문에 줄 바꿈을 계산해야합니다.
Joey Adams

1
나는 당신이 바꿀 수 있다고 생각 z=lambda x:def z(x):.
Joey Adams

@JoeyAdams : 아무 것도 돌려주지 않아도되었지만 돌아올 필요가 len(x)있고 def z(x):return5 개의 캐릭터 가 더 있습니다 : /
Joel Cornett

입력으로 파이핑하고 (질문에 허용 된) input()대신 사용하여 일부 캐릭터를 얻을 수 있다고 생각합니다.sys.argv[1].read()
ChristopheD

@JoelCornett : 그렇군요.
Joey Adams

2

PHP 187 바이트

명확성을 위해 줄 바꿈이 추가되었습니다.

<?$s=file($argv[1]);
for(shuffle($s);$i++<10;$l+=strlen($$i))echo~ÒÁß,$$i=$s[$i];
for($t=time();$j++<10;)echo$$j==fgets(STDIN)?OK:WRONG,~õ?>
--> You have scored <?=0|$l/(time()-$t)*60?> CPM!

사전 파일 이름을 명령 행 인수로 승인합니다. 사전 파일은 개행으로 끝나야합니다.


2

스칼라 ( 319 (306) 304 (302))

var s=util.Random.shuffle(io.Source.fromFile(args(0)).getLines.toSet)take 10
def?(a:Any)=println(a)
var l=(0/:s){_+_.size}
s map{"-> "+_}map?
def n=System.nanoTime
val t=n
while(s.size!=0){val m=readLine
if(s contains m)?("OK")else?("WRONG");s-=m}
?("--> You have scored "+l*60000000000L/(n-t)+" CPM!")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.