Kelime grafiğinin çapını bulma


13

Giriş

Popüler bir kelime bulmaca, sadece bir harf yerine geçen ve her zaman geçerli bir kelime ile sonuçlanan bir dizi adımla bir kelimeyi diğerine dönüştürmektir. Örneğin, BAG beş aşamalı bir yolla DOG'a dönüştürülebilir:

ÇANTA -> BAT -> KEDİ -> KOT -> COG -> KÖPEK

Bu durumda daha kısa yollar da vardır; Örneğin:

ÇANTA -> BOG -> KÖPEK

Biri, köşeleri kelimelerle etiketlenmiş bir grafik çizmişse, bir harfle farklılık gösteren herhangi bir kelime çifti arasında bir kenar varsa, "BAG" ile "DOG" arasındaki en kısa yol iki kenardan oluşur.

Meydan okuma

Bir yol boyunca adımlar olarak görülebilen tüm izin verilen kelimeleri temsil eden, aynı uzunlukta kelimelerin "sözlüğünü" girdi olarak alan bir program yazmalısınız. En az bir "en uzun en kısa yol" yani iki kelimeden oluşan bir yol çıkmalıdır:

  • bu iki kelime arasındaki herhangi bir yoldan daha uzun değildir;

  • en azından listedeki başka bir çift kelime arasındaki en kısa yol.

Yukarıda tarif edilen grafik bağlamında, böyle bir yolun uzunluğu grafiğin çapıdır .

Giriş kelimelerinden hiçbirinin diğerlerinden herhangi birine dönüştürülemediği dejenere durumda, sıfır uzunluklu en az bir yol, yani tek bir kelime çıktılayın.

Örnekler

  • Girdi ["torba", "yarasa", "kedi", "karyola", "nokta", "köpek"], en kısa yol " bu sözlük içinde çanta "to" köpek "ulaşılabilir en uzun, beş adımdır.

  • Giriş "" torba "," yarasa "," bot "," kedi "," karyola "," nokta "," köpek "]" çanta, yarasa, bot, nokta, köpek "ve / veya ters.

  • Giriş "" kod "," golf "," erkek "," buzz "," köstebek "," rol "," kalıp "," soğuk "," altın "," mod "]" kod "arasında bir yol vermelidir ve "golf".

  • Giriş "" bir "," iki "," altı "," on "] kenarsız bir grafiğe karşılık gelir, bu nedenle bir veya daha fazla tek sözcüklü (sıfır uzunluklu) yol çıktısı alın.

  • Giriş eşit olmayan uzunlukta iki sözcük içeriyorsa, çıktı tanımsızdır.

kurallar

  • Standart kod golf kuralları geçerlidir
  • Birden çok "en kısa" yol olacaktır. En az bir çıktı almanız gerekir, ancak istediğiniz kadar çıktı almakta serbestsiniz.
  • Giriş sözlüğünün programınıza nasıl aktarılacağına karar vermekte özgürsünüz.
  • Bayt cinsinden en kısa kod kazanır.

3
Birkaç test örneği daha eklemek ister misiniz?
Jonah

Bitti. Ayrıca grafiğin kenar içermediği durum hakkında tartışma eklendi.
jnfnt


Boş bir girişi kabul etmeli miyiz (cevap []ya olur [[]])?
Outgolfer Erik

Davranışların boş girdilerde tanımsız olmasından dolayı mutluyum.
jnfnt

Yanıtlar:



3

APL (Dyalog Klasik) , 84 80 77 76 74 66 61 bayt

