Orman yolu


9

Senin sonra felaket kano yolculuğu , sen nehir aktığı sonunda bir şelale düşen sona erdi. Kano patladı, ama patlamada hayatta kalmayı başardın. Bununla birlikte, nehir yolculuğunuz tamamen haritadan çıktı - şimdi bir ormanın ortasında kendinizi kaybettiniz. Neyse ki, programlama becerileriniz hala var, bu yüzden ormanda yolunuzu bulmanıza yardımcı olmak için bir ağacın yanına bir program yapmaya karar veriyorsunuz. Bununla birlikte, ağaç üzerinde çok fazla yüzey alanı yoktur, bu nedenle programınızı mümkün olduğunca kısa hale getirmelisiniz.

Orman olarak tarif edilebilir ntarafından n( n > 5sadece küçük harfler oluşacak karakter) kare a-z. Örnek bir orman:

anehcienwlndm
baneiryeivown
bnabncmxlriru
anhahirrnrauc
riwuafuvocvnc
riwnbaueibnxz
hyirorairener
ruwiiwuauawoe
qnnvcizdaiehr
iefyioeorauvi
quoeuroenraib
cuivoaisdfuae
efoiebnxmcsua

Bu ormanda, asol üst köşeden sağ alt köşeye doğru çapraz bir karakter satırı olduğunu fark etmiş olabilirsiniz . Bu, ormanı takip ederseniz sizi bir yere götürecek bir "yoldur". Göreviniz tekil yolu bulan bir program yazmaktır. Şimdi bu meydan okumayı neyin “yol” u çağrıştırdığını daha ayrıntılı olarak anlatacağım.

Bu meydan okumadaki bir "yol", bir Bresenham algoritması ile oluşturulmuş olabilecek , ancak aşağıdakileri içeren gereksinimlerle benzer bir çizgi olarak tanımlanır :

  • Satır en az 6 karakter uzunluğunda olmalıdır
  • Satırdaki her bir doğrusal (tamamen bitişik) karakter grubu aynı uzunlukta olmalıdır .
  • Ormanın bir kenarında başlayacak ve karşı kenarda sona erecek ( ayrıntılandırma için buradaki yorumuma bakın)

İkinci gereksinimi daha açık bir şekilde açıklamak için aşağıdaki satırı göz önünde bulundurun:

aaa
   aaa
      aaa
         aaa
            aaa

Bu satır, her biri tam olarak üç karakter uzunluğunda olan karakterlerin ortak doğrusal "segmentlerinden" oluşur. Bir yol olarak nitelendirilir. Şimdi bu satırı düşünün:

a
 aa
   a
    aa
      a
       aa

Bu satır, karakterlerin tam olarak aynı uzunlukta olmayan (bazıları 1 karakter uzunluğunda ve bazıları 2) olan doğrusal doğrusal "parçalardan" oluşur. Böylece, bu bir yol olarak nitelendirilmez.

Ormanın bir haritası verilen programınız, yolda kullanılan karakterleri tanımlar. Girdi uygun olan şeydir (örn. Komut satırı argümanı, STDIN prompt(), vb.). Bir değişkene önceden başlatılamaz. Girişin ilk kısmı n, ormanın boyutunu temsil eden tek bir tamsayıdır (orman her zaman bir karedir). Bundan sonra bir boşluk ve daha sonra tek bir dize olarak tüm orman. Örneğin, örnek orman bir girdi olarak şu şekilde sunulacaktır:

13  anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua

Bunun çıktısı:

a

çünkü yol harf kullanılarak oluşturulur a. Ormanda sadece bir yol olacak. Bu kod golf, bu yüzden en düşük karakter sayısı kazanır. Sorularınız varsa yorumlarda sorun.


Birden çok yol varsa ne olur?
Eric Tressler

@EricTressler Herhangi bir ormanda yalnızca bir yol olacaktır. Bunu belirtmek için özellikleri düzenleyeceğim.
Absinthe

Yol mektubu, yola ait olmadığı başka bir yerde kullanılabilir mi?
Martin Ender

Örnek orman muhtemelen bunu içerir. Örnek ormandaki bu satırdaki ilk a anhahirrnrauc yolunun bir parçası değil
Spade

@ MartinBüttner Evet. Fakat hiçbir zaman aynı mektuptan yapılmış iki yol olmayacaklar.
Absinthe

Yanıtlar:


3

APL (Dyalog 14) (70)

⎕ML←3⋄Z/⍨1=≢¨Z←∪¨(↓⍉F),(↓F),{(⍳≢⍵)⌷¨↓⍵}¨(⊂F),⊂⌽F←⊃{⍵⍴⍨2/⍎⍺}/I⊂⍨' '≠I←⍞

Açıklama:

  • ⎕ML←3: Set MLiçin 3anlamı, onun APL2 anlamı vardır.
  • I←⍞: klavyeden bir satır oku ve kaydet I
  • I⊂⍨' '≠I: Iboşluklarda bölün
  • {... }/: bu işlevi sonuçta elde edilen iki dizeye uygular:
    • 2/⍎⍺: sol argümanı değerlendirin ve matris boyutunu vererek iki kez çoğaltın
    • ⍵⍴⍨: bu boyutu kullanarak doğru argümanı biçimlendirin
  • F←⊃: kutusundan çıkarın ve saklayın F.
  • {(⍳≢⍵)⌷¨↓⍵}¨(⊂F),⊂⌽F: köşegenleri alın: her iki satırdan Fve ⌽F(dikey olarak yansıtılmış F) her satırdan, X sütunundaki değeri alın; burada X, satır numarasıdır
  • (↓⍉F),(↓F),: satır ve sütunlarını alın F
  • Z←∪¨: her satır, sütun ve köşegendeki benzersiz değerleri bulup saklayın Z.

