digitalmars.D - Small code example
- bearophile (61/61) Nov 24 2009 This is a long line of Python2.x code that I've found difficult to trans...
This is a long line of Python2.x code that I've found difficult to translate to nice D1 code, even using my dlibs: result = min( ((arr[i], arr[j]) for i in xrange(len(arr) - 1) for j in xrange(i + 1, min(i + 5, len(arr)))), key=dist) Where: arr is a list (that are dynamic arrays in Python) of items. dist() is a function that takes a couple of items (here a tuple of length 2) and returns the distance between them. len() returns the length of a list. xrange(x,y) yields the numbers from x to y-1. min(iter, key=func) returns the minimum value of an iterable iter, using func as mapping function to find the minimum value, so min([-1, 5, -2, -4], key=abs) is -1. Here the first agument given to the min() function is a lazy iterable, this is useful when arr is very long. That code shows why Python lazy/strict comps are useful. An implementation in D1 that uses no higher order functions: import std.stdio: writefln; int min(int x, int y) { return x <= y ? x : y; } int dist(int x, int y) { return (x < y) ? (y - x) : (x - y); } void main() { int[] arr = [1, 12, 3, 7, 5, 13]; int min_dist = int.max; int min_i, min_j; for (int i; i < arr.length - 1; i++) for (int j = i + 1; j < min(i + 5, arr.length); j++) { auto d = dist(arr[i], arr[j]); if (d < min_dist) { min_dist = d; min_i = i; min_j = j; } } writefln(arr[min_i], " ", arr[min_j]); } An alternative implementation in D1 that uses no higher order functions: import std.stdio: writefln; int min(int x, int y) { return x <= y ? x : y; } int dist(int x, int y) { return (x < y) ? (y - x) : (x - y); } void main() { int[] arr = [1, 12, 3, 7, 5, 13]; int min_dist = int.max; int min_i, min_j; foreach (i, arr_i; arr[0 .. $ - 1]) foreach (j, arr_j; arr[i + 1 .. min(i + 5, arr.length)]) { auto d = dist(arr_i, arr_j); if (d < min_dist) { min_dist = d; min_i = i; min_j = j + i + 1; // careful here } } writefln(arr[min_i], " ", arr[min_j]); } Bye, bearophile
Nov 24 2009