程序写不好,总理当到老!

导读:自古英雄出少年,可惜不想当总理,只想当个程序员。

最近HackNext网站有一个贴子引发网友热议,一位叫Lihaoyi的作者宣布自己刚刚写了一本叫《动手Scala编程》的书,表示自己的书写得不错,书理论强项目多,希望喜欢Scala的朋友多捧场。

HackNext 网站上李浩毅的贴子

整本书约400多页,将在2020年夏季正式发行,包括电子书,平装和精装几个版本。跟帖网友非常欣赏作者写的样章,并为他的技术和文笔赞口不绝。

有的人在后面一堆跟帖中写了一句:“没有人告诉你,他的祖父创建了这个国家”。

原来这位Lihaoyi就是现任新加坡总理李显龙的儿子——李浩毅。

李浩毅的Twitter头像

据公开资料显示,李浩毅出生于 1989 年,毕业于麻省理工学院(MIT),计算机科学和工程学位。他还是 Scala 社区的主要贡献者。

李浩毅简历 https://lihaoyi.com/resume

李浩毅的个人网站上自称,其开源项目在 Github 上有超过 10,000 Star,每个月的下载次数超过 7,000,000 次。自称擅长用 Scala 来构建分布式后端系统、高性能Web 应用程序等。

有同学不禁感叹,他一直关注的技术博主,原来是这样的身份证和背景。「这是我人生接触的第二个家里比我有权家里黄金遍地智商比我强,还比我努力的人!」

还有一些网友调侃说,要是李浩毅不好好写代码,就只有回去当坡县的县长了。

李显龙也是会编程的

将门无犬子,李浩毅的父亲现任总理李显龙同志,也是有计算机科学文凭的,还是一位响当当的技术极客。

40年前,获得一个数学学位后,在父亲的忠告下我继续深造计算机科学。他说这里有未来。后来事实证明,他是对的。

我最后的一个项目是数年前用C++写的数独,或许这也说明我过时了。目前我的孩子都在IT圈内,两个毕业于MIT。其中一个拿起一本书给我看,上面写着:“想要更上一层楼,你该学习Haskell。”我想,有一天这会是我退休时的读物。

这是李显龙的一段演讲,令人惊讶的不仅仅是他会写一些C++代码,还有他知道Haskell是什么。新加坡的网友如是说:

作为一名新加坡人,我自豪于我政府的趋势方向。并且我惊讶他们竟然提到了Haskell/LYAHFGG和C++,Balakrishnan部长是怎么找时间去涉猎硬件和编程的?这些高级公务员不应该是非常忙的吗?

虽然美国总统奥巴马曾经写过一个“Hello World”程序,但只能算是“打酱油”。

李显龙在一次创业者论坛上透露,他最后编写的程序是一个解决数独问题的程序。

演讲结束后,很多人要求李显龙公开那段代码,他在Facebook上发布了一个截屏,如下图示。

李显龙在Facebook上晒的C++程序代码

“这段程序很简单,只能以命令提示符的形式运行。”他写道,“逐行输入数据后(例如1-3-8---6),求解器就会输出答案(如果有多个答案,则会输出所有答案)、搜索答案所花费的步骤,以及一些搜索统计数据。”

李显龙还提供了一个指向Google Drive的链接,里面包含了这段代码及其输出示例和编译后的Windows可执行文件。

以下是整段程序源代码,感兴趣的同学可以品鉴一小下:

#include "stdio.h"

int InBlock[81], InRow[81], InCol[81];

const int BLANK = 0;
const int ONES = 0x3fe;   // Binary 1111111110

int Entry[81];  // Records entries 1-9 in the grid, as the corresponding bit set to 1
int Block[9], Row[9], Col[9];  // Each int is a 9-bit array

int SeqPtr = 0;
int Sequence[81];

int Count = 0;
int LevelCount[81];


void SwapSeqEntries(int S1, int S2)
{
     int temp = Sequence[S2];
     Sequence[S2] = Sequence[S1];
     Sequence[S1] = temp;
}


void InitEntry(int i, int j, int val)
{
   int Square = 9 * i + j;
   int valbit = 1 << val;
     int SeqPtr2;

     // add suitable checks for data consistency
     
   Entry[Square] = valbit;
   Block[InBlock[Square]] &= ~valbit;
   Col[InCol[Square]] &= ~valbit; // Simpler Col[j] &= ~valbit;
   Row[InRow[Square]] &= ~valbit; // Simpler Row[i] &= ~valbit;

     SeqPtr2 = SeqPtr;
     while (SeqPtr2 < 81 && Sequence[SeqPtr2] != Square)
           SeqPtr2++ ;

     SwapSeqEntries(SeqPtr, SeqPtr2);
     SeqPtr++;
}


