Hai con đường rẽ vào một khúc gỗ màu vàng (phần 3)


10

Lưu ý: Điều này dựa trên Hai con đường được chuyển hướng trong gỗ màu vàng (phần 2) , một thử thách trước đây của tôi. Vì sự phổ biến của câu hỏi đó và Hai con đường rẽ vào một khúc gỗ màu vàng (phần 1) , tôi muốn làm một phần ba. Nhưng 2 cái đầu tiên quá dễ dàng ( câu trả lời 2 byte cho lần đầu tiên, câu trả lời 15 byte cho lần thứ hai.) Vì vậy, tôi đã làm một cái gì đó phức tạp hơn ...

Nguồn cảm hứng

Thử thách này được lấy cảm hứng từ bài thơ nổi tiếng của Robert Frost, Con đường chưa đi :

Hai con đường rẽ vào một khúc gỗ màu vàng,
Và xin lỗi tôi không thể đi cả hai
Và là một du khách, tôi đứng đó
và nhìn xuống một cách xa nhất có thể
đến nơi mà nó bị bẻ cong;

... 2 đoạn được cắt tỉa ...

Tôi sẽ nói điều này với một tiếng thở dài Ở
đâu đó và mọi lứa tuổi: Do đó,
hai con đường rẽ vào một khúc gỗ, và tôi -
tôi đã đi một con đường ít đi qua,
và điều đó đã tạo nên sự khác biệt.

Lưu ý dòng thứ hai đến dòng cuối cùng , I took the one less traveled by,.

Câu chuyện hậu trường

Bạn được giao nhiệm vụ giúp đỡ một nhà thám hiểm mù đang đi trên đường và được truyền cảm hứng từ The Road Not Taken . Nhà thám hiểm đang tiếp cận một ngã ba trên đường và muốn đi theo con đường ít người đi qua. Bạn phải tìm nơi thám hiểm thực sự và nói với nhà thám hiểm nơi để rẽ.

Các thách thức

Mục tiêu của bạn là tìm ra con đường ít người đi nhất trên bản đồ của bạn, nơi con đường rẽ nhánh. Bản đồ của bạn là một chuỗi chứa các dòng mới (hoặc \n, nếu bạn thích) và có chiều rộng và chiều cao không xác định. Trong bản đồ, đường được tạo thành từ các chữ số 0 đến 9 , giao lộ được tạo thành #s. Bạn phải tìm con đường bạn đang đi và ra khỏi những con đường khác mà con đường đi qua nhiều nhất và con đường ít người đi qua cho nhà thám hiểm mù của bạn. Bản đồ trong rừng được thể hiện bằng một khoảng trống. Đây là một bản đồ đơn giản:

2   2
 1 0 
  #  
  2  
  2  

Bản đồ này rộng 5 và cao 5. Chú ý đường rẽ nhánh theo hình chữ Y. Chữ Y có thể được định hướng theo bất kỳ cách nào, vì vậy bạn phải có khả năng hiểu bản đồ "xoay".

#nghĩa là gì

Trường hợp bản đồ sẽ có a #. Điều này không ảnh hưởng đến điểm số của bất kỳ con đường.

Những con số thực sự có nghĩa là gì

Mỗi đường dẫn (một dòng số, có thể có một khúc cua trong đó) có một điểm. Điểm của một đường dẫn được xác định bằng cách thêm các chữ số của nó, vì vậy, trong ví dụ đầu tiên, đường dẫn đầu tiên (từ phía trên bên trái, theo chiều kim đồng hồ) có điểm 2 + 1 = 3, lần thứ hai có 2 + 0 = 2 và lần thứ ba có 2 + 2 = 4. Đường có thể chứa các số được kết nối theo đường chéo.

Tìm bạn đang ở đâu

Bạn đang trên con đường có số điểm cao nhất. Hai con đường khác là con đường đi qua nhiều hơn và con đường ít đi qua. Bạn cần tìm con đường có số điểm thấp nhất .

Nói cho khách du lịch của bạn đi đâu

Bạn phải nói với khách du lịch của bạn đi "trái" hoặc "phải". Hãy nhớ rằng chỉ đường là từ quan điểm của khách du lịch của bạn (anh ấy đang đối mặt với ngã ba.)

