重写技术面试

2020-09-16 22:26:35

Frigitt,vi danser for etøyeblikk,vi leker Vi tusen smãbladski per Gleder OSS,pèdeet Klare morgenlys。

母锥展开她柔软的鳞片,几天之后我就解放了。在寒冷的黎明阳光下,我的兄弟姐妹们飘动着,纤细的身影捕捉着微风,在河床上方的凉风中盘旋、漂移、旋转的龙卷风。在我们漫长的一生中,这是我们第一次也是唯一一次知道这样的自由:那些小溪不会被冲走的,那些不会屈服于腐烂或饥饿的人,会扎根养活,这样,公社就会固定下来,度过他们的余生。现在是初春,母亲的树根周围还堆积着松软的小山。现在是等待的时候了。

我依偎在一块石头边上的洞穴里,太阳的温暖在那里一整天都在积聚,这个壁炉可以保护一条狭窄的泥土通道不会结冰。到了时候,我的外套就融化了。我往下推我的下胚轴,呼吸着这里土壤水的酸味--去年秋天的针滴填满了我第一根的味道。我喝得酩酊大醉,鼓起了我的子叶,自从我在母锥里怀孕以来,我的子叶就一直卷曲着。我第一次深深地吸了口气,尝到了它们变绿时的一种温和的甜味。

我降落在一个太黑的地方,选择时机太早了。石头的影子每天早上都会遮蔽太阳,而每天只剩下几个小时的光线,积雪就会遮盖住太阳。我挣扎着,抬起一英寸,然后两英寸,我的分生组织向天空伸展。一簇针头--我的第一片真正的叶子--从我的顶芽中喷发出来,但这耗费了宝贵的能量,我一天比一天饿。我把子叶撕开,不惜一切代价把注意力放在高度上。我必须为光明而起,但现在什么都没有了。为了形成我的第一根,我吃掉了我囤积的种子。

我悲痛不已,苦黄酮类物质渗入土壤。日子在悄无声息的虚弱中流逝。然后是一种刺痛,一种温和的刺痛我的根部。土壤中某处的细丝会带来明亮的触点。十万根纤维抚摸着我。我被编织成地球的结构。

伴随着这种编织而来的是生命:氮、铁,是的,但对我来说最重要的是土壤网提供的糖分。有了这些,我在晚雪和缺乏阳光的情况下幸存了下来,当夏天到来时,我借来的力量膨胀起来。一个接一个的芽从我的茎上冒了出来,我长到了将近四英寸。因为我们云杉很少是孤独的:高耸在我上方的成虫将他们的营养提供给充满土壤的真菌网。当我呼喊时,它们会回应,根茎也会与我分享它们的赏金。

秋天的休眠伴随着一种温和的满足感:我会成功的。随着白昼的临近,我萌发了花蕾,为霜冻做好了准备。我把水集中在细胞的缝隙中,形成纯净的口袋,这样就不会形成冰晶。如此坚硬,我等待着过冬,到了春天,我的树枝就认真地发芽了。我急切地、鲁莽地向太阳奔跑。在我的第一个十年里,我达到了5米,14米乘20米。我的主根在钻研,我的树干在膨胀。曾经遮蔽我种子的石头躺在我的底部,一半被形成层吞没。我一枝接一枝地举起树枝,挖掘小溪潮湿的空气,在夏日的长光中欢呼。

我和我的兄弟姐妹通过根和空气交流。它们的气味让我充满了归属感。当我健康的时候,我会给土壤我所要求的:磷,锰,我自己的糖。当我在我的第四个十年里被甲虫侵扰削弱时,它们的力量又回到了我身上。我在空气中充斥着挥发性有机物,而我的兄弟姐妹们则用防御性的酸填满了他们的针头。当甲虫来找它们的时候,它们已经准备好了。

那一年我掉了很多树枝,但我的根很牢固,我们一起活了下来。阳光依旧甜美。在我的第二个世纪,我-。

你大吃一惊,把手从切割干净的云杉板上抬起来,现在它就是大堂的长椅,小心翼翼地轻拍你的眼角。你能感觉到,你不是第一个在这个地方哭泣的女人。

“嘿,…”接待员说,轻轻地拉出音节。她一只手拿着一盒纸巾跪在地上。珍妮,你还记得吗。她给了你一把钥匙,和亲近的微笑的温暖。“你为什么不花点时间梳洗一下呢?”出了门,右转,左转,大厅尽头的门。“。

