【问题标题】:Calculate an alphabetic score for a word计算一个单词的字母分数
【发布时间】:2022-06-21 19:10:30
【问题描述】:

如何为字符串生成数字分数,以便以后用户按字母顺序排序?

(我想将 objectIds 添加到基于 name 属性的 redis 排序集中。这需要一个数字分数。我的事物列表可能太大而无法一次排序,因此想要对每个项目进行评分单独)

字母表中较早的单词的分数应该较低,'a' = 0。

到目前为止我的天真方法; (来自Replace a letter with its alphabet position的字母字母位置)

function alphaScoreString(inputString) {
    let score = 0

    inputString
        .trim()
        .toLowerCase()
        .split('')
        .map((letter, index) => {
            const letterNumber = parseInt(letter, 36) - 10
            if (letterNumber >= 0) {
                score += letterNumber / (index + 1) 
            }
        })

    return score * 1000
}

这不起作用,因为

alphaScoreString('bb')
1500
alphaScoreString('bc')
2000
alphaScoreString('bbz')
9833.333333333334

您可以看到“bbz”的得分高于“bc”,但应该更低,因为在字母列表中“bbz”会排在“bc”之前。

【问题讨论】:

  • 这是一个非常有趣的问题。只是为了澄清 - 字符串的长度是否有限?如果不是,那么实现这样的函数将非常困难,因为例如,字符串 'a' * n 总是必须产生小于字符串 'b' 的分数,无论 n 有多大。跨度>
  • 是的,这是一个棘手的问题!字符串在技术上没有限制,但在这种情况下它们是姓氏,所以我们可以假设小于... 25?如果由于第 26 个字母而导致一些较长的名称顺序错误,我认为没有人会注意到。
  • 如果字母表中较早的单词应该有较低的分数,而关键是稍后按该分数对单词进行排序......**为什么不直接对单词进行正常排序**?跨度>
  • 因为稍后我将只有对象的分数和 ID,而不是单词本身。

标签: javascript


【解决方案1】:

您可以将每个字符转换为其 unicode(并通过填充字符串确保每个字符都是 4 位数字。例如“H”= 72 但填充为 0072:逐字比较,您仍然可以确定 '每个字符串的字母顺序':

var instring = "Hello World";
var output = "";
for(i=0; i<instring.length;i++){
  const newchar = String(instring.charCodeAt(i)).padStart(4, '0');
  output = output.concat(newchar)
  console.log(output);
}

【讨论】:

  • 有趣的想法!但我需要输出是数字类型,而这是字符串类型。
  • 使用数字的问题(假设这里是 longint)是您永远无法为每个字符串获取唯一标识符。字符串比 64 位整数多。如果您可以将数字限制为 64 位,则此方法将起作用。
  • 我对这里的重复完全没问题,我正在使用它来生成score: object-id 的有序集,但是要在 redis 排序集中使用分数,它需要是数字跨度>
  • 您能否将“数字字符串”截断为前 n(例如 n=16)位数字并将其转换为数字?
【解决方案2】:
Answer writen in python.

char_codex = {'a':0.01, 'b':0.02, 'c':0.03, 'd':0.04, 'e':0.05, 'f':0.06,
              'g':0.07, 'h':0.08, 'i':0.09, 'j':0.10, 'k':0.11, 'l':0.12, 
              'm':0.13, 'n':0.14, 'o':0.15, 'p':0.16, 'q':0.17, 'r':0.18, 
              's':0.19, 't':0.20, 'u':0.21, 'v':0.22, 'w':0.23, 'x':0.24,
              'y':0.25, 'z':0.26}

def alphabetic_score(word):
  bitwiseshift = '1'
  scores = [0.00] * len(word)
  for index, letter in enumerate(word.lower()):
    if index is 0:
      scores[index] = char_codex[letter]
    else:
      bitwiseshift = bitwiseshift+'00'
      scores[index] = char_codex[letter]/int(bitwiseshift)
  return sum(scores)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多