Две дороги разошлись в желтом лесу (часть 3)


10

Примечание: это основано на двух дорогах, раскинувшихся в желтом лесу (часть 2) , моей предыдущей проблеме. Из-за популярности этого вопроса и двух дорог, расходящихся в желтом лесу (часть 1) , я хотел сделать третью. Но первые 2 были слишком просты ( 2-байтовый ответ на первом, 15-байтовый ответ на втором.) Поэтому я сделал что-то более сложное ...

Вдохновение

Этот вызов вдохновлен знаменитым стихотворением Роберта Фроста « Дорога не взята» :

Две дороги расходились в желтом лесу,
И мне жаль, что я не мог путешествовать обоими
И быть одним путешественником, долго я стоял
И смотрел вниз на одну так далеко, как мог,
На то, где оно согнулось в подлеске;

... 2 абзаца обрезаны ...

Я расскажу это со вздохом
Где-то через века и века:
две дороги расходились в лесу, и я…
я выбрал ту, по которой меньше путешествовал,
И это имело все значение.

Обратите внимание на вторую и последнюю строку I took the one less traveled by,.

Предыстория

Вам поручили помочь слепому искателю приключений, который идет по дороге и вдохновлен «Дорога не взята» . Авантюрист приближается к развилке дороги и хотел бы выбрать путь, по которому меньше всего путешествуют. Вы должны найти, где на самом деле находится искатель приключений, и сказать искателю приключений, куда следует повернуть.

Соревнование

Ваша цель состоит в том, чтобы найти на вашей карте наименее пройденную дорогу, где дорога разветвляется. Ваша карта представляет собой строку, содержащую новые строки (или \n, если вы предпочитаете) и имеет неизвестную ширину и высоту. На карте дороги состоят из цифр от 0 до 9 , пересечение состоит из #s. Вы должны найти дорогу, по которой вы находитесь в данный момент, и из других дорог, по которой вы чаще всего путешествовали, и дорогу, по которой вы слепой искатель приключений. Лес на вашей карте представлен пробелом. Вот простая карта:

2   2
 1 0 
  #  
  2  
  2  

Эта карта 5 в ширину и 5 в высоту. Обратите внимание, как дорога разветвляется в форме Y. Y может быть ориентирован как угодно, поэтому вы должны понимать «повернутую» карту.

Что #значит

Там, где разветвится карта #. Это не влияет на оценку любого пути.

Что на самом деле означают цифры

Каждый путь (строка чисел, может иметь изгиб) имеет оценку. Оценка пути определяется суммированием его цифр, поэтому для первого примера первый путь (сверху слева, по часовой стрелке) имеет оценку 2 + 1 = 3, второй - 2 + 0 = 2, а третий имеет 2 + 2 = 4. Дороги могут содержать номера, соединенные по диагонали.

Найти, где вы находитесь

Вы на пути с наибольшим количеством очков. Другие 2 дорожки - это дорога, по которой больше путешествуют, и дорога, по которой меньше путешествуют. Вам нужно найти дорогу с самым низким счетом.

Рассказать своему путешественнику, куда идти

Вы должны сказать своему путешественнику идти «налево» или «направо». Имейте в виду, что направления с точки зрения вашего путешественника (он стоит перед вилкой.)

Пример карты

  14
9#  
  04

Выход: «вправо» (путник у 9дороги, 0 + 4 <1 + 4

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

Выход: «налево» (путник у 99999дороги, 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

Выход: «правый» (путник у 98765дороги, 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

Выход: «правильно» (путник у 4422дороги, 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

Выход «налево» (путник на 999дороге, 8 + 8 + 8> 7 + 7 + 7

Материал, чтобы знать:

  • Карты будут дополнены пробелами, чтобы каждая строка имела одинаковую длину.
  • Вы должны вывести в STDOUT / console / file строку leftили right, необязательно, после завершающей строки.
  • Вы должны принимать входные данные либо как строку, содержащую символы новой строки, \ns, либо как массив / список строк (каждая строка является строкой). Место ввода должно быть функцией, аргументом командной строки, файлом или STDIN по одной строке за раз или аналогичным. Переменная не является приемлемым устройством ввода (если это не параметр функции.) Аналогично, переменные-выражения в JS и других языках должны быть назначены переменной.
  • Это , поэтому выигрывает самый короткий ответ в байтах!
  • Стандартные лазейки запрещены

Вещи, которые вы можете предположить

  • Ваш вклад будет действительным. Ничего подобного не будет проверено на:
0 0 0
 0 0
  #
 0 0
  • Оценка путей никогда не будет привязана.
  • Ввод может иметь любую длину по ширине или высоте, меньшую, чем ограничение строки вашего языка.
  • Между двумя путями всегда будет хотя бы 1 пробел.
  • Пути могут иметь изгибы, повороты и т. Д. Это дороги, а не дороги.

Есть вопросы? Спросите меня ниже в комментариях и счастливого гольфа!


Будет ли #всегда быть в центре по горизонтали?
Дэвид Арчибальд

12
Я думаю, что пришло время использовать Песочницу . И, возможно, найти новое вдохновение. При такой скорости вы чувствуете, что вы продвигаете стихотворение, а не создаете интересную серию испытаний. Тем более, что вы публикуете стихотворение, кроме как в каждом. Мы уже видели это с первого раза, этого достаточно.
mbomb007

4
Смотреть. Мне понравились ваши задачи, но просто добавить некоторую сложность, а затем опубликовать 3, даже не принимая ни одного в pt 2, слишком быстро. Редактирование в 2 было бы достаточно для небольшого изменения поворота, абсолютного выхода и так далее.
Дэвид Арчибальд

2
Это сильно отличается от предыдущих, и мне это нравится ... Мы можем принять форму Y как должное (один путь всегда заканчивается на одном ребре, а два других - на противоположном ребре), верно?
dnep

1
@dnep Да, ты прав.
programmer5000

Ответы:


4

D , 348 321 312 302 байт

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

Попробуйте онлайн!


Поздравляем с первым ответчиком! Вы можете выиграть это ... Можете ли вы ссылку на D?
programmer5000

2

Python 2, 304 байта

Попробуйте онлайн

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]

Эта программа определяет направление движения дороги и поворачивает его вверх, чтобы использовать мое решение из второй части этой задачи.


Побит 2 байта! Разговор о разочаровании!
Caird Coinheringaahing

@ user00001, поэтому я много плачу
Мертвый Опоссум
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.