codewar系列--Directions Reduction


题意就是
一个人被指示从一个地方去另一个地方。方向是“北”、“南”、“西”、“东”。显然,“北”和“南”是对立的,“西”和“东”也是对立的。朝一个方向去,又朝相反的方向回来,这是一种不必要的努力。因为这是蛮荒的西部,天气很糟糕,水也不多,所以一定要节约一些能量,否则你会渴死的!
你马上就能看到,先“北”再“南”是不合理的,还是呆在原地好!所以任务是给这个人一个简化版的计划。
(“北”、“南”、“东”、“西”)中,“北”+“南”的方向是向北,然后马上返回。真是浪费时间!最好什么也不做。
路径变成[东"、"西"],现在"东"和"西"相互湮灭,因此,最终结果是[](Clojure中为nil)。
在[北"、"东"、"西"、"南"、"西"]中,"北"和"南"不是直接对立的,而是经过"东"和"西"的还原而成为直接对立的,所以整个路径可以还原为[西"、"西"]。
写一个函数dirReduc,它将取一个字符串数组,并返回一个字符串数组,去掉不必要的方向(W<->E或S<->N并排)。
Haskell版本采用一个方向列表,数据方向=北|东|西|南。当路径被还原为空时,Clojure版本返回nil。锈版采用了一个切片枚举方向{北,南,东,西}。
并不是所有的路径都可以简化。这条路(“北”、“西”、“南”、“东”)是不可简化的。“北”与“西”、“西”与“南”、“南”与“东”不是直接对立的,不可能成为对立的。因此,结果路径本身就是:[“北”、“西”、“南”、“东”]
拿到题的那一刻我是懵的,但是仔细想一想,思路也很简单:就是找到数组中相邻元素对立的值,消除相邻元素,最后返回数组。
于是我找到一个办法,就是利用栈的原理,在栈中先推进数组一个元素,将数组第二个元素同推进栈的第一个元素的值做对比,相反则推出栈的第一个元素,消除数组中已对比的俩元素;不相反则推第二个元素进栈。依次比较到数组最后一个元素,最后返回栈内的元素。

我利用了加法,相反元素相加为0。最后虽然得到了正确的结果,但是从字面上看对阅读者实在不友好😰,接下来看看大神们怎么做吧。
best practice的做法,贴上来几个:

array.reduce()我就不说了,给个链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

