सीपीएम टाइपिंग टेस्ट / मापने का निर्माण करें


11

नियम

अपनी पसंद की भाषा में टाइपिंग स्पीड टेस्ट बनाने का समय आ गया है!

1 है । आप पसंद की एक डिक्शनरी के साथ एक फ़ाइल प्रदान करते हैं (इसमें प्रत्येक 'शब्द' को नया रूप दिया जाना चाहिए)। इसके माध्यम से पाइप करें stdinया इसे कमांड लाइन तर्क के रूप में नाम दें।

ए
योग्य
के बारे में
ऊपर
अनुपस्थिति
...

। फ़ाइल से 10 यादृच्छिक शब्द चुनें (कोई डुप्लिकेट की अनुमति नहीं होनी चाहिए) और उन्हें निम्नलिखित तरीके से प्रिंट करें:

-> प्रत्यक्ष
-> मैदान
-> अगला
-> पाँच
...

। अभी से बिताए गए समय को मापना शुरू करें!

। उपयोगकर्ता को सभी दस शब्दों को जितनी जल्दी हो सके टाइप करें (एक गाड़ी वापसी के साथ समाप्त)। OKजब आपके पास एक मिलान हो तो प्रिंट करें , WRONGजब हमारे पास टाइपिंग की गलती हो (या शब्द पहले से ही इस रन में टाइप किया गया था)।

। घड़ियों रोक! अब प्रिंट सीपीएम : बेंचमार्क है, जो गणना निम्न प्रकार है (प्रति मिनट caracters) (sum of the characters of the chosen words / time spent typing (seconds)) * 60। निकटतम पूर्णांक पर गोल करें और निम्न (नमूना) आउटपुट पुन: उत्पन्न करें:

-> आपने 344 CPM स्कोर किया है!

एक नमूना चला

-> बसना
-> पक्ष
-> खुला
-> मंत्री
-> जोखिम
-> रंग
-> जहाज
-> वही
-> आकार
-> तलवार
रुकना
ठीक
पक्ष
ठीक
खुला हुआ
ठीक
# ...................... कुछ रेखाएँ छीन ली गईं ......................
शब्द
गलत
तलवार
ठीक
-> आपने 298 CPM स्कोर किया है!

विजेता

यह कोड कॉलफ़ है, सबसे छोटी प्रविष्टि (स्रोत कोड वर्ण गणना में) जीतती है, मज़े करो!


4
मुझे लगता है कि विजेता को आंशिक रूप से उच्चतम सीपीएम वाले व्यक्ति द्वारा स्कोर किया जाना चाहिए;)
मेलमोकब

समय को मापने के लिए हमें कितनी सही आवश्यकता है? क्या एक दूसरा संकल्प ठीक है?
इल्मरी करोनें

@ इल्मारी करोनेन: इस विशिष्ट प्रतियोगिता के लिए एक दूसरा प्रस्ताव ठीक होगा।
क्रिस्टोफ़ीड

जवाबों:


5

के, 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 या (तेजी से) में हैं।
tmartin

मैं काफी नहीं मिलता है क्यों यह केवल एक ही upvote (मेरा) मिला!
क्रिस्टोफ़ीड

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 # समाधान पोस्ट करता हूं तो :) :)
क्रिस्टियन लुपस्कू

1
आप $SECONDSबीते हुए समय की गणना को सरल बनाने के लिए शेल चर का उपयोग कर सकते हैं ।
मैनटवर्क

आप 2 और वर्णों को हटा सकते हैं: 1) :डिफ़ॉल्ट मान पैरामीटर विस्तार में; 2) अंकगणितीय मूल्यांकन $में सामने SECONDS। वास्तव में एक और अतिरिक्त चरित्र है, फ़ाइल की और पर नईलाइन।
मैनटवर्क

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)

सुंदर बुनियादी, मुझे यकीन है कि सुधार किए जाने हैं। डिक्शनरी के फाइलनाम को एक कमांड-लाइन तर्क के रूप में लेता है।

EDIT : मुख्य रूप से डिक्शनरी से नई कहानियों को बनाए रखने के आसपास कुछ मामूली मोड़। परिणामस्वरूप फ़ाइल को सही ढंग से काम करने के लिए एक अनुगामी न्यूलाइन की आवश्यकता होगी।


4

C, 305 309 347 chars

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

सुधार के संकेत के लिए @ यूगोरेन को धन्यवाद। आने वाली शब्दकोश प्रविष्टियों को छोड़ने के लिए "11 वें शब्द" का उपयोग करना मेरे पिछले स्ट्रैची-इफ-चुने हुए दृष्टिकोण पर एक बड़ी जीत थी।

यहाँ 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. के एंड आर घोषणा 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
ugoren

जगह fgets()के साथ gets()की जरूरत शब्दकोश में नई-पंक्तियों के साथ सौदा करने के लिए अतिरिक्त कोड; यह घाव छोटा हो रहा है। rand()%iपर्याप्त नहीं है; वास्तविक गणना है (double)i*rand()/RAND_MAX। चलती *60printf को भी बदल रहा है इसका मतलब -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>10, जो इसे 100% देता है। rand()%(i+1)>9बेहतर है (लेकिन इसके बजाय अगर %(i+1)करें i++>9?। इसके अलावा *stdinसबसे पहले कदम रखें और एक स्थान
बचाएं

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

यह अजगर 2.x में है, 3.x में मैं प्रिंट फ़ंक्शन का उपयोग करके 4 और पात्रों को शेव कर सकता हूं।

न्यूलाइन शामिल थे


2
"प्रश्न: क्या नई गणनाएँ हैं?" हम आमतौर पर "आवश्यक पात्रों" द्वारा जाते हैं। पायथन के मामले में, हां, नई सुर्खियों को गिनने की जरूरत है, क्योंकि उन्हें हटाने से काम करने से कार्यक्रम बना रहेगा।
जॉय एडम्स

1
मुझे लगता है कि आप बदल सकते हैं z=lambda x:करने के लिए def z(x):
जॉय एडम्स

@ जोए एडम्स: मैं अगर केवल किसी को वापस करने की जरूरत नहीं है, लेकिन मुझे वापस जाने की जरूरत है len(x)और def z(x):return5 और चार्टर्स हैं: /
जोएल कॉर्नेट

मुझे लगता है कि आप इनपुट में पाइपिंग (प्रश्न में अनुमति दी गई) और input()इसके बजाय का उपयोग करके कुछ पात्रों को जीत सकते हैंsys.argv[1].read()
क्राइस्टोफेड

@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

स्काला ( 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!")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.