import std.stdio ;
import std.conv : to;
import std.string : isNumeric;
import std.range : iota, generate, repeat, take, enumerate;
import std.algorithm .iteration : map, each, reduce, joiner;
import std.typecons : Tuple;
import std.array : array;
import std.random : uniform01, uniform;
import std.format : format;
import std.math : sqrt;
import std.algorithm .sorting : sort;
import std.algorithm .searching : find;
struct Point
{
double x;
double y;
}
void main( string [ ] args)
{
if ( ( args[ 1 .. $] .length != 1 ) || ! args[ 1 ] .isNumeric ) {
writeln( "usage: ./dots N" ) ;
return ;
}
uint n;
try {
n = args[ 1 ] .to ! uint ;
if ( n< 2 ) throw new Exception ( "N is less than two" ) ;
}
catch ( Exception e) {
writeln( "N must be an integer, more than 1" ) ;
}
Point[ ] points = new Point[ n] ;
foreach ( ref pt; points) {
pt.x = uniform01( ) ;
pt.y = uniform01( ) ;
}
double minLen = double .infinity ;
Point p1, p2;
foreach ( i, pt1; points[ 0 .. $- 1 ] ) {
foreach ( j, pt2; points[ i+ 1 .. $] ) {
double len = sqrt( ( pt2.x - pt1.x ) ^^ 2 + ( pt2.y - pt1.y ) ^^ 2 ) ;
if ( len < minLen) {
minLen = len;
p1 = pt1;
p2 = pt2;
}
}
}
points.each ! ( pt => writefln( "%s%s" , pt, ( p1 is pt) || ( p2 is pt) ? " *" : "" ) ) ;
}
aW1wb3J0IHN0ZC5zdGRpbzsKaW1wb3J0IHN0ZC5jb252OiB0bzsKaW1wb3J0IHN0ZC5zdHJpbmc6IGlzTnVtZXJpYzsKaW1wb3J0IHN0ZC5yYW5nZTogaW90YSwgZ2VuZXJhdGUsIHJlcGVhdCwgdGFrZSwgZW51bWVyYXRlOwppbXBvcnQgc3RkLmFsZ29yaXRobS5pdGVyYXRpb246IG1hcCwgZWFjaCwgcmVkdWNlLCBqb2luZXI7CmltcG9ydCBzdGQudHlwZWNvbnM6IFR1cGxlOwppbXBvcnQgc3RkLmFycmF5OiBhcnJheTsKaW1wb3J0IHN0ZC5yYW5kb206IHVuaWZvcm0wMSwgdW5pZm9ybTsKaW1wb3J0IHN0ZC5mb3JtYXQ6IGZvcm1hdDsKaW1wb3J0IHN0ZC5tYXRoOiBzcXJ0OwoKaW1wb3J0IHN0ZC5hbGdvcml0aG0uc29ydGluZzogc29ydDsKaW1wb3J0IHN0ZC5hbGdvcml0aG0uc2VhcmNoaW5nOiBmaW5kOwoKc3RydWN0IFBvaW50CnsKCWRvdWJsZSB4OwoJZG91YmxlIHk7Cn0KCnZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKQp7CglpZiAoKGFyZ3NbMS4uJF0ubGVuZ3RoICE9IDEpIHx8ICFhcmdzWzFdLmlzTnVtZXJpYykgewoJCXdyaXRlbG4oInVzYWdlOiAuL2RvdHMgTiIpOwoJCXJldHVybjsKCX0KCgl1aW50IG47Cgl0cnkgewoJCW4gPSBhcmdzWzFdLnRvIXVpbnQ7CgkJaWYgKG48MikgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTiBpcyBsZXNzIHRoYW4gdHdvIik7Cgl9CgljYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQl3cml0ZWxuKCJOIG11c3QgYmUgYW4gaW50ZWdlciwgbW9yZSB0aGFuIDEiKTsKCX0KCglQb2ludFtdIHBvaW50cyA9IG5ldyBQb2ludFtuXTsKCWZvcmVhY2ggKHJlZiBwdDsgcG9pbnRzKXsKCQlwdC54ID0gdW5pZm9ybTAxKCk7CgkJcHQueSA9IHVuaWZvcm0wMSgpOwoJfQoKCWRvdWJsZSBtaW5MZW4gPSBkb3VibGUuaW5maW5pdHk7CglQb2ludCBwMSwgcDI7CgoKCWZvcmVhY2ggKGksIHB0MTsgcG9pbnRzWzAuLiQtMV0pewoJCWZvcmVhY2ggKGosIHB0MjsgcG9pbnRzW2krMS4uJF0pewoJCQlkb3VibGUgbGVuID0gc3FydCgocHQyLnggLSBwdDEueCleXjIgKyAocHQyLnkgLSBwdDEueSleXjIpOwoKCQkJaWYgKGxlbiA8IG1pbkxlbil7CgkJCQltaW5MZW4gPSBsZW47CgkJCQlwMSA9IHB0MTsKCQkJCXAyID0gcHQyOwoJCQl9CgkJfQoJfQoJcG9pbnRzLmVhY2ghKHB0ID0+IHdyaXRlZmxuKCIlcyVzIiwgcHQsIChwMSBpcyBwdCkgfHwgKHAyIGlzIHB0KSA/ICIgKiIgOiAiIiApKTsKfQ==