Construyendo un puente

10

Su tarea es construir un puente para conectar dos acantilados dada una entrada d, la distancia entre ellos. dsiempre será parejo

Sin embargo, el puente necesita columnas para sostenerlo. Cada columna puede contener un máximo de 6 espacios en cada lado.

Para este ejemplo:

________                        ________
        |                      |
   A    |                      |   B

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

El puente para d = 20debería verse así con dos columnas. Las columnas no cuentan en d.

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

Reglas:

  1. Debe tener suficientes columnas para levantarse.

  2. Debe tener un número mínimo de columnas necesarias para levantarse.

  3. Debe ser simétrico

  4. La cantidad más baja de bytes gana

Ejemplos: (los números son solo para ayudarlo a contar espacios. No debe incluirse en su salida)

d = 10

_____|_____
12345|12345
     |

d = 32

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

d = 8

____|____
1234|1234
    |

d = 4

__|__
12|34
  |

d = 22

_____|____________|_____
12345|123456654321|
     |            |

o

______|__________|______
123456|1234554321|123456
      |          |
JoshK
fuente
Para aclarar, ¿los números en la salida son obligatorios o meramente ilustrativos?
isaacg
@isaacg No, no son necesarios en la salida. Simplemente están allí para que no tengan que contar líneas en mis ejemplos.
JoshK
Creo que su especificación es defectuosa? Lo que impide una solución 1 | 2 | 3 | 4 | 5 ... | d donde | Es un rayo.
Vlo
@Vlo Una de las reglas es usar el mínimo número de columnas posible. Por lo tanto, usando una columna cada espacio no sería el mínimo.
JoshK
Dices que d siempre será par, pero en tu último ejemplo, d = 21.
SE - deja de despedir a los buenos

Respuestas:

4

JavaScript (ES6), 92 bytes

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

Donde \nrepresenta el carácter de nueva línea literal. Si dpuede ser extraño, me lleva 128 bytes:

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`
Neil
fuente
¿Cómo puede funcionar su solución para números impares? Para d = 35, ninguna de las soluciones óptimas es simétrica.
SE - deja de despedir a los buenos
@Hohmannfan Devuelve la solución simétrica menos subóptima, que en este caso es |____________|___________|____________|etc.
Neil
Supongo que esa es la mejor interpretación.
SE - deja de despedir a los buenos
0

Ruby, 108 bytes

Probablemente se pueda jugar mucho más golf. Algoritmo codicioso.

->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}
Tinta de valor
fuente