1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | require 'json' require 'open-uri' def base_url "http://www.reddit.com/r/dailyprogrammer.json?limit=100000&after=" end def pull(before='') target_url = base_url + before.to_s puts "PULLING #{target_url}" results = open(target_url).readlines.join posts = JSON.parse(results, symbolize_names: true) # Discard occasional empty hash posts = posts.select { |p| p.is_a?(Hash) && !p.empty? }.first posts = posts.fetch(:data).fetch(:children) posts = posts.map { |p| p[:data] } posts = posts.select { |p| p[:title].include?('#') } posts = posts.map { |p| Challenge.new(p) }.sort end def dataset @dataset ||= get_all end def get_all all_posts = [] next_id = '' while all_posts.empty? || (all_posts.map(&:challenge_id).min > 1) new_posts = pull(next_id) all_posts.concat(new_posts) all_posts.sort!.uniq! next_id = all_posts.first.reddit_id end return all_posts.uniq.sort end def main return dataset end class Challenge attr_accessor :raw def initialize(hash={}) @raw = hash self end def difficulty return @difficulty unless @difficulty.nil? return @difficulty = 0 if self.title.downcase.include?('easy') return @difficulty = 1 if self.title.downcase.include?('intermediate') return @difficulty = 2 end def title @title ||= @raw[:title] end def challenge_id begin @challenge_id ||= title.split('#')[1].split(' ').first.to_i rescue -1 end end def hash [self.challenge_id].hash end def eql?(other) self.hash == other.hash end def reddit_id @reddit_id ||= @raw[:name].to_s end def url @url ||= @raw[:url] end def to_s "[#{%w(Easy Intermediate Difficult)[self.difficulty]}] #{self.title} #{self.url}" end def <=>(other) return -1 if self.challenge_id < other.challenge_id return 0 if self.challenge_id == other.challenge_id return 1 end end main |
cmVxdWlyZSAnanNvbicKcmVxdWlyZSAnb3Blbi11cmknCgpkZWYgYmFzZV91cmwKICAiaHR0cDovL3d3dy5yZWRkaXQuY29tL3IvZGFpbHlwcm9ncmFtbWVyLmpzb24/bGltaXQ9MTAwMDAwJmFmdGVyPSIKZW5kCgpkZWYgcHVsbChiZWZvcmU9JycpCiAgdGFyZ2V0X3VybCA9IGJhc2VfdXJsICsgYmVmb3JlLnRvX3MKICBwdXRzICJQVUxMSU5HICN7dGFyZ2V0X3VybH0iCiAgcmVzdWx0cyA9IG9wZW4odGFyZ2V0X3VybCkucmVhZGxpbmVzLmpvaW4KCiAgcG9zdHMgICA9IEpTT04ucGFyc2UocmVzdWx0cywgc3ltYm9saXplX25hbWVzOiB0cnVlKQoKICAjIERpc2NhcmQgb2NjYXNpb25hbCBlbXB0eSBoYXNoCiAgcG9zdHMgICA9IHBvc3RzLnNlbGVjdCB7IHxwfCBwLmlzX2E/KEhhc2gpICYmICFwLmVtcHR5PyB9LmZpcnN0IAogIHBvc3RzICAgPSBwb3N0cy5mZXRjaCg6ZGF0YSkuZmV0Y2goOmNoaWxkcmVuKQoKICBwb3N0cyAgID0gcG9zdHMubWFwICAgIHsgfHB8IHBbOmRhdGFdIH0KICBwb3N0cyAgID0gcG9zdHMuc2VsZWN0IHsgfHB8IHBbOnRpdGxlXS5pbmNsdWRlPygnIycpIH0KICBwb3N0cyAgID0gcG9zdHMubWFwICAgIHsgfHB8IENoYWxsZW5nZS5uZXcocCkgfS5zb3J0CmVuZAoKZGVmIGRhdGFzZXQKICBAZGF0YXNldCB8fD0gZ2V0X2FsbAplbmQKCmRlZiBnZXRfYWxsCiAgYWxsX3Bvc3RzID0gW10KICBuZXh0X2lkID0gJycKCiAgd2hpbGUgYWxsX3Bvc3RzLmVtcHR5PyB8fCAoYWxsX3Bvc3RzLm1hcCgmOmNoYWxsZW5nZV9pZCkubWluID4gMSkKICAgIG5ld19wb3N0cyA9IHB1bGwobmV4dF9pZCkKICAgIGFsbF9wb3N0cy5jb25jYXQobmV3X3Bvc3RzKQogICAgYWxsX3Bvc3RzLnNvcnQhLnVuaXEhCiAgICBuZXh0X2lkICAgPSBhbGxfcG9zdHMuZmlyc3QucmVkZGl0X2lkCiAgZW5kCgogIHJldHVybiBhbGxfcG9zdHMudW5pcS5zb3J0CmVuZAoKZGVmIG1haW4KICByZXR1cm4gZGF0YXNldAplbmQKCgpjbGFzcyBDaGFsbGVuZ2UKICBhdHRyX2FjY2Vzc29yIDpyYXcKCiAgZGVmIGluaXRpYWxpemUoaGFzaD17fSkKICAgIEByYXcgICAgICAgPSBoYXNoCiAgICBzZWxmCiAgZW5kCgogIGRlZiBkaWZmaWN1bHR5CiAgICByZXR1cm4gQGRpZmZpY3VsdHkgdW5sZXNzIEBkaWZmaWN1bHR5Lm5pbD8KICAgIHJldHVybiBAZGlmZmljdWx0eSA9IDAgaWYgc2VsZi50aXRsZS5kb3duY2FzZS5pbmNsdWRlPygnZWFzeScpCiAgICByZXR1cm4gQGRpZmZpY3VsdHkgPSAxIGlmIHNlbGYudGl0bGUuZG93bmNhc2UuaW5jbHVkZT8oJ2ludGVybWVkaWF0ZScpCiAgICByZXR1cm4gQGRpZmZpY3VsdHkgPSAyCiAgZW5kCgogIGRlZiB0aXRsZQogICAgQHRpdGxlIHx8PSBAcmF3Wzp0aXRsZV0KICBlbmQKCiAgZGVmIGNoYWxsZW5nZV9pZAogICAgYmVnaW4KICAgICAgQGNoYWxsZW5nZV9pZCB8fD0gdGl0bGUuc3BsaXQoJyMnKVsxXS5zcGxpdCgnICcpLmZpcnN0LnRvX2kKICAgIHJlc2N1ZQogICAgICAtMQogICAgZW5kCiAgZW5kCgogIGRlZiBoYXNoCiAgICBbc2VsZi5jaGFsbGVuZ2VfaWRdLmhhc2gKICBlbmQKCiAgZGVmIGVxbD8ob3RoZXIpCiAgICBzZWxmLmhhc2ggPT0gb3RoZXIuaGFzaAogIGVuZAoKICBkZWYgcmVkZGl0X2lkCiAgICBAcmVkZGl0X2lkIHx8PSBAcmF3WzpuYW1lXS50b19zCiAgZW5kCgogIGRlZiB1cmwKICAgIEB1cmwgfHw9IEByYXdbOnVybF0KICBlbmQKCiAgZGVmIHRvX3MKICAgICJbI3sldyhFYXN5IEludGVybWVkaWF0ZSBEaWZmaWN1bHQpW3NlbGYuZGlmZmljdWx0eV19XSAje3NlbGYudGl0bGV9ICN7c2VsZi51cmx9IgogIGVuZAoKICBkZWYgPD0+KG90aGVyKQogICAgcmV0dXJuIC0xIGlmIHNlbGYuY2hhbGxlbmdlX2lkIDwgb3RoZXIuY2hhbGxlbmdlX2lkCiAgICByZXR1cm4gIDAgaWYgc2VsZi5jaGFsbGVuZ2VfaWQgPT0gb3RoZXIuY2hhbGxlbmdlX2lkCiAgICByZXR1cm4gIDEKICBlbmQKZW5kCgptYWlu
-
upload with new input
-
result: Runtime error time: 0.08s memory: 9608 kB signal: -1
PULLING http://www.reddit.com/r/dailyprogrammer.json?limit=100000&after=


