20210110のGoに関する記事は5件です。

AtCoder Beginner Contest 188のメモ

前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

問題

https://atcoder.jp/contests/abc188

A

Q_A.go
package main

import (
    "fmt"
)

func main() {
    var X, Y int
    fmt.Scanf("%d %d", &X, &Y)

    var flag bool = false
    if X>Y{
        if X-Y < 3{
            flag = true
        }
    } else {
        if Y-X < 3{
            flag = true
        }
    }

    if flag{
        fmt.Printf("Yes\n")
    } else {
        fmt.Printf("No\n")
    }
}

B

Q_B.go
package main

import (
    "fmt"
)

func main() {
    var N int
    fmt.Scanf("%d", &N)

    var sum int64 = 0
    A := make([]int64, N)
    B := make([]int64, N)

    for i:=0; i<N; i++{
        fmt.Scanf("%d", &A[i])
    }

    for i:=0; i<N; i++{
        fmt.Scanf("%d", &B[i])
    }

    for i:=0; i<N; i++{
        sum += A[i] * B[i]
    }

    if sum == 0{
        fmt.Printf("Yes\n")
    } else {
        fmt.Printf("No\n")
    }

}

C

Q_C.go
package main

import (
    "fmt"
)

func main() {
    var N int
    fmt.Scanf("%d", &N)

    var imax int = 1 
    for i:=0; i<N; i++{
        imax *= 2
    }

    A := make([]int64, imax)

    for i:=0; i<imax; i++{
        fmt.Scanf("%d", &A[i])      
    }

    var left int64 = 0
    var left_index int 
    for i:=0; i<imax/2; i++{
        if left < A[i]{
            left = A[i]
            left_index = i
        }
    }

    var right int64 = 0
    var right_index int 
    for i:=imax/2; i<imax; i++{
        if right < A[i]{
            right = A[i]
            right_index = i
        }
    }

    if left > right{
        fmt.Printf("%d\n", right_index+1)
    } else {
        fmt.Printf("%d\n", left_index+1)
    }

}

D

Q_D.go
package main

import (
    "bufio"
    "fmt"
    "sort"
    "os"
    "strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func nextInt() int64 {
    sc.Scan()
    i, e := strconv.ParseInt(sc.Text(),10,64)
    if e != nil {
        panic(e)
    }
    return i
}

func main() {
    sc.Split(bufio.ScanWords)
    var N int64
    var C int64
    N = nextInt()
    C = nextInt()

    a := make([]int64, N)
    b := make([]int64, N)
    c := make([]int64, N)

    var amin int64 = 1000000000
    var bmax int64 = 1
    var i int64
    for i=0; i<N; i++ {

        a[i] = nextInt()
        b[i] = nextInt()
        c[i] = nextInt()

        if amin > a[i]{
            amin = a[i]
        }
        if bmax < b[i]{
            bmax = b[i]
        }
    }

    index := make(map[int64]int64)
    for i=0; i<N; i++{
        index[a[i]] = index[a[i]] + c[i]
        index[b[i]+1] = index[b[i]+1] - c[i] 
    }

    keys := make([]int64, 0, len(index))
    for k := range index {
        keys = append(keys, k)
    }
    sort.Slice(keys, func(s, t int) bool {
        return keys[s] < keys[t]
    })

    var cost_sum int64 = 0
    var sum int64 = 0
    var before int64 = 0
    for i:=0; i<len(index); i++{
        // 前まで足し込む
        if cost_sum > C{
            sum += C * (keys[i] - before)
        } else {
            sum += cost_sum * (keys[i] - before)
        }

        // tugiwo keisann 
        cost_sum = cost_sum + index[keys[i]]
        before = keys[i]
    }

    fmt.Printf("%d\n", sum)    
}

E

覚えてたら後で書きます。

F

覚えてたら後で書きます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【macOS】goenvを使用したGo(Go言語)のインストール

概要

macOSGo(Go言語)をインストールする手順を記載しています。
GoのインストールにはGoのバージョン管理ツールであるgoenvを使用しました。
また、goenvのインストールにはHomebrewを使用しています。
PATHを通す部分でつまずいたので、そこの解説も後半に記載しています。

