- 投稿日:2021-01-10T22:52:57+09:00
AtCoder Beginner Contest 188のメモ
前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。問題
https://atcoder.jp/contests/abc188
A
Q_A.gopackage 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.gopackage 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.gopackage 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.gopackage 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
覚えてたら後で書きます。
- 投稿日:2021-01-10T14:11:31+09:00
【macOS】goenvを使用したGo(Go言語)のインストール
概要
macOSにGo(Go言語)をインストールする手順を記載しています。
GoのインストールにはGoのバージョン管理ツールであるgoenvを使用しました。
また、goenvのインストールにはHomebrewを使用しています。
PATHを通す部分でつまずいたので、そこの解説も後半に記載しています。[参考] 公式
実行環境
- macOS Big Sur 11.1
- Homebrew 2.7.2
インストール手順
1. Homebrewをアップデートする。
Homebrewをインストールできていない方は、こちらの公式からインストールお願いします。
$ brew update2. goenvのインストール
$ brew install goenv下記コマンドでバージョンが表示されれば完了。
$ goenv -v3. 使用できる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_profileGoのバージョンが表示されれば完了。
$ go version go version go1.11.4 darwin/amd64
- 投稿日:2021-01-10T12:17:57+09:00
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
まとめ
Go言語でCircleCIの環境変数の登録を自動化する方法について記述しました。
ブラウザでポチポチして登録するより、時間やストレスを大きく削減できるかと思います。
使用する際には、機密情報になると思いますのでセキュリティには十分ご注意ください。
今回初めてQiitaの記事を書いてみました。
もし参考になりましたらLGTMをいただけると嬉しいです。
- 投稿日:2021-01-10T00:27:56+09:00
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」パッケージをインポートする必要がある
- 投稿日:2021-01-10T00:27:56+09:00
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」パッケージをインポートする必要がある