Sarı ahşapta iki yol ayrıldı (bölüm 3)


10

Not: Bu, daha önceki bir sorunum olan sarı ahşapta (bölüm 2) ayrılmış iki yola dayanmaktadır . Bu sorunun popülaritesi ve sarı ahşapta (yol 1) iki yol ayrıldığı için üçüncüsünü yapmak istedim. Ama ilk 2 çok kolay (bir vardı 2 bayt ilk on cevap, ikinci bir 15 bayt cevap.) Bu yüzden daha karmaşık bir şey yaptı ...

İlham

Bu zorluğun ilham kaynağı Robert Frost'un ünlü şiiri The Get Not Road :

Sarı bir ağaçta iki yol ayrıldı,
Ve üzgünüm ben de seyahat edemedim
Ve bir gezgin olmak, uzun süre durdum
Ve olabildiğince bir aşağı baktı
Bir yerde çalılar bükülmüş nereye;

... 2 paragraf kesilmiş ...

Bunu bir nefesle söyleyeceğim
Bir yerlerde yaşlar ve çağlar bundan dolayı:
İki yol bir ormanda saptı ve ben -
daha az seyahat edileni aldım,
Ve bu tüm farkı yarattı.

Son satırdan son satıra dikkat edin I took the one less traveled by,.

Backstory

Bir yolda yürüyen ve Alınan Yol'dan esinlenen kör bir maceracıya yardım etmek için görevlendirildiniz . Maceracı yolda bir çatala yaklaşıyor ve daha az seyahat edilen yolu almak istiyor. Maceracının gerçekte nerede olduğunu bulmalı ve maceracıya nereye döneceğini söylemelisin.

Meydan okuma

Amacınız, haritanızda en az gidilen yolu yolun çatallandığı yer bulmaktır. Haritanız yeni satırlar içeren (veya \nisterseniz) bir dizedir ve genişliği ve yüksekliği bilinmemektedir. Haritada yollar 0-9 arasındaki rakamlardan , kavşak ise #s. Şu anda bulunduğunuz yolu ve en çok seyahat ettiği yoldan ve kör maceracı için daha az gidilen yolu bulmalısınız. Haritanızdaki ormanlar bir boşlukla temsil edilir. İşte basit bir harita:

2   2
 1 0 
  #  
  2  
  2  

Bu harita 5 geniş ve 5 boyunda. Yolun Y şeklinde nasıl çatallandığına dikkat edin. Y herhangi bir şekilde yönlendirilmiş olabilir, bu nedenle "döndürülmüş" bir haritayı anlayabilmeniz gerekir.

Ne #demek

Haritanın çatallandığı yerde bir #. Bu herhangi bir yolun puanını etkilemez.

Sayılar aslında ne anlama geliyor?

Her yolun (bir sayı çizgisi, içinde bir bükülme olabilir) bir puanı vardır. Bir yolun puanı, rakamlarının toplanmasıyla belirlenir, bu nedenle ilk örnek için ilk yolun (soldan, saat yönünde) 2 + 1 = 3 puanı, ikincisinin 2 + 0 = 2 ve üçüncü yolu 2 + 2 = 4. Yollar çapraz olarak bağlanmış sayılar içerebilir.

Nerede olduğunuzu bulma

En yüksek puanı alan yoldasın. Diğer 2 yol ise daha çok gidilen yol ve daha az gidilen yol. En düşük puana sahip yolu bulmanız gerekiyor .

Yolcunuza nereye gideceğini söyleme

Yolcunuza "sola" veya "sağa" gitmesini söylemelisiniz. Yol tariflerinin gezgininizin bakış açısından olduğunu unutmayın (çatala dönük.)

Örnek haritalar

  14
9#  
  04

