Menu
Coddy logo textTech

ユニークなアイテムコレクター

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 68/68。

challenge icon

チャレンジ

簡単

Goの慣用的なセットパターンを使用して、文字列のコレクションから一意のアイテムをフィルタリングする重複削除システムを作成します。このチャレンジでは、map[string]struct{}のイディオムを使用して、既知のアイテムを追跡し、一意の要素のみを含むコレクションを構築する能力をテストします。

2つの入力を受け取ります:

  • カンマで区切られたアイテムを含む文字列(例:"apple,banana,apple,orange,banana,grape,apple"
  • マージする追加のアイテムを含む、同様にカンマで区切られた文字列(例:"kiwi,apple,mango,banana,kiwi"

あなたのタスクは以下の通りです:

  1. 文字列のスライスを受け取り、一意の文字列のみを含む新しいスライスを返すgetUniqueItemsという関数を作成します。
  2. この関数内で、map[string]struct{}のイディオムを使用して、どのアイテムが既知であるかを追跡します。
  3. 入力スライスを反復処理し、各アイテムについて以下を行います:
    • comma okイディオムを使用して、アイテムがセット内に存在するかどうかを確認します。
    • アイテムがまだ現れていない場合は、セットと結果スライスの両方に追加します。
  4. 最初の入力をカンマで分割して解析し、初期アイテムリストを取得します。
  5. 2番目の入力をカンマで分割して解析し、追加アイテムを取得します。
  6. システムヘッダーを表示します:"=== UNIQUE ITEM COLLECTOR ==="
  7. 元のアイテムを表示します:"Original items: [comma-separated list of all original items]"
  8. 追加のアイテムを表示します:"Additional items: [comma-separated list of all additional items]"
  9. getUniqueItems関数を使用して、元のリストから一意のアイテムを取得します。
  10. 一意の元のアイテムを表示します:"Unique original items: [comma-separated list of unique items from original list]"
  11. 両方の入力スライスを、すべてのアイテムを含む単一のスライスに結合します。
  12. getUniqueItems関数を使用して、結合されたリストから一意のアイテムを取得します。
  13. 最終的な一意のアイテムを表示します:"Final unique items: [comma-separated list of all unique items]"
  14. コレクションの統計を表示します:
    • "=== COLLECTION STATISTICS ==="
    • "Total original items: [count of original items]"
    • "Total additional items: [count of additional items]"
    • "Total combined items: [count of all items combined]"
    • "Unique items found: [count of unique items]"
    • "Duplicates removed: [total combined items minus unique items]"
  15. 完了メッセージを表示します:"Unique item collection completed successfully"

入力文字列の分割にはstringsパッケージを、出力にはfmtパッケージを使用してください。表示のためにアイテムを結合するときは、カンマ区切りでstrings.Joinを使用します。このチャレンジは、Goのセットイディオムが、データ処理アプリケーションで頻繁に使用されるパターンである「コレクションからの重複削除」という一般的な問題をいかに効率的に解決するかを示しています。

自分で試してみよう

package main

import (
	"fmt"
	"strings"
)

func main() {
	// 入力を読み込む
	var input1 string
	var input2 string
	fmt.Scanln(&input1)
	fmt.Scanln(&input2)
	
	// 入力文字列をスライスにパースする
	originalItems := strings.Split(input1, ",")
	additionalItems := strings.Split(input2, ",")
	
	// TODO: ここにコードを記述してください
	// 1. map[string]struct{} イディオムを使用する getUniqueItems 関数を作成する
	// 2. 元のアイテムを処理して、ユニークなアイテムを取得する
	// 3. 両方のスライスを結合し、結合されたリストからユニークなアイテムを取得する
	// 4. 統計を計算する
	
	// システムヘッダーを表示
	fmt.Println("=== UNIQUE ITEM COLLECTOR ===")
	
	// 元のアイテムと追加のアイテムを表示
	fmt.Printf("Original items: %s\n", strings.Join(originalItems, ","))
	fmt.Printf("Additional items: %s\n", strings.Join(additionalItems, ","))
	
	// TODO: ユニークな元のアイテム、最終的なユニークアイテム、および統計を表示する
	// 出力フォーマットには fmt.Printf と strings.Join を使用すること
}

論理とフローのすべてのレッスン