u_sho競プロぶろぐ

21歳。みゃーくぴとぅ。ゆる~く続けますたぶん。  デザイン変えました(2019/2/25)これでいきます

yukicoder April Fool Contest 2021 No.3077, No.3085

いやー難しかったです(好き

全部は解いていませんし、解いた問題を全て(6つしかないですが)解説すると大変なので2つだけ

E: No.3077 🔧

まず項目があるのに問題文、制約、サンプル等が読めないことに着目します。
きっと読めない状態になっているということです。
ブラウザの開発者ツールを開いてみます。

a×b+c-d を k で割った余りを出力してください。
No.3077 🔧 を開発者ツールでみた画像

ビンゴです! なんと問題文が HTML の class 属性名になっていました。

つまり、

  • 問題
    • a×b+c-d を k で割った余りを出力してください。
  • 制約
    • 1 <= a, b, c, d, k <= 10^9
    • ab + c >= d
    • 入力はすべて整数。
  • 入力
    • $a\ b\ c\ d\ k$
  • 出力
    • a×b+c-d を k で割った余りを出力してください。最後に改行してください。

ということですね。
制約より、a*b および (a%k)*(b%k) は 32 bit 整数に収まらないですが、
ab + c - d は 64 bit 整数には収まるので、次のように解けます。

#include<iostream>
int main(){
  long long a,b,c,d,k;
  std::cin>>a>>b>>c>>d>>k;
  std::cout<<(a*b+c-d)%k<<"\n";
}

問題文さえ読めれば ABC A問題程度の難易度でしたネ🎃

M: No.3085 Math...?

まず真面目に考えます。

u-sho「愚直?」
u-sho2「間に合わん」
u-sho「じゃあ総和部分の値を保存しておいて」
u-sho2「それでも間に合わないね」
u-sho「演算のいい性質がある?」
u-sho2「具体的に Do you know?」
u-sho「知りません。難しすぎませんか?」

時間切れです。ここで解説をみました。この問題は解けないらしいです。なるほどニャ(?

ところで、問題文の下の空行がやけに多いですね。何かあるんでしょうか?

例により開発者ツールを開いてみます

白文字の数式があるようです
No.3085 Math...? を開発者ツールでみた画像

ありましたね......

font タグ*1の color 属性で white にされているようなので、ここを black に編集して見えるようにしてみます。

数式モードで書かれたリンクが表示されました
No.3085 Math...? を開発者ツールで編集してみた画像

Googleドキュメントへのリンクが表示されましたね。
打ち込むのが大変でしょうからここに貼っておきます。
https://docs.google.com/document/d/14UQE9wc6K-YRyN56WYiF6Z7WQ1AkT8qVg17VdWrjeTg/edit?usp=sharing
docs.google.com

しかし、ここにもおかしなことが書いてあります。

1+2+3+4+...+100=5050です。5050を1000000007で割った余りの1を出力してください。

5050 を 1000000007 で割った余りは当然 5050 ですから、これはおかしいですね。
そういえば、サンプルの下の空行がやけに多いですね。何かあるんでしょうか。

3053 306e から始まる英数文字列がファイル末尾に現れました
No.3085 の Googleドキュメントを全選択してみた画像

ありましたね......

16進数でしょうか。文字列か、最大4桁ということは 64bit 整数かもしれませんね。
とりあえず以下のようなコードを書いて変換してみます。

#include<stdio.h>
int main(){
  long long c;
  while(~scanf("%x", &c)) printf("%c", c);
}

ascii 範囲外の文字は化けましたが、とりあえず次のような出力になりました

Sn�(https://yukicoder.me/problems/6059)n�OL�e�6go�K�fD�0ojD�nhWf�gO`UD~_�3o6U�n_�ƹȱ�k+~�~[�

明らかに文字列です。つまりこれを UTF16 なりなんなり*2で見てあげればいいわけですね。

C や C++ でこれをやるのは大変な気がしたので、JavaScript を使います。

まず、JavaScriptUnicode リテラル(参考:
文字クラス - JavaScript | MDN
)に変換します。
適当なエディタに先程の文字列をコピペし、[0-9a-f]+ や !\s を \u{$1} のような形に置換すると良いです。
結果はこんな感じ(文字列は適当な長さで分割しています)

const str = "\u{3053}\u{306e}\u{30da}\u{30fc}\u{30b8}"
            + "\u{28}\u{68}\u{74}\u{74}\u{70}\u{73}\u{3a}\u{2f}\u{2f}"
            + "\u{79}\u{75}\u{6b}\u{69}\u{63}\u{6f}\u{64}\u{65}"
            + "\u{72}\u{2e}\u{6d}\u{65}\u{2f}\u{70}\u{72}\u{6f}"
            + "\u{62}\u{6c}\u{65}\u{6d}\u{73}\u{2f}\u{36}\u{30}"
            + "\u{35}\u{39}\u{29}\u{306e}\u{5185}\u{3001}"
            + "\u{554f}\u{984c}\u{6587}\u{3001}\u{5165}"
            + "\u{529b}\u{3001}\u{5236}\u{7d04}\u{3067}"
            + "\u{306f}\u{3001}\u{66f8}\u{304b}\u{308c}"
            + "\u{3066}\u{3044}\u{308b}\u{30}\u{306f}\u{306a}"
            + "\u{3044}\u{3082}\u{306e}\u{3068}\u{3057}"
            + "\u{3066}\u{8aad}\u{3093}\u{3067}\u{304f}"
            + "\u{3060}\u{3055}\u{3044}\u{3002}\u{307e}"
            + "\u{305f}\u{3001}\u{30b5}\u{30f3}\u{30d7}\u{30eb}"
            + "\u{33}\u{306f}\u{5236}\u{7d04}\u{9055}\u{53cd}"
            + "\u{306e}\u{305f}\u{3081}\u{30c6}\u{30b9}\u{30c8}"
            + "\u{30b1}\u{30fc}\u{30b9}\u{306b}\u{542b}"
            + "\u{307e}\u{308c}\u{307e}\u{305b}\u{3093}\u{3002}"

そしてこれを console.log してあげれば良いわけです。

f:id:u_sho:20210402163155p:plain
No.3085 の 本質部分を表示させた画像

はい、出てきましたね。

このページ(https://yukicoder.me/problems/6059)の内、問題文、入力、制約では、書かれている0はないものとして読んでください。また、サンプル3は制約違反のためテストケースに含まれません。

なるほどです(元の問題文なんだったっけ←)

つまり元の問題文

正整数 A,\ B が与えられるので、\prod_{i=1}^A \sum_{j=1}^B j^i1000000007 で割った余りを出力してください。この問題は Q ケース与えられます。

入力、制約

  • 入力は全て整数
  • 1\leq Q \leq 10^5
  • 1\leq A_i \leq 10^9
  • 1\leq B_i \leq 20210401

は次のようになるということですね。

  • 問題
    • 正整数 A(=1),\ B が与えられるので、\prod_{i=1}^A \sum_{j=1}^B j^i(制約より、\sum_{j=1}^B j)を 17 で割った余りを出力してください。この問題は Q(=1) ケース与えられます。
  • 制約
    • 入力は全て整数
    • 1\leq Q \leq 1^5 つまり Q=1
    • 1\leq A_i \leq 1^9 つまり A=1
    • 1\leq B_i \leq 22141

ゆえに

#include<iostream>
int main(){
  int Q, A, B;
  std::cin >> Q >> A >> B;
  long long sum = 0;
  for (int i=1; i<B; i++) sum += i;
  std::cout << sum << "\n";
}

となります。

ゴルフ

ところで、\sum_{j=1}^B j = \frac{B}{2}(B+1) であることが知られています(参考:等差数列の和の公式の例題と証明など | 高校数学の美しい物語
なので、C(gcc) でコードゴルフをすると次のようにも書けます。

B;main(){scanf("%d%d%d",&B,&B,&B);printf("%d",B++*B/2%17);}

2021/4/2 17:06 時点で Bash に次いで2番目です(お行儀の悪い提出をしています。ごめんなさい)
ruby とかも結構短く書けるはずなので皆さんもお試しあれ

以上

ばいちゃ!

*1:HTML5 では廃止されています。使わないようにしましょう

*2:最大4桁あるので UTF8 には収まっていなそう

AtCoder Beginner Contest 183 (A, B のみ)

久しぶりすぎてはてな記法を忘れました.u-shoです.
調べていたら数式を書けるようになりました.進歩!
AtCoder Beginner Contest 183 - AtCoder に参加したので少し書こうと思います.

A - ReLU

問題概要

次のような関数 \mathrm{ReLU} があります.


\mathrm{ReLU}(x) = \begin{cases} x & (x\geq 0) \\ 0 & (x < 0) \end{cases}
x が入力として与えられるので \mathrm{ReLU}(x) を出力します.

解法

\mathrm{ReLU} 関数は x\geq0 なら x,x<0 なら 0 を返すので,次のようにも書けますね.


\mathrm{ReLU}(x) = \max (x, 0)

なのでプログラムはこんな感じです.

#include <iostream>
int main(){
    int x;
    std::cin >> x;
    std::cout << std::max(x, 0) << "\n";
    return 0;
}

B - Billiards

問題概要

S:(S_x,\,S_y) と点 G:(G_x,\,G_y) があります (S_y>0,\;G_y>0).
x 軸で反射させて,点 S から点 G にボールを通過させるには,x 軸のどこを狙えばいいでしょう?

解法

x 軸で反射させて,点 (S_x,\,S_y) から点 (G_x,\,G_y) にボールを通過させるには,点 (S_x,\,S_y) から点 (G_x,\,-G_y) を結ぶ直線の x 切片を狙えばいいですね.
なので,点 (S_x,\,0) から x 軸方向に (G_x-S_x)\times\left|\frac{G_y-S_y}{S_y}\right| だけ移動したところです.

符号と出力桁数と精度に気をつけて

#include <bits/stdc++.h
int main() {
    using namespace std;

    long double Sx, Sy, Gx, Gy;
    cin >> Sx >> Sy >> Gx >> Gy;
    cout << fixed << setprecision(10) << Sx + (Gx-Sx) / (Gy + Sy) * Sy << "\n";

    return 0;
}

なお,適切に式変形することで S_x + (G_x-S_x) / (G_y + S_y) * Sy = (S_x G_y + G_x S_y) / (S_y + G_y) とできます

あとがき

久々に書いて疲れたのでこの辺で終わります.ごめんにゃ

AtCoder Beginner Contest 152

精進をサボってコンテストに出ていたのですが,このままでは「C o n t e s t a n t 笑」って感じなので,久々に記事を書いてやる気の足しにしようと思いました。

AtCoder Scores の精進グラフ
コンテスト以外で問題を解かなくなって早1年の図

A - AC or WA

解説するようなことはないんですが,あまりにも書いていなさすぎて cin << n とかやって CE を出していました😓
対策として VSCode で赤線出るようにしました。

#include<bits/stdc++.h>
const std::string ans[2] = { "No\n", "Yes\n" };

int main() {
    using namespace std;
    int n, m;
    cin >> n >> m;
    cout << ans[n == m] << endl;
    return 0;
}

一応注目は二行目の const string ans です。ans は使いがちな名前なのでちょっと怖い感じもしますが,long long ans 等の他の型の ans とは区別されるのでテンプレに入れました。
あと 575; (ユージング・ネームスペース・エスティーディ/スタンダード)は main の中に書くことにしました。グローバルをあんまり汚したくなくなってきたためです。

B - Comparing Strings

辞書順ってことは,要は数字の若い方(min(a, b))を出力すればいいんですね😆
このとき max(a, b) 個連続させて出力させるのが肝要ですたぶん。

#include<bits/stdc++.h>
int main() {
    using namespace std;
    int a, b;
    cin >> a >> b;

    // min(a,b)をmax(a,b)回出力する
    for (int i = 0; i < max(a,b); i++) cout << min(a,b);
    cout << endl;
    return 0;
}

rep マクロはあまり使わなかったので廃止しました。
私は ij を間違える回数よりも,rep のフォーマットに沿わない for の書き方をする回数が多かったです。

C - Low Elements

数列 \{P\} 中のある数 P_i について,それより左にある(添字が若い)全ての数よりも小さいかどうかを判定できれば,あとは数えるだけですね。
判定は, P_0 から P_{i-1} における最小値と比較してあげればOKです。

#include<bits/stdc++.h>
const std::string ans[2] = { "No\n", "Yes\n" };

int main() {
    using namespace std;
    int n;
    cin >> n;
    vector<int> P;
    for (int i = 0; i < n; i++){
        int p;
        cin >> p;
        P.push_back(p);
    }

    int min_p = P[0];
    int ans = 1;
    for (int i = 1; i < n; i++){
        if (P[i] < min_p) { // 比較してるとこ
            min_p = P[i]; // 更新を忘れない
            ans++; // 数える
        }
    }
    cout << ans << endl;
    return 0;
}

string ans がちゃんと無視されて,int ansが意図した動きをしています🤗🤗🤗
vector の入力のところで cin >> p[i] ってやっちゃう癖をなんとかしたいですね。これでパフォを300ほど落としています。
テンプレに operator>>(istream, vector)オーバーロードを入れてもいいかもしれません。

D - Handstand 2

よく耳にする「桁DP」というものだそうです。適当に実装したやつに名前がついていると嬉しくなっちゃいますね

#include<bits/stdc++.h>
using ll = long long;

int main() {
    using namespace std;
    int n;
    cin >> n;

    int match[10][10]; // match[先頭の数字][末尾の数字]
    fill(match[0], match[10], 0); // 初期化
    for (int i = 1; i <= n; i++){
        int d = i<10 ? 1 : i<100 ? 10 : i<1000 ? 100 : i<10000 ? 1000 : i <100000 ? 10000 : 100000; // 桁数
        int s = (i<10) ? i : (i / d); // 先頭の数字
        int e = i % 10; // 末尾の数字
        match[s][e]++;
    }
    ll ans = 0LL;
    for (int i = 1; i < 10; i++){
        for (int j = i; j < 10; j++){
            ans += 2 * match[i][j] * match[j][i]; // 2! = 2
            if (j==i) ans -= match[i][j] * match[i][j]; // (1,1)と(1,1)などは重複しているので引く
        }
    }

    cout << ans << endl;
    return 0;
}

コンテスト中は,桁数を求めるところで log10 を使っていたのですが,色々やらかしてしまって提出できませんでした...
終了してからこの愚直実装を思いつきましたが,これは結構気に入っています。

E は解説できそうですが,まだ解けてないので割愛します。
F は問題を見てすらいません。

精進するぞい!!

FSPathMakeRef ... failed with error -36.

Issue

I faced this error when I was going to open the Simulator(of Xcode) to run flutter.

FSPathMakeRef(/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app) failed with error -36.

Reason

I googled. So, I found a message.

One possible cause was the user's machine had two instances of Atom.app on it. (In this case, one was in the Downloads folder, the other in Applications. Delete one of them, try again.
https://gist.github.com/josh-works/ac68a974cb9e0d73d663ea6c8cf3e8d8#fspathmakeref-and-a-bunch-of-other-stuff

Maybe, the file path was collapsed when I execute `xcode-select --switch` command by flutter doctor's recommendation.

Resolve

Simple way is restarting your mac :p

日本語

シミュレータ起動しようとして

$ open -a Simulator

を実行したら下のようなエラーが出たけど再起動したら直りました()

FSPathMakeRef(/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app) failed with error -36.

flutter doctor に言われるがまま実行した `xcode-select --switch` でpathが変わったのが原因っぽいです。

AtCoder Beginner Contest 119 (ABC119)

みなさん,おはこんばんにちは,u_shoですにゃ
MacBook Airの記事をかいていたらABCの記事こんな時間になっちまったよ(昼だが(夜だったので))
u-sho.hatenablog.com

実は前回のABC118にも出ていたのだけど,3か月ぶりに競プロしてみたら爆死したからそっちの記事は書かないよ
あと,今回でなんと
AtCoder緑になりました
いぇ~いv(棒)
いえ,爆死しなければ上がれることは分かっていたので。
ついでに言えば,最高パフォも1415に更新しました(実はこっちの方が嬉しい)。

今回の勝因は,ABC史上2番目に正答率の低かったC問題に5分で見切りをつけたことですね。
わからないなら(もしくは実装に時間がかかるなら)一旦とばす。これ大事
ではでは,問題の方に

A - Still TBD

A問題は日付がyyyy/mm/ddの形で渡されるので,それが平成(Heisei)か次の年号(To Be Determined)か(なぜまだ発表されていないんだ)を判別するやつです。

#include <bits/stdc++.h>
using namespace std;
int main(){
    string S;
    cin>>S;
    if(S<="2019/04/30") cout<<"Heisei\n";
    else cout<<"TBD\n";
    return 0;
}

string型の比較演算はまず長さで比較して,次に辞書順で比較します。
今回のケースでは長さはすべて等しく,また日付は辞書順ですので,これでOKです。
制約を見ている人は,mの部分が4以下かどうかだけ判定すればよかったみたいですね←爆死のもと

B - Digital Gifts

N人から x JPY(日本円) か x BTC(ビットコイン) のお年玉をもらえるので(貰いたい),
それが全部で何円か,合わせてみましょう。という,問題だけ見ると小学校の算数。
1BTCあたり380000円なので,それにをもとに計算すると,こんな感じ

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

int main(){
    double N, x, ans=0.0;
    string u;
    cin >> N;
    for(int i=0; i<N; i++){
        cin >> x >> u;
        if(u=="JPY") ans += x;
        else ans += x*380000.0;
    }
    cout << ans << endl;
    return 0;
}

今回は有効数字8桁だったので,double型なら十分です。
(参考)浮動小数点数型と誤差
出力もcoutのデフォルトでOKです。不安ならprintfを使いましょう。

C - Synthetic Kadomatsu

l[i](3≦iN)の長さのN本の竹に対して,魔法を使ってA,B,Cの長さの3本の長さの竹を錬成しましょう。
えー,個人的にはむずかった。発想としては,各々の竹にに関して,

  1. Aに使う
  2. Bに使う
  3. Cに使う
  4. 使わない

の4通りがあるので,4^N(N≦8)で全探索すれば解けます。

なんか,数学1Aの「場合の数」で、
『通し番号のついた8個くらいのボールをそれぞれ名前の付いた3個くらいの箱に入れるやり方は何通り?』
っていう問題と発想は似てると思うんですよ。

僕はこれと類似の発想を見る度に天才だと思っているし,この発想は苦手というか穴ですが、
典型ではあるので,他の人が解けていないのはちょっと謎に思いました。
みんな私と同じところが苦手なのでしょうか・・・
ともかく典型は解けるようになりたいと思ったのですよ。

D - Lazy Faith

1本の道があって,一方の端からs[i](1≦iA)の距離に神社(shrine),t[i](1≦iB)の距離に寺(temple)があり,
君がx[i](1≦iQ)の場所にいるとき,神社と寺を少なくとも1回ずつ訪れるには最短どのくらい歩けばいい?

こういう問題が出たら,とりあえずソートします。*1
んで,こういうときは実際に想像します。

  1. 右隣のお家に回覧板を回して,その右隣のお家にも何か差し入れするとき→→
  2. 右隣のお家に回覧板を回して,左隣のお家には何か差し入れするとき  →←←
  3. 左隣のお家に   〃   ,右隣のお家には   〃    とき  ←→→
  4. 左隣のお家に回覧板を回して,その左隣のお家にも何か差し入れするとき←←

というパターンがあって,回覧板(神社)と差し入れ(寺)はこの場合区別しなくてもよいので,これで以上になります。 

これを4パターンをそれぞれのxについて全探索すればよいわけですが,
A,B,Q≦1e5なので,『それぞれのxについてO(log(A+B)程度で解く必要がある』ことが分かります。
これが†真の制約†です。

全探索自体は4パターンしかないので,それぞれのxがソート済みのsとtのそれぞれ何番目にあるかをO(log(A+B)程度で求めればよいわけです。
それぞれのxがソート済みのstのそれぞれ何番目にあるかを求めるのといえば,
upper_bound()やlower_bound()がお馴染みですが,
奇しくもそれらの計算量はO(logn)なので(2分探索するため),なんと†真の制約†をクリアできました。やったね☆

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

int main(){
    ll A, B, Q;
    cin >> A >> B >> Q;
    vector<ll> s(A), t(B), x(Q);
    for(ll i=0LL; i<A; i++){
        cin >> s[i];
    }
    for(ll i=0LL; i<B; i++){
        cin >> t[i];
    }
    sort(s.begin(),s.end());
    sort(t.begin(),t.end());
    for(ll i=0LL; i<Q; i++){
        cin >> x[i];
    }

    for(int i=0; i<Q; i++){
        ll ans=0LL;
        decltype(s)::iterator its = upper_bound(s.begin(), s.end(), x[i]);
        decltype(t)::iterator itt = upper_bound(t.begin(), t.end(), x[i]);

        ll sl = *its, tl = *itt;
        if(its==s.end())sl=3e10;
        if(itt==t.end())tl=3e10;

        ll ss = *(its-1), ts = *(itt-1);
        if(its==s.begin())ss=-3e10;
        if(itt==t.begin())ts=-3e10;

        if( sl < tl ){
            ans = min( x[i] + sl - 2*ts, -x[i] + 2*sl - ts );
            ans = min( ans, tl - x[i] );
            ans = min( ans, x[i] - min(ss,ts) );
        }else{
            ans = min( x[i] + tl - 2*ss, -x[i] + 2*tl - ss );
            ans = min( ans, sl - x[i] );
            ans = min( ans, x[i] - min(ss,ts) );
        }
        cout << ans << endl;
    }

    return 0;
}

こぼれ話

手元でg++コンパイルして提出前に確認できたから
イテレータ関連でCEやREを投げなかったのが嬉しかったかな。
やっぱり手元に実行環境は作っておくもんだね。
そういえば今回はレッツノートで参戦しました。

*1:ソートの計算量は配列の大きさnについてO(n log n)なので,そこだけ確認しましょう。

MacBook Air 2019を理系大学生が1ヶ月使ってみた使ってみた感想

久しぶりの更新です。もう成人したどころか21になりました。u_shoです。
ブログ紹介欄に19歳とか書いてあって流石に笑いました。
最終更新から1年以上経っているということですね←おい

時の流れは速く,この20年間働いたことのなかった私も
3か月ほど前からレッドインパルス株式会社さんでアルバイトをはじめました。

開発環境を揃えるという名目でMacBookPro2015を貸与してもらっていたのですが,
使っているうちに自分で1台所有したくなってしまったので
大学の帰りにMacBook Airを買ってしまいました。

f:id:u_sho:20190225101432j:plain
MacBook Airとその箱の間からこんにちはしているのが,私御用達の大学生協PCくんです。

購入したのは MacBook Air 2019年モデル(メモリ8GB,SSD256GB,Retinaディスプレイ13インチ)です。

学生・教職員の方は,Macの学生プランで購入した方が*1,家電量販店で購入するよりも格安と思います*2
私は家電量販店でバイトしてる友人がいたので少しばかりごねたら主任と価格交渉してくれて,
学生プランと同額で購入できました。学生プランと同額でないと買うつもりはなかったのですが,
割り引いて頂いたおかげで,その日のうちに手に入れることができて満足でした。

ありがとうビックカメラ京王調布店。 ありがとう売り上げ目標。ありがとう友人A――

MacBook Airの利点・欠点

いうわけでMacBook Airを普段使いしているのですが,

  1. ディスプレイがめっちゃ綺麗
  2. 音質が最高

という感想が強くて,15万円のディスプレイとスピーカーセットを買った気分です(笑)
正直ノートPCとしての性能はゴミ私が今まで使っていた大学生協PCくん(レッツノート8GB,256GB,Corei7-6500U)とそんなに変わらないです。

というかAirはスレッド数,コア数が少ないので,だいたいの場面においてレッツノートのほうが強いです。
拡張性についてもレッツノートの方が強いですが,省電力性に関してはAirがリードしています。
正直5時間もHD動画を流していて,バッテリーを60%程度しか消費しないのをみたときは驚異的だと思いました。
あと貧弱なりにもGPUがついているので,囲碁AIとか機械学習とかでもよい性能を発揮するかも

プログラミングで使っていて思う利点としては,

  1. _(アンダーバー)が打ちやすい
  2. 半角/全角キーにあたる,英数キー/かなキーやCtrlキーの配置がよい
  3. Ctrl+(P,N,B,F)キーによるカーソル移動(初期設定)
  4. 画面遷移のしやすさ

とかですかね。どれもmacOSならではです。
ただし,キーが固くて大きいので,打っていて疲れます。HHKB*3BTを買ってみたくなります。

また,1番目に関してはunix系のOSなら(というか何故か円マーク¥が表示されるWindows以外なら)問題ないですし,
2番目に関してもHHKBの日本語配列がだいたいこんな感じですがね・・・
ただ,4番目に関しては本当にmacOSならではですし,3本指アプリ移動と2本指でブラウザバックはもう戻れない感じがします。
あと,touch IDは地味に便利ですね。使っていきましょう。

本当は上の部分は導入にして,ABC119の話をするつもりだったのですが,前書きのほうが長くなったのでわけますm(_ _)m

*1:apple storeapple公式サイトからのみ

*2:家電量販店からすると利益率の少ない商品なので,あまり値引きしてもらえない

*3:HHKB:Happy Hacking KeyBoardという,エンジニア界隈に根強い人気があるキーボードシリーズ。静電容量無接点の数万円するやつは依存性が高いらしい。

AtCoder A埋め

久々のゴルフを兼ねてA埋め。ゴルフはこたつがめ氏が強すぎて萎えた。

ABC100

A - Happy Birthday!
Submission #2892439 - AtCoder Beginner Contest 100
「かつ」を示す「&&」のうち1個はいらないですね。a<9の返り値は0/1なので。

ABC101

A - Eating Symbols Easy
Submission #2892339 - AtCoder Beginner Contest 101
scanfで読み取っていますが、getchar()を使った方が短いです。
43は「+」の文字コードです。これも、s==43?...とやるより、t+=s/45;printf("%d",4-2*s);とした方が2文字少ないです。
45は「-」の文字コードで、char型を整数で割るとint型として計算されるので、s='+','-'のときs/45=0,1です。

ABC102

A - Multiple of 2 and N
Submission #2892151 - AtCoder Beginner Contest 102
includeしていますが、importした方が、cin/coutが使えなくなったとしても、短いですね。
また、n%2?2*n:nの部分ですが、n%2が1か0かによって2*nかnかを出力させたいので、n<<n%2という書き方の方が断然短い。
ここでの<<はビットシフト演算子です。例えばa<<bだと、aの2進数表記で立っているビットを左にbだけ動かします。
a=1、b=2のときはa_(2)=0000000000000001なので、1を左に2個動かしてa_(2)=0000000000000100となり、a=4になります。

ではではここで