{⍵⌷⍨{⍵,⍨⊃⍋(1a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/⊃⍸a=d←⌈/512|,a←⌊.+⍨⍣≡9*⍨2⌊⍵+.≠⍉⍵}

Çevrimiçi deneyin!

girdi ve çıktı karakter matrisleridir

⍵+.≠⍉⍵ kelimeler arasındaki çarpma benzeri mesafeler matrisi

9*⍨2⌊0'ları ve 1'leri olduğu gibi bırakın, 2+ değerini büyük bir sayıya çevirin (512 = 2 9 , "∞" olarak kullanılır)

⌊.+⍨⍣≡ floyd & warshall 'ın en kısa yol algoritması

  • ⌊.+matris çarpımı gibi ama sırasıyla min( ) kullanarak ve +yerine +ve×

  • sol ve sağda aynı matrisi kullanın

  • ⍣≡ yakınsamaya kadar tekrarla

d←⌈/512|, atanmış en uzun ("∞" değil) yolun uzunluğu d

⊃⍸a=hangi iki düğümü bağlar, onlara i ve j diyelim

{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/ yolu yeniden yapılandır

  • { }⍣d/{ }fonksiyon dzamanlarını değerlendirir . sol arg her zaman i . doğru arg j olarak başlar ve yavaş yavaş yolun iç düğümlerini biriktirir

  • (1≠a⌷⍨⊃⍵),⍪⍺⌷a bu iki vektörün 2 sütunlu bir matrisini oluşturun:

    • 1≠a⌷⍨⊃⍵ hangi düğümlerin 1 ile 1 arasındaki mesafede olduğunu belirten booleans (0 veya 1)

    • ⍺⌷a tüm grafik düğümlerinin mesafeleri

  • ⊃⍋ sözlükbilimsel olarak en küçük satırın dizini

  • ⍵,⍨ başına

⍵⌷⍨ orijinal kelimeleri yolla dizine ekler


2

Python 3 , 225 bayt

from itertools import*
def f(a):b=[((p[0],p[-1]),(len(p),p))for i in range(len(a))for p in permutations(a,i+1)if all(sum(q!=r for q,r in zip(*x))<2for x in zip(p,p[1:]))];return max(min(r for q,r in b if x==q)for x,y in b)[1]

Çevrimiçi deneyin!

Temel olarak, tüm olası yolları kullanın, sadece geçerli olanları koruyun, ardından her başlangıç-bitiş kombinasyonundan geçin, minimum yol mesafesini bulun ve maksimumunu bulun.



1

JavaScript (ES6),  195  194 bayt

İade [optimal_length, [optimal_path]].

f=(a,p=[],w=o=[],l=0)=>Object.values(o,o[k=[w,p[0]]]=(o[k]||0)[0]<l?o[k]:[l,p],a.map((v,i)=>w+w&&[...v].map((c,i)=>s-=c!=w[i],s=1)|s||f(a.filter(_=>i--),[...p,v],v,l+1))).sort(([a],[b])=>b-a)[0]

Çevrimiçi deneyin!

Nasıl?

fÖw0w1[l,p]pw0w1l

plwpÖ

o[k = [w, p[0]]] = (o[k] || 0)[0] < l ? o[k] : [l, p]

Ö

Object.values(o).sort(([a], [b]) => b - a)[0]

(bu kod her özyineleme derinliğinde yürütülür, ancak yalnızca kök düzeyi gerçekten önemlidir)

vw

[...v].map((c, i) => s -= c != w[i], s = 1) | s

v

f(                    //
  a.filter(_ => i--), // remove the i-th word from a[]
  [...p, v],          // append v to p[]
  v,                  // pass v as the last word
  l + 1               // increment the length of the path
)                     //


0

Python 3, 228 bayt.

def G(w):
    D={A+B:[A,B]if sum(a!=b for a,b in zip(A,B))<2else[0,0]*len(w)for A in w for B in w}
    for k in w:
        for i in w:
            for j in w:
                p=D[i+k]+D[k+j][1:]
                if len(p)<len(D[i+j]):D[i+j]=p
    return max(D.values(),key=len)

Tüm çiftler için en kısa yollar için Floyd-Warshall algoritmasını uygular, ardından bulunan yollar üzerinde maksimum değeri alır.

Bu uygulamadaki karakterlerden 16'sı talihsiz sekmelerdir :(


2
Olay kenarı olmayan bir tepe noktası mevcut olduğunda bu kırılıyor gibi görünmektedir, örneğin, "baskı G (['torba', 'yarasa', 'karyola'])"
jnfnt

Python girintisi için golf ipucu: ilk seviye için bir boşluk, ikinci için bir sekme, üçüncü için bir sekme ve bir boşluk, dördüncü için iki sekme vb.
Peter Taylor

1
@PeterTaylor İyi ipucu, ancak yalnızca Python 2 için çalışır. Python 3, sekmeleri boşluklarla karıştırmaya izin vermez.
OOBalance

1
Ah, iyi yakalama @jnfnt. Şimdi düşünüyorum, sadece grafik bağlı olduğunda çalışır.
rikhavshah
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.