Dua jalan bercabang di kayu kuning (bagian 3)

10

Catatan: Ini didasarkan pada Dua jalan yang menyimpang dari kayu kuning (bagian 2) , tantangan tambang sebelumnya. Karena popularitas pertanyaan itu dan Dua jalan menyimpang dalam kayu kuning (bagian 1) , saya ingin membuat yang ketiga. Tetapi 2 yang pertama terlalu mudah ( jawaban 2-byte pada yang pertama, jawaban 15-byte pada yang kedua.) Jadi saya membuat sesuatu yang lebih kompleks ...

Inspirasi

Tantangan ini terinspirasi oleh puisi terkenal Robert Frost, The Road Not Taken :

Dua jalan bercabang di kayu kuning,
Dan maaf aku tidak bisa melakukan perjalanan keduanya.
Dan menjadi seorang musafir, lama aku berdiri
Dan melihat ke bawah sejauh yang aku bisa
Ke tempat itu membungkuk di semak-semak;

... 2 paragraf dipangkas ...

Saya akan mengatakan ini dengan menghela nafas
Di suatu tempat berabad-abad karena itu:
Dua jalan menyimpang di hutan, dan saya -
saya mengambil satu yang kurang dilalui oleh,
Dan itu telah membuat semua perbedaan.

Perhatikan baris kedua hingga terakhir I took the one less traveled by,,.

Latar belakang

Anda ditugaskan untuk membantu seorang petualang buta yang berjalan di jalan dan terinspirasi oleh The Road Not Taken . Petualang itu mendekati persimpangan jalan dan ingin mengambil jalan setapak yang jarang dilalui. Anda harus menemukan di mana petualang sebenarnya dan memberi tahu petualang ke mana harus berpaling.

Tantangan

Tujuan Anda adalah untuk menemukan jalan yang paling jarang dilalui oleh peta Anda di mana jalan bercabang. Peta Anda adalah string yang berisi baris baru (atau \n, jika Anda mau) dan memiliki lebar dan tinggi yang tidak diketahui. Di peta, jalan terdiri dari angka 0 hingga 9 , persimpangan dibuat dari #s. Anda harus menemukan jalan saat ini, dan keluar dari jalan lain yang paling sering dilalui, dan jalan yang jarang dilalui oleh petualang buta Anda. Hutan di peta Anda diwakili oleh spasi. Ini adalah peta sederhana:

2   2
 1 0 
  #  
  2  
  2  

Peta ini 5 lebar dan 5 tinggi. Perhatikan bagaimana jalan bercabang dalam bentuk Y. Y dapat diorientasikan dengan cara apa pun, jadi Anda harus dapat memahami peta yang "diputar".

Apa #artinya

Di mana garpu peta akan ada #. Ini tidak memengaruhi skor jalur mana pun.

Apa sebenarnya angka-angka itu

Setiap jalur (garis angka, mungkin memiliki tikungan di dalamnya) memiliki skor. Skor jalur ditentukan dengan menjumlahkan digitnya, jadi untuk contoh pertama, jalur pertama (dari kiri atas, searah jarum jam) memiliki skor 2 + 1 = 3, yang kedua memiliki 2 + 0 = 2, dan yang ketiga memiliki 2 + 2 = 4. Jalan mungkin mengandung angka yang terhubung secara diagonal.

Menemukan di mana Anda berada

Anda berada di jalur dengan skor tertinggi. 2 jalur lainnya adalah jalan yang lebih sering dilalui, dan jalan yang jarang dilalui. Anda harus menemukan jalan dengan skor terendah .

Memberitahu traveler Anda ke mana harus pergi

Anda harus memberi tahu wisatawan Anda untuk pergi "kiri" atau "kanan". Ingatlah bahwa arah dari sudut pandang traveler Anda (dia menghadap ke persimpangan.)

Contoh peta

  14
9#  
  04

Output: "benar" (traveler ada di 9jalan, 0 + 4 <1 + 4

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

Output: "kiri" (traveler ada di 99999jalan, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Output: "benar" (traveler ada di 98765jalan, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Output: "benar" (traveler ada di 4422jalan, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Keluaran "kiri" (traveler ada di 999jalan, 8 + 8 + 8> 7 + 7 + 7

Hal-hal yang perlu diketahui:

  • Peta akan diisi dengan spasi untuk membuat setiap garis memiliki panjang yang sama.
  • Anda harus output ke STDOUT / konsol / file string leftatau right, opsional diikuti oleh baris baru.
  • Anda harus mengambil input baik sebagai string yang berisi baris baru, \ns, atau array / daftar baris (setiap baris adalah string). Di mana input yang diletakkan harus berupa fungsi, argumen baris perintah, file, atau STDIN satu baris pada satu waktu atau serupa. Variabel bukan perangkat input yang dapat diterima (kecuali itu adalah parameter fungsi.) Demikian juga, ekspresi fungsi dalam JS dan bahasa lain harus ditetapkan ke variabel.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang!
  • Celah standar dilarang

Hal-hal yang dapat Anda asumsikan

  • Masukan Anda akan valid. Tidak ada yang seperti ini yang akan diuji untuk:
0 0 0
 0 0
  #
 0 0
  • Skor Paths tidak akan pernah terikat.
  • Input dapat berupa panjang atau lebar apa pun, kurang dari batas string bahasa Anda.
  • Akan selalu ada setidaknya 1 ruang antara 2 jalur.
  • Jalan mungkin memiliki tikungan, belokan, dll. Ini adalah jalan, bukan jalan raya.

Ada pertanyaan? Tanyakan saya di bawah ini di komentar dan senang bermain golf!

programmer5000
sumber
Akankah #selalu berada di tengah secara horizontal?
David Archibald
12
Saya pikir sudah waktunya bagi Anda untuk menggunakan Sandbox . Dan mungkin menemukan inspirasi baru. Pada tingkat ini, rasanya lebih seperti Anda mempromosikan puisi daripada membuat seri tantangan yang menarik. Terutama karena Anda memposting puisi kecuali di setiap puisi. Kami sudah melihatnya dari yang pertama, itu sudah cukup.
mbomb007
4
Lihat. Saya menyukai tantangan Anda, tetapi hanya menambahkan beberapa kesulitan kemudian memposting 3 bahkan tanpa menerima satu di pt 2 terlalu cepat. Hasil edit ke 2 akan cukup baik untuk sedikit perubahan rotasi, output absolut dan sebagainya.
David Archibald
2
Ini adalah tantangan yang sangat berbeda dari yang sebelumnya dan saya menyukainya ... Kita dapat mengambil bentuk Y seperti yang diberikan (satu jalur selalu berakhir di satu sisi dan dua lainnya di sisi yang berlawanan), kan?
dnep
1
@tidak Ya Anda benar.
programmer5000

Jawaban:

4

D , 348 321 312 302 byte

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

Tidak disatukan

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

Cobalah online!

sinar
sumber
Selamat menjadi penjawab pertama! Anda mungkin memenangkan yang ini ... Bisakah Anda menautkan ke D?
programmer5000
2

Python 2, 304 byte

Cobalah online

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]

Program ini menyimpulkan arah jalan dan memutarnya menghadap ke atas untuk menggunakan solusi saya dari bagian 2 dari tantangan ini.

Possum Mati
sumber
Dipukul 2 byte! Bicara tentang frustasi!
caird coinheringaahing
@ user00001 itu sebabnya saya menangis banyak
Dead Possum