Дві дороги розходилися в жовтому лісі (частина 3)


10

Примітка. Це засновано на двох дорогах, розбігшихся в жовтому лісі (частина 2) , що було попереднім завданням. Через популярність цього питання і Дві дороги розійшлися в жовтому лісі (частина 1) , я хотів зробити третю. Але перші 2 були занадто легкими ( 2-байтна відповідь на перший, 15-байтна відповідь на другу.) Тому я зробив щось складніше ...

Натхнення

Цей виклик натхненний відомою поемою Роберта Фроста «Дорога не взята» :

Дві дороги розходилися в жовтому лісі,
І вибачте, що я не міг подорожувати обома
І бути однією мандрівницею, довго я стояв
І дивився вниз, наскільки я міг,
куди вона зігнулася в підліску;

... 2 абзаци оброблені ...

Я скажу про це зітханням
Десь віками і століттями, отже:
Дві дороги розійшлися в лісі, а я -
я взяв ту, яку менше проїжджав,
і це змінило все.

Зверніть увагу , що другий в останній рядок I took the one less traveled by,.

Попередня історія

Вас призначили допомогти сліпому авантюристу, який йде по дорозі і був натхненний The Road Not Taken . Авантюрист підходить до роз’їзду в дорозі і хотів би взяти шлях, менший проїжджаючи. Ви повинні знайти, де насправді знаходиться авантюрист, і сказати авантюристу, куди звернутися.

Змагання

Ваша мета полягає в тому, щоб знайти на вашій карті найменш проїжджану дорогу, де роз’їжджає дорога. Ваша карта - це рядок, що містить нові рядки (або \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 / консоль / файл рядок leftабо right, необов'язково, слідом за новим рядком.
  • Ви повинні приймати введення як рядок, що містить нові рядки, \ns, або масив / список рядків (кожен рядок є рядком). Там, де цей ввід має бути, має бути функція, аргумент командного рядка, файл або STDIN по одному рядку за одним чи подібним. Змінна не є прийнятним пристроєм введення (якщо це не параметр функції). Так само, вирази функцій у JS та інших мовах повинні бути призначені змінній.
  • Це , тому найкоротша відповідь у байтах виграє!
  • Стандартні лазівки заборонені

Речі, які ви можете припустити

  • Ваш вклад буде дійсним. Нічого подібного не буде перевірено на:
0 0 0
 0 0
  #
 0 0
  • Оцінки шляхів ніколи не будуть зв'язані.
  • Вхід може бути будь-якої довжини в ширину або висоту, менший за межу рядка вашої мови.
  • Між двома стежками завжди буде не менше 1 місця.
  • Шляхи можуть мати вигини, повороти тощо. Це дороги, а не шосе.

Є якісь питання? Запитайте мене нижче в коментарях і щасливого гольфу!


Чи #завжди буде в центрі горизонтально?
Девід Арчібальд

12
Я думаю, що вам пора використовувати пісочницю . І, можливо, знайдіть нове натхнення. З такою швидкістю відчувається, що ви рекламуєте вірш, ніж створюєте цікавий виклик серії. Тим більше, що ви публікуєте вірш, окрім кожного. Ми вже бачили це з першого, цього достатньо.
mbomb007

4
Подивіться. Мені сподобалися ваші виклики, але просто додавати певних труднощів, а потім розміщувати 3, навіть не приймаючи їх у pt 2, занадто швидко. Правка до 2 була б достатньою для невеликої зміни обертання, абсолютного виходу тощо.
Девід Арчібальд

2
Це дуже різний виклик від попередніх, і мені це подобається ... Ми можемо прийняти форму Y як належну (одна стежка завжди закінчується на одному краю, а друга дві - на протилежному краю), правда?
день

1
@dnep Так, ви праві.
програміст5000

Відповіді:


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

Безумовно

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?
програміст5000

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 цього завдання.


Побито на 2 байти! Говоріть про розчарування!
caird coinheringaahing

@ user00001, тому я плачу багато
Dead Possum
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.