问题1:用1、2、2、3、4、5这六个数字,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
原题链接:http://blog.csdn.net/zhutulang/article/details/7775644
tinyscript解法
numbers=[1,2,2,3,4,5]; numbers.permuteAll((e) -> { if(e[3]!=4&&!(abs(e.indexOf(3)-e.indexOf(5))==1)){ println(e); } });
运行结果,篇幅原因只贴部分:
[1, 2, 2, 3, 4, 5] [1, 2, 2, 5, 4, 3] [1, 2, 3, 2, 4, 5] [1, 2, 3, 2, 5, 4] [1, 2, 3, 4, 2, 5] [1, 2, 3, 4, 5, 2] [1, 2, 5, 4, 3, 2] [1, 2, 5, 4, 2, 3] [1, 2, 5, 2, 4, 3] [1, 2, 5, 2, 3, 4] [1, 2, 2, 3, 4, 5] [1, 2, 2, 5, 4, 3] [1, 2, 3, 2, 4, 5] [1, 2, 3, 2, 5, 4] [1, 2, 3, 4, 2, 5] [1, 2, 3, 4, 5, 2] [1, 2, 5, 4, 3, 2] [1, 2, 5, 4, 2, 3]
Java解法:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeSet; public class Sort { static TreeSet<String> ts=new TreeSet<String>(); public static void main(String[] args) { String[] d={"1","2","2","3","4","5"}; List<String> s=new ArrayList<String>(); StringBuilder rs=new StringBuilder(); for(int i=0;i<d.length;i++) s.add(d[i]); pl(s, rs); Iterator<String> iterator=ts.iterator(); while (iterator.hasNext()) System.out.println(iterator.next()); System.out.println("总数是:"+ts.size()); } //全排列 public static void pl(List<String> s,StringBuilder rs){ if(s.size()==1){ rs.append(s.get(0)); if(rs.indexOf("4")!=2 && (!rs.toString().contains("35")&& !rs.toString().contains("53")) ) { ts.add(rs.toString()); } //if(rs.length()>0) rs.delete(rs.length()-1, rs.length()); }else{ for(int i=0;i<s.size();i++) { rs.append(s.get(i)); List<String> tmp=new ArrayList<String>(); for(String a:s) tmp.add(a); tmp.remove(i); pl(tmp, rs); //if(rs.length()>0) rs.delete(rs.length()-1, rs.length()); } } } }
问题2:abc+def=ghi,以上字母为1-9的数字,且两两不相同,求可能的组合。
原题链接:
tinyscript解法
/** abc+def=ghi,以上字母为1-9的数字,且两两不相同。 */ numbers=[1 .. 9]; numbers.permuteAll((e) -> { if(e[1]*100+e[2]*10+e[3]+e[4]*100+e[5]*10+e[6]==e[7]*100+e[8]*10+e[9]){ println(e); } });
运行结果,篇幅原因只贴部分:
[1, 2, 4, 6, 5, 9, 7, 8, 3] [1, 2, 5, 7, 3, 9, 8, 6, 4] [1, 2, 7, 3, 5, 9, 4, 8, 6] [1, 2, 7, 3, 6, 8, 4, 9, 5] [1, 2, 8, 4, 3, 9, 5, 6, 7] [1, 2, 8, 3, 6, 7, 4, 9, 5] [1, 2, 9, 4, 3, 8, 5, 6, 7] [1, 2, 9, 6, 5, 4, 7, 8, 3] [1, 2, 9, 7, 3, 5, 8, 6, 4] [1, 2, 9, 3, 5, 7, 4, 8, 6] [1, 3, 4, 6, 5, 8, 7, 9, 2] [1, 3, 5, 7, 2, 9, 8, 6, 4] [1, 3, 8, 4, 2, 9, 5, 6, 7] [1, 3, 8, 6, 5, 4, 7, 9, 2] [1, 3, 9, 4, 2, 8, 5, 6, 7]
C解法
#include <stdio.h> void main() { int count=0,sum=0,num1,num2,a,b,c,d,e,f; for(a=1;a<=9;a++) for(b=0;b<=9;b++) { if(a==b) continue; for(c=1;c<=9;c++) { if(a==c||b==c) continue; //********************** num1=a*100+b*10+c; for(d=1;d<=9;d++) { if(d==a||d==b||d==c) continue; //printf("good1 \n"); for(e=0;e<=9;e++) { if(d==e||e==a||e==b||e==c) continue; for(f=1;f<=9;f++) { if(d==f||e==f||f==a||f==b||f==c) continue; num2=d*100+e*10+f; sum=num1+num2; if(sum<=1000||sum%10==a||sum%10==b||sum%10==c||sum%10==d||sum%10==e||sum%10==f ||(sum/10)%10==a||(sum/10)%10==b||(sum/10)%10==c||(sum/10)%10==d||(sum/10)%10==e||(sum/10)%10==f ||(sum/100)%10==a||(sum/100)%10==b||(sum/100)%10==c||(sum/100)%10==d||(sum/100)%10==e||(sum/100)%10==f ||sum/1000==a||sum/1000==b||sum/1000==c||sum/1000==d||sum/1000==e||sum/1000==f ||sum%10==(sum/10)%10||sum%10==(sum/100)%10||sum%10==sum/1000||(sum/10)%10==(sum/100)%10||(sum/10)%10==sum/1000||(sum/100)%10==sum/1000 ) continue; count++; printf("%d + %d = %d \n",num1,num2,sum); } } } } } printf("count=%d\n",count); }
问题3:马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭 共花了50先令, 每个男人各花5先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
tinysctipt解法
elements = 0..30; elements.permute(3,(e) -> { if(sum(e)==30 && e[1]*5+e[2]*2+e[3]==50){ println(e); } });
运行结果:
[0, 20, 10] [1, 16, 13] [2, 12, 16] [3, 8, 19] [4, 4, 22] [5, 0, 25]
Java解法
for(int a=1;a<50/5;a++) { for(int b=1;b<50/2;b++) { for(int c=1;c<50/1;c++) { if((a+b+c)==30 && a*5+b*2+c*1==50) { System.out.println("男人:"+a+" 女人:"+b+" 小孩:"+c ); } } } }
或者
public static void main(String[] args) { for (int a = 1; a <= 5; a++) { for (int b = 1; b <= 20; b++) { if (4 * a + b == 20) { int c = 30 - a - b; if (c != 0) { System.out.println(a + "--" + b + "--" + c); } } } } }
问题4:青年歌手参加歌曲大奖赛,有n(n>2)个评委打分,试编程求选手的平均得分(去掉一个最高分和 一个最低分)
tinyscript解法
score(scores)->{ return (sum(scores)-max(scores)-min(scores))/(scores.size()-2); }; println(score(elements));
C#解法
#include<stdio.h> void main() { int sum = 0,i; double avg,b; int a[10]; int max,min; for(i=0;i<10;i++) { scanf("%d",&a[i]); if(i==0)//只有第一次赋值max=min=a[0] { max = a[0]; min = a[0]; } if(max<a[i]) max = a[i]; if(min>a[i]) min = a[i]; sum = sum+a[i]; } b = sum-max-min; avg = b/8.0; printf("平均分为:%.2lf\n",avg);//保留两位小数 }
背包问题:有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6, * 现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
tinyscript解法:
/** * 有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6, * 现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和? */ class Obj{ name,weight,value; Obj(name,weight,value){ this.name=name; this.weight=weight; this.value=value;` } } list=[new Obj("a",2,6),new Obj("b",2,3),new Obj("c",6,5),new Obj("d",5,4),new Obj("e",4,6)]; sum=0; ele=null; //这里本来应该是1-5的,但是看了题目,最多只能放入3件物品,因此就处于性能提升方面,只循环到3 for(i=1;i<=3;i++){ list.permute(i,(e) -> { if(sum(e.weight)<=10)){ if(sum(e.value>sum)){ ele=e; } } }); } print(ele);
运行结果:
15 [Obj[name=a,weight=2,value=6], Obj[name=b,weight=2,value=3], Obj[name=e,weight=4,value=6]]
java代码:
public void bag(int[] weights, int[] values, int bagsize){ int[][] result = new int[weights.length][bagsize+1]; for(int i=0;i<bagsize+1;i++){ for(int j=0;j<weights.length;j++){ if(i==0){ result[j][i] = 0; System.out.print(result[j][i]+" "); continue; }else if(j==0){ if(weights[j]<=i){ result[j][i] = values[j]; }else{ result[j][i] = 0; } }else{ if(weights[j]<=i){ result[j][i] = result[j-1][i-weights[j]]+values[j]>result[j-1][i]?result[j-1][i-weights[j]]+values[j]:result[j-1][i]; }else{ result[j][i] = result[j-1][i]; } } } } for(int m=0;m<weights.length;m++){ for(int n=0;n<bagsize+1;n++){ System.out.print(result[m][n]+" "); } System.out.println(""); }
问题5:基金量化投资:选择一个月收益排名前50名,并且最大回撤率小于50%,并且基金经理任职连续超过一年,管理的基金在同类基金排名前20%,列出符合条件的基金。
可能有的同学说,你这个也就做做算法穷举类题目不错别的又干不了什么,说的非常不错,接下来展示一个实际业务。
由于篇幅原件,数据只提供部分表达意思即可:
基金数据
code1 name date value 003860 招商招旭纯债C 2017/7/1 1.188147057 160630 鹏华国防 2017/7/1 1.58792832 160643 鹏华中证 2017/7/1 0.922133108 001838 国投瑞银 2017/7/1 1.537061604 630011 华商主题精选 2017/7/1 1.443479085 003860 招商招旭纯债C 2017/7/2 1.044532467 160630 鹏华国防 2017/7/2 1.438359583 160643 鹏华中证 2017/7/2 0.894619462 001838 国投瑞银 2017/7/2 1.734040948 630011 华商主题精选 2017/7/2 1.000473053 003860 招商招旭纯债C 2017/7/3 1.717215024 160630 鹏华国防 2017/7/3 1.780652734 160643 鹏华中证 2017/7/3 1.686924083
基金经理积分数据
code3 manager3 type repay avg rank 003860 王平 混合型 10.17% 3.98% 30% 160630 蒋秋洁 混合型 23.10% 3.98% 15% 160643 李佳亮 固定收益 1.35% -3.17% 13% 001838 陈剑波 分级杠杆 -17.23% -3.17% 80% 630011 王平 股票型 154.65% 20.92% 0% 161724 蒋秋洁 混合型 18.32% 4.08% 15% 168204 李佳亮 股票型 4.41% 4.55% 50% 002779 陈剑波 固定收益 42.68% 4.55% 1% 161032 王平 分级杠杆 4.41% 7.96% 75% 161725 李佳亮 股票型 25.27% 7.96% 18%
基金经理与基金管理关系数据
code2 firstdt lastdt manager2 003860 2006 2007 蒋秋洁 160630 2005 2008 李佳亮 160643 2005 2006 陈剑波 001838 2006 2010 王平 630011 2005 2006 蒋秋洁 003860 2007 2010 李佳亮 160630 2008 2009 陈剑波 160643 2006 2007 王平 001838 2010 2013 蒋秋洁 630011 2006 2009 李佳亮 003860 2010 2012 陈剑波 160630 2009 2013 王平 160643 2007 2013 蒋秋洁 001838 2013 2014 李佳亮 630011 2009 2010 陈剑波 003860 2012 2017 王平 160630 2015 2017 蒋秋洁 160643 2014 2017 李佳亮 001838 2014 2017 陈剑波 630011 2010 2017 王平 161724 2006 2007 蒋秋洁 168204 2005 2008 李佳亮 002779 2005 2006 陈剑波 161032 2006 2010 王平 161725 2005 2006 蒋秋洁 161724 2007 2010 李佳亮 168204 2008 2009 陈剑波 002779 2006 2007 王平 161032 2010 2013 蒋秋洁
tinyscript解法:
/* 基金量化投资:选择一个月收益排名前50名,并且最大回撤率小于50%,并且基金经理任职连续超过一年,管理的基金在同类基金排名前20%,列出符合条件的基金。 */ dataset = readTxt("/example/dayinfo.txt"); groupds =dataset.insertColumn(3,"UP").insertColumn(4,"rate").convert("value","double").group("code1"); groupds.update("UP",(e)->{ last = 31-e; first = 1-e; return (value[last]-value[first])/value[first]; });//求一月的净值 groupds.update("rate",(e)->{ minvalue = value[0]; for(i = 1;i<=31-e;i++){ if(value[i]<minvalue){ minvalue = value[i];//对每一个值求在之后的最小净值 } } return (value[0]-minvalue)/value[0]; }); groupds.update("rate",(e)->{ last = 31-e; first = 1-e; maxvalue = 0; for(i = first;i<=last;i++){ maxvalue = max(maxvalue,rate[i]); } return maxvalue; });//对每一个净值的回撤率进行比较求出最大回撤率 //过滤回撤率大于50%的数据 groupds = groupds.sort("UP desc"); groupds = groupds.limit(1,5); groupds = groupds.filterGroup(rate[0]<=0.5); dataset2 = readTxt("/example/history.txt"); dataset3 = readTxt("/example/score.txt"); result = dataset2.match(dataset3,code3==code2&&manager3==manager2); result = result.convert("lastdt","int").convert("firstdt","int").convert("rank","double").filter(lastdt==2017&&lastdt-firstdt>=3).filter(rank<=0.2); result = result.match(groupds,code3==code1); for(i = 1;i<=result.getRows();i++){ println("符合条件的基金代码:"+result[i][1]); }
运行结果:
符合条件的基金代码:160643 符合条件的基金代码:630011 符合条件的基金代码:161724
java解法:
用Java写,不仅仅是烧脑,长度比上面所有的长度都长......
总结
以上只是tinyscript脚本的简单展示,还有很多很多特性没有展示,比如数据库开发相关有比较大的突破,敬请期待下次分享。
喜欢我博客的同学请关注我,以便第一时间接受到相关信息推送。