Yazma hızı testi / ölçüm BGBM'si oluşturma


11

Kurallar

Tercih ettiğiniz dilde bir yazma hızı testi yapma zamanı!

1 . Seçili sözlük içeren bir dosya sağlarsınız (içindeki her 'kelime' yeni satırla sınırlandırılmalıdır). Aracılığıyla ekleyin stdinveya adını komut satırı bağımsız değişkeni olarak sağlayın.

bir
yapabilmek
hakkında
yukarıda
yokluk
...

2 . Dosyadan 10 rastgele kelime seçin (kopyalara izin verilmemelidir) ve bunları aşağıdaki şekilde yazdırın:

-> doğrudan
-> zemin
-> sonraki
-> beş
...

3 . Artık harcanan zamanı ölçmeye başlayın!

4 . Kullanıcının on kelimenin tümünü olabildiğince hızlı yazmasına izin verin (satır başı ile sona erdi). Baskı OKEğer bir eşleşme olduğunda, baskı WRONGbir yazım hatası var (ya da kelime zaten başarıyla bu dönemde yazılan) ne zaman.

5 . Saatleri durdur! Şimdi yazdırmak CPM : aşağıdaki şekilde hesaplanır kriter, (dakika başına karakter kavramı) (sum of the characters of the chosen words / time spent typing (seconds)) * 60. En yakın tam sayıya yuvarlayın ve aşağıdaki (örnek) çıktıyı çoğaltın:

-> 344 BGBM kazandınız!

Örnek bir çalışma

-> yerleşmek
-> yan
-> açık
-> bakan
-> risk
-> renk
-> gemi
-> aynı
-> boyut
-> kılıç
yerleşmek
tamam
yan
tamam
açık
tamam
# ...................... bazı çizgiler kesildi ......................
sözcük
YANLIŞ
kılıç
tamam
-> 298 BGBM kazandınız!

Kazanan

Bu kod colf, en kısa giriş (kaynak kodu karakter sayısı) kazanır, eğlenin!


4
Bence kazanan kısmen en yüksek BGBM'ye sahip kişi tarafından puanlandırılmalıdır;)
mellamokb

Zamanı ölçmek için ne kadar hassas bir şekilde ihtiyacımız var? Bir saniye çözünürlük iyi mi?
Ilmari Karonen

@Ilmari Karonen: Bu yarışma için bir saniyelik karar yeterli olacaktır.
ChristopheD

Yanıtlar:


5

K, 146

Geçerli çalışma dizininde 'd' adlı sözlük dosyasını varsayar.

{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!";}

Çok güzel ve kısa, ilk girişte Kgördüm (burada codegolf.se) ...
ChristopheD

Teşekkürler, buradaki tüm cevaplarım Q veya (giderek artan bir şekilde) K'de.
tmartin

Bunun neden sadece tek bir upvote aldığını tam olarak anlamıyorum (benim)!
ChristopheD

11

Bash - 217 212 199 196 karakter

Kazanmayacak ama eğlenceliydi

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!

Şimdi 200 karakterden az!

Sözcük listesi dosyasını bağımsız değişken olarak alır Şimdi standart girdi üzerindeki sözcük listesini alır. Terminale yapıştırın ve ^ D tuşuna basın

Yapıtlardan gelen öneri


1
Kazanmayacağım ama eğlenceliydi - C # çözümlerimi
gönderdiğimde

1
$SECONDSGeçen sürenin hesaplanmasını basitleştirmek için shell değişkenini kullanabilirsiniz .
manatwork

2 karakteri daha kaldırabilirsiniz: 1) :varsayılan değer parametresi genişletmesinde; 2) $önünde SECONDSaritmetik değerlendirme. Aslında başka bir ekstra karakter var, ve dosya ve satırsonu.
manatwork

4

Ruby (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)

Oldukça basit, eminim yapılacak iyileştirmeler var. Sözlüğün dosya adını komut satırı bağımsız değişkeni olarak alır.

