cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 7820|回复: 35

[聊天] 测量计算器哪家强?(先挖坑,慢慢填)

 关闭 [复制链接]
发表于 2017-10-6 19:21:36 | 显示全部楼层 |阅读模式
本帖最后由 randomzoom 于 2017-10-11 19:37 编辑

数独源程序tns--22楼
============================================================
由于手机和电脑的普及,计算器的刚性需求是越来越小,但是,在测量领域,计算器是必不可少的。想想一对基友在野外漫山遍野捉迷藏,一个举着杆子说,我在这里,另外一个扛着笨重的全站仪,到处搜对友,可能还要对着对讲机喊前进x米,后退x米,是不愿意抗电脑的。手机,电力成大问题。输入也慢,大太阳下,能看清楚屏幕才怪。所以一款顺手高效高能的计算器必不可少。

如何选择计算器,先来个应用场景分析:
1. 由于太阳暴晒,电力续航原因,彩屏计算器可以出局了。
2. 负重和便携原因,大体积大砖头出局,如TI-92,TI-Voyage 200。
3. 功能不能太弱,函数机出局,至少要是编程机。

那么剩下的就屈指可数了:
TI:84系列,89系列,nSpire(非彩屏);
Casio:58系列,98系列;
HP:39系列,49系列,FD10;
其他的有sharp,好像没有新出机。全是10多年前古董9400,9600,9900,出局。
不过,本文也不限于上述机器,尽可能收集公开的数据。涉及的计算器有:
TI 84 89 92 voyage 200 NSpire CX
CASIO fx 9860 5800 FD10 CG10 CG20
HP HP39G HP49G HP50G  Prime




 楼主| 发表于 2017-10-6 21:19:15 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-10 18:51 编辑

先来一个不完整的配置参数对比吧。所有参数均从网上及说明书中获取,不完整,也不保证准确。此参数仅供参考,本人对阅读此帖所产生的任何直接或间接的影响(收益或损失)不负任何责任。

本帖子中包含更多资源

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

x
回复 支持 0 反对 3

使用道具 举报

 楼主| 发表于 2017-10-6 21:48:37 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-6 22:00 编辑

为什么HP的为HP Basic,TI的为TI Basic,而casio的却称为类basic指令呢,
因为9860,5800都用了一些奇特的指令,如:
?→A,输入A的数值
A⊿,输出A的数值
⇒,条件转移
Dsz,Isz,Rel,不知道什么意思。
这些东西在basic,或者hp,ti basic里没有此类指令。
其他的一些命令如:if/else,for/to/next,while......和basic类似,所以称为类basic指令。
编程上,basic和pascal差不多的。但是HP的RPL Lisp就完全是另外一种风格。
RPL要时刻惦记着堆栈,递归,比较的锻炼大脑,提升智力。
basic/pascal主要关注数据之间的逻辑关系。是面向抽象实际世界的。


 楼主| 发表于 2017-10-6 21:51:13 | 显示全部楼层
電卓院亜紀良 发表于 2017-10-6 21:36
这位大佬从哪找的这些参数?彭定康说的?光这几个参数不行啊,你得把列表里面的机子摆出来让我等瞧瞧,然后 ...

谢谢关注,欢迎你发表正气。
 楼主| 发表于 2017-10-6 22:21:52 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-6 22:23 编辑

欢迎大家参与评比哪家强,不限于我所列的型号。但必须是计算器,拿个手机就没意思了。
大家可以自己在计算器上编个8皇后或者解数独程序,特别是解数独很有用,随时随地破数独。
8皇后我已经用V200做了两个类型的。正在考虑高效简洁的第三类。
看大家能不能用自己心爱的计算器编出来,算法可以网上搜。
回复 支持 0 反对 2

使用道具 举报

发表于 2017-10-6 23:00:08 | 显示全部楼层
randomzoom 发表于 2017-10-6 22:21
欢迎大家参与评比哪家强,不限于我所列的型号。但必须是计算器,拿个手机就没意思了。
大家可以自己在计算 ...

问一下楼主有nspire的解数独的程序吗?
 楼主| 发表于 2017-10-6 23:17:59 | 显示全部楼层
王大锤 发表于 2017-10-6 23:00
问一下楼主有nspire的解数独的程序吗?

编过python的,正准备编TI-basic。
电脑上可以随便挥霍数组,计算器上就不能这么玩了。等我想一段时间吧。
 楼主| 发表于 2017-10-7 01:03:16 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-7 01:05 编辑

高端对垒

我想说,日本人真的很工于算计,在那么可怜的内存下也能做出可用的计算器。大家都应该学习CASIO这种节省的精神。


本帖子中包含更多资源

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

