blog.bouzuya.net

2023-03-01 bouzuya/nostr-keyconv 0.1.0 をつくった / ABC152 の A, B, C, D を解いた

bouzuya/nostr-keyconv 0.1.0 をつくった。

nostr-keyconv は nostr で使う public key / private key / event id の bech32 表記 (NIP-19) と hex を相互変換するためのコマンドラインツール。使用例は以下。

$ nostr-keyconv npub10elfcs4fr0l0r8af98jlmgdh9c8tcxjvz9qkw038js35mp4dma8qzvjptg
7e7e9c42a91bfef19fa929e5fda1b72e0ebc1a4c1141673e2794234d86addf4e

$ nostr-keyconv nsec1vl029mgpspedva04g90vltkh6fvh240zqtv9k0t9af8935ke9laqsnlfe5
67dea2ed018072d675f5415ecfaed7d2597555e202d85b3d65ea4e58d2d92ffa

$ nostr-keyconv note1paq6fdap00vkkxch74hxkkhjldvjtkwa6u23as2cpc92h5ghxnmqf7eyg4
0f41a4b7a17bd96b1b17f56e6b5af2fb5925d9ddd7151ec1580e0aabd11734f6

$ nostr-keyconv --prefix=npub 3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d
npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6

$ nostr-keyconv --prefix=nsec 67dea2ed018072d675f5415ecfaed7d2597555e202d85b3d65ea4e58d2d92ffa
nsec1vl029mgpspedva04g90vltkh6fvh240zqtv9k0t9af8935ke9laqsnlfe5

$ nostr-keyconv --prefix=note 0f41a4b7a17bd96b1b17f56e6b5af2fb5925d9ddd7151ec1580e0aabd11734f6
note1paq6fdap00vkkxch74hxkkhjldvjtkwa6u23as2cpc92h5ghxnmqf7eyg4

既存のツールは多々あると思う。けど NIP-05 の設定時に npub -> hex が欲しくなったときに、さっとつくれたので手直してして公開することにした。

プログラミング言語は Rust で、ライブラリに crates:nostr を使っている。あとは定番の crates:clap, crates:anyhow を使っている。

NIP-19 の bech32 から hex は何のヒントもなく変換できるが、 hex から NIP逆変換のときにどう指定すべきかすこし迷った。

Web アプリケーション版も用意しておいても良さそう (既にあると思うけど) 。

このアプリケーションの話ではないけど、今回は bouzuya/rust-sandbox の外に出してみた。手軽ではあるのだけど、リポジトリをひとつにまとめるのも良くない気がしてきたので。このことについてはまた別で書くかもしれない。


ABC152 : AtCoder Beginner Contest 152 の A, B, C, D を解いた。

use proconio::input;

fn main() {
    input! {
        n: usize,
    };
    let mut count = vec![vec![0_usize; 10]; 10];
    for i in 1..=n {
        let chars = i.to_string().chars().collect::<Vec<char>>();
        let first = (*chars.first().unwrap() as u8 - b'0') as usize;
        let last = (*chars.last().unwrap() as u8 - b'0') as usize;
        count[first][last] += 1;
    }
    let mut ans = 0_usize;
    for i in 0..=9 {
        for j in 0..=9 {
            ans += count[i][j] * count[j][i];
        }
    }
    println!("{}", ans);
}

今日のコミット。