Deux routes divergeaient dans un bois jaune (partie 3)

10

Remarque: Ceci est basé sur deux routes divergées dans un bois jaune (partie 2) , un défi précédent pour moi. En raison de la popularité de cette question et des deux routes divergeaient dans un bois jaune (partie 1) , je voulais en faire une troisième. Mais les 2 premiers étaient trop faciles (une réponse de 2 octets sur le premier, une réponse de 15 octets sur le second.) J'ai donc rendu quelque chose de plus complexe ...

L'inspiration

Ce défi est inspiré du célèbre poème de Robert Frost, The Road Not Taken :

Deux routes divergeaient dans un bois jaune,
Et désolé, je ne pouvais pas voyager les deux
Et être un voyageur, longtemps je me tenais
Et baissais les yeux autant que je pouvais
Vers où il se penchait dans le sous-bois;

... 2 paragraphes coupés ...

Je vais le dire avec un soupir
Quelque part, des âges et des siècles à venir:
Deux routes ont divergé dans un bois, et je -
j'ai pris celle moins fréquentée,
Et cela a fait toute la différence.

Remarquez l'avant-dernière ligne I took the one less traveled by,,.

La trame de fond

Vous avez été chargé d'aider un aventurier aveugle qui marche sur une route et qui a été inspiré par The Road Not Taken . L'aventurier s'approche d'une bifurcation sur la route et aimerait emprunter le chemin le moins fréquenté. Vous devez trouver où l'aventurier se trouve réellement et lui dire où vous tourner.

Le défi

Votre objectif est de trouver la route la moins fréquentée sur votre carte où la route bifurque. Votre carte est une chaîne contenant des sauts de ligne (ou \n, si vous préférez) et a une largeur et une hauteur inconnues. Dans la carte, les routes sont composées des chiffres 0 à 9 , l'intersection est constituée de #s. Vous devez trouver la route sur laquelle vous êtes actuellement et, parmi les autres routes, la route la plus fréquentée et la route la moins fréquentée pour votre aventurier aveugle. Les bois de votre carte sont représentés par un espace. Voici une carte simple:

2   2
 1 0 
  #  
  2  
  2  

Cette carte mesure 5 de large et 5 de haut. Remarquez comment la route bifurque en forme de Y. Le Y peut être orienté de n'importe quelle façon, vous devez donc être capable de comprendre une carte "tournée".

Ce que les #moyens

Là où la carte se trouve, il y aura #: Cela n'affecte le score d'aucun chemin.

Que signifient réellement les chiffres

Chaque chemin (une ligne de chiffres, peut avoir un coude) a un score. Le score d'un chemin est déterminé en additionnant ses chiffres, donc pour le premier exemple, le premier chemin (en haut à gauche, dans le sens des aiguilles d'une montre) a un score de 2 + 1 = 3, le second a 2 + 0 = 2 et le troisième a 2 + 2 = 4. Les routes peuvent contenir des numéros connectés en diagonale.

Trouver où vous êtes

Vous êtes sur le chemin avec le score le plus élevé. Les 2 autres chemins sont la route la plus fréquentée et la route la moins fréquentée. Vous devez trouver la route avec le score le plus bas .

Dire à votre voyageur où aller

Vous devez dire à votre voyageur d'aller "à gauche" ou "à droite". Gardez à l'esprit que les directions sont du point de vue de votre voyageur (il fait face à la fourche.)

Exemples de cartes

  14
9#  
  04

Sortie: "à droite" (le voyageur est sur la 9route, 0 + 4 <1 + 4

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

Sortie: "gauche" (le voyageur est sur la 99999route, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Sortie: "à droite" (le voyageur est sur la 98765route, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Sortie: "à droite" (le voyageur est sur la 4422route, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Sortie "gauche" (le voyageur est sur la 999route, 8 + 8 + 8> 7 + 7 + 7

Choses à savoir:

  • Les cartes seront remplies d'espaces pour que chaque ligne ait la même longueur.
  • Vous devez sortir dans STDOUT / console / file la chaîne leftou right, éventuellement suivi d'un retour à la ligne de fin.
  • Vous devez prendre l'entrée comme une chaîne contenant des sauts de ligne, des \ns ou un tableau / liste de lignes (chaque ligne est une chaîne). Où cette entrée est placée doit être une fonction, un argument de ligne de commande, un fichier ou STDIN une ligne à la fois ou similaire. Une variable n'est pas un périphérique d'entrée acceptable (sauf s'il s'agit d'un paramètre de fonction.) De même, les expressions de fonction en JS et dans d'autres langages doivent être affectées à une variable.
  • C'est le , donc la réponse la plus courte en octets l'emporte!
  • Failles standard interdites

Ce que vous pouvez supposer

  • Votre contribution sera valide. Rien de tel ne sera testé pour:
0 0 0
 0 0
  #
 0 0
  • Les scores des chemins ne seront jamais à égalité.
  • L'entrée peut être de n'importe quelle longueur en largeur ou en hauteur, inférieure à la limite de chaîne de votre langue.
  • Il y aura toujours au moins 1 espace entre les 2 chemins.
  • Les chemins peuvent avoir des virages, des virages, etc. Ce sont des routes, pas des autoroutes.

Avez-vous des questions? Demandez-moi ci-dessous dans les commentaires et bon golf!

programmer5000
la source
Le sera-t-il #toujours au centre horizontalement?
David Archibald
12
Je pense qu'il est temps pour vous d'utiliser le Sandbox . Et peut-être trouver une nouvelle inspiration. À ce rythme, on a plus l'impression de promouvoir un poème que de créer une série de défis intéressante. D'autant plus que vous postez le poème sauf dans chacun. Nous l'avons déjà vu depuis le premier, ça suffit.
mbomb007
4
Regardez. J'ai aimé vos défis, mais simplement ajouter de la difficulté puis publier 3 sans même en accepter un dans le pt 2 est tout simplement trop rapide. Une modification à 2 serait suffisante pour le léger changement de rotation, la sortie absolue, etc.
David Archibald
2
C'est un défi très différent des précédents et je l'aime bien ... Nous pouvons prendre la forme en Y comme accordée (un chemin se termine toujours sur un bord et les deux autres sur le bord opposé), non?
dnep
1
@dnep Oui, vous avez raison.
programmer5000

Réponses:

4

D , 348 321 312 302 octets

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

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

Essayez-le en ligne!

Rayon
la source
Félicitations d'être le premier répondeur! Vous pourriez gagner celui-ci ... Pouvez-vous créer un lien vers D?
programmer5000
2

Python 2, 304 octets

Essayez-le en ligne

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]

Ce programme déduit la direction des routes et la fait pivoter vers le haut pour utiliser ma solution de la partie 2 de ce défi.

Possum mort
la source
Battu de 2 octets! Parlez de frustrant!
caird coinheringaahing
@ user00001 c'est pourquoi je pleure beaucoup
Dead Possum