x
回复 支持 0 反对 2

使用道具 举报

发表于 2017-10-7 10:26:49 | 显示全部楼层
王大锤 发表于 2017-10-6 23:00
问一下楼主有nspire的解数独的程序吗?

分分钟做出来但是我觉得可以跑一辈子[滑稽]
发表于 2017-10-7 20:30:27 | 显示全部楼层
zqqyyy 发表于 2017-10-7 10:26
分分钟做出来但是我觉得可以跑一辈子[滑稽]

哈哈
 楼主| 发表于 2017-10-8 18:15:20 | 显示全部楼层
我正在编NSpire版数独,程序不难,调试难。
总是遇到一些莫名其妙的语法错误,习惯问题,我不怎么看手册,基本上是想用什么函数就看看有没有,然后凭直觉使用。
还有一些特殊的传值方式,总是不自觉地使用X=1这种电脑方式,忘掉-〉或者输入时1:=x,应该是1=:x。
说说麻烦的地方,电脑可以用三维数组,计算器不行,即矩阵的每个元素存一个列表。我就用10位二进制。每个bit位代表这个格子可不可以填相应的数据。
所以就是8*8个10bit。
0b1111010110即表示,不可以取3,5,或者相反,可以取3,5。0,1的含义根据操作便利来规定。
之所以用10位,多一位,是为了操作便利。2^5 or 2^8可以表示操作第2、5位。用9位还要+-,麻烦。
候选举阵就这样:[[0b1010,0b1000101100,......],[...],...[...]] 9*9*10bit
逐位操作用 and,or,xor很方便。
 楼主| 发表于 2017-10-8 18:17:57 | 显示全部楼层
我邀请CASIO,HP也来编一个,或者其他的题目。
如果HP50g用rpl能做出来,我就膜拜了。
 楼主| 发表于 2017-10-8 18:23:59 | 显示全部楼层
三维数组也可以用二维数组来解决
9*9*9==>81*9,操作稍微不那么好看。
如操作z[7][5]==>z[7*9+5]
 楼主| 发表于 2017-10-9 17:58:22 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-9 18:01 编辑

数独做出来了,献上源程序。
电脑版NSpire 3.9,稍后会上tns。
主程序(入口)
Define shudu(str)=
Prgm
:Local h,i,j,k,l,p,q,mat,ex,rang,flag,depth
:m:="709080300
000002050
002000490
095000000
300090700
000030040
040100000
003500000
800609010"
:©default matrix for test
:If dim(str)≥89 Then © use out data
:str→m
:EndIf
:zoom:=newMat(9,9)
:initmat(m)→mat ©initial data for matrix
:Disp "Origin matrix":Disp mat
:fillmat(mat)→mat ©Fill grid with only 1 digit
:checkmat(mat)→status
:If status=1 Then
: Disp "Filled matrix"
: Disp mat
: Stop
:EndIf
:1→depth
:trymat(mat,depth)→mat  © try by force
:Disp "Final matrix":Disp mat
:EndPrgm
 楼主| 发表于 2017-10-9 18:06:57 | 显示全部楼层
按照调用顺序,主程序调用的函数

将字符串填入数独矩阵。
当然可以直接用矩阵,我个人觉得输入矩阵比较麻烦。

原始数据的输入是一个长全部给定残数独的数字,逐行输入,空格用0。用任意字符包括回车分隔行,非数字自动忽略。
Define initmat(m)=
Func
:Local i,j,k,p,q,mat
:newMat(9,9)→mat
:0→q
:For p,1,dim(m)
:  k:=mid(m,p,1)
:    If k≥"0" and k≤"9" Then
:        q+1→q
:        iPart(((q-1)/(9)))+1→i
:            mod(q-1,9)+1→j
:                expr(k)→mat[i,j]
:                    EndIf
:                EndFor
:Return mat
:EndFunc

 楼主| 发表于 2017-10-9 18:12:23 | 显示全部楼层
根据已有数据来回搜寻唯一可填的格子,然后填充,每填一个数,将打开下一轮的开关。
while循环是一轮81格扫描。其实可以提高效率的。但是在nspire上也就半分钟时间,暂时不弄了。
Define fillmat(mat)=
Func
:©fill grid with only 1 digit
:Local flag,i,j,ex,rang
:1→flag ©开启while循环
:While flag>0
:0→flag ©关闭while循环
:For i,1,9
:For j,1,9
:If mat[i,j]=0 Then
:exzoom(mat,i,j)→ex
:bits2list(ex)→rang
:If dim(rang)=1 Then
:1→flag ©开启while循环
:rang[1]→mat[i,j]
:Else
:©ex→zoom[i,j]
:1
:EndIf
:EndIf
:EndFor
:EndFor
:EndWhile
:Return mat
:EndFunc
 楼主| 发表于 2017-10-9 18:18:20 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-9 18:19 编辑

