Kernighans large earthquake problem: Difference between revisions
Content added Content deleted
(→{{header|Kotlin}}: Changed code to something which can deal with huge files.) |
Thundergnat (talk | contribs) (→{{header|Perl6}}: Add a Perl6 example) |
||
Line 44: | Line 44: | ||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
<lang perl>perl -n -e '/(\S+)\s*$/ and $1 > 6 and print' data.txt</lang> |
<lang perl>perl -n -e '/(\S+)\s*$/ and $1 > 6 and print' data.txt</lang> |
||
=={{header|Perl 6}}== |
|||
{{works with|Rakudo|2018.03}} |
|||
Pass in a file name, or use default for demonstration purposes. |
|||
<lang perl6>$_ = @*ARGS[0].IO // q:to/END/; |
|||
8/27/1883 Krakatoa 8.8 |
|||
5/18/1980 MountStHelens 7.6 |
|||
3/13/2009 CostaRica 5.1 |
|||
END |
|||
map { .say if .words[2] > 6 }, .lines;</lang> |
|||
> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
Revision as of 12:57, 21 April 2018
Kernighans large earthquake problem is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Brian Kernighan, in a lecture at the University of Nottingham, described a problem on which this task is based.
- Problem
You are given a a data file of thousands of lines; each of three `whitespace` separated fields: a date, a one word name and the magnitude of the event.
Example lines from the file would be lines like:
8/27/1883 Krakatoa 8.8 5/18/1980 MountStHelens 7.6 3/13/2009 CostaRica 5.1
- Task
- Create a program or script invocation to find all the events with magnitude greater than 6
- Assuming an appropriate name e.g. "data.txt" for the file:
- Either: Show how your program is invoked to process a data file of that name.
- Or: Incorporate the file name into the program, (as it is assumed that the program is single use).
AWK
<lang awk> awk '$3 > 6' data.txt</lang>
Kotlin
<lang scala>// Version 1.2.40
import java.io.File
fun main(args: Array<String>) {
val r = Regex("""\s+""") println("Those earthquakes with a magnitude > 6.0 are:\n") File("data.txt").forEachLine { if (it.split(r)[2].toDouble() > 6.0) println(it) }
}</lang>
- Output:
Using the given file:
Those earthquakes with a magnitude > 6.0 are: 8/27/1883 Krakatoa 8.8 5/18/1980 MountStHelens 7.6
Perl
<lang perl>perl -n -e '/(\S+)\s*$/ and $1 > 6 and print' data.txt</lang>
Perl 6
Pass in a file name, or use default for demonstration purposes. <lang perl6>$_ = @*ARGS[0].IO // q:to/END/;
8/27/1883 Krakatoa 8.8 5/18/1980 MountStHelens 7.6 3/13/2009 CostaRica 5.1 END
map { .say if .words[2] > 6 }, .lines;</lang>
>
Python
Typed into a bash shell or similar: <lang python>python -c ' with open("data.txt") as f:
for ln in f: if float(ln.strip().split()[2]) > 6: print(ln.strip())'</lang>