Goで言語処理100本ノック 2020 第1章: 準備運動

Goで「言語処理100本ノック 2020 第1章: 準備運動」を解いた記録

第1章: 準備運動 - NLP100 2020

00. 文字列の逆順

package main

import (
	"fmt"
)

func main() {
	a := []rune("stressed")
	fmt.Println(string(a))
	b := ""
	for i := len(a) - 1; i >= 0; i-- {
		b += string(a[i])
	}
	fmt.Println(b)
}
//stressed
//desserts
The Go Playground

01. 「パタトクカシーー」

package main

import (
	"fmt"
)

func main() {
	a := []rune("パタトクカシーー")
	fmt.Println(string(a))
	b := ""
	for i := 0; i < len(a); i += 2 {
		b += string(a[i])
	}
	fmt.Println(b)
}
//パタトクカシーー
//パトカー
The Go Playground

02. 「パトカー」+「タクシー」=「パタトクカシーー」

package main

import (
	"fmt"
)

func main() {
	a := []rune("パトカー")
	b := []rune("タクシー")
	fmt.Println(string(a))
	fmt.Println(string(b))
	c := ""
	for i := 0; i < len(a); i++ {
		c += string(a[i]) + string(b[i])
	}
	fmt.Println(c)
}
//パトカー
//タクシー
//パタトクカシーー
The Go Playground

03. 円周率

package main

import (
	"fmt"
	"strings"
)

func main() {
	a := "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
	a = strings.Trim(a, ".")
	a = strings.Replace(a, ",", "", -1)
	b := strings.Split(a, " ")
	fmt.Println(string(a))
	var c []int
	for i := 0; i < len(b); i++ {
		c = append(c, len(b[i]))
	}
	fmt.Println(c)
}
//Now I need a drink alcoholic of course after the heavy lectures involving quantum mechanics
//[3 1 4 1 5 9 2 6 5 3 5 8 9 7 9]
The Go Playground

04. 元素記号

package main

import (
	"fmt"
	"strings"
)

func main() {
	a := "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
	a = strings.Replace(a, ".", "", -1)
	b := strings.Split(a, " ")
	fmt.Println(string(a))
	m := map[string]int{}
	for i := 0; i < len(b); i++ {
		switch i + 1 {
		case 1, 5, 6, 7, 8, 9, 15, 16, 19:
			m[string([]rune(b[i])[0])] = i
		default:
			m[string([]rune(b[i])[0:2])] = i
		}
	}
	fmt.Println(m)
}
//Hi He Lied Because Boron Could Not Oxidize Fluorine New Nations Might Also Sign Peace Security Clause Arthur King Can
//map[Al:12 Ar:17 B:4 Be:3 C:5 Ca:19 Cl:16 F:8 H:0 He:1 K:18 Li:2 Mi:11 N:6 Na:10 Ne:9 O:7 P:14 S:15 Si:13]
The Go Playground

05. n-gram

package main

import (
	"fmt"
	"strings"
)

func ngram(s []string) [][]string {
	c := [][]string{}
	for i := 0; i < len(s); i++ {
		if i+1 < len(s) {
			b := []string{s[i], s[i+1]}
			c = append(c, b)
		}
	}
	return c
}

func main() {
	a := "I am an NLPer"
	fmt.Println(a)

	b := strings.Split(a, " ")
	c := ngram(b)
	fmt.Println(c)

	d := strings.Split(a, "")
	e := ngram(d)
	fmt.Println(e)
}
//I am an NLPer
//[[I am] [am an] [an NLPer]]
//[[I  ] [  a] [a m] [m  ] [  a] [a n] [n  ] [  N] [N L] [L P] [P e] [e r]]
The Go Playground

参考
N-gramの作り方 - Qiita

06. 集合

package main

import (
	"fmt"
	"strings"
)

func ngram(s []string) [][]string {
	c := [][]string{}
	for i := 0; i < len(s); i++ {
		if i+1 < len(s) {
			b := []string{s[i], s[i+1]}
			c = append(c, b)
		}
	}
	return c
}

func toMap(ss [][]string) map[string][]string {
	m := map[string][]string{}
	for _, s := range ss {
		key := s[0] + s[1]
		m[key] = s
	}
	return m
}

