前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一道小学生的趣味数学题

一道小学生的趣味数学题

作者头像
专业余码农
发布2020-07-16 09:46:40
6770
发布2020-07-16 09:46:40
举报
文章被收录于专栏:老Z的博客老Z的博客
Fun
Fun

据说上图(来源于网络)中这道小学生趣味题只要聪明一点的小学生都可以解出来,成年人估计只要一分钟。我也试着用SAS来解答, 思路如下:首先获取所有的数字出现的位置,然后与完整的位置(1234)比较,去重存异;根据题中的提示每次输入有两位数字正常且位置都不对,故排除只出现一次或者出现4次的数字;最后将数字的多个位置和已被占的单一位置进行比较,去重存异。重复这一操作直到得到每个数字的正确位置。完整的程序如下:

代码语言:javascript
复制
%let code=6087 5173 1358 3825 2531;

data temp;
    length CODE $200;
    retain INC 0;
    CODE="&code";
    do I=1 to length(CODE);
        CODE_IND=cats(substr(CODE, I, 1));
        if missing(CODE_IND) then INC=I;
        POSITION=cats(I-INC);
        if ^missing(CODE_IND) then output;
    end;
    keep CODE_IND POSITION;
    proc sort nodupkey;
    by CODE_IND POSITION;
run;

data temp;
    set temp;
    by CODE_IND;
    retain POSITION_;
    if first.CODE_IND then POSITION_=POSITION;
    else POSITION_=cats(POSITION_, POSITION);
    POSITION=prxchange('s/['||cats(POSITION_)||']//', -1, '1234');
    if last.CODE_IND and length(POSITION_) ^ in (1, 4);
    keep CODE_IND POSITION;
run;

%macro unipos();
proc sql noprint;
    select distinct POSITION into :pos separated by '|'
        from temp
        where length(POSITION)=1
        ;
quit;

data temp;
    set temp;
    if length(POSITION)>1 then POSITION=prxchange("s/&pos//", -1, POSITION);
run;
%mend unipos;

%macro check();
%do i=1 %to 4;
    %if "&pos"^="1|2|3|4" %then %unipos;
%end;
%mend check;

%let pos=;

%check

proc sql noprint;
    select distinct CODE_IND, POSITION into :code separated by ' ', :dummy
        from temp
        order by POSITION
        ;
quit;

%put &code;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档