ためすう

atan2 を使ってみる (C++)

2020-02-03

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

atan2は三角形の底辺と高さから、角度を求めます。

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    // ラジアンを求める
    // 引数の順番に注意 (高さ, 底辺)
    double radian = atan2(1.0, 1.0);
    cout << radian << endl;

    // ラジアンを角度に変換する
    double deg = radian * (180 / M_PI);
    cout << deg << endl;
}

出力結果

0.785398
45

参考

FLT_EPSILON を調べる (C++)

2020-01-26

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

規格で 1E-5 以下であることが規定されている。

すごく小さい数のことです。

計算で誤差が出るときなどに利用したりします。

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << FLT_EPSILON << endl;
}

出力結果

1.19209e-07

参考

all_of を使ってみる (C++)

2020-01-26

やったこと

all_of を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v = {2, 9, 3, 5};
    bool ans = all_of(v.begin(), v.end(), [](int x) { return x >= 2; });
    cout << ans << endl;

    bool ans2 = all_of(v.begin(), v.end(), [](int x) { return x >= 5; });
    cout << ans2 << endl;
}

出力結果

1
0

参考

YAML の文法をチェックする (Ruby)

2020-01-14

やったこと

YAML の文法が正しいかどうかを確認する方法を調べました。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

正常な YAML

sample.yml

aaa:
  bbb: 111
  ccc: 222
$ ruby -r yaml -e 'YAML.load_file "sample.yml"'

特に何も表示されません。

壊れている YAML

sample2.yml

aaa:
  bbb: ccc:::
  ccc: 222
$ ruby -r yaml -e 'YAML.load_file "sample2.yml"'
Traceback (most recent call last):
	7: from -e:1:in `<main>'
	6: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:577:in `load_file'
	5: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:577:in `open'
	4: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:578:in `block in load_file'
	3: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:277:in `load'
	2: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:390:in `parse'
	1: from /Users/xxxxx/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:456:in `parse_stream'
/Users/himejima/.rbenv/versions/2.6.3/lib/ruby/2.6.0/psych.rb:456:in `parse': (sample2.yml): mapping values are not allowed in this context at line 2 column 13 (Psych::SyntaxError)

SyntaxError が発生しました。

コマンドの意味

-r はライブラリを require します。

-e はコマンドラインで実行する時に使います。

抜粋

$ man ruby
...

-r library     Causes Ruby to load the library using require.  It is useful when using -n or -p.

-e command     Specifies script from command-line while telling Ruby not to search the rest of the arguments for a script file name.

参考

割り算の切り上げを計算する (C++)

2020-01-13

やったこと

割り算した結果、小数を切り上げます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    // 9 / 2 の切り上げ
    int t1 = ceil(9 / 2.0);
    cout << t1 << endl;

    // 9 / 2 の切り上げ
    int t2 = (9 + 2 - 1) / 2;
    cout << t2 << endl;


    // 9 / 3 の切り上げ
    int t3 = (9 + 3 - 1) / 3;
    cout << t3 << endl;
}

出力結果

5
5
3

2つ目の式の形

(x + y - 1) / y

こうすると割り切れる場合も、割り切れない場合も切り上げることができます。

__builtin_popcount を使ってみる (C++)

2020-01-13

やったこと

2進数で1を数えるため、 __builtin_popcount を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    for (int i = 0; i < (1 << 3); i++) {
        cout << bitset<8>(i);
        printf(" 1ビットが立っている数: %d\n", __builtin_popcount(i));
    }
}

出力結果

00000000 1ビットが立っている数: 0
00000001 1ビットが立っている数: 1
00000010 1ビットが立っている数: 1
00000011 1ビットが立っている数: 2
00000100 1ビットが立っている数: 1
00000101 1ビットが立っている数: 2
00000110 1ビットが立っている数: 2
00000111 1ビットが立っている数: 3

参考

replace を使ってみる (C++)

2020-01-05

やったこと

replace を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    string t = "abcdefg";
    t.replace(1, 2, "-");
    cout << t << endl;

    t.replace(0, 1, 3, 'A');
    cout << t << endl;
}

出力結果

a-defg
AAA-defg

参考

accumulate でオーバーフローすることがある (C++)

2020-01-05

やったこと

accumulate で計算結果がオーバーフローした時の対処方法です。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

// accumulateの戻り値型は、第3引数の型となるため、変数sum_llの型はlong long

戻り値の型は、第3引数で決まります。 なので、戻り値を long long にする場合、 0LL にする必要があります。

test.cpp

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ll a[] = {(ll)1e9, (ll)1e9, (ll)1e9, (ll)1e9};

    cout << accumulate(a, a + 4, 0) << endl;
    cout << accumulate(a, a + 4, 0LL) << endl;
}

出力結果

-294967296
4000000000

参考

priority_queue を使ってみる (C++)

2019-12-30

やったこと

priority_queue を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a[] = {3, 5, 2, 1, 9, 8};

    // 降順
    priority_queue<int> pq;

    // 昇順
    priority_queue<int, vector<int>, greater<int>> pq2;

    for (int i = 0; i < 6; i++) {
        pq.push(a[i]);
        pq2.push(a[i]);
    }

    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    cout << endl;


    while (!pq2.empty()) {
        cout << pq2.top() << " ";
        pq2.pop();
    }
    cout << endl;
}

出力結果

9 8 5 3 2 1
1 2 3 5 8 9

参考

deque を使ってみる (C++)

2019-12-30

やったこと

deque を使ってみます。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

> std::deque (double-ended queue) は先頭と末尾の両方に高速な挿入と削除が行えるインデックス付きのシーケンスコンテナです。

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    deque<int> d = {2, 4, 6};
    d.push_front(100);
    d.push_back(333);

    for (int v : d) {
        cout << v << " ";
    }
    cout << endl;
}

出力結果

100 2 4 6 333

参考