Побудова мосту


10

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

Однак мосту потрібні стовпчики, щоб його підняти. Кожен стовпець може містити максимум 6 пробілів з кожної сторони.

Для цього прикладу:

________                        ________
        |                      |
   A    |                      |   B

        |----------------------|
                d = 22

Міст для d = 20повинен виглядати так з двома колонами. Стовпці не враховуються в d.

_____|__________|_____
12345|1234554321|12345
     |          |

Правила:

  1. Повинно бути достатньо стовпців, щоб стояти.

  2. Повинна бути мінімальна кількість стовпців, необхідних для стояння.

  3. Повинно бути симетричним

  4. Найменша кількість байтів виграє

Приклади: (# - це лише для того, щоб підрахувати пробіли. Не слід включати у свій вихід)

d = 10

_____|_____
12345|12345
     |

d = 32

_____|___________|___________|_____
12345|12345654321|           |
     |           |           |

d = 8

____|____
1234|1234
    |

d = 4

__|__
12|34
  |

d = 22

_____|____________|_____
12345|123456654321|
     |            |

або

______|__________|______
123456|1234554321|123456
      |          |

Для уточнення, чи потрібні цифри у вихідному висновку чи просто наочні?
isaacg

@isaacg Ні, вони не потрібні у висновку. Вони просто там, тож вам, хлопці, не доводиться рахувати рядки на моїх прикладах.
JoshK

Я думаю, що ваші специфікації є помилковими? Що заважає розчину 1 | 2 | 3 | 4 | 5 ... | d, де | - промінь.
Вло

@Vlo Одне з правил - використовувати мінімально можливу кількість стовпців. Тому за допомогою стовпця кожен пробіл не буде мінімальним.
JoshK

Ви кажете, що d завжди буде рівним, але у вашому останньому прикладі d = 21.
SE - перестаньте звільняти хороших хлопців

Відповіді:


4

JavaScript (ES6), 92 байти

d=>[..."_  "].map(c=>(s=c+c[r='repeat'](n%6))+'|'+(c[r](12)+'|')[r](n/6)+s,n=d-1>>1).join`\n`

Де \nпредставляє буквальний символ нового рядка. Якщо це dможе бути дивно, це займає у мене 128 байт:

d=>[..."_  "].map(c=>[...Array(d+1)].map((_,i)=>(d&1?i&&d-i&&(i>m)+5+i-m:((d-1)%24>11)*6+i-m)%12?'':'|',m=d>>1).join(c)).join`\n`

Як може працювати ваше рішення щодо непарних чисел? При d = 35 жоден з оптимальних рішень не є симетричним.
SE - перестаньте стріляти з хороших хлопців

@Hohmannfan Він повертає найменше неоптимальне симетричне рішення, яке в даному випадку є |____________|___________|____________|і т. Д.
Ніл

Я думаю, що це найкраща інтерпретація.
SE - перестаньте стріляти з хороших хлопців

0

Рубін, 108 байт

Напевно, можна покататися набагато більше. Жадібний алгоритм.

->d{s='',k=6
(s+=?_*[d,k].min+(d>k/2??|:'');d-=k;k=12)while d>0
s=s.chomp(?|)+s.reverse+$/
s+s.tr(?_,' ')*2}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.