DÜZENLEME : Yeni satırları sözlükten uzak tutmak için birkaç küçük değişiklik. Sonuç olarak, dosyanın düzgün çalışması için sondaki bir satırsonu gerekir.


4

Cı, 305 309 347 karakter

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'a iyileştirme ipuçları için teşekkürler. Gelen sözlük girişlerini atmak için bir "11. kelime" kullanmak, seçtiğim önceki strcpy yaklaşımım üzerinde büyük bir kazançtı.

İşte ungolfed kaynağı:

#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;
}

Bazı iyileştirmeler: 1. K & F beyanı: main(n,v)char**v;{.... 2. stdinolabilir char *. fgets(buf,len,stdin)= gets(buf)(arabellek taşmasına aldırmayın). 3. Sorun nedir rand()%i? RAND_MAXgerekli değil. 4. Neden long?
ugoren

1
Ayrıca: 1) t=time(0)-> time(&t). 2) n*60/(time(0)-t)- gitmelidir parantezler var *60taşınmış olabilir n+=60*printfo zaman n/=time(0)-t. 3) biçinde fazladan bir eleman ile wdeğiştirin strcpy, doğrudan içine okundu ile değiştirin w.
ugoren

Değiştirme fgets()ile gets()ihtiyaçlara sözlükte satırsonu ile anlaşma için ekstra kod; bu yara daha kısa oldu. rand()%iyeterli değil; gerçek hesaplama (double)i*rand()/RAND_MAX. Printf'ye taşımak *60aynı zamanda the -4değerini değiştirmek anlamına gelir , -240böylece sonuçta bir kayıp olur. Diğer noktalarınız da geçerli (inanıyorum). Oh, longçünkü time_t geleneksel olarak uzun. Sadece golf oynadığımız için taşınabilir olamayacağımız anlamına gelmez.
ekmek kutusu

Kaçırdım 4-> 240... Taşınabilirlik ve golf birlikte iyi gitmiyor. Ancak i,t;(dolaylı olarak int) tanımlamak MAX_INTsaniyeler içinde tamamdır (eğer kullanmazsanız time(&t)). Bununla birlikte rand(), tek ihtiyacınız olan bir 10/işanstır ve rand()%i<10bunu yapar.
ugoren

Rastgele seçiminiz biraz kusurlu (mutlak adalet gerekli değil). 11. satırın seçilmesi için 10/11 şansı olmalı, ancak bunu yapıyorsunuz rand()%10>10, bu da% 100 veriyor. rand()%(i+1)>9yerine daha iyi (ama %(i+1)yapmak i++>9?. Ayrıca hareket *stdinbirinci olmak ve bir boşluk tasarrufu.
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!");}

Burada sürüm çalışıyor: http://ideone.com/Nt6Id


2

Python ( 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))

Bu python 2.x'te, 3.x'te print fonksiyonunu kullanarak 4 karakteri daha tıraş edebilirim.

Yeni satırlar dahil


2
"Soru: Yeni satırlar önemli mi?" Genellikle "gerekli karakterler" deniriz. Python söz konusu olduğunda, evet, yeni satırların sayılması gerekir, çünkü bunları kaldırmak programın çalışmasını engelleyecektir.
Joey Adams

1
Ben değiştirebileceğiniz düşünmek z=lambda x:için def z(x):.
Joey Adams

@JoeyAdams: Sadece hiçbirini döndürmem gerekiyorsa yapabilirdim, ama geri dönmem gerekiyor len(x)ve def z(x):return5 karakter daha: /
Joel Cornett

Ben girişte boru (soru izin verilir) ve input()yerine kullanarak bazı karakterler kazanabilirsiniz düşünüyorumsys.argv[1].read()
ChristopheD

@JoelCornett: Hata! Haklısın.
Joey Adams

2

PHP 187 bayt

Netlik için yeni satırlar eklendi:

<?$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!

Sözlük dosya adını komut satırı bağımsız değişkeni olarak kabul eder. Sözlük dosyası bir satırsonu ile bitmelidir.


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!")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.