Achievement statistics
From Geohashing
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: 2024-07-21
Achievements
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" "Birds_of_a_Feather_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" "Climb_achievement" "Coffin_potato_achievement" "Cold_geohash_achievement" "Combo_achievement" "Consecutive_geohash_achievement" "Constant_geohasher_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" "Democracy_achievement" "Done_with_Nature_consolation_prize" "Drag-along_achievement" "Drowned_rat_geohash_achievement" "Earliest_geohash_achievement" "East_geohash_achievement" "Easy_geohash" "Eclipse_achievement" "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" "Graticule_unlocked_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" "Hunter_gatherer_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" "Most_active_graticules_achievement" "Multihash_achievement" "Multiple_elevations_achievement" "Musical_achievement" "My_kingdom_for_a_boat_consolation_prize" "N-in-a-row_achievement" "Namesake_achievement" "No_batteries_geohash_achievement" "North_geohash_achievement" "No_trespassing_consolation_prize" "Oldest_geohasher_achievement" "One_with_Nature_geohash_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" "Skate_geohash_achievement" "Snowman_geohash_achievement" "South_geohash_achievement" "Speed_racer_achievement" "Speedrun_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" "Walk_geohash_achievement" "Walking_on_water_geohash_achievement" "Water_geohash_achievement" "West_geohash_achievement" "White_Rabbit_consolation_prize" "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/ geohashing achievement]/]/g" -e "s/ geohash]/]/g" -e "s/ geohasher 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"