Оптимальное решение для перехода в противоположный угол прямоугольника

13

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

Ваша программа примет входные данные в виде упорядоченной пары (width, height). Это будут размеры прямоугольника, с которым вы будете работать. Ваша программа создаст ASCII-арт решения (используйте .для пустого квадрата и #для части решения, Xдля начального квадрата) и посчитайте количество ходов, необходимых для достижения конечной точки. Диагональные ходы не допускаются. Если существует несколько решений, выберите одно для вывода.

Самая короткая программа в байтах побеждает.

пример

Входные данные: (4, 5)

Выход:

..##
..#.
.##.
.#..
X#..

Количество ходов: 7

ericw31415
источник
Так должен ли вывод содержать число #в «оптимальном решении» (какое решение всегда движется влево или вниз)?
Мартин Эндер
12
Re "Извините, это мой первый вопрос по коду для игры в гольф, поэтому я не очень хорош в их создании". Позвольте мне порекомендовать «песочницу», где вы можете публиковать идеи и получать отзывы, прежде чем публиковать их на главной странице. И добро пожаловать в PPCG! :)
Мартин Эндер
@ MartinBüttner Да, количество ходов - это, по сути, число, #потому что нелогично идти влево или вниз.
ericw31415
Можно ли разделять каждый символ пробелами?
Синий,
1
Нужно ли выводить счетчик движений И искусство ascii? Как именно должен выглядеть результат?
Джеймс

Ответы:

0

05AB1E , 27 24 байта

Код:

+Í,¹<'.×'#¶J²<×'X'#¹<×J,

Объяснение:

+                         # Add the length and the height.
 Í                        # Decrease by two.
  ,                       # Print this value with a newline.
   ¹<'.×                  # Take the first input, decrease by 1 and multiply with ".".
        '#¶               # Push a "#"-character and a newline character.
           J              # Join the string.
            ²<            # Take the second input and decrease by 1.
              ×           # Multiply the joined string with this value.
               'X         # Push the "X"-character.
                 '#¹<×J   # Multiply the "#"-character with (first input - 1).
                       ,  # Pop and print with a newline.

Попробуйте онлайн! , Использует кодировку CP-1252 .

Аднан
источник
В чем разница между байтом и символом?
Утренняя монахиня
2
@KennyLau Я постоянно забываю упоминать, что в моих сообщениях ... 05AB1E использует кодировку CP-1252, каждый символ, используемый в коде, составляет 1 байт.
Аднан,
3

Сетчатка , 54 53 байта

\d+
$*.
S_`(?<=(.+)¶.*).|\D
T`.`#`.¶|.*$
:m-1=`^#
X
#

Принимает входные данные, разделенные переводом строки, и выводит сетку решения с последующим счетом перемещений.

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

объяснение

\d+
$*.

Превратите оба целых числа в это множество .s, то есть конвертируйте их в одинарные.

S_`(?<=(.+)¶.*).|\D

Это строит сетку .s, сопоставляя каждый .в одинарной высоте и захватывая унарное представление ширины. SАктивирует режим разделения , который возвращает захваченные строки, а |\Dи _вместе убедиться , что все остальное удаляется из строки.

T`.`#`.¶|.*$

Это превращает последний символ каждой строки, а также всю последнюю строку в #s.

