タイピング速度テストを構築/ CPMを測定


11

ルール

選択した言語でタイピング速度テストを作成します!

1。選択した辞書を含むファイルを提供します(その中の「単語」はすべて改行で区切る必要があります)。経由でパイプするstdinか、コマンドライン引数としてその名前を指定します。

a
できる
約
上
不在
...

2。ファイルからランダムな単語を10個選択し(重複を許可しないでください)、次の方法で印刷します。

->直接
->地面
->次へ
-> 5
...

3。これから費やした時間の測定を開始します!

4。ユーザーが10語すべてをできるだけ早く入力できるようにします(改行で終了します)。印刷OKあなたはマッチを持っているとき、印刷WRONG我々はタイプミスを持っている(または単語がすでに正常にこの実行に入力された)とき。

5。時計を止めろ!次に、次のように計算されるCPM(1分あたりの文字数)ベンチマークを印刷します(sum of the characters of the chosen words / time spent typing (seconds)) * 60。最も近い整数に丸めて、次の(サンプル)出力を再現します。

-> 344 CPMを獲得しました!

サンプル実行

->解決する
->側
->開く
->大臣
->リスク
->色
->船
->同じ
->サイズ
->剣
解決する
OK
側
OK
開いた
OK
#......................いくつかの行を切り取った......................
語
違う
剣
OK
-> 298 CPMを獲得しました!

勝者

これはコードコルフで、最短のエントリ(ソースコードの文字数で)が勝ち、楽しんでください!


4
勝者は、CPMが最も高い人によって部分的に得点されるべきだと思います;)
— mellamokb

時間をどのくらい正確に測定する必要がありますか?1秒の解像度で大丈夫ですか?
— イルマリカロネン

@Ilmari Karonen:この特定のコンテストでは1秒の解像度で問題ありません。
— クリストフ

回答:


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)...-
— クリストフ

おかげで、ここでの私の答えはすべてQまたは(ますます)Kにあります。
— tmartin

なぜこれがたった1つの賛成票(私の)しか得られなかったのかよくわかりません!
— クリストフ

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を押します

マナトワークからの提案を実装しました


1
勝つつもりはないが、楽しかった -C#ソリューションを投稿したときも同じだと思う:)
— Cristian Lupascu

1
$SECONDSシェル変数を使用して、経過時間の計算を簡素化できます。
— マナトワーク

次の2文字を削除できます。1):デフォルト値のパラメーター展開。2)算術評価の$前SECONDS。実際には、ファイルのandに改行がもう1つあります。
— マナトワーク

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、305の309 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アプローチよりも大きな勝利でした。

以下は、ソースのないソースです。

#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ですか?
— ウゴレン

1
また:1)t=time(0)-> time(&t)。2)n*60/(time(0)-t)行かなければならない括弧を持っている- *60に移動させることができn+=60*printf、その後、n/=time(0)-t。3)bの余分な要素wと置き換えstrcpy、に直接読み込むと置き換えwます。
— ウゴレン

に置き換えるには、辞書の改行を処理するための追加のコードfgets()がgets()必要です。これは短くなってしまいました。rand()%i十分ではありません。実際の計算は(double)i*rand()/RAND_MAXです。*60また、printfに移動すると、toを変更すること-4に-240なるため、最終的に損失が発生します。ただし、他のポイントは有効なものです(私は信じています)。ああ、それlongはtime_tが伝統的に長いからです。ゴルフをしているからといって、ポータブルになれないというわけではありません。
— ブレッドボックス

懐かしかった4-> 240...携帯性とゴルフは相性が悪い。ただし、i,t;(暗黙的にint)を定義することは(MAX_INT秒を使用しない場合time(&t))秒まで問題ありません。でrand()、必要なのは10/iチャンスだけで、rand()%i<10それを行います。
— ウゴレン

ランダムな選択には多少の欠陥があります(絶対的な公平性が必要というわけではありません)。11行目では10/11のチャンスが選択されるはずですが、そうするとrand()%10>10100%になります。rand()%(i+1)>9(ただし、%(i+1)doの場合はそうです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ではprint関数を使用してさらに4文字を削ることができます。

改行が含まれています


2
「質問:改行は重要ですか?」通常、「必要な文字」を使用します。Pythonの場合、はい、改行を削除するとプログラムが機能しなくなるため、改行を数える必要があります。
— ジョーイアダムス

1
私はあなたが変えることができると思いますz=lambda x:しdef z(x):。
— ジョーイアダムス

@JoeyAdams:私の場合のみ戻りnoneに必要な可能性がありますが、私は返す必要がありますlen(x)し、def z(x):returnさらに5 charatersです:/
— ジョエル・コルネット

私はあなたが(問題の許可)の入力にパイプすると、使用して一部の文字に勝つことができると思うinput()のではなくsys.argv[1].read()
— ChristopheD

@JoelCornett:おっと、あなたは正しい。
— ジョーイアダムス

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

Scala(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.