卷?面试官竟要求35岁的求职者用shell脚本写个扫雷游戏

102 篇文章 0 订阅
102 篇文章 0 订阅

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在匈牙利,一个35岁的中年男子,名叫Feherke,经历了一件令人难以置信的事情。Feherke是一位资深的系统运维工程师,在网上之后流露出的简历来看2005年的Feherke当时的技术栈还是非常广泛的。

擅长领域:

  • 操作系统:Linux, MS-DOS, Windows

  • 编程语言:Turbo Pascal, Kylix, Delphi, C, Clipper, FoxPro, Perl, Bash, Awk, PHP, Ruby, Tcl/Tk, Java

  • 网络技术:HTTP, HTML, CSS, JavaScript, CGI, SSI

  • 数据库:DBF, PostgreSQL, MySQL, Oracle, SQLite, HSQLDB

  • 办公软件:WordPerfect, MS Office, LibreOffice

Feherke这样回忆起那次面试的经历。

2005年的一个夏日清晨,他在送完孩子上学后,驱车前往市中心的一家高楼大厦,准备参加一家科技初创公司的面试。

抵达目的地后,Feherke被前台引领到一间会议室,等待面试官的到来。房间里有一台电脑,出于无聊,他开始玩起扫雷游戏,没想到他熟练的技巧几分钟就让他完成了最高难度的挑战。正当他自得其乐时,一阵掌声打断了他的思绪。他回头一看,面试官已站在他身后观看了他的整个游戏过程。

面试官的兴趣被Feherke对扫雷的精湛操作所吸引.

“你是怎么做到的?”面试官打趣的问道.

Feherke略显歉意答道:“的扫雷游戏是有一定的算法规律的,只要了解了这个规律那么就会很快找到所有的地雷。”

两人互相探讨了十多分钟后面试官提出了一个挑战:是否能用他擅长的编程语言开发一套扫雷游戏?

Feherke有些惊讶:“您的意思是,现在立刻开始开发吗?”

面试官回答:“为什么不呢?”

经过短暂的思考,Feherke决定使用Shell脚本来完成这个任务。

面试官非常高兴地表示:“那就用你面前的电脑开始吧,它可以连接到合适的Shell脚本环境!”

在接下来的40分钟里,Feherke全神贯注地编码,而面试官则在旁观看。他的手指在键盘上飞速舞动,代码逐行展开。最终,他成功地完成了扫雷游戏的开发,并即刻在电脑上演示了游戏运行。

这场不同寻常的面试不仅证明了Feherke的编程实力,也展示了他的问题解决能力和创新思维。面试官对他的表现印象深刻,毫不犹豫地向他提供了高级系统工程师的职位。三年后,Feherke已经成为了公司的系统架构总监,并且他将那个用Shell脚本编写的扫雷游戏开源,这一作品在全球编程社区中广受赞誉,被视为Shell编程的一个创新里程碑。

那么我们一起来看看Feherke开源的脚本运行后的效果吧

游戏开始:

一样的数字颜色一致哦

其他玩法见描述

脚本全貌

#!/bin/bash  
  
# Mine Sweeper   version 1.1   august 2008   written by Feherke  
# the classic game in text mode  
  
  
shopt -s extglob  
IFS=''  
  
piece=( $'\e[1;30m.' $'\e[1;34m1' $'\e[1;32m2' $'\e[1;35m3' $'\e[1;36m4' $'\e[1;31m5' $'\e[33m6' $'\e[1;37m7' $'\e[0;40;37m8' $'\e[0;40;37m#' $'\e[0;40;31mF' $'\e[0;40;33m?' $'\e[1;31m*' $'\e[0;40;31mx' )  
size=( 'S ' 10 10 15   'M ' 15 15 33   'L ' 20 20 60   'XL' 30 20 90 )  
  
function drawboard()  
{  
  
  [[ "$dxt" ]] || { dxt=$mx; dyf=0; dyt=$my; }  
  
  tput 'cup' $(( dyf+2 )) 0  
  echo -n $'\e[40m'  
  for ((j=dyf;j<dyt;j++)); do for ((i=0;i<dxt;i++)); do echo -n " ${piece[board[j*mx+i]]}"; done; echo ' '; done  
  echo -n $'\e[0m'  
  
  dxt=''  
  
}  
  