'Orman' dikdörtgen olduğundan, geçerli bir yol varsa, bunlardan biri yol karakteri olan sadece bir karakterden oluşacağı anlamına gelir, yani:

  • Z/⍨1=≢¨Z: bu alt dizileri Zsadece bir unsuru olanlardan al .

Bu, geçerli tüm yollar için karakterleri görüntüler, ancak önemli olmayan tek bir tane olması gerektiğinden.


4

Lua - 506 380 - bayt

İyi düşünülmüş mücadeleniz için herhangi bir başvuru almadığınız için çok kötü hissettim, bu yüzden birlikte attım. Yolun verdiğiniz bilgilerden ayırt edilmesi gereken minimum ayırt edici özelliklerden çıkarak eğlenceliydi. Umarım doğru yaptım ... VE doğru şekilde uyguladım.

a=io.read"*l"n=a:match("%d+")+0 m=a:match"[a-z]+"o=""for i=1,n do for k=1,n^2,n do o=o..m:sub(i+k-1,i+k-1)end end q={m,o}for g=1,n^2 do for u=1,2 do l=q[u]:sub(g,g)for r=1,n do i=1 t=0 e=0 while i do s,e=q[u]:find(l:rep(r),e+1)if s then x=s-(e-s)-i-1 print(s,i,r,n,r)if x==n or x==n-2 or t==0 then t=t+1 i=s end else i=nil end end if t*r==n then print(l)os.exit()end end end end

Şunlarla test edilebilir:

lua divisorPath.lua "input"

Eğer vahşi bir meydan okuyucu ortaya çıkarsa, değerine göre kodumu golf oynamaya çalışacağım.

Güncelleme : üzerimizde yükseleceklerin onuruna golf. Ben varken ben sağdan sola giden tanınmış yolu kodumu düzeltmek zorunda kaldı. Hata.


3

MATLAB - 270 karakter

Aşağıda, xorman dizesini bağımsız değişken olarak kabul eden ve belirtilen kurallara tabi orman içinden geçerli "yolu" temsil eden karakteri döndüren bir işlev tanımlanır .

function F=x(s),A=sscanf(s,'%d%s');n=A(1);A=reshape(A(2:end),n,n);for c=A(:)',B=A==c;for i=1:n,if~mod(n,i),C=[kron(eye(i),ones(n/i,1)),zeros(n,n-i)];for j=0:n-i,f=@(B)sum(sum(B&circshift(C,[0,j]))==n;D=fliplr(B);if f(B)|f(B')|f(D)|f(D'),F=char(c);end;end;end;end;end;end

Küçültülmemiş sürüm

function F = x(s)
    A = sscanf( s, '%d %s' );
    n = A(1);
    A = reshape( A(2:end), n,n );
    for c = A(:)'
        B = A==c;
        for i = 1:n
            if ~mod( n, i )
                C = [kron( eye(i), ones( n/i,1 ) ), zeros( n,n-i )];
                for j = 0:n-i
                    f = @(B) sum(sum( B & circshift( C, [0 j] ))) == n;
                    D = fliplr(B);
                    if f(B) | f(B') | f(D) | f(D')
                        F = char(c);
                    end
                end
            end
        end
    end
end

Temel dayanak, olası her geçerli yol için bir boole maskesi oluşturmak ve matristeki dizin işlevi herhangi bir maskeyi kapsayan herhangi bir karakteri döndürmektir. Bunu yapmak için sadece dikey veya yukarıdan aşağıya ters eğik çizgi şeklinde maskeler oluşturulur, ancak orman matrisi dört yönelimde de karşılaştırılır: kimlik, ters çevrilmiş, 90 ° döndürülmüş, 90 ° döndürülmüş döndürülmüş.

İşlev herhangi biri için çalışır n. Komut satırında çağrılmasının bir örneği

x('13 anehcienwlndmbaneiryeivownbnabncmxlriruanhahirrnraucriwuafuvocvncriwnbaueibnxzhyirorairenerruwiiwuauawoeqnnvcizdaiehriefyioeorauviquoeuroenraibcuivoaisdfuaeefoiebnxmcsua')

ans =

    a

3

Python - 384 325 275

Bu Algoritma temel olarak matrisin ilk ve son satırını eşleşen karakterleri kontrol eder ve ardından her bir satır segmentinin uzunluğunu hesaplar

012345
------
aaVaaa|0
aaVaaa|1
aaaVaa|2
aaaVaa|3
aaaaVa|4
aaaaVa|5

Yukarıdaki Örnekte:
İlk satırdaki V, dizin 2'de, son satırdaki dizin 4'teki V'dir.
Bu nedenle, her bir satır segmentinin uzunluğu n = (6) ile n / (4-2) +1 = 2 olur. .

Daha sonra hattın geçerli olup olmadığını kontrol eder.

Soldan sağa bir yol bulmak için satırları sütunlarla değiştirir ve aynı şeyi tekrar yapar.

Düzenleme: Tamamen 270 alamıyorum (Lanet olsun Python ve lanet girinti !!)

n,m=raw_input().split()
n,r=int(n),range
t=r(n)
a=[m[i:i+n]for i in r(0,n*n,n)]
for v in a,["".join([a[i][j]for i in t])for j in t]:
 for i in t:
  for j in t:
   p=1-2*(j-i<0);d,c=p*(j-i)+1,v[0][i]
   if 6<=sum([v[z][i+(z/(n/d))*p*(n%d==0)]==c for z in t])==n:print c;exit()
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.