digitalmars.D.learn - For fun: Expressive C++ 17 Coding Challenge in D
- =?UTF-8?Q?Ali_=c3=87ehreli?= (10/10) Oct 03 2017 Found on Reddit:
- Biotronic (12/21) Oct 04 2017 https://gist.github.com/Biotronic/0bc6048b880d67bfdca970453cc47cf9
- Biotronic (27/30) Oct 04 2017 Drop-in replacement for readText:
- =?UTF-8?Q?Ali_=c3=87ehreli?= (42/46) Oct 04 2017 Here is one from me:
- Jesse Phillips (3/4) Oct 04 2017 ...
- Biotronic (9/13) Oct 05 2017 Features used: D.
- kerdemdemir (24/24) Oct 06 2017 I am a total beginner but I want to post that a lot.
- =?UTF-8?Q?Christian_K=c3=b6stlin?= (25/25) Oct 15 2017 Another solution using dlangs builtin csv support for reading.
- Atila Neves (8/17) Oct 04 2017 I can't bring myself to code a solution in C++17 or D. In C++17
- =?UTF-8?Q?Ali_=c3=87ehreli?= (8/11) Oct 04 2017 I spent more time on this obviously trivial program than necessary. :(
- jmh530 (3/10) Oct 04 2017 But it's not wasted time. You could also use it somewhere else.
- lithium iodate (48/49) Oct 04 2017 Those got me too!
Found on Reddit: https://www.reddit.com/r/programming/comments/740617/the_expressive_c17_coding_challenge/ How would you do it in D? Ali P.S. You can ignore the following note from the challenge text; I don't think it applies to D. Honestly, I don't think it matters for C++17 either. :) "You can assume input files won't be super large and can fit fully into memory."
Oct 03 2017
On Tuesday, 3 October 2017 at 19:25:56 UTC, Ali Çehreli wrote:Found on Reddit: https://www.reddit.com/r/programming/comments/740617/the_expressive_c17_coding_challenge/ How would you do it in D? Ali P.S. You can ignore the following note from the challenge text; I don't think it applies to D. Honestly, I don't think it matters for C++17 either. :) "You can assume input files won't be super large and can fit fully into memory."https://gist.github.com/Biotronic/0bc6048b880d67bfdca970453cc47cf9 I opted for writing to stdout instead, because 1) it's easier, x) it's less code, and b) it's more flexible. The memory limitations certainly do apply - readText would fail upon reading humongous files, and for 32-bit programs the resulting string wouldn't be able to hold enough data. Since the code uses ranges though, a simple replacement of readText with an mmapped equivalent should enable humongous file support with no other code change required. -- Biotronic
Oct 04 2017
On Wednesday, 4 October 2017 at 09:04:58 UTC, Biotronic wrote:Since the code uses ranges though, a simple replacement of readText with an mmapped equivalent should enable humongous file support with no other code change required.Drop-in replacement for readText: struct MmText { import std.mmfile; ulong _fileOffset; MmFile _file; this(string filename) { _file = new MmFile(filename); } dchar front() { auto end = min(_file.length, _fileOffset+4); auto data = cast(string)_file[_fileOffset..end]; return decodeFront(data); } void popFront() { auto end = min(_file.length, _fileOffset+4); auto data = cast(string)_file[_fileOffset..end]; size_t bytes; decodeFront(data, bytes); _fileOffset += bytes; } bool empty() { return _fileOffset >= _file.length; } } -- Biotronic
Oct 04 2017
On 10/04/2017 02:04 AM, Biotronic wrote:I opted for writing to stdout instead, because 1) it's easier, x) it's less code, and b) it's more flexible.Exactly! :)a simple replacement of readText with an mmapped equivalent should enable humongous file support with no other code change required.Here is one from me: import std.stdio; import std.algorithm; import std.string; import std.range; const delim = ","; auto byColumn(R)(R range) { return range .splitter(delim) .map!strip; } int main(string[] args) { if (args.length != 3) { stderr.writefln("USAGE: %s <column-name> <replacement>", args[0]); return 1; } const columnName = args[1]; auto lines = stdin.byLine; const columnNumber = lines .front .byColumn .countUntil(columnName); if (columnNumber == -1) { stderr.writefln(`ERROR: Failed to find "%s".`, columnName); return 1; } writeln(lines.front); lines.popFront(); const replacement = args[2]; auto replaced = lines .map!(line => line .byColumn .enumerate .map!(t => (t[0] == columnNumber) ? replacement : t[1]) .joiner(delim)); writefln("%(%s\n%)", replaced); return 0; } Ali
Oct 04 2017
On Wednesday, 4 October 2017 at 15:26:02 UTC, Ali Çehreli wrote:On 10/04/2017 02:04 AM, Biotronic wrote:... Hey where is the list of features used e.g: ranges, ufcs...
Oct 04 2017
On Wednesday, 4 October 2017 at 19:20:12 UTC, Jesse Phillips wrote:On Wednesday, 4 October 2017 at 15:26:02 UTC, Ali Çehreli wrote:Features used: D. But sure, added them to the gist: https://gist.github.com/Biotronic/0bc6048b880d67bfdca970453cc47cf9 Also added some more stuff to show off more D features, like unittests and safe. -- BiotronicOn 10/04/2017 02:04 AM, Biotronic wrote:... Hey where is the list of features used e.g: ranges, ufcs...
Oct 05 2017
I am a total beginner but I want to post that a lot. auto autoCorrelation(R)(R range) if (isRandomAccessRange!R) { import std.numeric : fft, inverseFft; import std.range : chain, repeat, zip, dropBack; import std.algorithm : map; import std.complex; auto residual = residualPowerOf2(range.length); auto fftResult = range.chain(repeat(0, residual)).fft(); auto autoCorrResult = fftResult.zip(fftResult.map!(a => a.conj())). map!( a=> a[0] * a[1] ). inverseFft(). dropBack(residual). map!( a => a.re ); return autoCorrResult; } I implemented auto correlation in C++ before which is I believe 2~3 time bigger(also I needed to compile fftw, lapack etc.. ) : https://forum.kde.org/viewtopic.php?f=74&t=118619 . That was the moment I feel in love with D.
Oct 06 2017
Another solution using dlangs builtin csv support for reading. import std.csv; import std.file; import std.algorithm : map; import std.range; string csvWrite(Header, Rows)(Header header, Rows rows) { return header.join(",") ~ "\n" ~ rows.map!(r => header.map!(h => r[h]).join(",")).join("\n"); } int main(string[] args) { auto inputFile = args[1]; auto columnName = args[2]; auto replacement = args[3]; auto outputFile = args[4]; auto records = readText(inputFile).csvReader!(string[string])(null); write(outputFile, csvWrite(records.header, records.map!((r) { r[columnName] = replacement; return r; }))); return 0; } Unfortunately this is still far from the powershell solution :/ cK
Oct 15 2017
On Tuesday, 3 October 2017 at 19:25:56 UTC, Ali Çehreli wrote:Found on Reddit: https://www.reddit.com/r/programming/comments/740617/the_expressive_c17_coding_challenge/ How would you do it in D? Ali P.S. You can ignore the following note from the challenge text; I don't think it applies to D. Honestly, I don't think it matters for C++17 either. :) "You can assume input files won't be super large and can fit fully into memory."I can't bring myself to code a solution in C++17 or D. In C++17 it'd be too painful, and in D so trivial it'd probably make me sleep out of boredom. Maybe that should be our new catchphrase: "D: Making programming boring" :P Atila
Oct 04 2017
On 10/04/2017 02:26 AM, Atila Neves wrote:in D so trivial it'd probably make me sleep out of boredom.I spent more time on this obviously trivial program than necessary. :( In addition to facing known template resolution issues, the hidden \r characters at the ends of some of the fields in the example textcolumns threw me off for a while. (Compounded by silly mistakes that I was making.)Maybe that should be our new catchphrase: "D: Making programming boring"While still keeping it interesting enough to scratch your head once in a while. :) Ali
Oct 04 2017
On Wednesday, 4 October 2017 at 15:30:08 UTC, Ali Çehreli wrote:On 10/04/2017 02:26 AM, Atila Neves wrote:But it's not wasted time. You could also use it somewhere else. Blog post, updated version of your book, new book, etc.in D so trivial it'd probably make me sleep out of boredom.I spent more time on this obviously trivial program than necessary. :( In addition to facing known template resolution issues, the hidden \r characters at the ends of some of the fields in the example textcolumns threw me off for a while. (Compounded by silly mistakes that I was making.)
Oct 04 2017
On Wednesday, 4 October 2017 at 15:30:08 UTC, Ali Çehreli wrote:the hidden \r characters at the endsThose got me too! Here's my less than optimal solution: int main(string[] args) { import std.stdio; import std.algorithm.iteration : map, splitter, joiner, each; import std.algorithm.searching : countUntil; import std.range : enumerate; import std.string : chomp; if (args.length != 5 && args.length != 4) { stderr.writeln("Something went wrong and it's obviously your fault."); return 1; } immutable columnID = args[2]; immutable substitute = args[3]; auto data = File(args[1], "r").byLine.map!chomp; if (data.empty) { stderr.writeln("input file missing\n\n(actually it exists, it's just " ~ "empty)\n\n(your fault regardless)"); return 1; } File output; if (args.length == 5) output = File(args[4], "w"); else output = stdout; immutable matchedColumn = data.front.splitter(",").countUntil(columnID); if (matchedColumn < 0) { stderr.writeln("column name doesn’t exist in the input file\n\n(and " ~ "it's your fault)"); return 1; } output.writeln(data.front); data.popFront; data.map!(line => line .splitter(",") .enumerate .map!(a => a.index == matchedColumn ? substitute : a.value) .joiner(",")).each!(a => output.writeln(a)); return 0; } I think the biggest problem is the lack of support for quoted content.
Oct 04 2017