排斥范围:对每个空格用排斥法得到一个10二进制。
使用二进制,是为了方便用矩阵记录可选/排斥数字,or,and很方便,无需用笨拙的if判断
可选、排斥的转换也方便。
Define exzoom(mat,i,j)=
Func
:Local k,p,q,u,v,zoom
:©i=1,2,3,4,...,..9
:©p=0,0,0,3,...,..6
:©q=0,0,0,3,...,..6
:p:=3*iPart(((i-1)/(3)))
:q:=3*iPart(((j-1)/(3)))
:0→zoom
:For k,1,9
:©k=1,2,3,4,...,..9
:©u=1,1,1,2,...,..3
:©v=1,2,3,1,...,..3
:u:=iPart(((k-1)/(3)))+1
:v:=mod(k-1,3)+1
:zoom or 2^(mat[i,k]) or 2^(mat[k,j])→zoom©行,列
:zoom or 2^(mat[p+u,q+v])→zoom  ©3*3小方格
:EndFor
:Return zoom
:EndFunc
 楼主| 发表于 2017-10-9 18:21:37 | 显示全部楼层
二进制解码。提取10位二进制各位代表的数字,存入一个数列{}。{}元素个数是实际个数。
Define bits2list(bits)=
Func
:Local i,n,t,list
:{}→list
:0→n
:For i,1,9
:t:=((2^(i) and bits)/(2^(i)))
:If t≠1 Then
:n+1→n
:i→list[n]
:EndIf
:EndFor
:Return list
:EndFunc
 楼主| 发表于 2017-10-9 18:32:22 | 显示全部楼层
好了,上边的表示能填的唯一数已经填入了,在此程序仅能使用行、列、块,各种神奇的技能不会,程序表示,也不屑用旁门左技。天下难题,唯快可破,那些块块行行列列的技巧是慢速人脑采用的。电脑可以一个一个的尝试,错了没关系,试下一个。

尝试分两步,第一步,寻找可选数最少的格子测试。2选1毕竟比3选1快。虽然电脑快,但能简单提高效率的还是提一提。那些块块行行列列的设计起来太麻烦,人脑毕竟能一眼看出来。电脑要不停循环扫描。

Define trymat(mat,depth)=
Func
:Local h,i,j,im,jm,ex,rang,minzoom,status,mat0
:©Find min range grid
:9→minzoom
:0→im:0→jm
:For i,1,9
:For j,1,9
:If mat[i,j]=0 Then
:  bits2list(exzoom(mat,i,j))→rang
:  If dim(rang)<minzoom Then
:    dim(rang)→minzoom
:    i→im:    j→jm
:    If minzoom=2 Then
:      Exit
:    EndIf
:  EndIf
:  If minzoom=2 Then
:    Exit
:  EndIf
:EndIf
:EndFor
:EndFor
:&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;&#169;
:&#169;&#169;Test at min range&#169;&#169;
:bits2list(exzoom(mat,im,jm))→rang
:For h,1,dim(rang)
:mat→mat0  &#169;save orginal
:&#169;Disp im*10000+jm*100+h
:rang[h]→mat[im,jm]
:fillmat(mat)→mat
:checkmat(mat)→status
:If status=1 Then &#169;1-- finished
:  Return mat
:ElseIf status=0 Then &#169;0--un finished
:  trymat(mat,depth+1)→mat
:  checkmat(mat)→status
:  If status=1 Then  &#169;1-- finished
:    Return mat
:  EndIf
:EndIf
:mat0→mat &#169;restore orginal
:EndFor
:If depth=1 Then
: Disp "error input data"
:EndIf
:Return mat
:EndFunc
 楼主| 发表于 2017-10-9 18:35:32 | 显示全部楼层
本帖最后由 randomzoom 于 2017-10-9 19:15 编辑

最后一步,检查所填矩阵
返回值有三种
0--未完成
1--完成
9--错误,即未填满而某个空格已经无数可填。




Define checkmat(mat)=
Func
:Local i,j,status,rang
:1→status &#169; 1--finished
:For i,1,9
:For j,1,9
:  If mat[i,j]=0 Then
:    0→status  &#169;0--un finished
:    bits2list(exzoom(mat,i,j))→rang
:    If dim(rang)=0 Then
:      9→status &#169;9--wrong
:      Return status
:    EndIf
:  EndIf
:EndFor
:EndFor
:Return status
:EndFunc
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-12-5 09:54 , Processed in 0.057777 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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