Achievement statistics

From Geohashing
Revision as of 19:10, 18 July 2023 by Fippe (talk | contribs) (achievement statistics)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

This page ranks achievements by how common they are, it shows how many geohashers have claimed them and on how many expeditions the achievement was claimed. For some achievements, like the xkcd centurion achievement, this number will not only include geohashers that have the full achievement, but also those who are on their way there.

For a thematically sorted list with brief descriptions of the achievements, see achievements instead. For detailed descriptions, see the pages for the individual achievements.

Last updated: 2023-07-18

Achievements

Achievement # of Expeditions # of Geohashers
Land geohash achievement 4269 721
Bicycle geohash achievement 1202 254
Virgin graticule achievement 772 294
No trespassing consolation prize 719 241
Public transport geohash achievement 692 184
Consecutive geohash achievement 636 144
Drag-along achievement 563 289
Minesweeper geohash achievement 557 203
Gratuitous ribbon achievement 345 108
Multihash achievement 339 94
Walk geohash achievement 330 165
Frozen geohash achievement 299 103
Midnight geohash achievement 281 91
xkcd centurion achievement 278 65
Two to the N achievement 268 81
Last man standing achievement 257 74
Speed racer achievement 251 162
Tron achievement 224 114
No batteries geohash achievement 220 136
Thumbs up geohash achievement 210 9
OpenStreetMap achievement 201 27
Ambassador achievement 170 85
Easy geohash 159 59
Meet-up achievement 156 130
Geotrash achievement 153 97
Hash collision achievement 146 55
Geohashing Day achievement 139 79
Déjà vu geohash achievement 137 62
Border geohash achievement 134 61
Radio Yerevan 126 43
Picnic achievement 108 99
Drowned rat geohash achievement 103 49
Regional geohashing achievement 102 32
Dark Ages achievement 99 13
Earliest geohash achievement 96 65
xkcd-100 geohash achievement 94 34
Birthday geohash achievement 87 48
MNB geohash consolation prize 78 66
Circus geohash achievement 72 54
Velociraptor geohash achievement 72 41
Police geohash achievement 63 45
Water geohash achievement 62 59
Puppet master geohash achievement 60 42
Blinded by science consolation prize 59 39
A Tale of Two Hashes achievement 57 38
Hashiversary achievement 56 30
Reverse regional achievement 55 37
Prize poultry consolation prize 53 30
Holy hash achievement 51 39
Snowman geohash achievement 49 45
Formal attire achievement 49 45
MNIMB geohash achievement 49 42
Hashcard achievement 46 31
Sunrise geohash achievement 45 30
Geosquishy achievement 44 37
Admit one achievement 42 30
Air geohash achievement 39 14
Globetrotters geohash achievement 35 36
Coffin potato achievement 34 17
Pub geohash achievement 33 42
My kingdom for a boat consolation prize 32 29
Juggernaut achievement 31 16
Hashcat achievement 29 23
Leap geohash achievement 28 23
Train wreck consolation prize 27 24
Combo achievement 26 12
Cliffs of despair consolation prize 24 15
Hobbit achievement 23 17
There might be alligators! consolation prize 21 20
Subdivision geohash achievement 20 5
Globalhash achievement 20 22
Geoflashing achievement 20 16
Towel Day achievement 20 10
Walking on water geohash achievement 19 13
Origin geohash achievement 18 16
Restricted area achievement 16 14
Youngest geohasher achievement 15 7
It's a kitty consolation prize 15 12
Golf geohash achievement 15 11
Camping geohash achievement 15 11
Displaced origin geohash achievement 14 7
Fly a kite achievement 13 5
Pie geohash achievement 13 15
Twister geohash achievement 12 26
Musical achievement 10 7
Largest geohash achievement 9 1
Cold geohash achievement 9 14
Geohash by proxy achievement 8 6
Phonebooth stuffing achievement 8 25
Going deep geohash achievement 7 7
Geohashing in the media 7 7
Oldest geohasher achievement 7 6
Trail of blood consolation prize 7 4
Cross that bridge achievement 7 4
Buccaneer geohash achievement 7 16
Underwater geohash achievement 6 7
Handshake achievement 5 8
North geohash achievement 5 7
Wedding anniversary geohash achievement 5 6
High geohash achievement 5 4
Low geohash achievement 5 3
Calendar girl achievement 5 10
Abduction achievement 5 10
Sex geohash achievement 4 7
Migration geohash achievement 4 10
Time-traveller achievement 3 4
West geohash achievement 3 2
Geobrush achievement 3 1
Most active graticules achievement 2 6
Hot geohash achievement 2 4
East geohash achievement 2 3
Graticule hopper achievement 2 2
Cubicle geohash achievement 2 2
South geohash achievement 2 1
Endurance geohashing achievement 2 1
Curse of Unawareness consolation prize 2 15
Star photographer achievement 1 2
Maker achievement 1 1
Couch potato geohash achievement 1 1
Beast of burden geohash achievement 1 1
Posted achievement 0 0
MacGyver geohash achievement 0 0
Bill Gates achievement 0 0