func union(x, y map[string][]string) map[string][]string {
	m := map[string][]string{}
	for k, v := range x {
		m[k] = v
	}
	for k, v := range y {
		m[k] = v
	}
	return m
}

func intersection(x, y map[string][]string) map[string][]string {
	m := map[string][]string{}
	for k, v := range x {
		if _, ok := y[k]; ok {
			m[k] = v
		}
	}
	return m
}

func difference(x, y map[string][]string) map[string][]string {
	m := map[string][]string{}
	for k, v := range x {
		if _, ok := y[k]; !ok {
			m[k] = v
		}
	}
	return m
}

func main() {
	xstring := "paraparaparadise"
	fmt.Println(xstring)
	ystring := "paragraph"
	fmt.Println(ystring)

	xn := ngram(strings.Split(xstring, ""))
	fmt.Println(xn)
	xmap := toMap(xn)
	fmt.Println("X", xmap)

	yn := ngram(strings.Split(ystring, ""))
	fmt.Println(yn)
	ymap := toMap(yn)
	fmt.Println("Y", ymap)

	fmt.Println("union", union(xmap, ymap))
	fmt.Println("intersection", intersection(xmap, ymap))
	fmt.Println("difference", difference(xmap, ymap))

	fmt.Print("'se' in X ")
	_, ok := xmap["se"]
	fmt.Println(ok)
	
	fmt.Print("'se' in Y ")
	_, ok = ymap["se"]
	fmt.Println(ok)
}
//paraparaparadise
//paragraph
//[[p a] [a r] [r a] [a p] [p a] [a r] [r a] [a p] [p a] [a r] [r a] [a d] [d i] [i s] [s e]]
//X map[ad:[a d] ap:[a p] ar:[a r] di:[d i] is:[i s] pa:[p a] ra:[r a] se:[s e]]
//[[p a] [a r] [r a] [a g] [g r] [r a] [a p] [p h]]
//Y map[ag:[a g] ap:[a p] ar:[a r] gr:[g r] pa:[p a] ph:[p h] ra:[r a]]
//union map[ad:[a d] ag:[a g] ap:[a p] ar:[a r] di:[d i] gr:[g r] is:[i s] pa:[p a] ph:[p h] ra:[r a] se:[s e]]
//intersection map[ap:[a p] ar:[a r] pa:[p a] ra:[r a]]
//difference map[ad:[a d] di:[d i] is:[i s] se:[s e]]
//'se' in X true
//'se' in Y false
The Go Playground

参考
go言語のmap、sliceのコピー | Golang | kido Tech Blog

07. テンプレートによる文生成

package main

import (
	"fmt"
)

func sentence(x int, y string, z float64) string {
	return fmt.Sprintf("%d時の%sは%v", x, y, z)
}

func main() {
	s := sentence(12, "気温", 22.4)
	fmt.Println(s)
}
//12時の気温は22.4
The Go Playground

08. 暗号文

package main

import (
	"fmt"
	"unicode"
)

func cipher(s string) string {
	res := ""
	for _, r := range s {
		if unicode.IsLower(r) {
			res += string(219 - r)
		} else {
			res += string(r)
		}
	}
	return res
}

func main() {
	s := cipher("Hello, World!!")
	fmt.Println(s)
	s = cipher(s)
	fmt.Println(s)
}
//Hvool, Wliow!!
//Hello, World!!
The Go Playground

参考

09. Typoglycemia

package main

import (
	"fmt"
	"math/rand"
	"strings"
	"time"
)

func randomSort(s string) string {
	res := []string{}
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for _, v := range strings.Fields(s) {
		rv := []rune(v)
		if len(rv) > 4 {
			pre := string(rv[0])
			suf := string(rv[len(rv)-1])
			c := ""
			for _, p := range r.Perm(len(rv) - 2) {
				c += string(rv[p+1])
			}
			res = append(res, pre+c+suf)
		} else {
			res = append(res, string(rv))
		}
	}
	return strings.Join(res, " ")
}

func main() {
	ex := "I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
	s := randomSort(ex)
	fmt.Println(ex)
	fmt.Println(s)
}
//I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind .
//I cu’dnolt belveie that I could alcaluty unetdansrd what I was rendiag : the pheaeonnml pewor of the huamn mind .
The Go Playground

参考
rand - The Go Programming Language

コメント

まだコメントはありません。