[参考] 公式

実行環境

  • macOS Big Sur 11.1
  • Homebrew 2.7.2

インストール手順

1. Homebrewをアップデートする。

Homebrewをインストールできていない方は、こちらの公式からインストールお願いします。

$ brew update

2. goenvのインストール

$ brew install goenv

下記コマンドでバージョンが表示されれば完了。

$ goenv -v

3. 使用できるGO言語のバージョンを確認

$ goenv install -l

バージョンを指定してGoをインストール。 (本記事では1.11.4を指定)

$ goenv install 1.11.4

マシンにインストールされているGoを確認。

$ goenv versions

コマンドを実行すると下記のような出力がターミナルに表示される。
*(アスタリスク)がついているバージョンが現在使用しているバージョン。

  system
* 1.11.4 (set by /Users/[User名]/.goenv/version)

ここまでで一旦インストールは完了。

つまずいたポイント

上記手順でインストール後、goコマンドを実行すると下記のようなエラーが発生。

bash: go: command not found

エラー内容の通り、PATHが通っていないことが原因のようなのでPATHを設定していく。
まずはGoがインストールされているディレクトリを確認。

ただ、goenvでインストールしたために、なかなかディレクトリを見つけられない...。
結局、下記コマンドを実行した時に出力されていたディレクトリをあさってインストール先のディレクトリを発見。

$ goenv version
1.11.4 (set by /Users/[User名]/.goenv/version)

実際にインストールされていたディレクトリは下記。

/Users/[User名]/.goenv/versions/1.11.4/

PATHの設定

.bash_profile(設定ファイル)をvimで開く。

$ vim ~/.bash_profile

.bash_profileに下記を追加。

export GOROOT=$HOME/.goenv/versions/1.11.4
export PATH=$GOROOT/bin:$PATH

.bash_profileの変更を反映。

$ source ~/.bash_profile

Goのバージョンが表示されれば完了。

$ go version
go version go1.11.4 darwin/amd64
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語でCircleCIの環境変数の登録を自動化する

CircleCIで環境変数の登録を自動化するプログラムを書いたので、作成した内容を書いていきます。

課題

CircleCIの環境変数の設定の際にブラウザからポチポチして登録していたのですが、単純作業で登録が面倒なのと、誤操作により設定ミスが発生することがありました。

CircleCIの環境変数について

まず環境変数の設定方法のバリエーションについてです。
大きくは、以下の6つのレベルで環境変数を設定することができます。今回の対象は、Project Environment Variablesの設定に関しての記事になります。
登録方法は、Build > Project > Settings で設定します。(もしこれ以外の登録方法をご存知の方がいらっしゃいましたら教えていただきたいです。)

  • Global Environment Variables
  • Project Environment Variables
  • Job Environment Variables
  • Container Environment Variables
  • Step Environment Variables
  • Bash Environment Variables

https://medium.com/veltra-engineering/circleci-2-0-a0549c65bc3b

解決策

今回はGo言語のagoutiというライブラリとChromeDriverを使用して、ブラウザ操作を自動化します。
https://agouti.org/
https://chromedriver.chromium.org/downloads

全体の処理のフロー

① CircleCIのGithubログイン認証を行う
https://circleci.com/login/

② 環境変数設定ページに遷移

③ Add Environment Variableをクリックし、入力フォームを開く

④ 入力フォームにNameとValueを入力する。

⑤ 登録完了

必要な設定

①ChromeDriverをインストールする。

$ brew install chromedriver

②constに設定されている各変数に任意の値を入力してください。

  • GithubUserName ... あなたのGithubのユーザー名を入力してください。
  • GithubPassWord ... あなたのGithubのパスワードをを入力してください。
  • Organization ... 個人開発の場合はGithubのユーザー名、組織開発の場合は組織名を入力してください。
  • Repository ... 対象のリポジトリ名を入力してください。
const (
   CircleCIURL    = "https://circleci.com/login/"
   GithubUserName = "あなたのGithubのユーザー名"
   GithubPassWord = "あなたのGithubのパスワード"
   Organization   = "組織名"
   Repository     = "リポジトリ名"
)

③登録する環境変数の準備
下記のmapでkeyに環境変数名、valueに登録する値を設定してください。