你停顿了片刻,想知道如何解释舌头上挥之不去的汁液的味道。“别担心,”杰尼安放心地说。“我来掩护你。”

你一刻也不会怀疑,这个扎着分叉的辫子整齐地盘绕在头顶的女人,可以掩盖从晚点的火车到正在进行的珠宝抢劫案的任何事情。你从她伸出的手中拿出钥匙,快速地喃喃念着,在她的手掌上画上了一道祝福。“谢谢你”

当你回来的时候,你的脚步轻盈,气场清晰,化妆新鲜。在技术面试中,这些事情很重要。

“我们喜欢从一些编码练习开始,”你的面试官解释说。他和蔼可亲,身材魁梧,灰白的胡须上有几道白黑相间的斑纹,这让你想起了你在加拿大落基山脉遇到的一只獾。他告诉你,他的名字是Martín,他是一名高级后端工程师。“在我们继续讨论体系结构之前,先做一些简单的事情。”

没有什么是简单的,你会想,然后怀着渴望的微笑。以括号的形式撒盐,这样就封闭了,打开你的笔记本电脑。

“你可能以前听过这个词,”马丁开始说。“我想让你写一个程序,打印从1到100的数字,但有几个例外。如果是3的倍数,请打印“Fizz”,如果是5的倍数,请打印“buzz”。对于两者的倍数,请打印“Fizzbuzz”。

事实上,你以前已经听过这句话了。在您的浏览器中,搜索“FizzBuzz解决方案”,然后选择第一个看起来有希望的链接。复制并粘贴。你是一个真正的工程师。