Source code

The following program generates this page:

#!/bin/bash

# Copyright 2023 Fippe
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

dir="/tmp/gh-achievementstats"
categoryAPI="https://geohashing.site/api.php?format=json&action=query&list=categorymembers&cmprop=title&cmlimit=5000&cmtitle=Category"
regularAchievements=("Abduction_achievement" "Admit_one_achievement" "Air_geohash_achievement" "Ambassador_achievement" "A_Tale_of_Two_Hashes_achievement" "Beast_of_burden_geohash_achievement" "Bicycle_geohash_achievement" "Bill_Gates_achievement" "Birthday_geohash_achievement" "Blinded_by_science_consolation_prize" "Border_geohash_achievement" "Buccaneer_geohash_achievement" "Calendar_girl_achievement" "Camping_geohash_achievement" "Circus_geohash_achievement" "Cliffs_of_despair_consolation_prize" "Coffin_potato_achievement" "Cold_geohash_achievement" "Combo_achievement" "Consecutive_geohash_achievement" "Couch_potato_geohash_achievement" "Cross_that_bridge_achievement" "Cubicle_geohash_achievement" "Curse_of_Unawareness_consolation_prize" "Dark_Ages_achievement" "Déjà_vu_geohash_achievement" "Drag-along_achievement" "Drowned_rat_geohash_achievement" "Earliest_geohash_achievement" "East_geohash_achievement" "Easy_geohash" "Endurance_geohashing_achievement" "Fly_a_kite_achievement" "Formal_attire_achievement" "Frozen_geohash_achievement" "Geobrush_achievement" "Geoflashing_achievement" "Geohash_by_proxy_achievement" "Geohashing_Day_achievement" "Geohashing_in_the_media" "Geosquishy_achievement" "Geotrash_achievement" "Globalhash_achievement" "Globetrotters_geohash_achievement" "Going_deep_geohash_achievement" "Golf_geohash_achievement" "Graticule_hopper_achievement" "Gratuitous_ribbon_achievement" "Handshake_achievement" "Hashcard_achievement" "Hashcat_achievement" "Hash_collision_achievement" "Hashiversary_achievement" "High_geohash_achievement" "Hobbit_achievement" "Holy_hash_achievement" "Hot_geohash_achievement" "It's_a_kitty_consolation_prize" "Juggernaut_achievement" "Land_geohash_achievement" "Largest_geohash_achievement" "Last_man_standing_achievement" "Leap_geohash_achievement" "Low_geohash_achievement" "MacGyver_geohash_achievement" "Maker_achievement" "Meet-up_achievement" "Midnight_geohash_achievement" "Migration_geohash_achievement" "Minesweeper_geohash_achievement" "MNB_geohash_consolation_prize" "MNIMB_geohash_achievement" "Most_active_graticules_achievement" "Multihash_achievement" "Musical_achievement" "My_kingdom_for_a_boat_consolation_prize" "No_batteries_geohash_achievement" "North_geohash_achievement" "No_trespassing_consolation_prize" "Oldest_geohasher_achievement" "OpenStreetMap_achievement" "Phonebooth_stuffing_achievement" "Picnic_achievement" "Pie_geohash_achievement" "Police_geohash_achievement" "Posted_achievement" "Prize_poultry_consolation_prize" "Pub_geohash_achievement" "Public_transport_geohash_achievement" "Puppet_master_geohash_achievement" "Radio_Yerevan" "Regional_geohashing_achievement" "Restricted_area_achievement" "Reverse_regional_achievement" "Sex_geohash_achievement" "Snowman_geohash_achievement" "South_geohash_achievement" "Speed_racer_achievement" "Star_photographer_achievement" "Subdivision_geohash_achievement" "Sunrise_geohash_achievement" 'There_might_be_alligators!_consolation_prize' "Thumbs_up_geohash_achievement" "Time-traveller_achievement" "Towel_Day_achievement" "Trail_of_blood_consolation_prize" "Train_wreck_consolation_prize" "Tron_achievement" "Twister_geohash_achievement" "Two_to_the_N_achievement" "Underwater_geohash_achievement" "Velociraptor_geohash_achievement" "Virgin_graticule_achievement" "Walk_geohash_achievement" "Walking_on_water_geohash_achievement" "Water_geohash_achievement" "West_geohash_achievement" "xkcd-100_geohash_achievement" "xkcd_centurion_achievement" "Youngest_geohasher_achievement")
retroAchievements=("Displaced_origin_geohash_achievement" "Origin_geohash_achievement" "Wedding_anniversary_geohash_achievement")

