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


13

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

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

Виграє найкоротша програма в байтах.

Приклад

Вхід: (4, 5)

Вихід:

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

Кількість рухів: 7


Тож чи повинен вивід містити кількість #"оптимального рішення" (що таке рішення, яке ніколи не рухається вліво чи вниз)?
Мартін Ендер

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 .


Яка різниця між байтом і символом?
Leaky Nun

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(нам потрібно переконатися, що тільки в останньому рядку впливає через входи шириною-1). mактивує багаторядковий режим, що ^відповідає початку рядків. -1=говорить Ретіні виконувати заміну лише в останньому матчі. Нарешті, :вимикає типовий беззвучний режим, щоб сітка була надрукована в STDOUT як проміжний результат.

#

Нарешті, ми просто підраховуємо число #в рядку, яке відповідає кількості ходів.


Можливо, до сітківки слід додати вбудовану для перетворення в одинарну.
Cyoce

3

Пайк, 26 байт

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

Спробуйте тут


Або неконкурентоспроможний 34 байт, додайте застосувати вузол з ast)

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

Спробуйте тут!

Або 30 байт, якщо дозволено пробіли, як прокладки

jUa]Dm!X|RZjht]q+".#X"R@)Pjmts

Чому він є неконкурентоспроможним?
Leaky Nun

3
Я змінив мову після публікації виклику
Блакитний

@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 Можливо, ви могли б допомогти мені в цьому гольф?
Leaky Nun

@KennyLau Я не знаю жодного Pyth ...
Мартін Ендер

@ MartinBüttner Це дуже соромно для того, щоб Pyth зазнав поразки, правильно
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.
Кіос


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літерал для #і нового, і нового рядка (код містить фактичний новий рядок, а не послідовність втечі.) Після цього в останньому рядку Xслідують w-1 #.

Це було коротше зменшення значень w і h під час мистецтва покоління ASCII, так що остаточний розрахунок є простим w+h.



1

MATL , 28 26 25 байт

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

EDIT (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

Scala, 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 "#"

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

Пітона, 48.

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

Щоб використовувати його, додайте f=перед рядком вище та назвіть його так:

f(4, 5)

Результат:

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