-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdata_recovery.go
59 lines (54 loc) · 1.17 KB
/
data_recovery.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package main
import "fmt"
import "log"
import "bufio"
import "os"
import "strings"
import "strconv"
func restitute(scrambled []string, orders []int) string {
decyphered := make([]string, len(scrambled))
for ix, or := range orders {
decyphered[ix] = scrambled[or]
}
return strings.Join(decyphered, " ")
}
func FindInt(s []int, i int) int {
for ix, val := range s {
if i == val {
return ix
}
}
return -1
}
func fillOrders(orders []int, l int) []int {
filled := make([]int, l)
for i := 1; i <= l; i++ {
pos := FindInt(orders, i)
if pos >= 0 {
filled[i-1] = pos
} else {
filled[i-1] = l - 1
}
}
return filled
}
func main() {
file, err := os.Open(os.Args[1])
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
test := scanner.Text()
tests := strings.Split(test, ";")
orderss := strings.Fields(tests[len(tests)-1])
orders := make([]int, len(orderss))
for ix, or := range orderss {
orders[ix], _ = strconv.Atoi(or)
}
scrambled := strings.Fields(strings.Join(tests[0:len(tests)-1], ";"))
orders = fillOrders(orders, len(scrambled))
fmt.Println(restitute(scrambled, orders))
}
}