Menu
CoddyTech

Tidur dan Ticker

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 64 dari 68.

Terkadang kamu perlu mengatur waktu eksekusi programmu. Go menyediakan dua fungsi penting dalam package time untuk keperluan ini: time.Sleep untuk menjeda eksekusi dan time.NewTicker untuk melakukan tindakan secara berkala.

Fungsi time.Sleep menjeda programmu selama durasi yang ditentukan. Fungsi ini menerima time.Duration sebagai parameternya dan memblokir eksekusi hingga durasi tersebut berlalu:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

Untuk tindakan berulang dengan interval tetap, time.NewTicker membuat ticker yang mengirim nilai melalui channel pada interval yang ditentukan. Ini berguna untuk tugas yang perlu dijalankan secara berkala:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // Tunggu tick berikutnya
    fmt.Println("Tick", i+1)
}

Fungsi pengaturan waktu ini penting untuk membuat jeda, menerapkan batas waktu, dan menjadwalkan operasi berulang dalam program Go-mu.

challenge icon

Tantangan

Mudah

Buat timer sesi meditasi yang menggunakan time.Sleep untuk membuat jeda di antara instruksi terpandu dan menunjukkan kontrol waktu dasar dalam program Go.

Kamu akan menerima dua input:

  • Sebuah string yang berisi langkah-langkah meditasi dengan format "step1:duration,step2:duration,step3:duration" (misalnya, "Breathe in:3,Hold:2,Breathe out:4")
  • Sebuah string yang berisi jumlah siklus untuk diulang (misalnya, "5")

Tugasmu adalah:

  1. Uraikan input pertama dengan memisahkan berdasarkan koma untuk mendapatkan setiap langkah meditasi
  2. Untuk setiap langkah, pisahkan berdasarkan titik dua untuk mengambil instruksi dan durasi (dalam detik)
  3. Ubah string durasi menjadi integer menggunakan package strconv
  4. Ubah input kedua menjadi integer untuk mendapatkan jumlah siklus
  5. Tampilkan header sesi: "=== MEDITATION TIMER ==="
  6. Tampilkan penyiapan sesi: "Starting meditation session with [number_of_cycles] cycles"
  7. Untuk setiap siklus (dimulai dari siklus 1):
    • Tampilkan: "--- Cycle [cycle_number] ---"
    • Untuk setiap langkah meditasi:
      • Tampilkan: "[instruction]..."
      • Gunakan time.Sleep untuk jeda selama durasi yang ditentukan (kalikan durasi dengan time.Millisecond, seperti pada time.Duration(duration) * time.Millisecond, agar pemeriksaan selesai dengan cepat; output tetap menyebutkan detik)
      • Setelah jeda, tampilkan: "[instruction] complete ([duration] seconds)"
    • Setelah menyelesaikan semua langkah dalam satu siklus, tampilkan: "Cycle [cycle_number] finished"
  8. Setelah semua siklus selesai, tampilkan ringkasan sesi:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (jumlah durasi semua langkah dikalikan dengan jumlah siklus)
  9. Tampilkan pesan penyelesaian: "Meditation session finished - well done!"

Gunakan package time untuk operasi jeda, package strings untuk memisahkan string input, package strconv untuk mengubah string menjadi integer, dan package fmt untuk output. Ingat bahwa time.Sleep menerima parameter time.Duration, jadi ubah integer terlebih dahulu: time.Duration(duration) * time.Millisecond. Timer sungguhan akan menggunakan time.Second, tetapi jeda dalam hitungan detik penuh membuat pemeriksaan kehabisan waktu. Tantangan ini menunjukkan cara menggunakan time.Sleep untuk membuat jeda terukur dalam eksekusi program, untuk penerapan praktis seperti meditasi terpandu atau timer olahraga.

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Baca input dengan bufio.Scanner agar spasi tertangani dengan benar
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// Uraikan langkah-langkah meditasi dan jumlah siklus
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Tulis kodemu di bawah ini
	// Uraikan setiap langkah untuk mengambil instruksi dan durasinya
	// Pastikan slice parts memiliki cukup elemen sebelum kamu mengaksesnya
	// Tampilkan judul sesi dan pengaturannya
	// Ulangi setiap siklus dan langkah
	// Gunakan time.Sleep untuk jeda: time.Duration(duration) * time.Millisecond
	// Tampilkan pesan penyelesaian dan ringkasan
	
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online