For(i=1;i<;101println i++){if(I%15==0){println(";;&34;);}Else if(I%3==0){println(";FIZZ&34;);}Else if(I%5==0){println(";buzz&34;);}Else{println(I);};}“啊,呃,是的。”马丁正试图尽可能温和地宣布一些不幸的消息。“这些问题的重点是…。让你自己写程序,而不是使用别人的代码。“。

你换了个位子,很惊讶。“到目前为止,人们似乎并不喜欢这样。”

他似乎正要问为什么,但最终决定不问。相反,他要求您运行该程序,这样您就可以讨论它是如何工作的。

马丁眉头紧锁。你在脑海里记下检查那只獾。也许这次是一群野鼠。

双手向头顶伸展,手指交叉,左右伸展。这不是特别神奇,但感觉很好。然后回到你的编辑那里,把你自己锚定在虚空中。

(defn定点[fx](设[x';(F X)](if(=xx';)x(recur f x&39;)你的主根延伸到Yggdrasil的底部,你感觉到它的力量与你的相连。现在,很多事情都是可能的。您开始编织翻译的咒语:首先在序列…中

(defn rewrite-seq-1([f Term](rewrite-seq-1 f[]Term))([f Scanned Term](if(Seq Term)(if-let[Term';(F Term)](Into Scanned Term';)(Recur f(conj scanned(First Term))(Next Term)scanned)(Defn Rewrite-Term-1[f Term](cond(map-entry?术语)术语(向量?术语)(vec(重写序号-1 f术语))(序号?Term)(if(Seq Term)(seq(rewrite-seq-1 f term))term):ELSE(或(F Term)马丁清了清嗓子:一种温柔的咯咯作响。“你正在建立一个学期改写系统。要解决…问题,请执行以下操作。泡泡嗡嗡?“。

抓住这个机会记住另一个人的记忆:伸展树枝的感觉,分叉的感觉,分裂的感觉,从你的生长节点喷发出的针的感觉。

(Required';[clojure.walk:参考[postwald]])(defn rewrite-walk-1[f Term](postwalk(部分重写-Term-1f)术语))(Defn Rewrite-Walk[Term f](定点(部分重写-Walk-1f)术语))“Hang on,”Martín中断。“我理解你为什么要重写序列--这样你就可以把像‘3’和‘6’这样的数字转换成‘Fizz’,依此类推。但是您不需要为此进行任何形式的树遍历递归。这是一个平坦的序列。“。

马丁对此点点头,然后你就继续前进。在不中断眼神交流的情况下,编织一种用于翻译的语言。

(Defn Single-Rule[Guard Term]Body]]`(fn[~Term](When(~Guard~Term)~Body)(Defn seq-Rule[[Bindings Body]](let[[Bindings[_more]](Split-with(Complete#{';&;})Binding)More-sym(或more(gensym';more))Term(gensym';项)对(分区2绑定)保护(映射第一对)名称(映射第二对)保护表达式(映射索引(Fn[i保护]`(~Guard(nth~Term)保护)]`(Fn[~Term](try(When(and(顺序?~Term)(<;=~(Count Guard)(Count~Term))~@Guard-Exprs))(让[[~@Names';&;~More-sym]~Term]~(if more body`(conat~body~more-sym)释放你的凝视。你对Martín隐瞒了这件事,这对他来说是一件好事。现在,使用一个用于重写序列的小宏。

(def宏重写[expr&;Rules](let[Rules(Partition 2 Rules)Matches(Map Rule Rules)]`(let[Rules#[~@Matches]](Reduce Rewrite-Walk~Expr Rules#)在这一点上,最好向Martín保证您仍在正常运行。

User=>;(重写[";Og";1";直到javanissen!";](数字?X)(字符串(包含x))[字符串?X,弦?Y][(str x";";y)])[";Og 2 til javanissen!";]“so…。您已经有了这个术语重写系统,它可以重写单个术语,或者与某些谓词匹配的任何事物的子序列。你打算用它来解决泡沫吗?“。

“正是如此!”你笑得很灿烂。他现在加入了,虽然他不知道这一点。

“好的。这有点不正统,但是…。我想是有效的。你现在能给我看一下变换规则吗?“。

(defRecords FnCall[Fun Args])(Defn a[type](fn[Term](实例?键入Term)(def宏c[&;exprs](重写`(do~@exprs)[符号?好玩吗,序号?参数][(FnCall.。Fun args)]((A FnCall)fc)(cons(:Fun fc)(:args fc)“人们总是抱怨,”你喃喃地说。“里斯普斯的括号太多了。他们真正的意思是,他们的立场太偏左了。“。

User=>;(c Reduce(+,map(Inc,[1,2,3])9“并且没有中缀或后缀符号。嗯,这是可以解决的。“。

(def infix(INTO';{%mod=}(MAP(JUXT Identity)';[<;<;=>;>;=+-/*])(def Postfix{";++";Inc";--";dec})(Defn Postfix-sym[x](WHEN(符号?X)(When-let[p(First(Filter(Partial str/Ends-with?(Name X))(关键字后缀)](list(Postfix P)(Symbol(str/Replace(Name X)p";";)(def宏c[&;exprs](重写`(do~@exprs)[Symbol?好玩吗,序号?参数][(FnCall.。有趣的参数)][有吗?A,中缀f,有吗?B][(FnCall.。(Infix F)[a b])](Postfix-sym x)(Postfix-sym x)((A FnCall)fc)(cons(:Fun fc)(:args fc)“。好多了。“。你争论了一会儿,你的嵌合体是令人愉快的还是令人憎恶的,然后你选择了心爱的宠物,尽管它很古怪。

USER=>;(c1+2==3)TRUE USER=>;(c let([x3]x++*2)8 Martín is agog。“你不会真的在考虑这么做吧。”

“我知道,我知道,”你道歉。“他们都很好--这样才能联想到。我们可以通过有约束力的优先顺序将它们分成不同的规则,但我们在这里的时间很紧迫,反正我永远也记不住确切的优先规则。“。说实话,没人能做到。它叫“里奇的荒野猎人”。你不记得为什么,并且认为这也是荒野猎人的错。

“既然我们在这里,我们不妨把赋值运算符修好。”

(def宏c[&;exprs](重写`(do~@exprs)[符号?好玩吗,序号?参数][(FnCall.。有趣的参数)][有吗?A,中缀f,有吗?B][(FnCall.。(中缀f)[a b])](后缀-符号x)(后缀-符号x)[符号?Var,#{';=}_,有吗?Rhs,&;more][`(let[~var~rhs]~@more)](A FnCall)fc)(cons(:Fun fc)(:args fc)USER=>;(c x=3;x++/5;)4/5“That‘s…。这不应该是这样的。“。马丁长得像个男人,他的女儿驯服了多只鹰,他坚持用家里的瓷器给他们端茶和小点心,而且他也(并非完全巧合)有理由害怕不高兴的鹰。

(deford条件[分支])(deford Elsif[测试正文])(defn花括号[m](cons&39;do(mapcat标识m)(def宏c[&;exprs](重写`(do~@exprs)[#{';否则}_,#{';if}_,seq?测试,地图?正文][(Elsif.。`(do~@test)(花括号正文)][#{';if}_,序号?测试,地图?T][(续。[`(do~@test)(花括号t)])][(A Cond)cond,(A Elsif)elsif][(update cond:Branch conj(:test elsif)(:body elsif))]][(A Cond)cond,#{';Else}_,map?正文][(update cond:Branch conj:Else(花括号正文))]...((A Cond)c)`(cond~@(:Branch c)“在Lisp中,”您可以提供。“我们经常编写特定领域的语言来解决新问题。”

User=>;(c x=3;if(x==2){println(";Two";);}Else if(x==3){println(";yes!";);}Else{println(";noope";);})yes!一根睫毛从你的眼角脱落,飘到空中,轻轻地冒烟。副作用是要付出代价的。

马丁全神贯注地盯着你的REPL,好像它出了什么问题,而不是整个世界。“那些是…。地图文字,“他说,似乎不确定。

当马丁语无伦次时,你想再加一个“如果”子句,然后意识到你的咒语需要更超常的魔法。仔细检查你的钥匙扣,拍两下掌,在桌面上划出一个保护病房。你将要做的事情并不完全是邪恶的,但可能会激怒一些人。

(定义间隔-sym[x](何时(符号?X)(let[Parts(str/Split(Name X)#"; ";)](When(<;1(计数部件))(地图符号部件)(def宏c[&;exprs](重写`(do~@exprs)[空格符号s](空格符号s)...[';#{Return;}_]nil)Martín正在询问有关读者的一些平淡无奇的问题。“行终止符是一种社会结构,”你温和地说,因为信息往往令人不舒服。“空格也是如此。我是…。实际上是在说明书里。“。你不是第一次想知道,为什么朱迪思·巴特勒博士对主持国际标准化组织10646工作组如此感兴趣。她一定有她的理由。

“剩下的只有for循环本身。”一个不平凡的构造,你意识到了,并准备编织另一个函数。初始化、迭代、终止、求值。在空中描绘这些标志,并给出它们的形式。

(Defn gen-for[exprs body](让[[var_init]测试更改](Remove';#{(;)}(Partition-by';#{;}exprs))Body(mapcat标识主体)]`(LOOP([~var~init ret#nil]if(~@test){Recur(do(~@change),do(~@body))}~';否则{~';return ret#})(def宏c[&;exprs](重写`(do~@exprs)[#{';for}_,seq?快递,地图?正文](gen-表示表达式正文)[间隔符号s](间隔符号s)[#{';Else}_,#{';if}_,序号?测试,地图?正文][(Elsif.。`(do~@test)(花括号正文)][#{';if}_,序号?测试,地图?T][(续。[`(do~@test)(花括号t)])][(A Cond)cond,(A Elsif)elsif][(update cond:Branch conj(:test elsif)(:body elsif))]][(A Cond)cond,#{';Else}_,map?正文][(更新条件:分支conj:Else(花括号正文))][符号?好玩吗,序号?参数][(FnCall.。有趣的参数)][有吗?A,中缀f,有吗?B][(FnCall.。(中缀f)[a b])](后缀-符号x)(后缀-符号x)[符号?Var,#{';=}_,有吗?Rhs,&;more][`(let[~var~rhs]~@more)]((A Fncall)fc)(cons(:Fun fc)(:args fc))((A Cond)c)`(cond~@(:Branch c))[';#{Return;}_]nil))“Martín,”你低声说。圆括号上方的柱子里,灰尘闪闪发光。“我们现在已经准备好了。你想看看吗?“。

User=>;(c For(i=1;i<;101;i++){if(i%15==0){println(";fizbuzz&34;);}Else if(i%3==0){println(";fizz&34;);}Else if(i%5==0){println(";buzz&34;);}否则{println(I);};})1 2 Fizz 4 Buzz Fizz...。当数字沿着屏幕向上滑动时,马丁闭上眼睛,释放了一口疲惫的长长呼吸。一只手放在会议室桌子的蜡松上,另一只手支撑着他的太阳穴。“我当然推荐强聘,但…”他身体前倾,说话声音更轻了。“你真的认为你在这里会开心吗?”

你有时间和力量,不需要扎根在贫瘠的土地上。感谢他,扬起你的种子翅膀,在你离开的时候,让你的双脚轻轻地抬起。

衷心感谢C.Scott Andreas、AndréArko、David Ascher、Mike Bernstein、Lita Cho、Nicole Forsgren、Brad Greenlee、Coda Hale、Michael Handler、Marc Hedlund、Ben Linsay、Caitie McCaffrey、Dan McKinley、Greg Poirier、Marco Rogers、Kelly Shortridge、Tasha和Leif Walsh。