Çıktı: "sağ" (gezgin 9yola çıktı, 0 + 4 <1 + 4

  9  
  9  
  9  
  9  
  9  
  #  
 8 8 
 8 8 
88 88
8   7

Çıktı: "sol" (gezgin 99999yolda, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Çıktı: "sağ" (gezgin 98765yolda, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Çıktı: "sağ" (gezgin 4422yolda, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Çıktı "sol" (gezgin 999yola çıktı, 8 + 8 + 8> 7 + 7 + 7

Bilmeniz gerekenler:

  • Haritalar, her satırı aynı uzunlukta yapmak için boşluklarla doldurulur.
  • Dizeyi STDOUT / console / file leftya da rightisteğe bağlı olarak sondaki bir yeni satır izlemeniz gerekir.
  • Girdiyi, yeni satırlar, \ns veya bir dizi / satır listesi içeren bir dize olarak almalısınız (her satır bir dizedir). Bu girişin koyulduğu yerde bir fonksiyon, komut satırı argümanı, dosya veya STDIN her seferinde bir satır veya benzeri olmalıdır. Bir değişken kabul edilebilir bir giriş cihazı değildir (bir işlev parametresi değilse.) Benzer şekilde, JS ve diğer dillerdeki işlev ifadeleri bir değişkene atanmalıdır.
  • Bu , bu yüzden bayt en kısa cevap kazanır!
  • Standart boşluklar yasaktır

Varsayabileceğiniz şeyler

  • Girişiniz geçerli olacak. Bunun gibi hiçbir şey aşağıdakiler için test edilmeyecektir:
0 0 0
 0 0
  #
 0 0
  • Yolların puanları hiçbir zaman bağlanmayacaktır.
  • Giriş, dilinizin dize sınırından daha düşük herhangi bir genişlikte veya yükseklikte olabilir.
  • 2 yol arasında her zaman en az 1 boşluk olacaktır.
  • Yolların kıvrımları, dönüşleri vb. Olabilir. Bunlar karayolları değil, yollardır.

Sorunuz mu var? Aşağıdaki yorumlar ve mutlu golf bana sor!


Will #her zaman yatay merkezinde olmak?
David Archibald

12
Sanırım Sandbox'ı kullanmanın zamanı geldi . Ve belki de yeni ilhamlar bulabilirsin. Bu oranda, ilginç bir meydan okuma serisi oluşturmaktan ziyade bir şiiri tanıtıyor gibi hissediyorsunuz. Özellikle şiiri yayınladığınızdan beri her biri hariç. İlkinden zaten gördük, bu yeterli.
mbomb007

4
Bak. Zorluklarınızı beğendim, ancak pt 2'de bir tane bile kabul etmeden 3 gönderip göndermek biraz zor. 2'ye yapılan bir düzenleme , dönme, mutlak çıktı ve benzeri küçük değişiklikler için yeterince iyi olacaktır .
David Archibald

2
Bu öncekilerden çok farklı bir meydan okuma ve hoşuma gitti ... Y şeklini verilmiş gibi alabiliriz (bir yol her zaman bir kenarda ve diğer iki seçim kenarında), değil mi?
17'de dnep

1
@dnep Evet haklısın.
programcı5000

Yanıtlar:


4

D , 348 321 312 302 bayt

import std.stdio,std.algorithm,std.regex,std.range;void h(R,U)(R s,U r){U[2]c;foreach(L;s.map!(a=>a.array.split)){U l=L.length-1;r>1?r=l^r-2:0;l?c[]+=l*L.map!sum.array[]:c;}write(c[r]>c[!r]?"right":"left");}void main(){auto s=stdin.byLineCopy.array;!s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);}

Ungolfed

import std.stdio,std.algorithm,std.regex,std.range;

void h(R,U)(R s, U reverse) {
    U[2] counts;
    /* Now that all paths are up/down, every line we need to count up has
       precisely two space-delimited parts to sum up. */
    foreach (line; s.map!(a=>a.array.split)) {
        U len = line.length - 1;
        reverse > 1 ? reverse = len ^ reverse - 2 : 0;
        len ? counts[] += len * line.map!sum.array[] : counts;
    }

    /* Switch left/right as needed based on our orientation */
    write(counts[reverse] > counts[!reverse] ? "right" : "left");
}

void main() {
    /* Treat the input as a matrix of integers */
    auto s = stdin.byLineCopy.array;

    /* If moving left/right intead of up/down, transpose */
    !s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);
}

Çevrimiçi deneyin!


İlk cevap verdiğin için tebrikler! Bunu kazanabilirsin ... D'ye bağlayabilir misin?
programmer5000

2

Python 2, 304 bayt

Çevrimiçi deneyin

A=input()
S=str(A)[2:-2].replace("', '",'')
i=S.index('#')
r=len(A[0])
w=1
a=i/r
if' '<S[i-r]:w=-w;A=A[::w];a=len(A)+~a
if' '<S[i+1]:A=zip(*A[::-1]);a=i%r
if' '<S[i-1]:A=zip(*A)[::-1];a=len(A)-i%r-1
s=0
for c in' '.join(map(''.join,A[0:a])).split():s+=sum(map(int,c));s=-s
print['left','right'][::w][s>0]

Bu program, yolların yönünü saptar ve bu zorluğun 2. bölümündeki çözümümü kullanmak için yukarı doğru döndürür.


2 bayt tarafından dövüldü! Sinir bozucu hakkında konuşun!
caird coinheringaahing

@ user00001 bu yüzden çok ağlıyorum
Dead Possum
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.