Анімальна порада авантюриста


12

Змагання

Ваше завдання - оживити Adve Adventurer, що рухається по моторошному (тобто Хелловін) лабіринту. Adve - це ; Він, проте, характер рідини, тому він не проти бути представленим іншим персонажем.

Щоб оживити Adve, ви роздруковуєте кожен кадр; кадр - це карта з його поточним розташуванням у ній. Adve рухається по одному простору вперед на кожному кроці і ніколи не відступає. Він починається в першому ряду і закінчується в останньому.

Вхідні дані

Будь-який розумний формат, як рядок із роздільником або рядковим масивом. Можна припустити, що вхід буде картою більше 3 * 3, що містить лише один можливий шлях. Єдиними присутніми символами будуть #і .

Вихідні дані

Кадри.

Приклад лабіринту ( нормально ... лабіринт )

Ось карта без Адве на ній; перший і останній кадри - це порожня карта (ця карта 9x15):

### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###

Це , тому найкоротший код у байтах виграє!

Точний вихід для цього можна знайти тут (37 кадрів).

Це , тому найкоротший код у байтах виграє!


Чи завжди в першому та останньому рядках буде одна порожня клітинка? Чи завжди буде єдиний можливий шлях (без роздвоєнь)?
Луїс Мендо

@LuisMendo, так, і є "лише один можливий шлях"
Даніель

1
Чи завжди вхід буде вгорі?
Зруйнований лимон

@DestructibleWatermelon, так, і вихід буде внизу.
Даніель

4
Його справжнє ім’я - Дейв, але він весь змішаний.
mbomb007

Відповіді:


4

Perl, 84 байти

Дякую @Ton Hospel за те, що я вела мене в правильному напрямку для гри в гольф близько 30 байт!

Вхідний рахунок включає 82 байти коду та -0pпрапорів.

/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  

Зауважте, що є два заключні пробіли, і немає остаточного нового рядка (інакше це не буде працювати).

Приймає лабіринт як вхід, як виводить усі необхідні кадри, щоб Adve вийшов з нього. Зауважте, що Adve є &скоріше, ніж a , оскільки останній не є utf8 (а perl не використовує utf8 за замовчуванням). Запустіть його -0pEпрапорами:

perl -0pE '/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  ' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

Для очей я також зробив цю анімаційну версію, тобто трохи довше, але очистить термінал між кожним друком і сном 0,15 сек, тож буде схоже, що Adve насправді рухається:

perl -0nE 'system(clear);/.*/;say y/A/ /r;select($,,$,,$,,0.15);s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:say"\e[H",y/A&/  /r' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

Я думаю, що це найкращий алгоритм, але його все одно можна знизити більше, ніж на 20 байт ...
Ton Hospel

@TonHospel -9 байтів поки що (я видалив $s="@+", я не розумів раніше, що @+змінюється лише у випадку успішного регулярного вираження. І redoзамість whileзбереженого одного-двох байтів). Будь-який натяк про те, як більше грати в гольф? Я здогадуюсь, що я мушу y///якось позбутися цього , або зробити s///коротше ... але в будь-якому випадку я не знаю як.
Дада

@TonHospel (але якщо ви працювали над рішенням і хочете опублікувати його, не тримайте його, тому що це той самий алгоритм чи щось таке, я зовсім не заперечую;))
Dada

Те, як змінні регулярних виразів або не містяться в циклі, дуже тонкі. Це y///добре, оскільки вам потрібно щось вказати напрямок (але зауважте, що ви вирішите вибрати, на яку сторону) Але головне поліпшення відбудеться завдяки комбінуванню замін
Тон Євангелія

@TonHospel Дійсно, я мав би це бачити, але я надто намагався поєднати s/ &/&A/і s/& /A&/разом (і наступне разом), щоб побачити, що це не той регулярний вираз, який мені потрібно було поєднувати! Дуже дякую! (І дякую за те, що дозволили мені дізнатись, як
Dada

3

JavaScript (ES6), 137

(1 байт збережено thx @ETHproductions)

m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`
`)||[...r,m]

Менше гольфу

m=>{
  d = o = 1+m.search`\n`; // offset to next row and starting direction
  p = m.search` `-o; // starting position, 1 row above the first
  for( r=[m]; // r is the output array, start with empty maze
       // try moving in 3 directions (no back)
       // if no empty cell found, we have exit the maze
       [d,o/d,-o/d].some(q => 1/m[d=q,q+=p]? p=q : 0);
       r.push(q.join``) // add current frame
     )
     q=[...m], q[p] = 0; // build frame, '0' used to mark Adve position
  return [...r,m] // add last frame with maze empty again
}

Тест

F=
m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`\n`)||[...r,m]

function go() {
  var i=I.value,r=F(i),
      frame=x=>(x=r.shift())&&(O.textContent=x,setTimeout(frame,100))
  frame()
}

go()
#I { width:10em; height: 19em; font-size:10px}
#O { white-space:pre; font-family: monospace; font-size:10px; vertical-align: top; padding: 4px}
<table><tr><td>
<textarea id=I>### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###
</textarea><button onclick='go()'>go</button></td><td id=O></td></tr></table>


Гм, нерозумно, дякую @ETHproductions
edc65

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