Ülke Kodu Dönüşümleri


13

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"}))

3
PPCG'ye hoş geldiniz! bu bir meydan okuma için iyi bir fikirdir ve birincisi için iyi tanımlanmıştır. Bir meydan okuma hakkında şüpheleriniz varsa (veya yapmasanız bile), geri bildirim almak için onu sanal alana gönderebilirsiniz, böylece unutulmaya veya kapatılmaya başlamaz. Umarım sitede vakit geçirirsiniz!
Giuseppe

8
Ülke kodları, beni eve götür, ait olduğum yere
12Me21

@Giuseppe, geri bildiriminiz için teşekkürler. Emin olmadığım tek şey çıktı biçimini açıkça nasıl ifade edeceğimi anlayamıyorum bir şekilde inşa edilmiş bir dize olarak belirtmekti (umarım test senaryoları netleştirmesine rağmen). Doğrudan [RUS, ABD, SAM] olarak çıktıya izin vermek daha iyi olabilir, ancak mevcut sürüm aslında ailemle oynadıkça oyunla eşleşir (ancak en kısa, en uzun değil). Çıktıyı daha esnek hale getirmem gerektiğini mi düşünüyorsunuz yoksa olduğu gibi iyi mi düşünüyorsunuz?
Steven Jackson

Güzel bir meydan okuma ama 2 işaretçi: Girişiniz çok uzun soluklu ve büyük ölçüde meydan okumayla ilgisiz - lütfen düzenlemeyi düşünün. Giriş doğrulaması genellikle iyi gitmez; Her zaman geçerli bir yol olacağını garanti etmenizi öneririm. Siteye hoş geldiniz :)
Shaggy

2
@ChasBrown İyi Nokta. Bu kısıtı tamamen kaldıracağım. Sahip olduğum orijinal uzun soluklu tanıtımla daha mantıklıydı, ancak saf bir teknik açıdan çok fazla gerekçe yok ve bence "kötü deterministik" den "iyi deterministik" i yargılamak istemiyorum
Steven Jackson

Yanıtlar:


2

Jöle , 29 bayt

ḟŒPŒ!€Ẏ;ṙ-ɗ€Ḋ⁼Ṗ}ɗƝẠ$ƇLÞṪ;Ṫ}¥/

Çevrimiçi deneyin!

Golf, ancak ülke kodu setinin tüm güç setlerinin tüm kombinasyonlarını üreten verimsiz cevap, başlangıç ​​ve bitiş eksi ve sonra hangilerinin kurallara uyduğunu kontrol eder. Sol argüman olarak kod kümesini ve sağ argümanını sona erdiren ve bu sırayla başlayan ikili bir bağlantı. Yol yoksa 0 döndürür. Aksi takdirde, en uzun yolu ve birden fazla varsa, giriş kümesinin sırasına göre belirlenen son yolu döndürür.

Jöle , 42 43 bayt

ṭ@Ɱ⁵ḟṖ⁼¥Ƈ0ị$Ḋ$ƲßẎ;W)
ÇẎ0ị$Ḋ⁼⁴Ṗ¤ƲƇLÞṪṭ@;Ṫ}¥/

Çevrimiçi deneyin!

Üç argüman alan tam bir program: iç içe bir listede başlangıç ​​ülkesi, son ülke ve ülke kodları listesi. Ülke kodlarının listesinin tersi ile belirlenen sıralama düzeniyle varsa, en uzun yolun Jelly dizesini döndürür. Geçerli bir yol yoksa, geri dönüşler ve 0ardından hedefin son harfi gelir. Yinelemeli olarak çalışır ve daha uzun vakaları nispeten verimli bir şekilde işler.


2

Retina , 108 bayt

+/(?m:^.*\b((..).)(?!.*\1).*\2$)/_L$`\b(..)(.)(?!.*\1\2)(?=.*\1$)
$=$2
mL$`(...),(\w*\1)\w*$
$2
N$^`
$.&
1G`

Çevrimiçi deneyin! Bağlantı test paketini içerir. Giriş setini, terminali, ilk girişi alır. Açıklama: Tüm olası yolları oluşturarak, hedefi içerenlere filtre uygulayarak ve en uzun yolu alarak çalışır. Açıklama:

+

Hiçbir şey yapamayana kadar komutu tekrarlayın (çünkü daha fazla eşleşme yok).

/(?m:^.*\b((..).)(?!.*\1).*\2$)/_

Sadece zinciri uzatılabilen hatlarda çalışın.

L$`\b(..)(.)(?!.*\1\2)(?=.*\1$)
$=$2

Tüm olası zincirleri listeleyin.

mL$`(...),(\w*\1)\w*$
$2

Terminali içeren tüm zincirleri listeleyin (terminalin uzunluğuna kadar kesin).

N$^`
$.&

Artan uzunluk sırasına göre sıralayın, ardından listeyi ters çevirin.

1G`

İlkini al. Beraberlik durumunda, en son üretilen kazanır; eğer set sözlükbilimsel sıradaysa, bu sözlükbilimsel sıradadır.


2

Python 2 , 119 bayt

def f(s,e,c):
 r=max([s[0]+f(p,e,c-{p})for p in c-{s}if s[1:]==p[:2]]+[e]*(s==e)+['!'],key=len)
 return[r,'!']['!'in r]

Çevrimiçi deneyin!

Ülke kodlarını bir dizi olarak alır; en uzun yolu veya !böyle bir yol yoksa döndürür .


2

JavaScript (ES6), 106 bayt

Girişi alır (terminal)(initial,[array of codes]). Çözüm yoksa döndürür .0

(t,S=0)=>g=(s,a,r=s)=>S=a.map(w=>s[0]+w==s+w[2]&w!=s&&g(w,a.filter(s=>s!=w),r+w[2]))|s!=t||S[r.length]?S:r

Çevrimiçi deneyin!

Yorumlananlar

(t, S = 0) =>         // t = terminal code; S = best string, initialized to 0
  g = (               // g is a recursive function taking:
    s,                //   s   = previous code (or initial code on the first call)
    a,                //   a[] = array of codes
    r = s             //   r   = current result string, initialized to the first code
  ) =>                //
    S =               // this code will eventually update S
    a.map(w =>        // for each word w in a[]:
      s[0] + w ==     //   the test w[0] + w[1] == s[1] + s[2] can also be processed
      s + w[2]        //   as s[0] + (w[0] + w[1]) + w[2] == s[0] + (s[1] + s[2]) + w[2]
      &               //   and therefore as s[0] + w == s + w[2]
      w != s &&       //   if the above test is true and w is not equal to s:
      g(              //   do a recursive call to g:
        w,            //     use w as the previous code
        a.filter(s => //     using a[], create a new array:
          s != w      //       where w is removed
        ),            //     end of filter()
        r + w[2]      //     append w[2] to r
      )               //   end of recursive call
    ) |               // end of map()
    s != t ||         // if s is not equal to t
    S[r.length] ?     // or S is longer than r:
      S               //   leave S unchanged
    :                 // else:
      r               //   update it to r

0

Haskell, 102 95 bayt

import Data.Lists
f l u@(s:t)e=argmax(1<$)$"":[e|e==u]++[s:f(l\\[w])w e|w<-l,t==take 2w,u/=w]

Yol yoksa boş bir dize döndürür.

As Data.ListsTIO yüklü değildir, ben tanımını sağlıyorum argmax. Hala aktarıyorum Data.Listiçin \\bir byte daha az TIO puanlarına kod böylece. [Çevrimiçi deneyin!] Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.