juliaでAtCoderに立ち向かう競プロ初心者の日記 #1 『AtCoder に登録したら解くべき精選過去問 10 問』を解く。〜第一、二問〜
こんにちは!!!!!!!!!エリーズです!!!!!!!
皆さん今週はいかがお過ごしだったでしょうか!!!エリは某プログラミングサークルに体験参加してきました!!!
プログラミングという同じ趣味や目的を持った人たちとコミュニケーションを取ったりするのは初めてでしたが、皆さんとても優しかったし、とても楽しい時間を過ごせました!!!
活動内容は、エリはRustの勉強(この本使ってます!!
実践Rustプログラミング入門 | 初田 直也, 山口 聖弘, 吉川 哲史, 豊田 優貴, 松本 健太郎, 原 将己, 中村 謙弘, フォルシア株式会社 |本 | 通販 | Amazon
)を(gitの勉強も少し)したり数学徒の方がおられたので、数学の話をしたりあとは少しAtCoderの話をしたりと言った感じで、全体としては最後に各々今日何をしたか発表するというものでした!さらに活動の後、ご飯をご馳走になりました!!美味しかった🤤 これからがとても楽しみです!!!!!!(๑˃̵ᴗ˂̵)و
Rustについてはこちらを見てね( Rust (プログラミング言語) - Wikipedia)
さて、話は変わりますが(ここからが本題)エリは最近AtCoderという競技プログラミングのコンテストにC++で参加し始めたのですが、最近勉強を始めたJuliaという言語にお熱で、このJuliaを使って何かしたいなと思い最初に思いついたのがAtCoderです。 目標はとりあえず緑色になることで、それができればまた次の目標を立てて行こうと思います! 現在の実力はABCのA,Bがやっと解けるような感じでARCはAしか解けません。(まだ2度しか参加していませんが) なのでまずは、けんちょんさんの書かれている AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita に載っている10問を解いて行こうと思います!!(けんちょんさんの本を購入させていただきました。また時間を見つけて読んで行きたいです。 Amazonのリンクはこちら : 問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書) | 大槻 兼資, 秋葉 拓哉 |本 | 通販 | Amazon)
では早速第一問!!!
この問題は標準入力された変数a,bの積の偶奇を判別せよという問題ですね。 考え方としては与えられたa,bの積が偶奇つまり2で割ったあまりが0か1という判別をしてやればよく、(任意の整数mはnで割ったあまりに注目してあまりが0からn-1までのn個に場合分けできる。例えば3の倍数で書くと3r(+0),3r+1,3r+2の3つに場合分けできる。)ifを用いて場合分けします。
C++で解くと
#include <bits/stdc++.h> using namespace std; int main() { int a, b, ans; cin >> a >> b; ans + a*b; if(ans % 2 == 0){ cout << "Even" << endl; } else{ cout << "Odd" << endl; } }
(Remark)ここでは2で割ったあまりが0か1というより、0かそれ以外かというふうに場合分けしています。
では、次にJuliaではこうなります。
a,b = parse.(Int,split(readline())) println(a*b % 2 == 0 ? "Even" : "Odd")
コードについて説明します。 〜概要〜 一行目は文字列を読み取りそれを数値に変換しています。 二行目は変換して得た数値a,bの積の2で割ったあまりが0か否かでもし0ならばEven、もし0でないならばOddを返すようにしています。 〜詳細〜 readline()を用いると、文字列を標準入力によって得れます。得た文字列をsplit()を用いて空白で分割します。 あとはparseで文字列を数値に変換してあげて、得た数値を三項演算子で処理してあげます。具体的には三項演算子は”””〜〜〜 ? A : B”””という形でかかれ、〜〜〜が成り立つ時にA成り立たない時にBを値とするマクロです。if~ else~と書くことも可能ですがこのように簡単な処理はこっちの方が楽にかけます。
続いて第二問!!!
この問題は0と1のみから成る3桁の番号 s が与えられ、その中に1 が何個含まれるかを求める問題です。 エリはこの3桁の数を1つの文字列と捉え、高々3文字なのでif文でそれぞれの桁について1か否かを判定する方法で解きました。
C++で解くと
#include <bits/stdc++.h> using namespace std; int main(){ int ans = 0; string S; cin >> S; if(S.at(0) == '1'){ ans++; } if(S.at(1) == '1'){ ans++; } if(S.at(2) == '1'){ ans++; } cout << ans << endl; }
となります。Juliaでも同じことをします。
s = readline() ans = 0 if s[1] == '1' ans += 1 end if s[2] == '1' ans += 1 end if s[3] == '1' ans += 1 end println(ans)
ここで気を付けないといけないのはJuliaでは0からでなく1から数えられる点ですね。 それとしいてもう一つあげるとするならif文の終わりにendを付けてあげることぐらいだと思います。
『『AtCoder に登録したら解くべき精選過去問 10 問』を解く。』シリーズは一度にやると長くなるので4、5回に分けてやって行こうと思います!
何かご指摘や質問などありましたらコメントやTwitterのリプで教えてて欲しいです!!
では今日はこの辺で!!ばいば〜い👋( ¯ ꒳¯)
こんにちは!!!!!!!!!! Dynamax Ar1es(ダイナマックス エリーズ)と申します☆
初めまして!!!!!エリーズと申します!!!!幼女です!!!!
このブログでは、生活の中で起きたことから、普段思っていること、プログラミングについてなど幅広く好きなことを書いていこうと思います〜。
まずは初回なので、自己紹介や自分の趣味について話して行こうと思います。
〜自己紹介〜
タイトルにもありますが、ダイナマックス エリーズと申します!幼女です!!(大事なので2回言いました)
普段は数学や物理、プログラミングなどを嗜んでおります!!
3浪して現在は放送大学に所属しております。
と言っても、受験勉強していたのは2浪目の秋にうつ病になりそこからは遊んだり、大学の勉強をしたりしていました☆
最近はプログラミングにハマっており、RustやHaskellなどを勉強しております!!
現在の目標はAtCoderにRustで参加できるようになることです!(現在はC++で参加しています。)
〜趣味〜
- ピアノ たまに練習してます。(下手くそですが、ドラクエの曲など練習してます。)
- ゲーム 最近モンハンダブルクロスはじめました!他にもスイッチでいろいろ遊んでます。 ps5は購入検討中
- AtCoder まだ一度しか参加できていませんが過去問といて精進しています☆
こんなもんかな。。。?質問などあれば、なんでもください!!
今日はこの辺で!!
ではっ!!!