Zwei Straßen gingen in einem gelben Wald auseinander (Teil 3)

10

Hinweis: Dies basiert auf zwei Straßen, die in einem gelben Wald auseinanderlaufen (Teil 2) , eine frühere Herausforderung von mir. Wegen der Popularität dieser Frage und der Tatsache, dass zwei Straßen in einem gelben Wald auseinander gingen (Teil 1) , wollte ich eine dritte machen. Aber die ersten 2 waren zu einfach (eine 2-Byte- Antwort auf die erste, eine 15-Byte-Antwort auf die zweite). Also habe ich etwas komplexeres gemacht ...

Die Inspiration

Diese Herausforderung ist inspiriert von Robert Frosts berühmtem Gedicht The Road Not Taken :

Zwei Straßen gingen in einem gelben Wald auseinander,
und es tat mir leid, dass ich nicht beide fahren konnte.
Und ich war ein Reisender, lange stand ich
und schaute eine so weit ich konnte hinunter, bis
sie sich im Unterholz bog.

... 2 Absätze gekürzt ...

Ich werde dies mit einem Seufzer erzählen.
Irgendwo in Ewigkeit:
Zwei Straßen gingen in einem Wald auseinander, und ich -
ich nahm die weniger befahrene,
und das hat den Unterschied ausgemacht.

Beachten Sie die vorletzte Zeile I took the one less traveled by,.

Die Hintergrundgeschichte

Sie wurden beauftragt, einem blinden Abenteurer zu helfen, der auf einer Straße läuft und von The Road Not Taken inspiriert wurde . Der Abenteurer nähert sich einer Weggabelung und möchte den weniger befahrenen Weg nehmen. Sie müssen herausfinden, wo sich der Abenteurer tatsächlich befindet, und dem Abenteurer mitteilen, wohin er sich wenden soll.

Die Herausforderung

Ihr Ziel ist es, die am wenigsten befahrene Straße auf Ihrer Karte zu finden, auf der sich die Straße teilt. Ihre Karte ist eine Zeichenfolge mit Zeilenumbrüchen (oder \n, wenn Sie dies bevorzugen) und hat eine unbekannte Breite und Höhe. In der Karte bestehen Straßen aus den Ziffern 0 bis 9 , die Kreuzung aus #s. Sie müssen die Straße finden, auf der Sie sich gerade befinden, und von den anderen Straßen die Straße, auf der am meisten gefahren wird, und die Straße, auf der Ihr blinder Abenteurer weniger fährt. Wälder in Ihrer Karte werden durch ein Leerzeichen dargestellt. Hier ist eine einfache Karte:

2   2
 1 0 
  #  
  2  
  2  

Diese Karte ist 5 breit und 5 groß. Beachten Sie, wie sich die Straße in Y-Form teilt. Das Y kann beliebig ausgerichtet sein, daher müssen Sie in der Lage sein, eine "gedrehte" Karte zu verstehen.

Was #bedeutet das ?

Wo sich die Karte gabelt, wird es eine geben #. Dies hat keinen Einfluss auf die Punktzahl eines Pfades.

Was die Zahlen eigentlich bedeuten

Jeder Pfad (eine Zahlenreihe, die möglicherweise eine Biegung aufweist) hat eine Punktzahl. Die Punktzahl eines Pfades wird durch Addition seiner Ziffern bestimmt. Für das erste Beispiel hat der erste Pfad (von links oben im Uhrzeigersinn) eine Punktzahl von 2 + 1 = 3, der zweite 2 + 0 = 2 und der dritte hat 2 + 2 = 4. Straßen können diagonal verbundene Nummern enthalten.

Finden, wo Sie sind

Sie befinden sich auf dem Weg mit der höchsten Punktzahl. Die anderen beiden Pfade sind die Straße, die mehr befahren wird, und die Straße, die weniger befahren wird. Sie müssen die Straße mit der niedrigsten Punktzahl finden.

Sagen Sie Ihrem Reisenden, wohin er gehen soll

Sie müssen Ihrem Reisenden sagen, dass er "links" oder "rechts" gehen soll. Denken Sie daran, dass die Anweisungen aus der Sicht Ihres Reisenden sind (er steht vor der Gabelung).

