Arka Plan ve Motivasyon:
IOC Ülke Kodları , Olimpiyat Oyunlarını yayınlarken yaygın olarak kullanılan üç harflik kısaltmalardır. Bazı kodların son iki harfi, diğer iki kodun ilk iki harfi (RUS -> ABD, JPN -> PNG), vb. İle örtüşür. Açıkça, ilk harfi kaldırarak ve ekleyerek ilk ülke kodunu ikinciye dönüştürebilirsiniz. sonunda yeni bir mektup. Bazen bu dönüşümleri daha uzun bir yola zincirleyebilirsiniz (RUS -> ABD -> SAM).
Parti misafirlerini etkilemek için verilen 2 ülke kodu (IOC listesi veya FIFA listesi gibi sağlanan bir liste kullanılarak) arasında bir yol olup olmadığını belirlemek istiyorum ve birden çok yol olması durumunda, çıktı almak istiyorum en uzun olanı. Çıktıyı ticari bir kırılmaya yetecek kadar küçük tutmak için, yollar bitişik ülke kodları arasında ortak alt dizelerin tekrarlanmamasıyla sıkıştırılır: Örneğin RUSAM>> ABD -> SAM RUSAM olarak yazılacaktır.
Birden fazla eşit uzunluktaki yol mümkünse, herhangi bir sonuç seçebilirsiniz (daha önce "bir partiye açıklayabileceğim bir deterministik tiebreaking kuralı isteniyordu." Bunu içeren cevapları takdir ediyorum, ancak muhtemelen kısıtlayan iyi bir nesnel kural değil bir yanıtın doğru olup olmadığı.)
Teknik Zorluk
girişler:
- ilk 3 harfli ülke kodu
- terminal 3 harfli ülke kodu
- geçerli 3 harfli ülke kodu kümesi
Çıktılar :
Bir dizenin var olup olmadığını belirleyin:
- ilk üç harf ilk 3 harfli ülke koduyla aynıdır
- Son üç harf terminal 3 harfli ülke koduyla aynıdır
- her 3 harfli alt dize, giriş kümesindeki geçerli bir ülke koduna karşılık gelir
- aynı ülke kodu dizede iki kez görünemez (ilk 3 karakterin ve son 3 karakterin aynı olması hariç)
Böyle bir dize varsa, o dizeyi çıktı olarak yazdırın. Bu tür birden çok dize varsa, bu tür en uzun dizeyi yazdırın. Böyle bir dize yoksa, aşağıdakilerden herhangi biri kabul edilebilir:
- çıktı yok
- falsey çıkışı
- hata
Geçerli bir yol için karıştırılmadıkları sürece, böyle bir yolun bulunmadığını gösteren diğer yollara da izin verilir.
Geçerli Varsayımlar :
* İlk 3 harfli ülke kodu ve terminal 3 harfli ülke kodu, sağlanan geçerli 3 harfli ülke kodu kümesinde bulunur.
Geçersiz Varsayımlar :
* Girdi kümesinin deterministik bir çıktı üretmek amacıyla sipariş edildiği varsayılamaz.
* İlk 3 harfli ülke kodunun terminal ülke kodundan farklı olduğu varsayılamaz (döngüsel isteklere izin verilir)
Ekstra Stil Noktaları (Gönderimin Geçerli Olması İçin Gerekli Değildir):
Cevabınız, yukarıdaki tüm kriterleri karşılayan birden fazla özdeş uzunluk dizesi bulunduğunda hangi dizenin çıkacağını belirlemek için kullandığınız deterministik bir bağ kırma kuralının açıklamasını içeriyorsa, bu İnternet yabancısını çok mutlu edersiniz. Tercihen, geçerli bir gönderim için iyi bir gereklilik olmayacak kadar bulanık olan rastgele bir Olimpiyat görüntüleyicisini açıklamak için yeterince kolay bir şey.
puanlama:
Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır. Standart Loopholes uygulanır.
Test Durumları
Giriş 1 : "AAA", "ZZZ", ["AAA", "AAZ", "AZZ", "ZZZ"]
Çıktı 1 : "AAAZZZ" (Varsa geçerli yolu bul)
Giriş 2 : "AAA", "ZZZ", ["AAA", "AAZ", "AZZ", "ZZZ", "AAB", "ABB", "BBB", "BBZ", "BZZ", "ZZZ "]
Çıktı 2 : "AAABBBZZZ" (Kısa ve uzun yolların ikisi de varsa en uzun yolu bulun)
Giriş 3 : "AAA", "ZZZ", ["AAA", "ZZZ"]
Çıkış 3 : Çökme, falsey mesajı veya çıkış yok (sadece "AAAZZZ" veya bir yol için karıştırılabilecek bir şey çıkarmayın)
Giriş 4 : "AAA", "ZZZ", ["AAA", "AAB", "ABZ", "BZZ", "AAY", "AYZ", "YZZ", "ZZZ"],
Çıktı 4 : "AAABZZZ" VEYA "AAAYZZZ", ancak hangisinin çıktıya karar verdiğine hangi kuralın karar verdiğini açıklamalısınız (seçtiğiniz kuralı takip eden tutarlı davranış)
Giriş 5 : "AAA", "AAA", ["AAA", "ABA", "AAB", "BAA"],
Çıktı 5 : "AAABAAA" (Başlangıç kodunun == terminal kodunun, ancak diğer kodların sonuca dahil edilmesi gereken test durumu)
Giriş 6 : "AAA", "AAA", ["AAA", "ABA"],
Çıktı 6 : "AAA" ("AAABAAA" geçerli değil çünkü "AAB" ve "BAA" yanıtta, geçerli ülke kodu kümesinin parçası olmayan 3 harfli alt dizelerdir)
Giriş 7 : "ISL", "ERI",
["AFG", "AHO", "AIA", "ALB", "ALG", "AND", "ANG", "ANT", "ARG", "ARM", "ARU", "ASA", "AUS", "AUT", "AZE", "BAH", "BAN", "BAR", "BDI", "BEL", "BEN", "BER", "BHU", "BIH", "BIZ", "BLR", "BOL", "BOT", "BRA", "BRN", "BRU", "BUL", "BUR", "CAF", "CAM", "CAN", "CAY", "CGO", "CHA", "CHI", "CHN", "CIV", "CMR", "COD", "COK", "COL", "COM", "CPV", "CRC", "CRO", "CUB", "CYP", "CZE", "DEN", "DJI", "DMA", "DOM", "ECU", "EGY", "ERI", "ESA", "ESP", "EST", "ETH", "FAR", "FGU", "FIJ", "FIN", "FLK", "FPO", "FRA", "FSM", "GAB", "GAM", "GBR", "GBS", "GEO", "GEQ", "GER", "GHA", "GIB", "GRE", "GRL", "GRN", "GUA", "GUD", "GUI", "GUM", "GUY", "HAI", "HEL", "HKG", "HON", "HUN", "INA", "IND", "IRI", "IRL", "IRQ", "ISL", "ISR", "ISV", "ITA", "IVB", "JAM", "JOR", "JPN", "KAZ", "KEN", "KGZ", "KIR", "KOR", "KSA", "KUW", "LAO", "LAT", "LBA", "LBR", "LCA", "LES", "LIB", "LIE", "LTU", "LUX", "MAC", "MAD", "MAR", "MAS", "MAW", "MAY", "MDA", "MDV", "MEX", "MGL", "MGO", "MKD", "MLI", "MLT", "MNT", "MON", "MOZ", "MRI", "MRT", "MSH", "MTN", "MYA", "NAM", "NCA", "NCD", "NED", "NEP", "NFI", "NGR", "NIG", "NIU", "NMA", "NOR", "NRU", "NZL", "OMA", "PAK", "PAN", "PAR", "PER", "PHI", "PLE", "PLW", "PNG", "POL", "POR", "PRK", "PUR", "QAT", "REU", "ROU", "RSA", "RUS", "RWA", "SAM", "SEN", "SEY", "SIN", "SKN", "SLE", "SLO", "SMR", "SOL", "SOM", "SPM", "SRB", "SRI", "STP", "SUD", "SUI", "SUR", "SVK", "SWE", "SWZ", "SYR", "TAN", "TGA", "THA", "TJK", "TKM", "TKS", "TLS", "TOG", "TPE", "TTO", "TUN", "TUR", "TUV", "UAE", "UGA", "UKR", "URU", "USA", "UZB", "VAN", "VEN", "VIE", "VIN", "WAF", "YEM", "ZAM", "ZIM"]
Çıkış 7 : ISLESTPERI (gerçek dünya test örneği: IOC kodları ISL -> SLE -> LES -> EST -> STP -> TPE -> PER -> İzlanda'ya karşılık gelen ERI -> Sierra Leone -> Lesotho -> Estonya -> Sao Tome ve Principe -> Çin Cumhuriyeti -> Peru -> Eritre)
Giriş 8 : ABD, ABD,
["ABW", "AFG", "AGO", "AIA", "ALA", "ALB", "AND", "ARE", "ARG", "ARM", "ASM", "ATA", "ATF", "ATG", "AUS", "AUT", "AZE", "BDI", "BEL", "BEN", "BES", "BFA", "BGD", "BGR", "BHR", "BHS", "BIH", "BLM", "BLR", "BLZ", "BMU", "BOL", "BRA", "BRB", "BRN", "BTN", "BVT", "BWA", "CAF", "CAN", "CCK", "CHE", "CHL", "CHN", "CIV", "CMR", "COD", "COG", "COK", "COL", "COM", "CPV", "CRI", "CUB", "CUW", "CXR", "CYM", "CYP", "CZE", "DEU", "DJI", "DMA", "DNK", "DOM", "DZA", "ECU", "EGY", "ERI", "ESH", "ESP", "EST", "ETH", "FIN", "FJI", "FLK", "FRA", "FRO", "FSM", "GAB", "GBR", "GEO", "GGY", "GHA", "GIB", "GIN", "GLP", "GMB", "GNB", "GNQ", "GRC", "GRD", "GRL", "GTM", "GUF", "GUM", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN", "IDN", "IMN", "IND", "IOT", "IRL", "IRN", "IRQ", "ISL", "ISR", "ITA", "JAM", "JEY", "JOR", "JPN", "KAZ", "KEN", "KGZ", "KHM", "KIR", "KNA", "KOR", "KWT", "LAO", "LBN", "LBR", "LBY", "LCA", "LIE", "LKA", "LSO", "LTU", "LUX", "LVA", "MAC", "MAF", "MAR", "MCO", "MDA", "MDG", "MDV", "MEX", "MHL", "MKD", "MLI", "MLT", "MMR", "MNE", "MNG", "MNP", "MOZ", "MRT", "MSR", "MTQ", "MUS", "MWI", "MYS", "MYT", "NAM", "NCL", "NER", "NFK", "NGA", "NIC", "NIU", "NLD", "NOR", "NPL", "NRU", "NZL", "OMN", "PAK", "PAN", "PCN", "PER", "PHL", "PLW", "PNG", "POL", "PRI", "PRK", "PRT", "PRY", "PSE", "PYF", "QAT", "REU", "ROU", "RUS", "RWA", "SAU", "SDN", "SEN", "SGP", "SGS", "SHN", "SJM", "SLB", "SLE", "SLV", "SMR", "SOM", "SPM", "SRB", "SSD", "STP", "SUR", "SVK", "SVN", "SWE", "SWZ", "SXM", "SYC", "SYR", "TCA", "TCD", "TGO", "THA", "TJK", "TKL", "TKM", "TLS", "TON", "TTO", "TUN", "TUR", "TUV", "TWN", "TZA", "UGA", "UKR", "UMI", "URY", "USA", "UZB", "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF", "WSM", "YEM", "ZAF", "ZMB", "ZWE"]
Çıktı 8 : "USAUSA" (gerçek dünya test durumu: ABD -> SAU -> AUS -> ABD ABD'ye karşılık gelen ISO3166-Alpha-3 kodları Amerika Birleşik Devletleri -> Suudi Arabistan -> Avustralya -> Amerika Birleşik Devletleri)
Veri:
Gerçek dünya örnekleri için tüm ülke kodları , onunla daha fazla oynamak istiyorsanız https://datahub.io/core/country-codes#data adresinden alınmıştır . Yollar, bu soruyu başlattığımda düşündüğümden çok daha kısa ve daha az ilginçti (sanırım ülke kodları 3 harf dizesinin alanını yeterince yoğun bir şekilde doldurmuyor), ancak başka biri ilginç bir şeyler bulabilir onlarla.
Referans Kodu: Kodu tercih ederseniz, yazılı test senaryoları ile oynayabilirsiniz (veya sadece çeşitli yollarla oynamak isteyebilirsiniz ancak meydan okumayı çözmek istemezsiniz), tüm test vakalarını hızlı bir şekilde çözen bazı referans (çözülmemiş) kod.
def pathfinder_helper(initial_code, terminal_code, valid_codes):
if initial_code != terminal_code:
if initial_code[1:] == terminal_code[:-1]:
return [initial_code, terminal_code]
if not valid_codes:
if initial_code == terminal_code:
return [initial_code]
return None
best_path = None
for intermediate_code in valid_codes:
# Pure speed optimization, can be left out and be "correct" but will be super slow on cases 7 and 8
if initial_code[1:] != intermediate_code[:-1]:
continue
initial_intermediate_path = pathfinder_helper(initial_code, intermediate_code, valid_codes - {intermediate_code})
intermediate_terminal_path = pathfinder_helper(intermediate_code, terminal_code, valid_codes - {intermediate_code})
if initial_intermediate_path and intermediate_terminal_path:
# Longer paths preferred
if (best_path is None) or len(initial_intermediate_path + intermediate_terminal_path[1:]) >= len(best_path):
if best_path and len(initial_intermediate_path + intermediate_terminal_path[1:]) == len(best_path):
# If lengths equal, use sort order (lexicographic)
if initial_intermediate_path + intermediate_terminal_path[1:] < best_path:
best_path = initial_intermediate_path + intermediate_terminal_path[1:]
else:
best_path = initial_intermediate_path + intermediate_terminal_path[1:]
return best_path
def pathfinder(initial_code, terminal_code, valid_codes):
path = pathfinder_helper(initial_code, terminal_code, valid_codes - {initial_code, terminal_code})
if path:
return ''.join([path[0]] + [code[-1] for code in path[1:]])
print("Case 0:", pathfinder("AAA", "AAA", {"AAA"}))
print("Case 1:", pathfinder("AAA", "ZZZ", {"AAA", "AAZ", "AZZ", "ZZZ"}))
print("Case 2:", pathfinder("AAA", "ZZZ", {"AAA", "AAZ", "AZZ", "ZZZ", "AAB", "ABB", "BBB", "BBZ", "BZZ", "ZZZ"}))
print("Case 3:", pathfinder("AAA", "ZZZ", {"AAA", "ZZZ"}))
print("Case 4:", pathfinder("AAA", "ZZZ", {"AAA", "AAB", "ABZ", "BZZ", "AAY", "AYZ", "YZZ", "ZZZ"}))
print("Case 5:", pathfinder("AAA", "AAA", {"AAA", "ABA", "AAB", "BAA"}))
print("Case 6:", pathfinder("AAA", "AAA", {"AAA", "ABA"}))
print("Case 7:", pathfinder("ISL", "ERI", {"AFG", "AHO", "AIA", "ALB", "ALG", "AND", "ANG", "ANT", "ARG", "ARM", "ARU", "ASA", "AUS", "AUT", "AZE", "BAH", "BAN", "BAR", "BDI", "BEL", "BEN", "BER", "BHU", "BIH", "BIZ", "BLR", "BOL", "BOT", "BRA", "BRN", "BRU", "BUL", "BUR", "CAF", "CAM", "CAN", "CAY", "CGO", "CHA", "CHI", "CHN", "CIV", "CMR", "COD", "COK", "COL", "COM", "CPV", "CRC", "CRO", "CUB", "CYP", "CZE", "DEN", "DJI", "DMA", "DOM", "ECU", "EGY", "ERI", "ESA", "ESP", "EST", "ETH", "FAR", "FGU", "FIJ", "FIN", "FLK", "FPO", "FRA", "FSM", "GAB", "GAM", "GBR", "GBS", "GEO", "GEQ", "GER", "GHA", "GIB", "GRE", "GRL", "GRN", "GUA", "GUD", "GUI", "GUM", "GUY", "HAI", "HEL", "HKG", "HON", "HUN", "INA", "IND", "IRI", "IRL", "IRQ", "ISL", "ISR", "ISV", "ITA", "IVB", "JAM", "JOR", "JPN", "KAZ", "KEN", "KGZ", "KIR", "KOR", "KSA", "KUW", "LAO", "LAT", "LBA", "LBR", "LCA", "LES", "LIB", "LIE", "LTU", "LUX", "MAC", "MAD", "MAR", "MAS", "MAW", "MAY", "MDA", "MDV", "MEX", "MGL", "MGO", "MKD", "MLI", "MLT", "MNT", "MON", "MOZ", "MRI", "MRT", "MSH", "MTN", "MYA", "NAM", "NCA", "NCD", "NED", "NEP", "NFI", "NGR", "NIG", "NIU", "NMA", "NOR", "NRU", "NZL", "OMA", "PAK", "PAN", "PAR", "PER", "PHI", "PLE", "PLW", "PNG", "POL", "POR", "PRK", "PUR", "QAT", "REU", "ROU", "RSA", "RUS", "RWA", "SAM", "SEN", "SEY", "SIN", "SKN", "SLE", "SLO", "SMR", "SOL", "SOM", "SPM", "SRB", "SRI", "STP", "SUD", "SUI", "SUR", "SVK", "SWE", "SWZ", "SYR", "TAN", "TGA", "THA", "TJK", "TKM", "TKS", "TLS", "TOG", "TPE", "TTO", "TUN", "TUR", "TUV", "UAE", "UGA", "UKR", "URU", "USA", "UZB", "VAN", "VEN", "VIE", "VIN", "WAF", "YEM", "ZAM", "ZIM"}))
print("Case 8:", pathfinder("USA", "USA", {"ABW", "AFG", "AGO", "AIA", "ALA", "ALB", "AND", "ARE", "ARG", "ARM", "ASM", "ATA", "ATF", "ATG", "AUS", "AUT", "AZE", "BDI", "BEL", "BEN", "BES", "BFA", "BGD", "BGR", "BHR", "BHS", "BIH", "BLM", "BLR", "BLZ", "BMU", "BOL", "BRA", "BRB", "BRN", "BTN", "BVT", "BWA", "CAF", "CAN", "CCK", "CHE", "CHL", "CHN", "CIV", "CMR", "COD", "COG", "COK", "COL", "COM", "CPV", "CRI", "CUB", "CUW", "CXR", "CYM", "CYP", "CZE", "DEU", "DJI", "DMA", "DNK", "DOM", "DZA", "ECU", "EGY", "ERI", "ESH", "ESP", "EST", "ETH", "FIN", "FJI", "FLK", "FRA", "FRO", "FSM", "GAB", "GBR", "GEO", "GGY", "GHA", "GIB", "GIN", "GLP", "GMB", "GNB", "GNQ", "GRC", "GRD", "GRL", "GTM", "GUF", "GUM", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN", "IDN", "IMN", "IND", "IOT", "IRL", "IRN", "IRQ", "ISL", "ISR", "ITA", "JAM", "JEY", "JOR", "JPN", "KAZ", "KEN", "KGZ", "KHM", "KIR", "KNA", "KOR", "KWT", "LAO", "LBN", "LBR", "LBY", "LCA", "LIE", "LKA", "LSO", "LTU", "LUX", "LVA", "MAC", "MAF", "MAR", "MCO", "MDA", "MDG", "MDV", "MEX", "MHL", "MKD", "MLI", "MLT", "MMR", "MNE", "MNG", "MNP", "MOZ", "MRT", "MSR", "MTQ", "MUS", "MWI", "MYS", "MYT", "NAM", "NCL", "NER", "NFK", "NGA", "NIC", "NIU", "NLD", "NOR", "NPL", "NRU", "NZL", "OMN", "PAK", "PAN", "PCN", "PER", "PHL", "PLW", "PNG", "POL", "PRI", "PRK", "PRT", "PRY", "PSE", "PYF", "QAT", "REU", "ROU", "RUS", "RWA", "SAU", "SDN", "SEN", "SGP", "SGS", "SHN", "SJM", "SLB", "SLE", "SLV", "SMR", "SOM", "SPM", "SRB", "SSD", "STP", "SUR", "SVK", "SVN", "SWE", "SWZ", "SXM", "SYC", "SYR", "TCA", "TCD", "TGO", "THA", "TJK", "TKL", "TKM", "TLS", "TON", "TTO", "TUN", "TUR", "TUV", "TWN", "TZA", "UGA", "UKR", "UMI", "URY", "USA", "UZB", "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF", "WSM", "YEM", "ZAF", "ZMB", "ZWE"}))