bouzuya.hatenablog.com

ぼうずやのにっき

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 を解いた。

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);
}

今日のコミット。