You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Advent Of Code字符优先级计算:寻求更简洁的纯C实现方案

优化Advent Of Code字母优先级映射的纯C实现技巧

我在做Advent Of Code的趣味谜题,需要将小写字母a-z映射为优先级1-26,大写字母A-Z映射为27-52。目前已经实现了两种写法,但希望找到更简洁、高效且优雅的纯C实现方式。

现有实现方式

1. 数组查表法

static uint8_t map[] = {
        ['a'] = 1,  ['b'] = 2,  ['c'] = 3,  ['d'] = 4,
        ['e'] = 5,  ['f'] = 6,  ['g'] = 7,  ['h'] = 8,
        ['i'] = 9,  ['j'] = 10, ['k'] = 11, ['l'] = 12,
        ['m'] = 13, ['n'] = 14, ['o'] = 15, ['p'] = 16,
        ['q'] = 17, ['r'] = 18, ['s'] = 19, ['t'] = 20,
        ['u'] = 21, ['v'] = 22, ['w'] = 23, ['x'] = 24,
        ['y'] = 25, ['z'] = 26, ['A'] = 27, ['B'] = 28,
        ['C'] = 29, ['D'] = 30, ['E'] = 31, ['F'] = 32,
        ['G'] = 33, ['H'] = 34, ['I'] = 35, ['J'] = 36,
        ['K'] = 37, ['L'] = 38, ['M'] = 39, ['N'] = 40,
        ['O'] = 41, ['P'] = 42, ['Q'] = 43, ['R'] = 44,
        ['S'] = 45, ['T'] = 46, ['U'] = 47, ['V'] = 48,
        ['W'] = 49, ['X'] = 50, ['Y'] = 51, ['Z'] = 52
};

2. ASCII偏移计算法

#define UPRMAGIC 0x26
#define LWRMAGIC 0x60

// 调用示例
return islower(c) ? c - LWRMAGIC : c - UPRMAGIC;

更简洁高效的实现技巧

1. 直观化ASCII偏移计算

用字符常量代替魔法值,可读性大幅提升,效率与原偏移法一致:

int get_priority(int c) {
    return islower(c) ? c - 'a' + 1 : c - 'A' + 27;
}

2. 无分支位运算优化(输入为合法字母时适用)

利用ASCII大小写字母的第5位差异(小写为1,大写为0)消除条件分支,性能更优:

int get_priority(int c) {
    // 先统一转大写计算基础1-26值,再根据原字符大小写补差值
    return (c & ~0x20) - 'A' + 1 + ((c & 0x20) ? 0 : 26);
}

3. 紧凑查表法

缩小查表数组的内存占用,同时保留查表的高效性:

static const uint8_t priority[] = {
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,
    27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52
};

int get_priority(int c) {
    return priority[islower(c) ? c - 'a' : c - 'A'];
}

内容的提问来源于stack exchange,提问作者bjarne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:50:53