2023-03-20 Expo (React Native) の Android 環境での uuid のエラー / ABC294 の A, B, C, D, E を解いた
Expo (React Native) の Android 環境で uuid を生成しようとしてハマった。
- expo 48.0.6
- react-native 0.71.3
- uuid 9.0.0
npm:uuid の README にあるエラーだ。
"getRandomValues() not supported"
This error occurs in environments where the standard crypto.getRandomValues() API is not supported. This issue can be resolved by adding an appropriate polyfill:
↓のようにすれば良いと書いてある。
import 'react-native-get-random-values'; import { v4 as uuidv4 } from 'uuid';
……がこう書いても動かない。
npm:expo-crypto を使って↓の形で回避した。
import * as crypto from "expo-crypto";
import { v4 as uuidv4 } from "uuid";
// ...
uuidv4({
rng: () => {
const array = new Uint8Array(16);
crypto.getRandomValues(array);
return array;
},
})
ABC294 : AtCoder Beginner Contest 294 の A, B, C, D, E を解いた。
- A - Filter
https://atcoder.jp/contests/abc294/tasks/abc294_a
- 提出: https://atcoder.jp/contests/abc294/submissions/39903401
a.into_iter().filter(|a_i| a_i % 2 == 0).collect::<Vec<usize>>()
- B - ASCII Art
https://atcoder.jp/contests/abc294/tasks/abc294_b
- 提出: https://atcoder.jp/contests/abc294/submissions/39903494
- 0 なら '.', 1 以上なら -1 + b'A' して出力する
- C - Merge Sequences
https://atcoder.jp/contests/abc294/tasks/abc294_c
- 提出: https://atcoder.jp/contests/abc294/submissions/39903733
- A と B を連結したあと添字をつけたあとでソートする
- 添字のうち N 未満のものをフィルタして出力 (A)
- 添字のうち N 以上のものをフィルタして出力 (B)
- D - Bank
https://atcoder.jp/contests/abc294/tasks/abc294_d
- 提出: https://atcoder.jp/contests/abc294/submissions/39904040
- 受付に呼ばれた人を BinaryHeap で管理し、受付に行った人を HashSet で管理した
- E - 2xN Grid
https://atcoder.jp/contests/abc294/tasks/abc294_e
- 提出: https://atcoder.jp/contests/abc294/submissions/39905020
- 扱いやすく整形してなんとかした
- 長さを累積和にした
- 累積和の短い側に合わせて要素を区切った
- 一致していれば一つ前の要素からそこの個数までを答えに加算していった
use proconio::input;
fn main() {
input! {
_l: usize,
n_1: usize,
n_2: usize,
vl_1: [(usize, usize); n_1],
vl_2: [(usize, usize); n_2],
};
let (vl_1, vl_2) = {
let mut vl1 = vec![];
let mut count = 0_usize;
for (v_1, l_1) in vl_1 {
vl1.push((v_1, count + l_1));
count += l_1;
}
let mut vl2 = vec![];
let mut count = 0_usize;
for (v_2, l_2) in vl_2 {
vl2.push((v_2, count + l_2));
count += l_2;
}
(vl1, vl2)
};
let (vl_1, vl_2) = {
let mut vl1 = vec![];
let mut vl2 = vec![];
let mut i_1 = 0_usize;
let mut i_2 = 0_usize;
while i_1 < n_1 && i_2 < n_2 {
let (v_1, l_1) = vl_1[i_1];
let (v_2, l_2) = vl_2[i_2];
match l_1.cmp(&l_2) {
std::cmp::Ordering::Less => {
vl1.push((v_1, l_1));
vl2.push((v_2, l_1));
i_1 += 1;
}
std::cmp::Ordering::Equal => {
vl1.push((v_1, l_1));
vl2.push((v_2, l_2));
i_1 += 1;
i_2 += 1;
}
std::cmp::Ordering::Greater => {
vl1.push((v_1, l_2));
vl2.push((v_2, l_2));
i_2 += 1;
}
}
}
if i_1 < n_1 {
vl1.push(vl_1[i_1]);
}
if i_2 < n_2 {
vl2.push(vl_2[i_2]);
}
(vl1, vl2)
};
let mut count = 0_usize;
let mut prev = 0_usize;
for ((v1, l), (v2, _)) in vl_1.into_iter().zip(vl_2.into_iter()) {
if v1 == v2 {
count += l - prev;
}
prev = l;
}
let ans = count;
println!("{}", ans);
}
今日のコミット。