void PrintArray()
{
     int i, j, valbit, val, Square;
     char ch;
     
     Square = 0;

     for (i = 0; i < 9; i++) {
         if (i % 3 == 0) putc('\n', stdout);
         for (j = 0; j < 9; j++) {
             if (j % 3 == 0) putc(' ', stdout);
             valbit = Entry[Square++];
             if (valbit == 0) ch = '-';
             else {
                 for (val = 1; val <= 9; val++)
                     if (valbit == (1 << val)) {
                        ch = '0' + val;
                        break;
                     }
             }
             putc(ch,stdout);
         }
         putc ('\n', stdout);
     }
}


void ConsoleInput()
{
     int i, j;
     char InputString[80];

     for (i = 0; i < 9; i++) {
         printf("Row[%d] : ", i + 1);
         scanf("%s", InputString);

         for (j = 0; j < 9; j++) {
             char ch = InputString[j];
             if (ch >= '1' && ch <= '9')
                InitEntry(i, j, ch - '0');
         }
     }

     PrintArray();
}


void PrintStats()
{
    int i, j, S;

    printf("\nLevel Counts:\n\n");

    S = 0;
    while (LevelCount[S] == 0) S++;

    i = 0;

    while (S < 81) {
          int Seq = Sequence[S];
          printf("(%d, %d):%4d ", Seq / 9 + 1, Seq % 9 + 1, LevelCount[S]);
          if (i++ > 4){
             printf("\n");
             i = 0;
          }
          S++;
    }

    printf("\n\nCount = %d\n", Count);
}


void Succeed()
{
     PrintArray();
     PrintStats();
}


int NextSeq(int S)
{
    int S2, Square, Possibles, BitCount;
    int T, MinBitCount = 100;

    for (T = S; T < 81; T++) {
        Square = Sequence[T];
        Possibles = Block[InBlock[Square]] & Row[InRow[Square]] & Col[InCol[Square]];
        BitCount = 0;
        while (Possibles) {
           Possibles &= ~(Possibles & -Possibles);
           BitCount++;
        }

        if (BitCount < MinBitCount) {
           MinBitCount = BitCount;
           S2 = T;
        }
    }

    return S2;
}


void Place(int S)
{
    LevelCount[S]++;
    Count++;

    if (S >= 81) {
       Succeed();
       return;
    }

    int S2 = NextSeq(S);
    SwapSeqEntries(S, S2);

    int Square = Sequence[S];

    int   BlockIndex = InBlock[Square],
      RowIndex = InRow[Square],
      ColIndex = InCol[Square];

    int   Possibles = Block[BlockIndex] & Row[RowIndex] & Col[ColIndex];
    while (Possibles) {
          int valbit = Possibles & (-Possibles); // Lowest 1 bit in Possibles
          Possibles &= ~valbit;
          Entry[Square] = valbit;
          Block[BlockIndex] &= ~valbit;
          Row[RowIndex] &= ~valbit;
          Col[ColIndex] &= ~valbit;
        
          Place(S + 1);

          Entry[Square] = BLANK; // Could be moved out of the loop
          Block[BlockIndex] |= valbit;
          Row[RowIndex] |= valbit;
          Col[ColIndex] |= valbit;
  }

    SwapSeqEntries(S, S2);
}


int main(int argc, char* argv[])
{
  int i, j, Square;

  for (i = 0; i < 9; i++)
    for (j = 0; j < 9; j++) {
      Square = 9 * i + j;
      InRow[Square] = i;
      InCol[Square] = j;
      InBlock[Square] = (i / 3) * 3 + ( j / 3);
    }


  for (Square = 0; Square < 81; Square++) {
        Sequence[Square] = Square;
    Entry[Square] = BLANK;
        LevelCount[Square] = 0;
    }

  for (i = 0; i < 9; i++)
    Block[i] = Row[i] = Col[i] = ONES;

    ConsoleInput();
    Place(SeqPtr);
    printf("\n\nTotal Count = %d\n", Count);

  return 0;
}

网友评论:李显龙总理已晋升新一代男神

包子精是咸菜馅的:人家有剑桥的diploma in computer science。可怕的是他还有剑桥的1st class honor in Math 和哈佛的Master in public admin。。。

smart is the new sexy啊。给龙男神跪了。

美拉洋洋:人家总理是剑桥数学系的,这点东西不算什么

寻常梦中:总理您歇歇、这种问题就留给小的们解决吧

JJUNSU:程序员还是有前途的【居然能当上总理

ChorizoGelato:仰观学霸的世界我们亚历山大。

清仔_Veslyn:我靠,不好意思说自己会写程序

BELL-Sherlocked:早上被刷屏了....有点厉害......毕竟是剑桥出身的大学霸。真是全面响应smartnation国策从我做起从领袖做起

CyanZero:难怪我俩同事早上一直在吱哇乱叫的扫描代码找bug

__EATING:Smart is the new sexy

大白:程序写不好,总理当到老!

21CTO综合程序员那些事,海外社交媒体等,一并致谢。

推荐阅读:

 

他,用了8年,从程序员到CTO再到天使投资人蝶变记

 

剥开浮躁表面,直指金融科技内心

 

二本毕业生逆袭成大厂架构师的成长心得

 

波波老师: 解决微服务的数据一致性分发问题?

   END     
#接力技术,链接价值#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值