:m-1=`^#
X

Здесь используется масса опций для преобразования только первого #в последней строке X(нам нужно убедиться, что только последние строки затронуты из-за входов width-1). mактивирует многострочный режим, который ^сопоставляет начало строк. -1=говорит Retina выполнить замену только в последнем матче. Наконец, :отключите режим по умолчанию, чтобы сетка печаталась в STDOUT как промежуточный результат.

#

Наконец, мы просто считаем число #в строке, соответствующее количеству ходов.

Мартин Эндер
источник
Возможно, следует добавить встроенную сетчатку для преобразования в унарную.
Cyoce
3

Пайк, 26 байт

DtQ+RtF; Q\.*t\#+)\X\#Qt*+

Попробуй здесь


Или неконкурентные 34 байта, добавьте команду apply с звездочкой)

jUa]Dm!X|RZjht]q+".#X"R@)Fs
);jmts

Попробуй это здесь!

Или 30 байтов, если разрешены пробелы в качестве заполнения

jUa]Dm!X|RZjht]q+".#X"R@)Pjmts
синий
источник
Почему это неконкурентоспособно?
Утренняя монахиня
3
Я сменил язык после того, как задание было опубликовано
Blue
@muddyfish Внутренняя ошибка сервера при нажатии, попробуйте здесь
Insane
@Insane исправил ошибку (надеюсь). Внутренний тест на время проваливался каждый раз, когда день менялся.
Синий,
2

Pyth, 32 29 24 байта

AtMQVH+*\.G\#;+\X*\#G+GH

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

Пример ввода:

(4, 5)

Пример вывода:

...#
...#
...#
...#
X###
7

Как это устроено:

AtMQVH+*\.G\#;+\X*\#G+GH
                           assign('Q',eval_input())
AtMQ                       assign('[G,H]',Pmap(lambda d:tail(d),Q))
    VH       ;             for N in range(H):
      +*\.G\#                  implicit_print(plus(times(".",G),"#"))
              +\X*\#G      implicit_print(plus("X",times("#",G)))
                     +GH   implicit_print(plus(G,H))

Предыдущая попытка:

JthQK@Q1+*++*\.J\#btK+\X*\#Jt+JK

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

Пример ввода:

(4, 5)

Пример вывода:

...#
...#
...#
...#
X###
7

Как это устроено:

JthQK@Q1+*++*\.J\#btK+\X*\#Jt+JK
                                 assign('Q',eval_input())        --Q is now an official pair of numbers (4, 5)
JthQ                             assign("J",decrement(first(Q))) --gets the first element, and then take 1 from it, and assign it to J
    K@Q1                         assign("K",lookup(Q,1))         --K is now the second element (count from 0) of the pair.
        +            +\X*\#J     concat(-----------------------------------------------------------,concat("X",times("#",J)))
         *         tK                   repeat(--------------------------------------,decrement(K))
          +       b                            concat(-------------------------,"\n")
           +    \#                                    concat(-------------,"#")
            *\.J                                             repeat(".",J)
                            t+JK decrement(add(J,K)) <--- auto-print
Дрянная Монахиня
источник
@ MartinBüttner Может, ты поможешь мне в этом?
Утренняя монахиня
@KennyLau Я не знаю Pyth ...
Мартин Эндер
@ MartinBüttner Это довольно неловко, что Пиф побежден, верно
Leaky Nun
Вы можете объединить первые два задания с AtMQ. Это присваивает два значения Gи H.
Якуб
1

CJam, 35 33 байта

q~\(_2$(+p'.*a*'#f+)W%_"X#"era+N*

Принимает вход в виде width height и выводит количество ходов в первой строке, за которым следует сетка решений.

Проверьте это здесь.

Это также работает для того же количества байтов:

q~\('.*a*'#f+)W%_"X#"era+N*_'#e=p
Мартин Эндер
источник
Давно не видел решения CJam.
Cyoce
2
@Cyoce Тебе нужно выглядеть сложнее. ;)
Мартин Эндер
1

Рубин, 48 байтов

Это анонимная функция, которая согласно этому мета-посту является приемлемой, если в вопросе не указано «полная программа». Обычно я не буду педантичен по этому поводу, но проблема очень проста, и выполнение программы будет значительным% увеличения балла.

Ввод двух аргументов. Возвращаемое значение - это массив, содержащий художественную строку ASCII и номер #пути.

->w,h{[(?.*(w-=1)+'#
')*(h-=1)+?X+?#*w,w+h]}

В тестовой программе

f=->w,h{[(?.*(w-=1)+'#
')*(h-=1)+?X+?#*w,w+h]}

puts f[4,5]

Выход

...#
...#
...#
...#
X###
7

Это просто строка из h-1 строк с w-1 точками, за которыми следуют символы a #и новой строки. Я поставил #в конце, чтобы использовать один #\nлитерал для обоих #и новой строки (код содержит фактическую новую строку, а не escape-последовательность). Затем за последней строкой Xследует w-1 #.

Короче уменьшать значения w и h во время генерации ASCII-графики, чтобы окончательный расчет был простым w+h.

Уровень реки St
источник
1

JavaScript (ES6), 60 байт

w=>h=>--w+--h+`
${"."[r="repeat"](w)}#`[r](h)+`
X`+"#"[r](w)

использование

f(4)(5)

7
...#
...#
...#
...#
X###
user81655
источник
1

MATL , 28 26 25 байт

+qq35IMwX"46 5Lt4$(88HG(c

РЕДАКТИРОВАТЬ (10 июня 2016 г.): приведенная ниже ссылка содержит модификацию ( 5Lзаменена на IL) для адаптации к изменениям языка

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

объяснение

+       % take two inputs. Add them
qq      % subtract 2
35      % push ASCII for '#'
IMw     % push the two inputs again. Swap them
X"      % 2D char array of '#'  repeated as indicated by inputs
46      % push ASCII for '.'
5Lt4$(  % fill all but last and row columns with that
88HG(   % fill 88 (ASCII for 'X') at linear index given by second input
c       % convert to char
Луис Мендо
источник
0

Скала, 118 байт

(w:Int,h:Int)=>{print(Array.fill(h-1,w-1)('.')map(new String(_))mkString("","#\n","#\nX"));Seq.fill(w-1)(print("#"))}


(w:Int,h:Int)=>{...}           //define a function with 2 Ints as parameters
print(                        //print ...   
  Array.fill(h-1,w-1)('.')    //an array of arrays with dimensions (h-1,w-1)
                              //and fill it with a dot
  map(new String(_))          //map each inner array of chars to a string
  mkString("","#\n","#\nX")   //create a string from the array, with
                              //an empty string before the array,
                              //"#\n" as a seperator between the elements
                              //and "#\nX" at the end   
);
Seq.fill(w-1)(print("#"))     //w-1 times print "#"
corvus_192
источник
0

Haskell, 64 байта

c!n=c<$[2..n]
w#h=unlines$('.'!w++"#")!h++['X':'#'!w,show$w+h-2]

Пример использования:

*Main> putStr $ 4 # 5
...#
...#
...#
...#
X###
7

Как это устроено:

c!n = c <$ [2..n]                       -- helper function: make (n-1) copies of c

                                        -- main function
                     !h                 -- (h-1) times
       ('.'!w ++ "#")                   --    (w-1) dots and a hash sign
                       ++[      ,     ] -- followed by
                          'X' : '#'!w   --    an 'X' and (w-1) hash signs
                            show$w+h-2  --    and the number of steps
unlines                                 -- join everything with newlines in-between
Ними
источник
0

Java, 137 132 байта

w->h->{String s="";int i=0,j;for(;i<h;i++){for(j=1;j<w;j++)s+=".";s+="#\n";}s+="X";for(j=1;j<w;j++)s+=".";s+="\n"+(w+h-2);return s;}
Дрянная Монахиня
источник
Хотя Java не совсем шутка ...
ericw31415
s + = вместо s = s + сэкономит вам пару байтов
Blue
0

Луа, 81 байт

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

Golfed:

w,h=(...)print((("."):rep(w-1).."#\n"):rep(h-1).."X"..("#"):rep(w-1))print(w+h-2)

Ungolfed:

w,h=4,5
print((("."):rep(w-1).."#\n"):rep(h-1).."X"..("#"):rep(w-1))
print(w+h-2)
Дрянная Монахиня
источник
0

Python, 48.

lambda w,h:('.'*(w-1)+'#\n')*(h-1)+'X'+'#'*(w-1)

Чтобы использовать это, добавьте f=перед строкой выше и назовите это так:

f(4, 5)

Результат:

...#
...#
...#
...#
X###
shooqie
источник