package main
import (
"os"
"io/ioutil"
"fmt"
"strings"
)
func main( ) {
file := os.Args [ 1 ]
word := os.Args [ 2 ]
buffer, err := ioutil.ReadFile ( file)
if ( err != nil ) {
fmt.Println ( "failed to read: " , file)
return
}
content := string( buffer)
fmt.Println ( search1( word, content) )
fmt.Println ( search2( word, content) )
fmt.Println ( search3( word, content) )
}
func search1( word string, content string ) bool {
return strings.Index ( content, word) != ( - 1 )
}
func search2( word string, content string ) int {
return strings.Count ( content, word) ;
}
type Pos struct {
a int
b int
}
type Search3Result struct {
bool
int
pos [ ] Pos
}
func search3( word string, content string ) Search3Result {
indices := [ ] Pos{ }
for l, line := range strings.Split ( content, "\n " ) {
for i := 0 ;; i++ {
n := strings.Index ( line[ i: ] , word)
if ( n == ( - 1 ) ) { break ; }
i += n
indices = append( indices, Pos{ l, i} )
}
}
return Search3Result{ len( indices) > 0 , len( indices) , indices }
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAogICJvcyIKICAiaW8vaW91dGlsIgogICJmbXQiCiAgInN0cmluZ3MiCikKCmZ1bmMgbWFpbigpIHsKICBmaWxlIDo9IG9zLkFyZ3NbMV0KICB3b3JkIDo9IG9zLkFyZ3NbMl0KCiAgYnVmZmVyLCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKGZpbGUpCgogIGlmKCBlcnIgIT0gbmlsICkgewogICAgZm10LlByaW50bG4oImZhaWxlZCB0byByZWFkOiAiLCBmaWxlKQogICAgcmV0dXJuCiAgfQoKICBjb250ZW50IDo9IHN0cmluZyhidWZmZXIpCiAgZm10LlByaW50bG4oIHNlYXJjaDEod29yZCxjb250ZW50KSApCiAgZm10LlByaW50bG4oIHNlYXJjaDIod29yZCxjb250ZW50KSApCiAgZm10LlByaW50bG4oIHNlYXJjaDMod29yZCxjb250ZW50KSApCn0KCgpmdW5jIHNlYXJjaDEoIHdvcmQgc3RyaW5nLCBjb250ZW50IHN0cmluZyApIGJvb2wgewogIHJldHVybiBzdHJpbmdzLkluZGV4KGNvbnRlbnQsd29yZCkgIT0gKC0xKQp9CgpmdW5jIHNlYXJjaDIoIHdvcmQgc3RyaW5nLCBjb250ZW50IHN0cmluZyApIGludCB7CiAgcmV0dXJuIHN0cmluZ3MuQ291bnQoY29udGVudCx3b3JkKTsKfQoKdHlwZSBQb3Mgc3RydWN0IHsKICBhIGludAogIGIgaW50Cn0KdHlwZSBTZWFyY2gzUmVzdWx0IHN0cnVjdCB7CiAgYm9vbAogIGludAogIHBvcyBbXVBvcwp9CgpmdW5jIHNlYXJjaDMoIHdvcmQgc3RyaW5nLCBjb250ZW50IHN0cmluZyApIFNlYXJjaDNSZXN1bHQgewogIGluZGljZXMgOj0gW11Qb3N7fQoKICBmb3IgbCwgbGluZSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KGNvbnRlbnQsIlxuIikgewogICAgZm9yIGkgOj0gMDs7IGkrKyB7CiAgICAgIG4gOj0gc3RyaW5ncy5JbmRleChsaW5lW2k6XSx3b3JkKQogICAgICBpZiggbiA9PSAoLTEpICl7IGJyZWFrOyB9CiAgICAgIGkgKz0gbgogICAgICBpbmRpY2VzID0gYXBwZW5kKGluZGljZXMsIFBvc3tsLGl9KQogICAgfQogIH0KCiAgcmV0dXJuIFNlYXJjaDNSZXN1bHR7IGxlbihpbmRpY2VzKSA+IDAsIGxlbihpbmRpY2VzKSwgaW5kaWNlcyB9Cn0KCg==