function newgame()  
{  
  
#  n="$( expr index 'nNmM' "$1" )" # line kept as human readable version :(  
  n='nNmM'; n="${n%$1*}"; n=${#n}  
  
  mx=${size[n*4+1]}; my=${size[n*4+2]}; mb=${size[n*4+3]}; mf=0  
  
  echo -n $'\e[0m'  
  clear  
  echo 'Mine Sweeper   version 1.1   august 2008   written by Feherke'  
  echo "board : ${size[n*4]}   size : $mx*$my   mine : $mb   flag : $mf    "$'\e[43;30m:)\e[0m'  
  
  for ((i=0;i<mx*my;i++)); do bomb[i]=0; board[i]=9; done  
  for ((i=0;i<mb;i++)); do while :; do r=$(( RANDOM%(mx*my) )); (( bomb[r] )) || break; done; bomb[r]=1; done  
  
  drawboard  
  echo $'<\e[1mh\e[0m/\e[1mj\e[0m/\e[1mk\e[0m/\e[1ml\e[0m> Move <\e[1mg\e[0m> Step <\e[1mf\e[0m> Flag <\e[1mn\e[0m/\e[1mN\e[0m/\e[1mm\e[0m/\e[1mM\e[0m> New <\e[1mq\e[0m> Quit'  
  
  cx=0; cy=0  
  status=1  
  
}  
  
function gameover()  
{  
  
  for ((i=0;i<mx;i++)); do for ((j=0;j<my;j++)); do  
    (( bomb[j*mx+i]==1 && board[j*mx+i]==9 )) && board[j*mx+i]=12  
    (( bomb[j*mx+i]==0 && board[j*mx+i]==10 )) && board[j*mx+i]=13  
  done; done  
  
  drawboard  
  tput 'cup' 1 52  
  echo -n $'\e[43;30m:(\e[0m'  
  
  status=0  
  
}  
  
function makestep()  
{  
  local i j  
  local sx=${1:-$cx} sy=${2:-$cy}  
  
  [[ "${board[sy*mx+sx]}" != @(9|10|11) ]] && return  
  (( bomb[cy*mx+cx]==1 )) && { gameover; return; }  
  
  [[ "$1" ]] || {  
    dxt=$sx; dyf=$sy; dyt=$sy  
    tput 'cup' 1 52  
    echo -n $'\e[43;30m:o\e[0m'  
  }  
  
  (( dxt=dxt>sx?dxt:sx+1 )); (( dyf=dyf<sy?dyf:sy )); (( dyt=dyt>sy?dyt:sy+1 ))  
  
  n=0  
  for ((i=-1;i<=1;i++)); do for ((j=-1;j<=1;j++)); do  
    (( (i!=0 || j!=0) && sx+i>=0 && sx+i<mx && sy+j>=0 && sy+j<my )) && (( bomb[(sy+j)*mx+(sx+i)]==1 )) && (( n++ ))  
  done; done  
  board[sy*mx+sx]=$n  
  
  (( n )) || {  
    for ((i=-1;i<=1;i++)); do for ((j=-1;j<=1;j++)); do  
      (( (i!=0 || j!=0) && sx+i>=0 && sx+i<mx && sy+j>=0 && sy+j<my )) && makestep $(( sx+i )) $(( sy+j ))  
    done; done  
  }  
  
  [[ "$1" ]] || {  
    drawboard  
    tput 'cup' 1 52  
    echo -n $'\e[43;30m:)\e[0m'  
  }  
  
}  
  
function putflag()  
{  
  
  [[ ${board[cy*mx+cx]} != @(9|10|11) ]] && return  
  
  board[cy*mx+cx]=$(( (board[cy*mx+cx]-9+1)%3+9 ))  
  
  (( board[cy*mx+cx]==10 )) && (( mf++ ))  
  (( board[cy*mx+cx]==11 )) && (( mf-- ))  
  
  (( mf==mb )) && {  
    n=0  
    for ((i=0;i<mx;i++)); do for ((j=0;j<my;j++)); do  
      (( bomb[j*mx+i]==1 && board[j*mx+i]==10 )) && (( n++ ))  
    done; done  
  
    tput 'cup' 1 52  
    echo -n $'\e[43;30mB)\e[0m'  
  
    status=0  
  }  
  
  tput 'cup' 1 47  
  echo -en "\e[0m$mf  "  
  
}  
  
  
  
# |\/| /\ | |\|  
  
newgame 'n'  
  
while :; do  
  
  tput 'cup' $(( cy+2 )) $(( cx*2 ))  
  echo -en "\e[1;40;37m[${piece[board[cy*mx+cx]]}\e[1;37m]\b\b"  
  
  read -s -n 1 a  
  [[ "$a" == '' ]] && { read -s -n 1 a; [[ "$a" == '[' ]] && read -s -n 1 a; }  
  
  echo -en "\b ${piece[board[cy*mx+cx]]} \b\b"  
  
  (( status!=1 )) && [[ "$a" != [nNmMrq] ]] && continue  
  
  case "$a" in  
    'h'|'a'|'D'|'4') (( cx>0?cx--:0 )) ;;  
    'j'|'s'|'B'|'2') (( cy<my-1?cy++:0 )) ;;  
    'k'|'w'|'A'|'8') (( cy>0?cy--:0 )) ;;  
    'l'|'d'|'C'|'6') (( cx<mx-1?cx++:0 )) ;;  
    'g'|' '|'') makestep ;;  
    'f'|'0') putflag ;;  
    'n'|'N'|'m'|'M') newgame "$a" ;;  
    'r') drawboard ;;  
    'q') break ;;  
  esac  
  
done  
  
echo -n $'\e[0m'  
clear

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值