Строим мост


10

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

Однако мосту нужны колонны, чтобы удержать его. Каждый столбец может содержать до 6 пробелов с каждой стороны.

Для этого примера:

________                        ________
        |                      |
   A    |                      |   B

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

Мост для d = 20должен выглядеть так с двумя столбцами. Столбцы не учитываются в d.

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

Правила:

  1. Должно быть достаточно столбцов, чтобы встать.

  2. Должно иметь минимальное количество столбцов, необходимых для вставания.

  3. Должен быть симметричным

  4. Наименьшее количество побед в байтах

Примеры: (# используются только для подсчета пробелов. Не должны быть включены в ваш вывод)

д = 10

_____|_____
12345|12345
     |

д = 32

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

д = 8

____|____
1234|1234
    |

д = 4

__|__
12|34
  |

д = 22

_____|____________|_____
12345|123456654321|
     |            |

или

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

Чтобы уточнить, требуются ли цифры в выходных данных или являются просто иллюстративными?
Исаак

@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.