测量计算器哪家强?(先挖坑,慢慢填)
本帖最后由 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 HP50GPrime
本帖最后由 randomzoom 于 2017-10-10 18:51 编辑
先来一个不完整的配置参数对比吧。所有参数均从网上及说明书中获取,不完整,也不保证准确。此参数仅供参考,本人对阅读此帖所产生的任何直接或间接的影响(收益或损失)不负任何责任。
本帖最后由 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:36
这位大佬从哪找的这些参数?彭定康说的?光这几个参数不行啊,你得把列表里面的机子摆出来让我等瞧瞧,然后 ...
谢谢关注,欢迎你发表正气。 本帖最后由 randomzoom 于 2017-10-6 22:23 编辑
欢迎大家参与评比哪家强,不限于我所列的型号。但必须是计算器,拿个手机就没意思了。
大家可以自己在计算器上编个8皇后或者解数独程序,特别是解数独很有用,随时随地破数独。
8皇后我已经用V200做了两个类型的。正在考虑高效简洁的第三类。
看大家能不能用自己心爱的计算器编出来,算法可以网上搜。 randomzoom 发表于 2017-10-6 22:21
欢迎大家参与评比哪家强,不限于我所列的型号。但必须是计算器,拿个手机就没意思了。
大家可以自己在计算 ...
问一下楼主有nspire的解数独的程序吗? 王大锤 发表于 2017-10-6 23:00
问一下楼主有nspire的解数独的程序吗?
编过python的,正准备编TI-basic。
电脑上可以随便挥霍数组,计算器上就不能这么玩了。等我想一段时间吧。 本帖最后由 randomzoom 于 2017-10-7 01:05 编辑
高端对垒
我想说,日本人真的很工于算计,在那么可怜的内存下也能做出可用的计算器。大家都应该学习CASIO这种节省的精神。
王大锤 发表于 2017-10-6 23:00
问一下楼主有nspire的解数独的程序吗?
分分钟做出来但是我觉得可以跑一辈子[滑稽] zqqyyy 发表于 2017-10-7 10:26
分分钟做出来但是我觉得可以跑一辈子[滑稽]
哈哈{:13_341:} 我正在编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位还要+-,麻烦。
候选举阵就这样:[,[...],...[...]] 9*9*10bit
逐位操作用 and,or,xor很方便。
我邀请CASIO,HP也来编一个,或者其他的题目。
如果HP50g用rpl能做出来,我就膜拜了。 三维数组也可以用二维数组来解决
9*9*9==>81*9,操作稍微不那么好看。
如操作z==>z 本帖最后由 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 按照调用顺序,主程序调用的函数
将字符串填入数独矩阵。
当然可以直接用矩阵,我个人觉得输入矩阵比较麻烦。
原始数据的输入是一个长全部给定残数独的数字,逐行输入,空格用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
: EndIf
: EndFor
:Return mat
:EndFunc
根据已有数据来回搜寻唯一可填的格子,然后填充,每填一个数,将打开下一轮的开关。
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=0 Then
:exzoom(mat,i,j)→ex
:bits2list(ex)→rang
:If dim(rang)=1 Then
:1→flag ©开启while循环
:rang→mat
:Else
:©ex→zoom
:1
:EndIf
:EndIf
:EndFor
:EndFor
:EndWhile
:Return mat
:EndFunc 本帖最后由 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) or 2^(mat)→zoom©行,列
:zoom or 2^(mat)→zoom©3*3小方格
:EndFor
:Return zoom
:EndFunc
二进制解码。提取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
:EndIf
:EndFor
:Return list
:EndFunc 好了,上边的表示能填的唯一数已经填入了,在此程序仅能使用行、列、块,各种神奇的技能不会,程序表示,也不屑用旁门左技。天下难题,唯快可破,那些块块行行列列的技巧是慢速人脑采用的。电脑可以一个一个的尝试,错了没关系,试下一个。
尝试分两步,第一步,寻找可选数最少的格子测试。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=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
:©©©©©©©©©©©©©©
:©©Test at min range©©
:bits2list(exzoom(mat,im,jm))→rang
:For h,1,dim(rang)
:mat→mat0©save orginal
:©Disp im*10000+jm*100+h
:rang→mat
:fillmat(mat)→mat
:checkmat(mat)→status
:If status=1 Then ©1-- finished
:Return mat
:ElseIf status=0 Then ©0--un finished
:trymat(mat,depth+1)→mat
:checkmat(mat)→status
:If status=1 Then©1-- finished
: Return mat
:EndIf
:EndIf
:mat0→mat ©restore orginal
:EndFor
:If depth=1 Then
: Disp "error input data"
:EndIf
:Return mat
:EndFunc 本帖最后由 randomzoom 于 2017-10-9 19:15 编辑
最后一步,检查所填矩阵
返回值有三种
0--未完成
1--完成
9--错误,即未填满而某个空格已经无数可填。
Define checkmat(mat)=
Func
:Local i,j,status,rang
:1→status © 1--finished
:For i,1,9
:For j,1,9
:If mat=0 Then
: 0→status©0--un finished
: bits2list(exzoom(mat,i,j))→rang
: If dim(rang)=0 Then
: 9→status ©9--wrong
: Return status
: EndIf
:EndIf
:EndFor
:EndFor
:Return status
:EndFunc
页:
[1]
2