Duas estradas divergiam em uma madeira amarela (parte 3)

10

Nota: Isso é baseado em duas estradas divergindo em uma madeira amarela (parte 2) , um desafio anterior da minha. Por causa da popularidade dessa pergunta e duas estradas divergirem em uma madeira amarela (parte 1) , eu queria fazer uma terceira. Mas os 2 primeiros foram fáceis demais (uma resposta de 2 bytes no primeiro, uma resposta de 15 bytes no segundo). Então, fiz algo mais complexo ...

A inspiração

Este desafio é inspirado no famoso poema de Robert Frost, The Road Not Taken :

Duas estradas divergiam em um bosque amarelo.
E , desculpe, eu não podia viajar pelas duas.
E ser um viajante, por muito tempo eu fiquei.
E olhei para uma delas o mais longe que pude
.

... 2 parágrafos aparados ...

Vou contar isso com um suspiro
Em algum lugar, eras e eras daqui em diante :
Duas estradas divergiam em um bosque, e eu -
eu peguei a menos percorrida,
e isso fez toda a diferença.

Observe a penúltima linha I took the one less traveled by,,.

A história de fundo

Você foi designado para ajudar um aventureiro cego que está andando em uma estrada e foi inspirado em The Road Not Taken . O aventureiro está se aproximando de uma bifurcação na estrada e gostaria de seguir o caminho menos percorrido. Você deve encontrar onde o aventureiro realmente está e dizer ao aventureiro para onde se virar.

O desafio

Seu objetivo é encontrar a estrada menos percorrida em seu mapa, onde a bifurcação da estrada. Seu mapa é uma sequência contendo novas linhas (ou \n, se preferir) e possui largura e altura desconhecidas. No mapa, as estradas são compostas de dígitos de 0 a 9 , e o cruzamento é de #s. Você deve encontrar a estrada em que está atualmente e, fora das outras estradas, a estrada mais percorrida e a menos percorrida pelo aventureiro cego. As madeiras no seu mapa são representadas por um espaço. Aqui está um mapa simples:

2   2
 1 0 
  #  
  2  
  2  

Este mapa tem 5 de largura e 5 de altura. Observe como a estrada se bifurca em forma de Y. O Y pode ser orientado de qualquer maneira, portanto, você deve entender um mapa "girado".

O que os #meios

Onde o mapa bifurca, haverá um #. Isso não afeta a pontuação de nenhum caminho.

O que os números realmente significam

Cada caminho (uma linha de números, pode ter uma curva) tem uma pontuação. A pontuação de um caminho é determinada somando seus dígitos. Portanto, para o primeiro exemplo, o primeiro caminho (do canto superior esquerdo, no sentido horário) tem uma pontuação de 2 + 1 = 3, o segundo tem 2 + 0 = 2 e o terceiro tem 2 + 2 = 4. As estradas podem conter números conectados na diagonal.

Descobrindo onde você está

Você está no caminho com a maior pontuação. Os outros 2 caminhos são a estrada mais percorrida e a menos percorrida. Você precisa encontrar a estrada com a menor pontuação.

Dizendo ao seu viajante para onde ir

Você deve dizer ao seu viajante para "esquerda" ou "direita". Lembre-se de que as direções são do ponto de vista do viajante (ele está de frente para o garfo).

Mapas de exemplo

  14
9#  
  04

Saída: "direita" (o viajante está na 9estrada, 0 + 4 <1 + 4

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

Saída: "esquerda" (o viajante está na 99999estrada, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Saída: "direita" (o viajante está na 98765estrada, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Saída: "direita" (o viajante está na 4422estrada, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Saída "esquerda" (o viajante está na 999estrada, 8 + 8 + 8> 7 + 7 + 7

Coisas a saber:

  • Os mapas serão preenchidos com espaços para tornar cada linha do mesmo comprimento.
  • Você deve enviar para STDOUT / console / arquivo a sequência leftou right, opcionalmente, seguida por uma nova linha à direita.
  • Você deve receber a entrada como uma sequência contendo novas linhas, \ns ou uma matriz / lista de linhas (cada linha é uma sequência). Onde essa entrada é colocada, deve haver uma função, argumento da linha de comandos, arquivo ou STDIN, uma linha por vez ou semelhante. Uma variável não é um dispositivo de entrada aceitável (a menos que seja um parâmetro de função.) Da mesma forma, expressões de função em JS e outros idiomas devem ser atribuídas a uma variável.
  • Isso é , então a resposta mais curta em bytes vence!
  • Lacunas padrão proibidas

Coisas que você pode assumir

  • Sua entrada será válida. Nada como isso será testado para:
0 0 0
 0 0
  #
 0 0
  • As pontuações dos caminhos nunca serão vinculadas.
  • A entrada pode ter qualquer comprimento em largura ou altura, menor que o limite de caracteres do seu idioma.
  • Sempre haverá pelo menos 1 espaço entre os 2 caminhos.
  • Os caminhos podem ter curvas, curvas etc. São estradas, não rodovias.

Tem alguma pergunta? Pergunte-me abaixo nos comentários e golfe feliz!

programmer5000
fonte
O #sempre estará no centro horizontalmente?
David Archibald
12
Acho que está na hora de você usar a Sandbox . E talvez encontre alguma inspiração nova. Nesse ritmo, parece mais que você está promovendo um poema do que criando uma série de desafios interessantes. Especialmente desde que você publica o poema, exceto em todos. Já vimos desde o primeiro, basta.
mbomb007
4
Veja. Gostei dos seus desafios, mas simplesmente adicionar alguma dificuldade e publicar 3 sem sequer aceitar um no pt 2 é muito rápido. Uma edição para 2 seria boa o suficiente para a leve mudança de rotação, saída absoluta e assim por diante.
David Archibald
2
É um desafio muito diferente dos anteriores e eu gosto ... Podemos tomar a forma Y como garantida (um caminho sempre termina em uma borda e os outros dois na borda oposta), certo?
DNEP
11
@ dnep Sim, você está certo.
programmer5000

Respostas:

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

Experimente online!

Raio
fonte
Parabéns por ser o primeiro a responder! Você pode ganhar este ... Você pode criar um link para D?
programmer5000
2

Python 2, 304 bytes

Experimente 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]

Este programa deduz a direção das estradas e a gira para cima, para usar minha solução da parte 2 deste desafio.

Gambá morto
fonte
Batido por 2 bytes! Isso é frustrante!
caird coinheringaahing
@ user00001 É por isso que eu choro um monte
Morto Possum