Costruire un ponte


10

Il tuo compito è quello di costruire un ponte per collegare due scogliere con un input d, la distanza a parte. dsarà sempre pari

Tuttavia, il bridge ha bisogno di colonne per sostenerlo. Ogni colonna può contenere un massimo di 6 spazi su ciascun lato.

Per questo esempio:

________                        ________
        |                      |
   A    |                      |   B

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

Il ponte per d = 20dovrebbe apparire così con due colonne. Le colonne non contano in d.

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

Regole:

  1. Deve avere abbastanza colonne per alzarsi.

  2. Deve avere il numero minimo di colonne necessario per alzarsi.

  3. Deve essere simmetrico

  4. La quantità più bassa di byte vince

Esempi: (#s servono solo per aiutarti a contare gli spazi. Non devono essere inclusi nell'output)

d = 10

_____|_____
12345|12345
     |

d = 32

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

d = 8

____|____
1234|1234
    |

d = 4

__|__
12|34
  |

d = 22

_____|____________|_____
12345|123456654321|
     |            |

o

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

Per chiarire, sono richiesti i numeri nell'output o sono semplicemente illustrativi?
isaacg,

@isaacg No, non sono necessari nell'output. Sono lì, quindi non dovete contare le righe sui miei esempi.
JoshK,

Penso che le tue specifiche siano difettose? Cosa impedisce una soluzione 1 | 2 | 3 | 4 | 5 ... | d dove | è un raggio.
Vlo,

@Vlo Una delle regole è utilizzare il numero minimo di colonne possibile. Pertanto, usando una colonna ogni spazio non sarebbe il minimo.
JoshK,

Dici che d sarà sempre pari, ma nel tuo ultimo esempio, d = 21.
SE - smetti di sparare ai bravi ragazzi

Risposte:


4

JavaScript (ES6), 92 byte

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

Dove \nrappresenta il carattere letterale di newline. Se dpuò essere dispari, mi ci vogliono 128 byte:

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`

Come può funzionare la tua soluzione per i numeri dispari? Per d = 35, nessuna delle soluzioni ottimali è simmetrica.
SE - smetti di sparare ai bravi ragazzi

@Hohmannfan Restituisce la soluzione simmetrica meno subottimale, che in questo caso è |____________|___________|____________|ecc.
Neil,

Immagino sia l'interpretazione migliore.
SE - smetti di sparare ai bravi ragazzi

0

Rubino, 108 byte

Probabilmente si può giocare a golf molto di più. Algoritmo goloso.

->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}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.