Dos caminos divergieron en un bosque amarillo (parte 3)

10

Nota: Esto se basa en dos caminos divergidos en un bosque amarillo (parte 2) , un desafío previo mío. Debido a la popularidad de esa pregunta y dos caminos divergieron en un bosque amarillo (parte 1) , quería hacer un tercero. Pero los primeros 2 fueron demasiado fáciles (una respuesta de 2 bytes en el primero, una respuesta de 15 bytes en el segundo). Así que hice algo más complejo ...

La inspiración

Este desafío está inspirado en el famoso poema de Robert Frost, The Road Not Taken :

Dos caminos se bifurcaban en un bosque amarillo,
y lo siento, no podía viajar a la vez
y ser un viajero, me quedé parado
y miré hacia abajo lo más lejos que pude
hacia donde se doblaba en la maleza;

... 2 párrafos recortados ...

Voy a decir esto con un suspiro
En algún lugar de siglos en adelante:
dos caminos divergieron en un bosque, y yo
... tomé el menos transitado,
y eso ha marcado la diferencia.

Observe la penúltima línea I took the one less traveled by,,.

La historia de fondo

Te asignaron para ayudar a un aventurero ciego que camina por una carretera y se inspiró en The Road Not Taken . El aventurero se está acercando a una bifurcación en el camino y le gustaría tomar el camino menos transitado. Debes encontrar dónde está realmente el aventurero y decirle al aventurero a quién recurrir.

El reto

Su objetivo es encontrar el camino menos transitado en su mapa donde el camino se bifurca. Su mapa es una cadena que contiene nuevas líneas (o \n, si lo prefiere) y tiene un ancho y alto desconocidos. En el mapa, las carreteras están formadas por dígitos del 0 al 9 , la intersección está formada por #s. Debe encontrar el camino en el que se encuentra actualmente, y fuera de los otros caminos, el camino más transitado y el camino menos transitado por su aventurero ciego. Woods en tu mapa está representado por un espacio. Aquí hay un mapa simple:

2   2
 1 0 
  #  
  2  
  2  

Este mapa tiene 5 de ancho y 5 de alto. Observe cómo la carretera se bifurca en forma de Y. La Y puede estar orientada de cualquier manera, por lo que debe poder entender un mapa "girado".

Que #significa

Donde el mapa se bifurca, habrá un #. Esto no afecta la puntuación de ninguna ruta.

¿Qué significan realmente los números?

Cada ruta (una línea de números, puede tener una curva) tiene una puntuación. La puntuación de una ruta se determina sumando sus dígitos, por lo que para el primer ejemplo, la primera ruta (desde la esquina superior izquierda, en el sentido de las agujas del reloj) tiene una puntuación de 2 + 1 = 3, la segunda tiene 2 + 0 = 2 y la tercera tiene 2 + 2 = 4. Las carreteras pueden contener números conectados en diagonal.

Encontrar donde estás

Estás en el camino con la puntuación más alta. Los otros 2 caminos son el camino más transitado y el camino menos transitado. Necesitas encontrar el camino con la puntuación más baja.

Decirle a tu viajero a dónde ir

Debe decirle a su viajero que vaya "izquierda" o "derecha". Tenga en cuenta que las instrucciones son desde el punto de vista de su viajero (él está de frente al tenedor).

Mapas de ejemplo

  14
9#  
  04

Salida: "derecha" (el viajero está en la 9carretera, 0 + 4 <1 + 4

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

Salida: "izquierda" (el viajero está en el 99999camino, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Salida: "derecha" (el viajero está en la 98765carretera, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Salida: "derecha" (el viajero está en la 4422carretera, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Salida "izquierda" (el viajero está en la 999carretera, 8 + 8 + 8> 7 + 7 + 7

Cosas para saber:

  • Los mapas se rellenarán con espacios para que cada línea tenga la misma longitud.
  • Debe enviar a STDOUT / console / file la cadena lefto right, opcionalmente, seguido de una nueva línea final.
  • Debe tomar la entrada como una cadena que contiene nuevas líneas, \ns, o una matriz / lista de líneas (cada línea es una cadena). Donde se coloca esa entrada debe ser una función, argumento de línea de comando, archivo o STDIN una línea a la vez o similar. Una variable no es un dispositivo de entrada aceptable (a menos que sea un parámetro de función). Del mismo modo, las expresiones de función en JS y otros lenguajes deben asignarse a una variable.
  • Este es el , por lo que gana la respuesta más corta en bytes.
  • Lagunas estándar prohibidas

Cosas que puedes asumir

  • Su aporte será válido. Nada como esto será probado para:
0 0 0
 0 0
  # #
 0 0
  • Los puntajes de los caminos nunca estarán empatados.
  • La entrada puede ser de cualquier longitud en ancho o alto, menor que el límite de cadena de su idioma.
  • Siempre habrá al menos 1 espacio entre las 2 rutas.
  • Los caminos pueden tener curvas, giros, etc. Estos son caminos, no autopistas.

¿Tiene alguna pregunta? ¡Pregúntame a continuación en los comentarios y feliz golf!

programador 5000
fuente
¿Estará #siempre en el centro horizontalmente?
David Archibald
12
Creo que es hora de que uses Sandbox . Y tal vez encuentre alguna inspiración nueva. A este ritmo, se siente más como si estuvieras promoviendo un poema que creando una interesante serie de desafíos. Especialmente porque publicas el poema, excepto en todos. Ya lo hemos visto desde el primero, eso es suficiente.
mbomb007
44
Mira. Me han gustado tus desafíos, pero simplemente agregar un poco de dificultad y luego publicar 3 sin siquiera aceptar uno en el pt 2 es demasiado rápido. Una edición a 2 sería lo suficientemente buena para el ligero cambio de rotación, salida absoluta, etc.
David Archibald
2
Es un desafío muy diferente de los anteriores y me gusta ... Podemos tomar la forma de Y como está garantizado (un camino siempre termina en un borde y los otros dos en el borde de elección), ¿verdad?
dnep
1
@dnep Sí, tienes razón.
programador

Respuestas:

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

Sin golf

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

Pruébalo en línea!

Rayo
fuente
¡Felicitaciones por ser el primer respondedor! Podrías ganar este ... ¿Puedes vincular a D?
programador
2

Python 2, 304 bytes

Pruébalo en línea

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]

Este programa deduce la dirección de las carreteras y la gira hacia arriba para usar mi solución de la parte 2 de este desafío.

Zarigüeya muerta
fuente
Batido por 2 bytes! ¡Habla de frustrante!
caird coinheringaahing
@ user00001 por eso lloro mucho
Dead Possum