Bản đồ ví dụ

  14
9#  
  04

Đầu ra: "đúng" (khách du lịch đang ở 9đường, 0 + 4 <1 + 4

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

Đầu ra: "trái" (khách du lịch đang ở trên 99999đường, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Đầu ra: "đúng" (khách du lịch đang ở 98765đường, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Đầu ra: "đúng" (khách du lịch đang ở 4422đường, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Đầu ra "trái" (khách du lịch đang ở trên 999đường, 8 + 8 + 8> 7 + 7 + 7

Những điều cần biết:

  • Bản đồ sẽ được đệm bằng các khoảng trắng để làm cho mỗi dòng có cùng độ dài.
  • Bạn phải xuất ra STDOUT / console / file chuỗi lefthoặc right, tùy ý theo sau là một dòng mới.
  • Bạn phải lấy đầu vào là một chuỗi chứa dòng mới, \ns hoặc một mảng / danh sách các dòng (mỗi dòng là một chuỗi). Trong đó đầu vào được đặt phải là một hàm, đối số dòng lệnh, tệp hoặc STDIN một dòng tại một thời điểm hoặc tương tự. Một biến không phải là một thiết bị đầu vào có thể chấp nhận (trừ khi nó là một tham số hàm.) Tương tự, các biểu thức hàm trong JS và các ngôn ngữ khác phải được gán cho một biến.
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!
  • Sơ hở tiêu chuẩn bị cấm

Những điều bạn có thể giả định

  • Đầu vào của bạn sẽ hợp lệ. Không có gì như thế này sẽ được kiểm tra:
0 0 0
 0 0
  #
 0 0
  • Điểm số của Paths sẽ không bao giờ bị ràng buộc.
  • Đầu vào có thể có chiều dài hoặc chiều cao bất kỳ, nhỏ hơn giới hạn chuỗi của ngôn ngữ của bạn.
  • Sẽ luôn có ít nhất 1 khoảng trắng giữa 2 đường dẫn.
  • Đường dẫn có thể có khúc cua, khúc cua, v.v ... Đây là những con đường, không phải đường cao tốc.

Có câu hỏi nào không? Hãy hỏi tôi dưới đây trong các ý kiến ​​và chơi golf vui vẻ!


Sẽ #luôn luôn ở trung tâm theo chiều ngang?
David Archibald

12
Tôi nghĩ rằng đã đến lúc để bạn sử dụng Sandbox . Và có thể tìm thấy một số cảm hứng mới. Với tốc độ này, cảm giác giống như bạn đang quảng cáo một bài thơ hơn là tạo ra một chuỗi thử thách thú vị. Đặc biệt là vì bạn đăng bài thơ ngoại trừ trong mỗi người. Chúng tôi đã nhìn thấy nó từ cái đầu tiên, thế là đủ.
mbomb007

4
Nhìn. Tôi đã thích các thử thách của bạn, nhưng chỉ cần thêm một số khó khăn sau đó đăng 3 mà không chấp nhận một trong pt 2 là quá nhanh. Một chỉnh sửa thành 2 sẽ đủ tốt cho sự thay đổi xoay nhẹ , đầu ra tuyệt đối, v.v.
David Archibald

2
Đó là một thử thách rất khác so với những lần trước và tôi thích nó ... Chúng ta có thể lấy hình chữ Y như được cấp (một đường luôn luôn kết thúc ở một cạnh và hai đường còn lại ở cạnh đối diện), phải không?
dnep

1
@dep Có bạn nói đúng.
lập trình

Câu trả lời:


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

Ung dung

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

Hãy thử trực tuyến!


Chúc mừng bạn đã là người trả lời đầu tiên! Bạn có thể giành chiến thắng này ... Bạn có thể liên kết với D không?
lập trình

2

Python 2, 304 byte

Dùng thử trực tuyến

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]

Chương trình này suy ra hướng của các con đường và xoay nó hướng lên để sử dụng giải pháp của tôi từ phần 2 của thử thách này.


Bị đánh bại bởi 2 byte! Nói về bực bội!
caird coinheringaahing

@ user00001 đó là lý do tại sao tôi khóc rất nhiều
Dead Possum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.