搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  成语大全.txt
资料下载链接地址: https://bbs.pinggu.org/a-1628204.html
附件大小:
161.13 KB   举报本内容
好久不用SAS了,写了一个成语接龙游戏来练练手。游戏使用规则:
一、运行下面代码里面的所有的宏
二、%cyjl(接龙用的成语,mode=接龙模式)
说明:
1、只有两种接龙模式可以用:1随机 2长龙
2、随机模式:使用IML模式完成,随机抽取接龙的词语,有可能重复
3、长龙模式:使用SQL方式完成,寻找最长的不重复的成语接龙方式

使用的成语词库是从搜狗输入法下载的成语大全:http://pinyin.sogou.com/dict/detail/index/931

代码如下:
  1. /********************************************************/
  2. /*程序说明:使用搜狗的成语词库做成语接龙程序 */
  3. /*程序编写时间:2014年9月12日 */
  4. /*程序修改时间:2014年9月14日 */
  5. /*作者:6皮皮9 */
  6. /********************************************************/

  7. libname cy 'D:\成语接龙测试\sas_file';
  8. /*导入成语列表*/
  9. proc import datafile="D:\成语接龙测试\成语大全.txt"
  10. out=cy.cy_list
  11. replace;
  12. guessingrows=20000;
  13. run;
  14. data cy.test;
  15. set cy.cy_list;
  16. length f e $2.;
  17. index=_n_;
  18. f=ksubstr(var1,1,1);/*第一个字符*/
  19. e=ksubstr(kreverse(strip(var1)),1,1);/*最后一个字符*/
  20. run;
  21. /*使用IML做的随机成语接龙*/
  22. %macro cy(beg_wd);
  23. data wrd_list;
  24. list='*********成语接龙列表*********';
  25. run;
  26. proc iml;
  27. use cy.test;
  28. read all var _num_ into index;
  29. read all var _char_ into wd;
  30. close test;
  31. initial_wd_pos=(loc(wd[,1]="&beg_wd"));
  32. if ncol(initial_wd_pos)=0 then do;
  33. i_wd='好像你输入的不是成语哦';
  34. edit wrd_list;
  35. append from i_wd;
  36. end;
  37. else do;
  38. initial_ewd=wd[initial_wd_pos,3];/*初始成语词尾*/
  39. i_wd=wd[initial_wd_pos,1];
  40. edit wrd_list;
  41. append from i_wd;
  42. cur_ewd=initial_ewd;/*迭代用的词尾*/
  43. counter=0;
  44. wrd_loop='A';
  45. do until(counter=200);
  46. counter=counter+1;
  47. curpos=(loc(wd[,2]=cur_ewd));/*查找词尾属于哪个词的词头*/
  48. if ncol(curpos)=0 then do;
  49. counter=200;
  50. wrd_loop='完蛋接不下去了!Game over';
  51. end;
  52. else if ncol(curpos)>1 then do;
  53. call randseed(0);
  54. u=j(1,1,.);
  55. call randgen(u,'uniform');
  56. a1=1; b1=ncol(curpos);
  57. x = a1+(b1-a1)*u;
  58. rand_pos=int(x);
  59. line_pos=curpos[,rand_pos];
  60. wrd_loop=wd[line_pos,1];
  61. cur_ewd=wd[line_pos,3];
  62. end;
  63. else do;
  64. wrd_loop=wd[curpos,1];
  65. cur_ewd=wd[curpos,3];
  66. end;
  67. edit wrd_list;
  68. append from wrd_loop;
  69. end;
  70. end;
  71. quit;
  72. proc print data=wrd_list;
  73. run;
  74. %mend;
  75. /*使用SQL找到最长的不重复成语接龙方式*/
  76. %macro cy_long(beg_wd);
  77. proc sql;
  78. create table cy.wd_num as
  79. select f as fwd,count(f) as ewd_num
  80. from cy.test
  81. group by f
  82. order by calculated ewd_num
  83. ;
  84. quit;
  85. proc sql;
  86. create table cy.jl as
  87. select t.*,numb.ewd_num
  88. from cy.test as t
  89. left join cy.wd_num as numb
  90. on t.e=numb.fwd
  91. ;
  92. quit;
  93. data cy.jl;
  94. set cy.jl;
  95. if ewd_num=. then ewd_num=0;
  96. run;
  97. data wrd_list;
  98. do i=1 to 2;
  99. if i=1 then list='*********成语接龙列表*********';
  100. if i=2 then list="&beg_wd";
  101. output;
  102. end;
  103. drop i;
  104. run;
  105. proc sql noprint;
  106. select f,e into:fc,:ec
  107. from cy.jl
  108. where var1="&beg_wd"
  109. ;
  110. quit;
  111. options nonotes;
  112. proc sql noprint;
  113. select ewd_num into:wrd_check
  114. from cy.jl
  115. where var1="&beg_wd"
  116. ;
  117. quit;
  118. %if &wrd_check=0 %then %do;
  119. data wrd_list;
  120. do i=1 to 3;
  121. if i=1 then list='*********成语接龙列表*********';
  122. if i=2 then list="&beg_wd";
  123. if i=3 then list="完蛋接不下去了!Game over";
  124. output;
  125. end;
  126. proc print data=wrd_list;
  127. run;
  128. %end;
  129. %else %do %until(&ewd_check=0);
  130. proc sql noprint;
  131. select var1,ewd_num into:wd_loop,:ewd
  132. from cy.jl
  133. where f="&ec"
  134. and ewd_num in (
  135. select max(ewd_num)
  136. from cy.jl
  137. where f="&ec"
  138. and var1 not in(
  139. select list
  140. from wrd_list))
  141. and var1 not in(
  142. select list
  143. from wrd_list);
  144. quit;
  145. %let ewd_check=&ewd;%put &ewd_check;
  146. data loop_wd;
  147. list="&wd_loop";
  148. run;
  149. proc append base=wrd_list data=loop_wd force;
  150. run;
  151. proc sql noprint;
  152. select e into:ec
  153. from cy.jl
  154. where var1="&wd_loop"
  155. ;
  156. quit;
  157. %end;
  158. options notes;
  159. proc print data=wrd_list;
  160. run;
  161. %mend cy_long;
  162. %macro cyjl(beg_wd,mode=随机);
  163. proc sql noprint;
  164. select count(var1) into:wrd_check
  165. from cy.test
  166. where var1="&beg_wd"
  167. ;
  168. quit;
  169. %if &wrd_check=0 %then %do;
  170. data warnning;
  171. Warning='亲,您输入的成语不在这个词库哦!玩不了诶~sorry';
  172. run;
  173. proc print data=warnning;
  174. run;
  175. %end;
  176. %else %do;
  177. %if &mode=随机 %then %do;
  178. %cy(&beg_wd);
  179. %end;
  180. %else %if &mode=长龙 %then %do;
  181. %cy_long(&beg_wd);
  182. %end;
  183. %else %do;
  184. data warnning;
  185. Warning='哎哟~亲~~,你的接龙模式选择有错哦!模式只能选择:随机,长龙';
  186. run;
  187. proc print data=warnning;
  188. run;
  189. %end;
  190. %end;
  191. %mend cyjl;

  192. %cyjl(各取所需,mode=长龙)
复制代码




    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

GMT+8, 2025-12-29 10:01