← run

go-06-job-scheduler

0.000
0/1 tests· architecture

Proposed solution

```go
package challenge

import (
	"errors"
	"fmt"
	"sort"
)

type Job struct {
	ID       string
	Deps     []string
	Priority int
}

func Schedule(jobs []Job) ([]string, error) {
	if len(jobs) == 0 {
		return []string{}, nil
	}

	jobIDs := make(map[string]bool)
	dependencyCount := make(map[string]int)
	dependencyGraph := make(map[string][]string)
	for _, job := range jobs {
		if _, exists := jobIDs[job.ID]; exists {
			return nil, errors.New("duplicate ID")
		}
		jobIDs[job.ID] = true
		dependencyCount[job.ID] = 0
		dependencyGraph[job.ID] = make([]string, 0)
		for _, dep := range job.Deps {
			if _, exists := jobIDs[dep]; !exists {
				return nil, errors.New("unknown dependency")
			}
			dependencyCount[dep]++
			dependencyGraph[dep] = append(dependencyGraph[dep], job.ID)
		}
		dependencyCount[job.ID]++
	}

	var readyJobs []string
	for id, count := range dependencyCount {
		if count == 0 {
			readyJobs = append(readyJobs, id)
		}
	}

	var output []string
	for len(readyJobs) > 0 {
		sort.Slice(readyJobs, func(i, j int) bool {
			p1, p2 := jobs[readyJobs[i]].Priority, jobs[readyJobs[j]].Priority
			if p1 != p2 {
				return p1 > p2
			}
			return jobs[readyJobs[i]].ID < jobs[readyJobs[j]].ID
		})

		current := readyJobs[0]
		output = append(output, current)
		readyJobs = readyJobs[1:]
		for _, dep := range dependencyGraph[current] {
			dependencyCount[dep]--
			if dependencyCount[dep] == 0 {
				readyJobs = append(readyJobs, dep)
			}
		}
	}

	for _, count := range dependencyCount {
		if count > 0 {
			return nil, errors.New("cycle detected")
		}
	}

	return output, nil
}
```

Test output (stdout)

