Анимация Adve Авантюрист

12

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

Ваша задача - оживить Adve Adventurer, движущегося через жуткий (т. Е. Хэллоуин) лабиринт. Adve является ; он характерный персонаж, однако, он не против того, чтобы его представлял другой персонаж.

Чтобы оживить Adve, вы распечатываете каждый кадр; рамка - это карта с его текущим местоположением. Adve перемещается на одну позицию вперед каждый ход и никогда не отступает. Он начинается в первом ряду и заканчивается в последнем.

вход

Любой разумный формат, такой как строка с разделителем или строковый массив. Вы можете предположить, что на входе будет карта размером более 3 * 3, содержащая только один возможный путь. Единственные присутствующие символы будут #и .

Выход

Кадры

Пример лабиринта ( ок ... лабиринт )

Вот карта без Adve в нем; первый и последний кадры - это пустая карта (9x15):

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

Это , поэтому выигрывает самый короткий код в байтах!

Точный выход для этого можно найти здесь (37 кадров).

Это , поэтому выигрывает самый короткий код в байтах!

Даниил
источник
В первой и последней строках всегда будет одна пустая ячейка? Всегда ли будет один возможный путь (без бифуркаций)?
Луис Мендо
@LuisMendo, да, и есть «только один возможный путь»
Даниэль
1
Вход всегда будет наверху?
Разрушаемый лимон
@DestructibleWatermelon, да, и выход будет внизу.
Даниил
4
Его настоящее имя Дейв, но он все перепутал.
mbomb007

Ответы:

4

Perl, 84 байта

Спасибо @Ton Hospel за то, что он направил меня в правильном направлении для игры в гольф около 30 байтов!

Bytecount включает в себя 82 байта кода и -0pфлагов.

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

Обратите внимание, что есть два последних пробела и нет заключительного перевода строки (иначе это не сработает).

Принимает лабиринт в качестве входных данных и выводит все необходимые кадры, чтобы Adve мог выбраться из него. Обратите внимание, что Adve - это &скорее a , чем 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 байтов ...
Тон Хоспел
До настоящего времени @TonHospel -9 байт (я удалил $s="@+", раньше я не понимал, что @+он изменяется только в случае успешного выполнения регулярного выражения. И redoвместо того, чтобы whileсохранить один или два байта). Любой намек на то, как играть в гольф больше? Я предполагаю, что должен как-то избавиться от них y///, или сделать s///короче ... но в любом случае я не знаю как.
Дада
@TonHospel (но если вы работали над решением и хотите опубликовать его, не держите его, потому что это тот же алгоритм или что-то в этом роде, я совсем не против;))
Дада
То, как переменные регулярного выражения хранятся или не хранятся в циклах, очень тонко. Это y///хорошо, так как вам нужно что-то, чтобы указать направление (но обратите внимание, что вы можете выбрать, с какой стороны) Но главное улучшение будет от объединения замен
Тон Хоспел
@TonHospel В самом деле, я должен был это увидеть, но я слишком старался объединить s/ &/&A/и s/& /A&/вместе (и рядом с ними), чтобы увидеть, что это не было регулярным выражением, которое мне нужно было объединить! Большое спасибо! (И спасибо, что позволили мне узнать, как играть в гольф!)
Дада
3

JavaScript (ES6), 137

(1 байт сохранен, спасибо @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>

edc65
источник
Глупый я, спасибо @ETHproductions
edc65
Отличная работа. Я, вероятно, закончил бы около 160 байтов
ETHproductions