2048记录反查(ruby)

#58640。2048我打的最大分,别人问,你到底最高多少啊。只有最高纪录分数看不到状态,干脆写个程序,告诉别人自己到底打到多少吧,我其实只记得自己是4096+1024,其他的分数忘记了,不过使用这个程序,很容易就分析出来了。
#2048是在合成的时候记录分数,比如4和4合成8,记录8分,类似这个样子。新出现的2或者4是不计分数的。所以可以通过递归,获得块数合成时候的分数。

?





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

#coding: UTF-8

def total(n)  #假设全部的数都是2,2的n次方得到的分数,比如n=10,2**10=1024得到的纪录分数

  return
4 if
n == 2

  2
* total( n - 1
) + 2 ** n

end

def total_plus(n)  #随机2或4,比例9:1,获得的分数。

    i = 0

    (2
** n / 2).times { i += 1
if rand(10) == 0}

    if
total(n) >= i * 4

      total(n) - i * 4

    else

      0

    end

end

#{2=>4, 3=>16, 4=>48, 5=>128, 6=>320, 7=>768, 8=>1792, 9=>4096, 10=>9216, 11=>20480, 12=>45056, 13=>98304, 14=>212992, 15=>458752, 16=>983040} # 只有2的时候2**n对应的的得分

@h
= {}

(2..16).each
{|n| @h[n] = total_plus(n)}  #据传说,不能大于2**16次方

puts @h 
# 做一个对应表,2的n次方对应的可能得分数

def max_n(score) #录入一个分数,小于此分数的最大对应n,比如得到5124分,查表得到最大可能的n是9,也就是说盘面最大是2**9=512。

  temp = []

  @h.each 
do |k, v|     

    temp << k if
v <= score  

  end

  temp.max

end

def score_to_n(score, temp = []) #输入记录,反查组成此记录的n值数组

  max = max_n(score)

  return 
temp << @h.key(score) if
@h.key(score) == max #score在hash表内的时候,直接返回

  return
temp if @h[max].zero?   #因为有4存在,所以可能会有0,去除0,要不后面就会报错

  div = score.divmod(@h[max])  #求余数

  div[0].times {temp << max } #多个的时候,写入temp多个n

  score_to_n(div[1], temp)

  temp.compact

end

score = 58640

p score_to_n(score).map {|n| 2
** n} # 最终的状态集合,可以检查一下是否和自己的状态一致

p [score, score_to_n(score).map {|n| @h[n] } .inject(:+)] #录入分数和校验分数的比较,可能不一样噢



2048记录反查(ruby)

时间: 2024-08-30 08:54:49

2048记录反查(ruby)的相关文章

2048记录反查(javascript)

还是2048的记录反查,原先我写过一个,请看地址2048记录反查(ruby),不过是ruby版的.近期对js很感兴趣,一直在学习,所以就想顺便写一个js版的吧,至少方便发布到网页上.就去网上找了随便找了网页版的2048,感谢黄岩同学,在他的框架下,参考ruby版的,写出了html的2048记录反查.其实js里面的坑还是很多的,掉进去n次,太丢人就不说了,总之最后还是写出来了.源码在下面,我也随便发布到了github,地址是 http://qqrrm.github.io/2048.html其实有目

SQL自连接(源于推荐算法中的反查表问题)

"基于用户的协同过滤算法"是推荐算法的一种,这类算法强调的是:把和你有相似爱好的其他的用户的物品推荐给你. 要实现该推荐算法,就需要计算和你有交集的用户,这就要用到物品到用户的反查表. 先举个例子说明下反查表:甲喜欢的物品有:A.B.C:乙喜欢的物品有:B.E.F:丙喜欢的物品有:A.J.K:而你喜欢的物品是:A.J.M.反查表就是喜欢A物品的有你.甲.丙,喜欢J物品的有你.丙,喜欢M物品的只有你,这就是和你喜欢的物品有联系的用户.有了这个反查表,我们就可以看出和你有关系的用户只有甲和

C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)

这里使用了两个接口来反查IP,分别是"站长工具"和"爱站"的接口,两者各有千秋,结合起来查询就较为准确了. 注:我目前只写了个初始版本,还不太完善,但是可以基本使用了,代码中关键地方有注释,所以我就不多解释了 算法核心: package NmapTest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.Inpu

iOS 根据经纬度反查 地名

在iOS中 定位自己的当前位置,知道经纬度很简单,然后有些时候要知道地名,apple 也有了现成的api直接调用就可以(以下方法是iOS5.0以上的,现在基本都忽略了 iOS5.0以下的设备) #pragma mark - #pragma mark CLLocationManagerDelegate - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation

PHP地址反查返回经纬度 百度API

/** * 百度地图   根据地址反查经纬度 */ public function search_xy(){ $address = str_replace(' ','',$address); $rows = file_get_contents("http://api.map.baidu.com/geocoder/v2/?ak=xxxxxxxxxxxxxx&callback=renderOption&output=json&address=首都图书馆&city=北京

ip反查域名

nslookup 或者 dig -t ptr都不行 找了很多资料,大概意思是:目前的dns已经不支持反查了 不过后来无意中发现这个网站却做到了 http://www.myipneighbors.com/ 能否讨论一下它是怎么实现的

小鹤双拼飞扬版反查编码功能解释-by老随风

更新时间:2015-05-22 反查编码功能 文中例字均为(码maum) 关于知道编码也不知道为何这么拆,请明白鹤形是拆一个字首尾两部分的形码 ②ofi   (知道字怎么读,想知道该字是否有其他编码) ③ofi: (不知道字怎么读,但该字可以复制到剪贴板) ④:i   (查某字的详细信息:读音.笔画数.部首.笔顺.小鹤编码.释义) ⑤ozd  (打开候选窗字典功能) ⑥omb  (查码表,这个如果也查不出来的话,说明小鹤飞扬版词库没这个字或词) ⑦ohd  (这个专治笔顺和读音不对的亲们) 关于

SAP函数 CS_WHERE_USED_MAT 反查上层BOM

遇到用户要根据下层物料反查最上层BOM物料是什么. 试了一下,通过函数 CS_WHERE_USED_MAT 来查询,但是只能往上查询一层,类似事务码CS15的效果.如果要找最上层物料,需要自己写迭代进行查询. DATA: lt_wultb TYPE TABLE OF stpov, lt_equicat TYPE TABLE OF cscequi, lt_kndcat TYPE TABLE OF cscknd, lt_matcat TYPE TABLE OF cscmat, lt_stdcat T

Get_domains(调用ICP及mail反查接口获取资产)

写了个小工具,目的是尽可能多的获取资产,这个工具调用的是站长工具的ICP备案查询和邮箱反查功能. 环境:Python3 get_domains.py: import requests import re host = '' mail = '' headers = { 'Cookie':'', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/7