{"ImportPath":"challenge [challenge.test]","Action":"build-output","Output":"# challenge [challenge.test]\n"}
{"ImportPath":"challenge [challenge.test]","Action":"build-output","Output":"./solution.go:5:2: \"fmt\" imported and not used\n"}
{"ImportPath":"challenge [challenge.test]","Action":"build-output","Output":"./solution.go:50:19: invalid argument: index readyJobs[i] (variable of type string) must be integer\n"}
{"ImportPath":"challenge [challenge.test]","Action":"build-output","Output":"./solution.go:50:48: invalid argument: index readyJobs[j] (variable of type string) must be integer\n"}
{"ImportPath":"challenge [challenge.test]","Action":"build-output","Output":"./solution.go:54:16: invalid argument: index readyJobs[i] (variable of type string) must be integer\n"}
{"ImportPath":"challenge [challenge.test]","Action":"build-output","Output":"./solution.go:54:40: invalid argument: index readyJobs[j] (variable of type string) must be integer\n"}
{"ImportPath":"challenge [challenge.test]","Action":"build-fail"}
{"Time":"2026-06-30T05:53:39.2751546+02:00","Action":"start","Package":"challenge"}
{"Time":"2026-06-30T05:53:39.275208121+02:00","Action":"output","Package":"challenge","Output":"FAIL\tchallenge [build failed]\n"}
{"Time":"2026-06-30T05:53:39.275212811+02:00","Action":"fail","Package":"challenge","Elapsed":0,"FailedBuild":"challenge [challenge.test]"}
Self-repair attempts
[
  {
    "total": 1,
    "answer": "```go\npackage challenge\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sort\"\n)\n\ntype Job struct {\n\tID       string\n\tDeps     []string\n\tPriority int\n}\n\nfunc Schedule(jobs []Job) ([]string, error) {\n\tif len(jobs) == 0 {\n\t\treturn []string{}, nil\n\t}\n\n\tjobIDs := make(map[string]bool)\n\tdependencyCount := make(map[string]int)\n\tdependencyGraph := make(map[string][]string)\n\tfor _, job := range jobs {\n\t\tif _, exists := jobIDs[job.ID]; exists {\n\t\t\treturn nil, errors.New(\"duplicate ID\")\n\t\t}\n\t\tjobIDs[job.ID] = true\n\t\tdependencyCount[job.ID] = 0\n\t\tdependencyGraph[job.ID] = make([]string, 0)\n\t\tfor _, dep := range job.Deps {\n\t\t\tif _, exists := jobIDs[dep]; !exists {\n\t\t\t\treturn nil, errors.New(\"unknown dependency\")\n\t\t\t}\n\t\t\tdependencyCount[dep]++\n\t\t\tdependencyGraph[dep] = append(dependencyGraph[dep], job.ID)\n\t\t}\n\t\tdependencyCount[job.ID]++\n\t}\n\n\tvar readyJobs []string\n\tfor id, count := range dependencyCount {\n\t\tif count == 0 {\n\t\t\treadyJobs = append(readyJobs, id)\n\t\t}\n\t}\n\n\tvar output []string\n\tfor len(readyJobs) > 0 {\n\t\tsort.Slice(readyJobs, func(i, j int) bool {\n\t\t\tp1, p2 := jobs[readyJobs[i]].Priority, jobs[readyJobs[j]].Priority\n\t\t\tif p1 != p2 {\n\t\t\t\treturn p1 > p2\n\t\t\t}\n\t\t\treturn jobs[readyJobs[i]].ID < jobs[readyJobs[j]].ID\n\t\t})\n\n\t\tcurrent := readyJobs[0]\n\t\toutput = append(output, current)\n\t\treadyJobs = readyJobs[1:]\n\t\tfor _, dep := range dependencyGraph[current] {\n\t\t\tdependencyCount[dep]--\n\t\t\tif dependencyCount[dep] == 0 {\n\t\t\t\treadyJobs = append(readyJobs, dep)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, count := range dependencyCount {\n\t\tif count > 0 {\n\t\t\treturn nil, errors.New(\"cycle detected\")\n\t\t}\n\t}\n\n\treturn output, nil\n}\n```",
    "passed": 0,
    "test_error": "{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"# challenge [challenge.test]\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:5:2: \\\"fmt\\\" imported and not used\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:50:19: invalid argument: index readyJobs[i] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:50:48: invalid argument: index readyJobs[j] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:54:16: invalid argument: index readyJobs[i] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:54:40: invalid argument: index readyJobs[j] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-fail\"}\n{\"Time\":\"2026-06-30T05:53:39.2751546+02:00\",\"Action\":\"start\",\"Package\":\"challenge\"}\n{\"Time\":\"2026-06-30T05:53:39.275208121+02:00\",\"Action\":\"output\",\"Package\":\"challenge\",\"Output\":\"FAIL\\tchallenge [build failed]\\n\"}\n{\"Time\":\"2026-06-30T05:53:39.275212811+02:00\",\"Action\":\"fail\",\"Package\":\"challenge\",\"Elapsed\":0,\"FailedBuild\":\"challenge [challenge.test]\"}"
  },
  {
    "total": 1,
    "answer": "```go\npackage challenge\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sort\"\n)\n\ntype Job struct {\n\tID       string\n\tDeps     []string\n\tPriority int\n}\n\nfunc Schedule(jobs []Job) ([]string, error) {\n\tif len(jobs) == 0 {\n\t\treturn []string{}, nil\n\t}\n\n\tjobIDs := make(map[string]bool)\n\tdependencyCount := make(map[string]int)\n\tdependencyGraph := make(map[string][]string)\n\tfor _, job := range jobs {\n\t\tif _, exists := jobIDs[job.ID]; exists {\n\t\t\treturn nil, errors.New(\"duplicate ID\")\n\t\t}\n\t\tjobIDs[job.ID] = true\n\t\tdependencyCount[job.ID] = 0\n\t\tdependencyGraph[job.ID] = make([]string, 0)\n\t\tfor _, dep := range job.Deps {\n\t\t\tif _, exists := jobIDs[dep]; !exists {\n\t\t\t\treturn nil, errors.New(\"unknown dependency\")\n\t\t\t}\n\t\t\tdependencyCount[dep]++\n\t\t\tdependencyGraph[dep] = append(dependencyGraph[dep], job.ID)\n\t\t}\n\t\tdependencyCount[job.ID]++\n\t}\n\n\tvar readyJobs []string\n\tfor id, count := range dependencyCount {\n\t\tif count == 0 {\n\t\t\treadyJobs = append(readyJobs, id)\n\t\t}\n\t}\n\n\tvar output []string\n\tfor len(readyJobs) > 0 {\n\t\tsort.Slice(readyJobs, func(i, j int) bool {\n\t\t\tp1, p2 := jobs[readyJobs[i]].Priority, jobs[readyJobs[j]].Priority\n\t\t\tif p1 != p2 {\n\t\t\t\treturn p1 > p2\n\t\t\t}\n\t\t\treturn jobs[readyJobs[i]].ID < jobs[readyJobs[j]].ID\n\t\t})\n\n\t\tcurrent := readyJobs[0]\n\t\toutput = append(output, current)\n\t\treadyJobs = readyJobs[1:]\n\t\tfor _, dep := range dependencyGraph[current] {\n\t\t\tdependencyCount[dep]--\n\t\t\tif dependencyCount[dep] == 0 {\n\t\t\t\treadyJobs = append(readyJobs, dep)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, count := range dependencyCount {\n\t\tif count > 0 {\n\t\t\treturn nil, errors.New(\"cycle detected\")\n\t\t}\n\t}\n\n\treturn output, nil\n}\n```",
    "passed": 0,
    "test_error": "{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"# challenge [challenge.test]\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:5:2: \\\"fmt\\\" imported and not used\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:50:19: invalid argument: index readyJobs[i] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:50:48: invalid argument: index readyJobs[j] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:54:16: invalid argument: index readyJobs[i] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-output\",\"Output\":\"./solution.go:54:40: invalid argument: index readyJobs[j] (variable of type string) must be integer\\n\"}\n{\"ImportPath\":\"challenge [challenge.test]\",\"Action\":\"build-fail\"}\n{\"Time\":\"2026-06-30T05:53:43.457932991+02:00\",\"Action\":\"start\",\"Package\":\"challenge\"}\n{\"Time\":\"2026-06-30T05:53:43.457991262+02:00\",\"Action\":\"output\",\"Package\":\"challenge\",\"Output\":\"FAIL\\tchallenge [build failed]\\n\"}\n{\"Time\":\"2026-06-30T05:53:43.457995712+02:00\",\"Action\":\"fail\",\"Package\":\"challenge\",\"Elapsed\":0,\"FailedBuild\":\"challenge [challenge.test]\"}"
  },
  {
    "total": 1,
    "answer": "```go\npackage challenge\n\nimport (\n\t\"errors\"\n\t\"sort\"\n)\n\ntype Job struct {\n\tID       string\n\tDeps     []string\n\tPriority int\n}\n\nfunc Schedule(jobs []Job) ([]string, error) {\n\tif len(jobs) == 0 {\n\t\treturn []string{}, nil\n\t}\n\n\tjobIDs := make(map[string]bool)\n\tdependencyCount := make(map[string]int)\n\tdependencyGraph := make(map[string][]string)\n\tfor _, job := range jobs {\n\t\tif _, exists := jobIDs[job.ID]; exists {\n\t\t\treturn nil, errors.New(\"duplicate ID\")\n\t\t}\n\t\tjobIDs[job.ID] = true\n\t\tdependencyCount[job.ID] = 0\n\t\tdependencyGraph[job.ID] = make([]string, 0)\n\t\tfor _, dep := range job.Deps {\n\t\t\tif _, exists := jobIDs[dep]; !exists {\n\t\t\t\treturn nil, errors.New(\"unknown dependency\")\n\t\t\t}\n\t\t\tdependencyCount[dep]++\n\t\t\tdependencyGraph[dep] = append(dependencyGraph[dep], job.ID)\n\t\t}\n\t\tdependencyCount[job.ID]++\n\t}\n\n\tvar readyJobs []string\n\tfor id, count := range dependencyCount {\n\t\tif count == 0 {\n\t\t\treadyJobs = append(readyJobs, id)\n\t\t}\n\t}\n\n\tvar output []string\n\tfor len(readyJobs) > 0 {\n\t\tsort.Slice(readyJobs, func(i, j int) bool {\n\t\t\tp1, p2 := jobs[readyJobs[i]].Priority, jobs[readyJobs[j]].Priority\n\t\t\tif p1 != p2 {\n\t\t\t\treturn p1 > p2\n\t\t\t}\n\t\t\treturn jobs[readyJobs[i]].ID < jobs[readyJobs[j]].ID\n\t\t})\n\n\t\tcurrent := readyJobs[0]\n\t\toutput = append(output, current)\n\t\treadyJobs = readyJobs[1:]\n\t\tfor _, dep := range dependencyGraph[current] {\n\t\t\tdependencyCount[dep]--\n\t\t\tif dependencyCount[dep] == 0 {\n\t\t\t\treadyJobs = append(readyJobs, dep)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, count := range dependencyCount {\n\t\tif count > 0 {\n\t\t\treturn nil, errors.New(\"cycle detected\")\n\t\t}\n\t}\n\n\treturn output, nil\n}\n```",
    "passed": 0,
    "test_error": ""
  }
]
System prompt
You are an expert programmer. Solve the task exactly as specified. Output your solution as fenced code blocks using the required file name(s) and the exact function/type signatures requested. Prefer correctness; do not include prose outside code unless asked.