设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2856|回复: 10
打印 上一主题 下一主题

[胡扯] 【版聊2019.3.11】个人年度最差劲算法

[复制链接]

Lv5.捕梦者

梦石
10
星屑
39587
在线时间
1920 小时
注册时间
2010-11-14
帖子
3320

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2019-3-11 20:49:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 KB.Driver 于 2019-3-11 20:52 编辑

大家在做游戏时可能会用到自己的数据结构,
在处理这些结构时可能会碰到要自己写算法的情况。

今天,我在写代码时发现,需要写一个将数字与Excel列号互换的情况。
也就是
1 <=> A
2 <=> B
......
26 <=> Z
27 <=> AA
......
702 <=> ZZ
703 <=> AAA
......

在转换字母为数字时,事情还比较顺利。



但是数字转字母我被坑了半个小时,被进制坑的团团转= =
直到后来我发现



于是,个人年度最差劲算法诞生了!



大家也有写出过自己认为“最差劲”的算法吗?
欢迎分享个人经历~

版聊2019.3.11 @怪蜀黍
用头画头像,用脚写脚本

Lv3.寻梦者

梦石
0
星屑
2749
在线时间
2630 小时
注册时间
2013-1-16
帖子
5657

贵宾

2
发表于 2019-3-11 21:14:38 | 只看该作者
本帖最后由 myownroc 于 2019-3-11 21:17 编辑

这题在LeetCode上写过,然而不知道怎么找之前的记录┑( ̄Д  ̄)┍

啊啊啊啊,找到了
数字转字母:
  1. class Solution {
  2. public:
  3.     string convertToTitle(int n) {
  4.         string result;
  5.         while (n > 0) {
  6.             string ch = "A";
  7.             ch[0] += (n - 1) % 26;
  8.             result = ch + result;
  9.             n = (n - 1) / 26;
  10.         }
  11.         return result;
  12.     }
  13. };
复制代码


字母转数字:
  1. class Solution {
  2. public:
  3.     int titleToNumber(string s) {
  4.         int size = s.size();
  5.         int sum = 0;
  6.         for (int i = 0, t = size - 1; i < size; i++, t--) {
  7.             int fac = s[i] - 'A' + 1;
  8.             for (int j = t; j > 0; j--) {
  9.                 fac *= 26;
  10.             }
  11.             sum += fac;
  12.         }
  13.         return sum;
  14.     }
  15. };
复制代码

评分

参与人数 1+1 收起 理由
冷俊逸 + 1 塞糖

查看全部评分

(Created by @喵kano)


施工现场:hotege.github.io
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

3
发表于 2019-3-11 21:57:47 | 只看该作者
本来这个作为失败的项目不想发了
但是 既然是这个话题 我一定要参加!
之前关于四季学院猜词我写了一个工具
它根据可能单词的各字母出现次数来提供建议
比方a出现最多 那就猜它 然后有一天
我想到 这样好像不是最优的猜法
因为只有七次猜错的机会
要做的应该是最小化平均错误次数
比方五个单词中猜
STX SXJ SXX XXT XJX
X表示各不相同的字母 重点考察S T J
T和J是对称的
假如先猜S 3/5不损失机会
然后三个没有相同字母得一个一个试
没有S的话剩下两个也得一个一个试
平均损失1.2次机会
假如先猜T或J
因为他俩可以对单词有更好的区分性
平均只损失0.8次机会

我就据次写了一个推荐度算法 概括是
在所有可能出现的字母中一个一个迭代
寻找最小的平均损失值和对应的字母
具体来讲是
假如目标字母是S 目标单词长度五位
把单词群根据S的有无和出现位置分开
比方符合.S...的有8个单词
符合 S..S. 的有4个  ...
没有S的有7个
然后S对应损失的次数就是没有S的单词个数(这些猜错了)加上那些被分开的单词群各自最小的损失次数(这些是后续的可能性)
也就是不断递归直到单词群只有一个
因为这时候损失的次数是0

这算法理论上能给出最好的建议
经过测试也是没出错
可是一旦单词规模扩大 就算不出来了(也和单词长度有关 反正几十个肯定炸了)
因为单词群量一大 递归的量就非常非常大
有多大我也不知道 反正大 大的我难受
而且因为递归对应的单词群都不同
不能保存和利用算过的结果
我也不知道怎么优化(我菜)
最后就不了了之了


从兴致满满 到世界灰暗
只怪自己不够强
还是要慢慢积累

点评

我觉得这道题应该是有题库的……先找出来对应的单词书,然后从里面二分就行(看看猜哪个字母可以最好地分成两堆) 不用太heuristic的算法  发表于 2019-3-11 23:13
还是..算了 我老老实实拿网站猜词不好吗 我们忘了这茬 继续新的开始  发表于 2019-3-11 23:01
我倒是 想了一个替代的办法 就是先不管猜没猜对 这字母能最大程度区分单词群就行 这样就不需要考虑后续可能性 实现简单 就是不知道科学性怎么样  发表于 2019-3-11 23:00
我感觉 这就是不科学的算法..所以是年度失败大作...为了可能提高的那一点点精确度搞的这么麻烦 我走入邪道啦  发表于 2019-3-11 22:54
不检查完单词也不能肯定这个字母不合适 而剩下的字母空位只有两位的时候 就算一个字母只出现一次没没办法直接不考虑..因为可能只有三四个单词了  发表于 2019-3-11 22:53
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42344
在线时间
7599 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

4
发表于 2019-3-12 01:54:19 | 只看该作者
算法,不存在的,全靠穷举(x)
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 00:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表