func setVariables(page *agouti.Page) error {
    vars := map[string]string{
        "HOGE": "hoge",
        "PUGE": "puge",
        "FUGA": "fuga",
    }
...
}

全体のソースコードはGithubに上げてありますので、下記のURLからご確認ください。
https://github.com/kozy0810/agouti-circleci

ローカルで実行

上記の設定が完了しましたら、ローカルで下記のコマンドを実行してください。

$ go run main.go

処理が完了すると下記のように環境変数の登録が完了します。
スクリーンショット 2021-01-10 12.09.40.png

まとめ

Go言語でCircleCIの環境変数の登録を自動化する方法について記述しました。
ブラウザでポチポチして登録するより、時間やストレスを大きく削減できるかと思います。
使用する際には、機密情報になると思いますのでセキュリティには十分ご注意ください。
今回初めてQiitaの記事を書いてみました。
もし参考になりましたらLGTMをいただけると嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語のrandパッケージ

Goのrandパッケージ

プログラミング基本からGoの理解を文字におこして行こうと思います!

処理結果をランダムに表示

package main
import "main/rand"  //「fmt」と同様""で囲む
...
}

ランダムな数を扱うためのmath/randというパッケージ

乱数の生成

package main
import "fmt"
import "main/rand"

func main() {
  fmt.Println(rand.lntn(10)) //0~9の乱数を生成
  fmt.Println(rand.lntn(10)) //0~9の乱数を生成
}

//コンソール
1
8

「rand.Intn(10)」と書くことで、0~9までの10個の整数の乱数を生成できる

乱数の注意点

package main
import "fmt"
import "main/rand"

func main() {
  for i := 1; i <= 5; i ++ {
    fmt.Println(rand.lntn(10))
  }
}

//コンソール
[1回目]   [2回目]
 1         1 
 5         5
 3         3
 4         4
 8         8

単に「rand.Intn(10)」のように呼び出すだけでは
実行する度に、毎回同じ乱数が生成

完全な乱数を生成する

...
import "main/rand"
import "time"  //timeパッケージのインポート

func main() {
  rand.Seed(time.Now().Unix())  //完全な乱数を生成するコード
  for i := 1; i <= 5; i ++ {
    fmt.Println(rand.lntn(10))
  }
}

//コンソール
[1回目]   [2回目]
 1         2 
 5         6
 3         1
 4         9
 8         8

完全な乱数を生成するために
「rand.Seed(time.Now().Unix())」という1行を追加する必要がある
このコードを使うためには「time」パッケージをインポートする必要がある

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語-randパッケージ

randパッケージ

プログラミング基本からGoの理解を文字におこして行こうと思います!

処理結果をランダムに表示

package main
import "main/rand"  //「fmt」と同様""で囲む
...
}

ランダムな数を扱うためのmath/randというパッケージ

乱数の生成

package main
import "fmt"
import "main/rand"

func main() {
  fmt.Println(rand.lntn(10)) //0~9の乱数を生成
  fmt.Println(rand.lntn(10)) //0~9の乱数を生成
}

//コンソール
1
8

「rand.Intn(10)」と書くことで、0~9までの10個の整数の乱数を生成できる

乱数の注意点

package main
import "fmt"
import "main/rand"

func main() {
  for i := 1; i <= 5; i ++ {
    fmt.Println(rand.lntn(10))
  }
}

//コンソール
[1回目]   [2回目]
 1         1 
 5         5
 3         3
 4         4
 8         8

単に「rand.Intn(10)」のように呼び出すだけでは
実行する度に、毎回同じ乱数が生成

完全な乱数を生成する

...
import "main/rand"
import "time"  //timeパッケージのインポート

func main() {
  rand.Seed(time.Now().Unix())  //完全な乱数を生成するコード
  for i := 1; i <= 5; i ++ {
    fmt.Println(rand.lntn(10))
  }
}

//コンソール
[1回目]   [2回目]
 1         2 
 5         6
 3         1
 4         9
 8         8

完全な乱数を生成するために
「rand.Seed(time.Now().Unix())」という1行を追加する必要がある
このコードを使うためには「time」パッケージをインポートする必要がある

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む