そのタイトルについては、長く一生懸命考える必要がありましたか?...話は終わったので、すごいコードを書いてみましょう :)
ポンプブレーキ?悲鳴を上げる.... 今日構築しようとしているものについて少し紹介しましょう。タイトルがわかりにくいと思うので、ここでは golang で入力速度を計算する CLI アプリケーションを構築します。ただし、文字通り同じアプリケーションを、任意のプログラミング言語で同じ手法に従って構築することもできます。
さて、コーディングしましょう?
package main import ( "bufio" "fmt" "log" "math/rand" "os" "strings" "time" ) var sentences = []string{ "There are 60 minutes in an hour, 24 hours in a day and 7 days in a week", "Nelson Mandela is one of the most renowned freedom fighters Africa has ever produced", "Nigeria is the most populous black nation in the world", "Peter Jackson's Lord of the rings is the greatest film of all time", }
main.go ファイルでは、ロジックを作成するために必要なパッケージをインポートします。文章のスライスも作成します。自由に追加してください。
// A generic helper function that randomly selects an item from a slice func Choice[T any](ts []T) T { return ts[rand.Intn(len(ts))] } // Prompts and collects user input from the terminal func Input(prompt string) (string, error) { fmt.Print(prompt) r := bufio.NewReader(os.Stdin) line, err := r.ReadString('\n') if err != nil { return "", err } return strings.Trim(line, "\n\r\t"), nil } // Compares two strings and keeps track of the characters // that match and those that don't func CompareChars(target, source string) (int, int) { var valid, invalid int // typed some of the words // resize target to length of source if len(target) > len(source) { diff := len(target) - len(source) invalid += diff target = target[:len(source)] } // typed more words than required // resize source to length of target if len(target) < len(source) { invalid++ source = source[:len(target)] } for i := 0; i < len(target); i++ { if target[i] == source[i] { valid++ } if target[i] != source[i] { invalid++ } } return valid, invalid } // Calculates the degree of correctness func precision(pos, fal int) int { return pos / (pos + fal) * 100 } // Self explanatory - don't stress me ? func timeElapsed(start, end time.Time) float64 { return end.Sub(start).Seconds() } // Refer to the last comment func accuracy(correct, total int) int { return (correct / total) * 100 } // ? func Speed(chars int, secs float64) float64 { return (float64(chars) / secs) * 12 }
次に、アプリケーション ロジックを作成するときに便利な関数をいくつか作成します。
func main() { fmt.Println("Welcome to Go-Speed") fmt.Println("-------------------") for { fmt.Printf("\nWould you like to continue? (y/N)\n\n") choice, err := Input(">> ") if err != nil { log.Fatalf("could not read value: %v", err) } if choice == "y" { fmt.Println("Starting Game...") timer := time.NewTimer(time.Second) fmt.Print("\nBEGIN TYPING NOW!!!\n\n") _ = <-timer.C sentence := Choice(sentences) fmt.Printf("%s\n", sentence) start := time.Now() response, err := Input(">> ") if err != nil { log.Fatalf("could not read value: %v", err) } elasped := timeElapsed(start, time.Now()) valid, invalid := CompareChars(sentence, response) fmt.Print("\nResult!\n") fmt.Println("-------") fmt.Printf("Correct Characters: %d\nIncorrect Characters: %d\n", valid, invalid) fmt.Printf("Accuracy: %d%%\n", accuracy(valid, len(sentence))) fmt.Printf("Precision: %d%%\n", precision(valid, invalid)) fmt.Printf("Speed: %.1fwpm\n", Speed(len(sentence), elasped)) fmt.Printf("Time Elasped: %.2fsec\n", elasped) } if choice == "N" { fmt.Println("Quiting Game...") break } if choice != "N" && choice != "y" { fmt.Println("Invalid Option") } } }
メイン関数では、ターミナルにウェルカム メッセージを書き込み、プログラムを実行するための無限ループを作成します。次に、プログラムを終了するオプションを含む確認メッセージを標準出力 (ターミナル) に出力します。続行を選択した場合、以前に作成された文のスライスから文が選択され、開始時間が記録された直後に端末に表示されます。ユーザー入力を収集し、時間、速度、精度、精度を計算し、結果を端末に表示します。無限ループがリセットされ、プログラムからオプトアウトするまでアプリケーションが再度実行されます。
出来上がり!!! golang で最初のプログラムを作成したところです。
以上がGolang でのタイピング速度テスト CLI アプリケーションの作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。