Skip to content

Instantly share code, notes, and snippets.

@treyhunner
Created January 21, 2022 18:21
Show Gist options
  • Save treyhunner/8261108b7d333132b544807ee3ffd55a to your computer and use it in GitHub Desktop.
Save treyhunner/8261108b7d333132b544807ee3ffd55a to your computer and use it in GitHub Desktop.
Python script to identify all Unicode flags that represent a different flag when reversed
"""
Script to print all Unicode flag emoji are also a valid flag when reversed.
Output of this script:
🇦🇬 (Antigua and Barbuda) reverses to 🇬🇦 (Gabon)
🇦🇱 (Albania) reverses to 🇱🇦 (Lao People's Democratic Republic)
🇦🇲 (Armenia) reverses to 🇲🇦 (Morocco)
🇦🇶 (Antarctica) reverses to 🇶🇦 (Qatar)
🇦🇸 (American Samoa) reverses to 🇸🇦 (Saudi Arabia)
🇦🇺 (Australia) reverses to 🇺🇦 (Ukraine)
🇦🇿 (Azerbaijan) reverses to 🇿🇦 (South Africa)
🇧🇧 (Barbados) reverses to 🇧🇧 (Barbados)
🇧🇬 (Bulgaria) reverses to 🇬🇧 (United Kingdom)
🇧🇱 (Saint Barthélemy) reverses to 🇱🇧 (Lebanon)
🇧🇸 (Bahamas) reverses to 🇸🇧 (Solomon Islands)
🇨🇨 (Cocos (Keeling) Islands) reverses to 🇨🇨 (Cocos (Keeling) Islands)
🇨🇱 (Chile) reverses to 🇱🇨 (Saint Lucia)
🇨🇲 (Cameroon) reverses to 🇲🇨 (Monaco)
🇨🇳 (China) reverses to 🇳🇨 (New Caledonia)
🇨🇻 (Cape Verde) reverses to 🇻🇨 (Saint Vincent and the Grenadines)
🇩🇲 (Dominica) reverses to 🇲🇩 (Moldova, Republic of)
🇪🇪 (Estonia) reverses to 🇪🇪 (Estonia)
🇪🇬 (Egypt) reverses to 🇬🇪 (Georgia)
🇪🇷 (Eritrea) reverses to 🇷🇪 (Réunion)
🇪🇸 (Spain) reverses to 🇸🇪 (Sweden)
🇫🇲 (Micronesia, Federated States of) reverses to 🇲🇫 (Saint Martin (French part))
🇬🇦 (Gabon) reverses to 🇦🇬 (Antigua and Barbuda)
🇬🇧 (United Kingdom) reverses to 🇧🇬 (Bulgaria)
🇬🇪 (Georgia) reverses to 🇪🇬 (Egypt)
🇬🇬 (Guernsey) reverses to 🇬🇬 (Guernsey)
🇬🇲 (Gambia) reverses to 🇲🇬 (Madagascar)
🇬🇳 (Guinea) reverses to 🇳🇬 (Nigeria)
🇬🇵 (Guadeloupe) reverses to 🇵🇬 (Papua New Guinea)
🇬🇸 (South Georgia and the South Sandwich Islands) reverses to 🇸🇬 (Singapore)
🇬🇹 (Guatemala) reverses to 🇹🇬 (Togo)
🇬🇺 (Guam) reverses to 🇺🇬 (Uganda)
🇭🇰 (Hong Kong) reverses to 🇰🇭 (Cambodia)
🇭🇲 (Heard Island and McDonald Islands) reverses to 🇲🇭 (Marshall Islands)
🇭🇹 (Haiti) reverses to 🇹🇭 (Thailand)
🇮🇱 (Israel) reverses to 🇱🇮 (Liechtenstein)
🇮🇳 (India) reverses to 🇳🇮 (Nicaragua)
🇮🇸 (Iceland) reverses to 🇸🇮 (Slovenia)
🇰🇭 (Cambodia) reverses to 🇭🇰 (Hong Kong)
🇰🇲 (Comoros) reverses to 🇲🇰 (Macedonia, the Former Yugoslav Republic of)
🇰🇵 (Korea, Democratic People's Republic of) reverses to 🇵🇰 (Pakistan)
🇱🇦 (Lao People's Democratic Republic) reverses to 🇦🇱 (Albania)
🇱🇧 (Lebanon) reverses to 🇧🇱 (Saint Barthélemy)
🇱🇨 (Saint Lucia) reverses to 🇨🇱 (Chile)
🇱🇮 (Liechtenstein) reverses to 🇮🇱 (Israel)
🇱🇸 (Lesotho) reverses to 🇸🇱 (Sierra Leone)
🇱🇹 (Lithuania) reverses to 🇹🇱 (Timor-Leste)
🇲🇦 (Morocco) reverses to 🇦🇲 (Armenia)
🇲🇨 (Monaco) reverses to 🇨🇲 (Cameroon)
🇲🇩 (Moldova, Republic of) reverses to 🇩🇲 (Dominica)
🇲🇫 (Saint Martin (French part)) reverses to 🇫🇲 (Micronesia, Federated States of)
🇲🇬 (Madagascar) reverses to 🇬🇲 (Gambia)
🇲🇭 (Marshall Islands) reverses to 🇭🇲 (Heard Island and McDonald Islands)
🇲🇰 (Macedonia, the Former Yugoslav Republic of) reverses to 🇰🇲 (Comoros)
🇲🇲 (Myanmar) reverses to 🇲🇲 (Myanmar)
🇲🇴 (Macao) reverses to 🇴🇲 (Oman)
🇲🇵 (Northern Mariana Islands) reverses to 🇵🇲 (Saint Pierre and Miquelon)
🇲🇸 (Montserrat) reverses to 🇸🇲 (San Marino)
🇲🇹 (Malta) reverses to 🇹🇲 (Turkmenistan)
🇲🇺 (Mauritius) reverses to 🇺🇲 (United States Minor Outlying Islands)
🇲🇿 (Mozambique) reverses to 🇿🇲 (Zambia)
🇳🇨 (New Caledonia) reverses to 🇨🇳 (China)
🇳🇬 (Nigeria) reverses to 🇬🇳 (Guinea)
🇳🇮 (Nicaragua) reverses to 🇮🇳 (India)
🇳🇵 (Nepal) reverses to 🇵🇳 (Pitcairn)
🇴🇲 (Oman) reverses to 🇲🇴 (Macao)
🇵🇬 (Papua New Guinea) reverses to 🇬🇵 (Guadeloupe)
🇵🇰 (Pakistan) reverses to 🇰🇵 (Korea, Democratic People's Republic of)
🇵🇲 (Saint Pierre and Miquelon) reverses to 🇲🇵 (Northern Mariana Islands)
🇵🇳 (Pitcairn) reverses to 🇳🇵 (Nepal)
🇶🇦 (Qatar) reverses to 🇦🇶 (Antarctica)
🇷🇪 (Réunion) reverses to 🇪🇷 (Eritrea)
🇷🇸 (Serbia) reverses to 🇸🇷 (Suriname)
🇸🇦 (Saudi Arabia) reverses to 🇦🇸 (American Samoa)
🇸🇧 (Solomon Islands) reverses to 🇧🇸 (Bahamas)
🇸🇪 (Sweden) reverses to 🇪🇸 (Spain)
🇸🇬 (Singapore) reverses to 🇬🇸 (South Georgia and the South Sandwich Islands)
🇸🇮 (Slovenia) reverses to 🇮🇸 (Iceland)
🇸🇱 (Sierra Leone) reverses to 🇱🇸 (Lesotho)
🇸🇲 (San Marino) reverses to 🇲🇸 (Montserrat)
🇸🇷 (Suriname) reverses to 🇷🇸 (Serbia)
🇸🇸 (South Sudan) reverses to 🇸🇸 (South Sudan)
🇹🇬 (Togo) reverses to 🇬🇹 (Guatemala)
🇹🇭 (Thailand) reverses to 🇭🇹 (Haiti)
🇹🇱 (Timor-Leste) reverses to 🇱🇹 (Lithuania)
🇹🇲 (Turkmenistan) reverses to 🇲🇹 (Malta)
🇹🇹 (Trinidad and Tobago) reverses to 🇹🇹 (Trinidad and Tobago)
🇺🇦 (Ukraine) reverses to 🇦🇺 (Australia)
🇺🇬 (Uganda) reverses to 🇬🇺 (Guam)
🇺🇲 (United States Minor Outlying Islands) reverses to 🇲🇺 (Mauritius)
🇻🇨 (Saint Vincent and the Grenadines) reverses to 🇨🇻 (Cape Verde)
🇿🇦 (South Africa) reverses to 🇦🇿 (Azerbaijan)
🇿🇲 (Zambia) reverses to 🇲🇿 (Mozambique)
"""
import unicodedata
# List copied from this JSON list of ISO 3166-1-alpha-2 data (happens to be valid Python)
# https://www.datahub.io/core/country-list#data
country_data = [{"Code": "AF", "Name": "Afghanistan"},{"Code": "AX", "Name": "\u00c5land Islands"},{"Code": "AL", "Name": "Albania"},{"Code": "DZ", "Name": "Algeria"},{"Code": "AS", "Name": "American Samoa"},{"Code": "AD", "Name": "Andorra"},{"Code": "AO", "Name": "Angola"},{"Code": "AI", "Name": "Anguilla"},{"Code": "AQ", "Name": "Antarctica"},{"Code": "AG", "Name": "Antigua and Barbuda"},{"Code": "AR", "Name": "Argentina"},{"Code": "AM", "Name": "Armenia"},{"Code": "AW", "Name": "Aruba"},{"Code": "AU", "Name": "Australia"},{"Code": "AT", "Name": "Austria"},{"Code": "AZ", "Name": "Azerbaijan"},{"Code": "BS", "Name": "Bahamas"},{"Code": "BH", "Name": "Bahrain"},{"Code": "BD", "Name": "Bangladesh"},{"Code": "BB", "Name": "Barbados"},{"Code": "BY", "Name": "Belarus"},{"Code": "BE", "Name": "Belgium"},{"Code": "BZ", "Name": "Belize"},{"Code": "BJ", "Name": "Benin"},{"Code": "BM", "Name": "Bermuda"},{"Code": "BT", "Name": "Bhutan"},{"Code": "BO", "Name": "Bolivia, Plurinational State of"},{"Code": "BQ", "Name": "Bonaire, Sint Eustatius and Saba"},{"Code": "BA", "Name": "Bosnia and Herzegovina"},{"Code": "BW", "Name": "Botswana"},{"Code": "BV", "Name": "Bouvet Island"},{"Code": "BR", "Name": "Brazil"},{"Code": "IO", "Name": "British Indian Ocean Territory"},{"Code": "BN", "Name": "Brunei Darussalam"},{"Code": "BG", "Name": "Bulgaria"},{"Code": "BF", "Name": "Burkina Faso"},{"Code": "BI", "Name": "Burundi"},{"Code": "KH", "Name": "Cambodia"},{"Code": "CM", "Name": "Cameroon"},{"Code": "CA", "Name": "Canada"},{"Code": "CV", "Name": "Cape Verde"},{"Code": "KY", "Name": "Cayman Islands"},{"Code": "CF", "Name": "Central African Republic"},{"Code": "TD", "Name": "Chad"},{"Code": "CL", "Name": "Chile"},{"Code": "CN", "Name": "China"},{"Code": "CX", "Name": "Christmas Island"},{"Code": "CC", "Name": "Cocos (Keeling) Islands"},{"Code": "CO", "Name": "Colombia"},{"Code": "KM", "Name": "Comoros"},{"Code": "CG", "Name": "Congo"},{"Code": "CD", "Name": "Congo, the Democratic Republic of the"},{"Code": "CK", "Name": "Cook Islands"},{"Code": "CR", "Name": "Costa Rica"},{"Code": "CI", "Name": "C\u00f4te d'Ivoire"},{"Code": "HR", "Name": "Croatia"},{"Code": "CU", "Name": "Cuba"},{"Code": "CW", "Name": "Cura\u00e7ao"},{"Code": "CY", "Name": "Cyprus"},{"Code": "CZ", "Name": "Czech Republic"},{"Code": "DK", "Name": "Denmark"},{"Code": "DJ", "Name": "Djibouti"},{"Code": "DM", "Name": "Dominica"},{"Code": "DO", "Name": "Dominican Republic"},{"Code": "EC", "Name": "Ecuador"},{"Code": "EG", "Name": "Egypt"},{"Code": "SV", "Name": "El Salvador"},{"Code": "GQ", "Name": "Equatorial Guinea"},{"Code": "ER", "Name": "Eritrea"},{"Code": "EE", "Name": "Estonia"},{"Code": "ET", "Name": "Ethiopia"},{"Code": "FK", "Name": "Falkland Islands (Malvinas)"},{"Code": "FO", "Name": "Faroe Islands"},{"Code": "FJ", "Name": "Fiji"},{"Code": "FI", "Name": "Finland"},{"Code": "FR", "Name": "France"},{"Code": "GF", "Name": "French Guiana"},{"Code": "PF", "Name": "French Polynesia"},{"Code": "TF", "Name": "French Southern Territories"},{"Code": "GA", "Name": "Gabon"},{"Code": "GM", "Name": "Gambia"},{"Code": "GE", "Name": "Georgia"},{"Code": "DE", "Name": "Germany"},{"Code": "GH", "Name": "Ghana"},{"Code": "GI", "Name": "Gibraltar"},{"Code": "GR", "Name": "Greece"},{"Code": "GL", "Name": "Greenland"},{"Code": "GD", "Name": "Grenada"},{"Code": "GP", "Name": "Guadeloupe"},{"Code": "GU", "Name": "Guam"},{"Code": "GT", "Name": "Guatemala"},{"Code": "GG", "Name": "Guernsey"},{"Code": "GN", "Name": "Guinea"},{"Code": "GW", "Name": "Guinea-Bissau"},{"Code": "GY", "Name": "Guyana"},{"Code": "HT", "Name": "Haiti"},{"Code": "HM", "Name": "Heard Island and McDonald Islands"},{"Code": "VA", "Name": "Holy See (Vatican City State)"},{"Code": "HN", "Name": "Honduras"},{"Code": "HK", "Name": "Hong Kong"},{"Code": "HU", "Name": "Hungary"},{"Code": "IS", "Name": "Iceland"},{"Code": "IN", "Name": "India"},{"Code": "ID", "Name": "Indonesia"},{"Code": "IR", "Name": "Iran, Islamic Republic of"},{"Code": "IQ", "Name": "Iraq"},{"Code": "IE", "Name": "Ireland"},{"Code": "IM", "Name": "Isle of Man"},{"Code": "IL", "Name": "Israel"},{"Code": "IT", "Name": "Italy"},{"Code": "JM", "Name": "Jamaica"},{"Code": "JP", "Name": "Japan"},{"Code": "JE", "Name": "Jersey"},{"Code": "JO", "Name": "Jordan"},{"Code": "KZ", "Name": "Kazakhstan"},{"Code": "KE", "Name": "Kenya"},{"Code": "KI", "Name": "Kiribati"},{"Code": "KP", "Name": "Korea, Democratic People's Republic of"},{"Code": "KR", "Name": "Korea, Republic of"},{"Code": "KW", "Name": "Kuwait"},{"Code": "KG", "Name": "Kyrgyzstan"},{"Code": "LA", "Name": "Lao People's Democratic Republic"},{"Code": "LV", "Name": "Latvia"},{"Code": "LB", "Name": "Lebanon"},{"Code": "LS", "Name": "Lesotho"},{"Code": "LR", "Name": "Liberia"},{"Code": "LY", "Name": "Libya"},{"Code": "LI", "Name": "Liechtenstein"},{"Code": "LT", "Name": "Lithuania"},{"Code": "LU", "Name": "Luxembourg"},{"Code": "MO", "Name": "Macao"},{"Code": "MK", "Name": "Macedonia, the Former Yugoslav Republic of"},{"Code": "MG", "Name": "Madagascar"},{"Code": "MW", "Name": "Malawi"},{"Code": "MY", "Name": "Malaysia"},{"Code": "MV", "Name": "Maldives"},{"Code": "ML", "Name": "Mali"},{"Code": "MT", "Name": "Malta"},{"Code": "MH", "Name": "Marshall Islands"},{"Code": "MQ", "Name": "Martinique"},{"Code": "MR", "Name": "Mauritania"},{"Code": "MU", "Name": "Mauritius"},{"Code": "YT", "Name": "Mayotte"},{"Code": "MX", "Name": "Mexico"},{"Code": "FM", "Name": "Micronesia, Federated States of"},{"Code": "MD", "Name": "Moldova, Republic of"},{"Code": "MC", "Name": "Monaco"},{"Code": "MN", "Name": "Mongolia"},{"Code": "ME", "Name": "Montenegro"},{"Code": "MS", "Name": "Montserrat"},{"Code": "MA", "Name": "Morocco"},{"Code": "MZ", "Name": "Mozambique"},{"Code": "MM", "Name": "Myanmar"},{"Code": "NA", "Name": "Namibia"},{"Code": "NR", "Name": "Nauru"},{"Code": "NP", "Name": "Nepal"},{"Code": "NL", "Name": "Netherlands"},{"Code": "NC", "Name": "New Caledonia"},{"Code": "NZ", "Name": "New Zealand"},{"Code": "NI", "Name": "Nicaragua"},{"Code": "NE", "Name": "Niger"},{"Code": "NG", "Name": "Nigeria"},{"Code": "NU", "Name": "Niue"},{"Code": "NF", "Name": "Norfolk Island"},{"Code": "MP", "Name": "Northern Mariana Islands"},{"Code": "NO", "Name": "Norway"},{"Code": "OM", "Name": "Oman"},{"Code": "PK", "Name": "Pakistan"},{"Code": "PW", "Name": "Palau"},{"Code": "PS", "Name": "Palestine, State of"},{"Code": "PA", "Name": "Panama"},{"Code": "PG", "Name": "Papua New Guinea"},{"Code": "PY", "Name": "Paraguay"},{"Code": "PE", "Name": "Peru"},{"Code": "PH", "Name": "Philippines"},{"Code": "PN", "Name": "Pitcairn"},{"Code": "PL", "Name": "Poland"},{"Code": "PT", "Name": "Portugal"},{"Code": "PR", "Name": "Puerto Rico"},{"Code": "QA", "Name": "Qatar"},{"Code": "RE", "Name": "R\u00e9union"},{"Code": "RO", "Name": "Romania"},{"Code": "RU", "Name": "Russian Federation"},{"Code": "RW", "Name": "Rwanda"},{"Code": "BL", "Name": "Saint Barth\u00e9lemy"},{"Code": "SH", "Name": "Saint Helena, Ascension and Tristan da Cunha"},{"Code": "KN", "Name": "Saint Kitts and Nevis"},{"Code": "LC", "Name": "Saint Lucia"},{"Code": "MF", "Name": "Saint Martin (French part)"},{"Code": "PM", "Name": "Saint Pierre and Miquelon"},{"Code": "VC", "Name": "Saint Vincent and the Grenadines"},{"Code": "WS", "Name": "Samoa"},{"Code": "SM", "Name": "San Marino"},{"Code": "ST", "Name": "Sao Tome and Principe"},{"Code": "SA", "Name": "Saudi Arabia"},{"Code": "SN", "Name": "Senegal"},{"Code": "RS", "Name": "Serbia"},{"Code": "SC", "Name": "Seychelles"},{"Code": "SL", "Name": "Sierra Leone"},{"Code": "SG", "Name": "Singapore"},{"Code": "SX", "Name": "Sint Maarten (Dutch part)"},{"Code": "SK", "Name": "Slovakia"},{"Code": "SI", "Name": "Slovenia"},{"Code": "SB", "Name": "Solomon Islands"},{"Code": "SO", "Name": "Somalia"},{"Code": "ZA", "Name": "South Africa"},{"Code": "GS", "Name": "South Georgia and the South Sandwich Islands"},{"Code": "SS", "Name": "South Sudan"},{"Code": "ES", "Name": "Spain"},{"Code": "LK", "Name": "Sri Lanka"},{"Code": "SD", "Name": "Sudan"},{"Code": "SR", "Name": "Suriname"},{"Code": "SJ", "Name": "Svalbard and Jan Mayen"},{"Code": "SZ", "Name": "Swaziland"},{"Code": "SE", "Name": "Sweden"},{"Code": "CH", "Name": "Switzerland"},{"Code": "SY", "Name": "Syrian Arab Republic"},{"Code": "TW", "Name": "Taiwan, Province of China"},{"Code": "TJ", "Name": "Tajikistan"},{"Code": "TZ", "Name": "Tanzania, United Republic of"},{"Code": "TH", "Name": "Thailand"},{"Code": "TL", "Name": "Timor-Leste"},{"Code": "TG", "Name": "Togo"},{"Code": "TK", "Name": "Tokelau"},{"Code": "TO", "Name": "Tonga"},{"Code": "TT", "Name": "Trinidad and Tobago"},{"Code": "TN", "Name": "Tunisia"},{"Code": "TR", "Name": "Turkey"},{"Code": "TM", "Name": "Turkmenistan"},{"Code": "TC", "Name": "Turks and Caicos Islands"},{"Code": "TV", "Name": "Tuvalu"},{"Code": "UG", "Name": "Uganda"},{"Code": "UA", "Name": "Ukraine"},{"Code": "AE", "Name": "United Arab Emirates"},{"Code": "GB", "Name": "United Kingdom"},{"Code": "US", "Name": "United States"},{"Code": "UM", "Name": "United States Minor Outlying Islands"},{"Code": "UY", "Name": "Uruguay"},{"Code": "UZ", "Name": "Uzbekistan"},{"Code": "VU", "Name": "Vanuatu"},{"Code": "VE", "Name": "Venezuela, Bolivarian Republic of"},{"Code": "VN", "Name": "Viet Nam"},{"Code": "VG", "Name": "Virgin Islands, British"},{"Code": "VI", "Name": "Virgin Islands, U.S."},{"Code": "WF", "Name": "Wallis and Futuna"},{"Code": "EH", "Name": "Western Sahara"},{"Code": "YE", "Name": "Yemen"},{"Code": "ZM", "Name": "Zambia"},{"Code": "ZW", "Name": "Zimbabwe"}]
# Map country codes to country names
countries = {
country["Code"]: country["Name"]
for country in country_data
}
# Find all country codes that are valid when reversed
reversible_codes = sorted(
code
for code in countries
if code[::-1] in countries
)
def flag_for(code):
"""Return unicode flag emoji given a 2-digit country code."""
return "".join(
unicodedata.lookup(f"REGIONAL INDICATOR SYMBOL LETTER {char}")
for char in code
)
# Print each flag and country name and its valid reverse flag and country name
# Note: some flags are their own reverse (due to palindrome codes like TT)
# Note: each countries is printed twice (once as forward, once as reverse)
for code in reversible_codes:
print(
f"{flag_for(code)} ({countries[code]})",
"reverses to",
f"{flag_for(code[::-1])} ({countries[code[::-1]]})"
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment