Dwie drogi rozdzieliły się w żółtym lesie (część 3)

10

Uwaga: Opiera się to na dwóch drogach podzielonych na żółte drewno (część 2) , które było moim wcześniejszym wyzwaniem. Ze względu na popularność tego pytania i dwie drogi rozbieżne w żółtym lesie (część 1) , chciałem zrobić trzecią. Ale pierwsze 2 były zbyt łatwe (odpowiedź 2-bajtowa na pierwszym, odpowiedź 15-bajtowa na drugim.) Zrobiłem więc coś bardziej złożonego ...

Inspiracja

Wyzwanie to inspirowane jest słynnym wierszem Roberta Frosta „ Droga nie podjęta” :

Dwie drogi rozchodziły się w żółtym lesie.
I przepraszam, że nie mogłem podróżować obaj
I być jednym podróżnikiem, długo stałem
I patrzyłem w dół jak najdalej,
do miejsca, gdzie zakrzywiał się w zaroślach;

... przycięte 2 akapity ...

Będę opowiadać z westchnieniem
Gdzieś wieki i wieki stąd:
Dwie drogi rozchyliły się w lesie, a ja -
wziąłem tę mniej uczęszczaną,
i to zrobiło różnicę.

Zauważ przedostatniej linii I took the one less traveled by,.

Historia

Zostałeś przydzielony do pomocy niewidomemu poszukiwaczowi przygód, który idzie drogą, i zainspirował cię Droga nie zabrana . Poszukiwacz przygód zbliża się do rozwidlenia drogi i chciałby wybrać mniej uczęszczaną ścieżkę. Musisz znaleźć, gdzie naprawdę jest poszukiwacz przygód i powiedzieć poszukiwaczowi, gdzie ma się zwrócić.

Wyzwanie

Twoim celem jest znalezienie na mapie drogi, po której najmniej przebyłeś, w miejscu, w którym rozwidla się droga. Twoja mapa jest ciągiem zawierającym znaki nowej linii (lub \n, jeśli wolisz) i ma nieznaną szerokość i wysokość. Na mapie drogi składają się z cyfr od 0 do 9 , skrzyżowanie z #s. Musisz znaleźć drogę, na której aktualnie się znajdujesz, a spośród pozostałych dróg drogę, którą najczęściej podróżowałeś, oraz drogę, którą mniej podróżowałeś dla niewidomych poszukiwaczy przygód. Lasy na twojej mapie są reprezentowane przez spację. Oto prosta mapa:

2   2
 1 0 
  #  
  2  
  2  

Ta mapa ma 5 szerokości i 5 wysokości. Zwróć uwagę, jak droga rozwidla się w kształcie litery Y. Y może być zorientowany w dowolny sposób, więc musisz być w stanie zrozumieć „obróconą” mapę.

Co #znaczy

Tam, gdzie rozwidla się mapa, będzie #. Nie wpływa to na wynik żadnej ścieżki.

Co tak naprawdę oznaczają liczby

Każda ścieżka (linia liczb, może mieć zakręt) ma wynik. Wynik ścieżki jest określany poprzez zsumowanie jej cyfr, więc w pierwszym przykładzie pierwsza ścieżka (od lewego górnego rogu, zgodnie z ruchem wskazówek zegara) ma wynik 2 + 1 = 3, druga ma 2 + 0 = 2, a trzecia ma 2 + 2 = 4. Drogi mogą zawierać numery połączone po przekątnej.

Znalezienie gdzie jesteś

Jesteś na ścieżce z najwyższym wynikiem. Pozostałe 2 ścieżki to droga, po której częściej się porusza, i droga, którą mniej się jeździ. Musisz znaleźć drogę z najniższym wynikiem.

Informowanie podróżnika, gdzie się udać

Musisz powiedzieć podróżnemu, aby poszedł „w lewo” lub „w prawo”. Pamiętaj, że wskazówki są z punktu widzenia podróżnika (jest skierowany w stronę widelca).

Przykładowe mapy

  14
9#  
  04

Wyjście: „w prawo” (podróżny jest na 9drodze, 0 + 4 <1 + 4

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

Wyjście: „w lewo” (podróżny jest na 99999drodze, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Wyjście: „w prawo” (podróżny jest na 98765drodze, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Wyjście: „w prawo” (podróżny jest na 4422drodze, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Wyjście „w lewo” (podróżny jest na 999drodze, 8 + 8 + 8> 7 + 7 + 7

Rzeczy, które należy wiedzieć:

  • Mapy zostaną wypełnione spacjami, aby każda linia miała taką samą długość.
  • Musisz wyprowadzić do STDOUT / console / file ciąg znaków leftlub right, opcjonalnie, po którym następuje końcowy znak nowej linii.
  • Musisz wziąć dane wejściowe jako ciąg zawierający znaki nowej linii, \ns lub tablicę / listę linii (każda linia jest łańcuchem). Tam, gdzie wprowadzane są dane wejściowe, musi być funkcja, argument wiersza poleceń, plik lub STDIN, jeden wiersz na raz lub podobny. Zmienna nie jest akceptowalnym urządzeniem wejściowym (chyba że jest parametrem funkcji). Podobnie, wyrażenia funkcyjne w JS i innych językach muszą być przypisane do zmiennej.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach!
  • Standardowe luki zabronione

Rzeczy, które możesz założyć

  • Twój wkład będzie ważny. Nic takiego nie będzie testowane pod kątem:
0 0 0
 0 0
  #
 0 0
  • Wyniki ścieżek nigdy nie zostaną powiązane.
  • Dane wejściowe mogą mieć dowolną długość, szerokość lub wysokość, mniejszą niż limit napisów w Twoim języku.
  • Zawsze będzie co najmniej 1 spacja między 2 ścieżkami.
  • Ścieżki mogą mieć zakręty, zakręty itp. Są to drogi, a nie autostrady.

Jakieś pytania? Zapytaj mnie poniżej w komentarzach i życzę udanej gry w golfa!

programmer5000
źródło
Czy #zawsze będzie w centrum poziomo?
David Archibald
12
Myślę, że nadszedł czas, abyś użył piaskownicy . I może znajdź jakieś nowe inspiracje. W tym tempie bardziej przypominasz promowanie wiersza niż tworzenie ciekawej serii wyzwań. Zwłaszcza, że ​​piszesz wiersz z wyjątkiem każdego. Widzieliśmy to już od pierwszego, wystarczy.
mbomb007
4
Popatrz. Podobały mi się twoje wyzwania, ale po prostu dodanie trochę trudności, a następnie opublikowanie 3 bez nawet akceptowania jednego z pt 2 jest po prostu zbyt szybkie. Zmiana na 2 byłaby wystarczająca do niewielkiej zmiany obrotu, wydajności bezwzględnej i tak dalej.
David Archibald
2
Jest to zupełnie inne wyzwanie od poprzednich i podoba mi się ... Możemy przyjąć kształt Y jako przyznany (jedna ścieżka zawsze kończy się na jednej krawędzi, a dwie pozostałe na przeciwnej krawędzi), prawda?
dnep
1
@dnep Tak masz rację.
programista

Odpowiedzi:

4

D , 348 321 312 302 bajtów

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

Nie golfił

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

Wypróbuj online!

Promień
źródło
Gratulujemy bycia pierwszym odpowiadającym! Możesz wygrać ten ... Czy możesz połączyć się z D?
programista
2

Python 2, 304 bajty

Wypróbuj 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]

Ten program określa kierunek dróg i obraca je przodem do góry, aby wykorzystać moje rozwiązanie z części 2 tego wyzwania.

Dead Possum
źródło
Pobity przez 2 bajty! Mów o frustracji!
caird coinheringaahing
@ user00001 dlatego bardzo płaczę
Dead Possum