mkdir -p "$dir"
regex="^[0-9]{4}-[0-9]{2}-[0-9]{2} -?[0-9]{1,3} -?[0-9]{1,3}$|^[0-9]{4}-[0-9]{2}-[0-9]{2} global$|^User:"

function fetchData {
    for category in ${regularAchievements[@]} ${retroAchievements[@]} "Expeditions" "Retro_meetup"
        do echo -n > "$dir/$category"
        cmcontinue="0"
        while [ "$cmcontinue" != "null" ]
            do curl -so "$dir/tmp" "$categoryAPI:$category&cmcontinue=$cmcontinue"
            cmcontinue=$(cat "$dir/tmp" | jq -r ".continue.cmcontinue")
            cat "$dir/tmp" | jq -r ".query.categorymembers[].title" | grep -E "$regex" >> "$dir/$category"
        done
        rm "$dir/tmp"
    done
}

function extractData {
    for category in ${regularAchievements[@]}
        do numExpeditions=$(grep -cf "$dir/$category" "$dir/Expeditions" | tr "\n" "\t")
        test -z "$numExpeditions" && echo -en "0\t" || echo -n "$numExpeditions"
        grep "^User:" "$dir/$category" | cut -d "/" -f 1 | sort -u | wc -l | tr "\n" "\t"
        echo "$category"
    done

    for category in ${retroAchievements[@]}
        do numExpeditions=$(grep -cf "$dir/$category" "$dir/Retro_meetup" | tr "\n" "\t")
        test -z "$numExpeditions" && echo -en "0\t" || echo -n "$numExpeditions"
        grep "^User:" "$dir/$category" | cut -d "/" -f 1 | sort -u | wc -l | tr "\n" "\t"
        echo "$category"
    done
}

function toShortNames {
    tr "\n_" ", " | sed -e "s/ geohash achievement]/]/g" -e "s/ achievement]/]/g" -e "s/ consolation prize]/]/g" | head -c -1
}

function formatBriefTable {
    echo -en '<includeonly>{|class="wikitable"\n!Times claimed!!Achievements'
    
    echo -en "\n|-\n|1000+||"
    echo "$1" | sort -nr | awk '{ if($1>=1000) print " [[" $3 "|" $3 "]]" }' | toShortNames
    
    echo -en "\n|-\n|500—1000||"
    echo "$1" | sort -nr | awk '{ if($1<1000 && $1>=500) print " [[" $3 "|" $3 "]]" }' | toShortNames
    
    echo -en "\n|-\n|100—500||"
    echo "$1" | sort -nr | awk '{ if($1<500 && $1>=100) print " [[" $3 "|" $3 "]]" }' | toShortNames

    echo -en "\n|-\n|50—100||"
    echo "$1" | sort -nr | awk '{ if($1<100 && $1>=50) print " [[" $3 "|" $3 "]]" }' | toShortNames
    
    echo -en "\n|-\n|10—50||"
    echo "$1" | sort -nr | awk '{ if($1<50 && $1>=10) print " [[" $3 "|" $3 "]]" }' | toShortNames
    
    echo -en "\n|-\n|1—10||"
    echo "$1" | sort -nr | awk '{ if($1<10 && $1>=1) print " [[" $3 "|" $3 "]]" }' | toShortNames
    
    echo -en "\n|-\n|Unclaimed||"
    echo "$1" | sort -nr | awk '{ if($1==0) print " [[" $3 "|" $3 "]]" }' | toShortNames
       
    echo -e "\n|}</includeonly>"
}

function formatFullTable {
    echo "==Achievements=="

    echo '{|class="wikitable sortable zebra"'
    echo '!Achievement!!# of Expeditions!!# of Geohashers'

    echo "$1" | sort -gr | while read -r numExpeditions numUsers achievement
        do echo "|-"
        echo "|[[$achievement]]||$numExpeditions||$numUsers" | tr "_" " "
    done
    
    echo "|}"
}

echo -e "<noinclude>This page ranks achievements by how common they are, it shows how many geohashers have claimed them and on how many [[expedition]]s the achievement was claimed. For some achievements, like the [[xkcd centurion achievement]], this number will not only include geohashers that have the full achievement, but also those who are on their way there.\n\nFor a thematically sorted list with brief descriptions of the achievements, see '''[[achievements]]''' instead. For detailed descriptions, see the pages for the individual achievements.\n"

date +"Last updated: %F"

#fetchData
data=$(extractData)
formatFullTable "$data"

echo "==Source code=="    
echo "The following program generates this page:<pre"">$(cat "$0")</pre"">[[Category:Achievements]]</noinclude>"
formatBriefTable "$data"