Beispielkarten

  14
9#  
  04

Ausgabe: "rechts" (Reisender ist an der 9Straße, 0 + 4 <1 + 4

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

Ausgabe: "links" (Reisender ist auf der 99999Straße, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Ausgabe: "rechts" (Reisender ist auf der 98765Straße, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Ausgabe: "rechts" (Reisender ist an der 4422Straße, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Ausgabe "links" (Reisender ist an der 999Straße, 8 + 8 + 8> 7 + 7 + 7

Was Sie wissen sollten:

  • Karten werden mit Leerzeichen aufgefüllt, damit jede Zeile dieselbe Länge hat.
  • Sie müssen die Zeichenfolge leftoder rightoptional gefolgt von einem nachgestellten Zeilenumbruch an STDOUT / console / file ausgeben.
  • Sie müssen die Eingabe entweder als Zeichenfolge mit Zeilenumbrüchen, \ns oder als Array / Liste von Zeilen annehmen (jede Zeile ist eine Zeichenfolge). Wo diese Eingabe eingegeben wird, muss eine Funktion, ein Befehlszeilenargument, eine Datei oder STDIN zeilenweise oder ähnlich sein. Eine Variable ist kein akzeptables Eingabegerät (es sei denn, es handelt sich um einen Funktionsparameter). Ebenso müssen Funktionsausdrücke in JS und anderen Sprachen einer Variablen zugewiesen werden.
  • Dies ist , also gewinnt die kürzeste Antwort in Bytes!
  • Standardlücken verboten

Dinge, die Sie annehmen können

  • Ihre Eingabe ist gültig. Nichts davon wird getestet auf:
0 0 0
 0 0
  #
 0 0
  • Die Punktzahlen der Pfade werden niemals gebunden.
  • Die Eingabe kann eine beliebige Länge in Breite oder Höhe haben, die unter dem Zeichenfolgenlimit Ihrer Sprache liegt.
  • Zwischen den beiden Pfaden befindet sich immer mindestens ein Leerzeichen.
  • Wege können Kurven, Kurven usw. haben. Dies sind Straßen, keine Autobahnen.

Haben Sie Fragen? Fragen Sie mich unten in den Kommentaren und viel Spaß beim Golfen!

programmer5000
quelle
Wird das #immer horizontal in der Mitte sein?
David Archibald
12
Ich denke, es ist Zeit für dich, die Sandbox zu benutzen . Und vielleicht neue Inspiration finden. Bei dieser Geschwindigkeit fühlt es sich eher so an, als würden Sie ein Gedicht bewerben, als eine interessante Herausforderungsserie zu erstellen. Zumal du das Gedicht außer in jedem postest. Wir haben es schon vom ersten gesehen, das ist genug.
mbomb007
4
Aussehen. Ich habe Ihre Herausforderungen gemocht, aber es ist einfach zu schnell, einfach einige Schwierigkeiten hinzuzufügen und dann 3 zu veröffentlichen, ohne eine in Punkt 2 zu akzeptieren. Eine Bearbeitung auf 2 wäre gut genug für die leichte Änderung der Drehung, der absoluten Ausgabe und so weiter.
David Archibald
2
Es ist eine ganz andere Herausforderung als die vorherigen und ich mag es ... Wir können die Y-Form als selbstverständlich annehmen (ein Pfad endet immer an einer Kante und die anderen beiden an der gegenüberliegenden Kante), richtig?
Dnep
1
@dnep Ja du hast recht.
Programmierer5000

Antworten:

4

D , 348 321 312 302 Bytes

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

Probieren Sie es online aus!

Strahl
quelle
Herzlichen Glückwunsch zum ersten Antwortenden! Sie könnten diesen gewinnen ... Können Sie auf D verlinken?
Programmierer5000
2

Python 2, 304 Bytes

Probieren Sie es online aus

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]

Dieses Programm leitet die Richtung der Straßen ab und dreht sie nach oben, um meine Lösung aus Teil 2 dieser Herausforderung zu verwenden.

Totes Opossum
quelle
Von 2 Bytes geschlagen! Sprechen Sie über frustrierend!
Caird Coinheringaahing
@ user00001 deshalb weine ich viel
Dead Possum