排序路线
#python #perl #theweeklychallenge

每周挑战213

abaoqian1,My solution

任务1:乐趣排序

任务

您有一个正整数列表。

编写一个脚本以先整理所有整数,然后在上升顺序中所有几率

我的解决方案

这是相对直接的。经验丰富的开发人员可能会首先对所有偶数数字进行排序,然后再整理所有奇数,这将是该任务的完全可接受的解决方案。

但是,我们知道Perl和Python都允许我们使用自定义排序方法。在Perl中,这表示为{ $a % 2 <=> $b % 2 || $a <=> $b }$a$bsort函数实现此目标的全局变量。 <=>提供了两个值之间的数值比较,如果$b更大,则返回1,如果$a更大,则-10如果它们是相同的。

python的lambda功能更加直接。这里使用的语法是array.sort(key=lambda x: (x % 2, x)),这意味着我们首先按均匀搜索(首先evens),然后是数值。

例子

$ ./ch-1.py 1 2 3 4 5 6
2, 4, 6, 1, 3, 5

$ ./ch-1.py 1 2
2, 1

$ ./ch-1.py 1
1

任务2:最短路线

任务

您将为您提供定义节点网络的双向路由的列表,以及源和目标节点号。

编写一个脚本以找到从最少的节点从源到目标的路由。

我的解决方案

另一方面,此任务要复杂得多。我只提交了Python解决方案。 perl解决方案将仅是它的音译。

首先要解析输入。第一个值是将JSON字符串转换为列表的列表,而第二值和第三值代表开始和结束数字。

i然后循环遍历节点中的每个数字,直到找到起点为止,可能有一个以上。对于每个起点,我将带有原始列表,起点和最终值的递归函数find_routers调用。

find_routers递归函数具有节点的原始列表,我们访问过的节点/位置对的列表以及目标编号。对于当前节点,我从当前数字向后移动,然后向前移动。对于每个新号码,我称为find_pairs函数,以查看我们尚未看到的任何连接节点。对于每次发生的情况,我再次调用递归函数,将第二个值更新为我们已经看到的节点/位置对。

此功能的返回是节点/数字对的列表。我们跟踪到目前为止最短的解决方案的解决方案,并在当前的解决方案较短。

时进行更新。

如果没有解决方案,我会打印-1并退出。最后一步是将节点/位置对列表转换为数字列表,并显示新列表。

例子

$ ./ch-2.py "[[1,2,6], [5,6,7]]" 1 7
1,2,6,7

$ ./ch-2.py "[[1,2,3], [4,5,6]]" 2 5
-1

$ ./ch-2.py "[[1,2,3], [4,5,6], [3,8,9], [7,8]]" 1 7
1,2,3,8,7

$ ./ch-2.py '[[1,2,3,4,5,6,7], [7,1], [9,1]]' 6 9
6,7,1,9