Dammi un taglio di capelli!


18

Questa è la mia testa:

\         /-- -|
 /   -\  |  |  |
\      \ \  \  |
 --\    | \  | |
    / |--| / / |
 /|-  //--| /  |
| |  ||   //\  |
| \  /|  //  \ |

Si compone esattamente di otto peli. I miei capelli sono troppo lunghi. Si prega di tagliare ogni singolo filo ad una lunghezza che specifico.

Ingresso

L'attrazione principale in questa sezione è la vera capigliatura. Ecco una rappresentazione grafica con codice colore, insieme a un'animazione , per i pigri:

cosa codificata per colore cosa animata

Ed ecco una specifica completa per ciò che è un set di capelli:

  • I singoli peli, che chiameremo trefoli , saranno realizzati i /, \, |e -caratteri ASCII, ormai noto come atomi .
  • L'intero head of hear (tutti i trefoli combinati) saranno ccolonne per rrighe, dove c≥ 1 e r≥ 2.
  • Ogni filo sarà ...
    • inizia dall'ultima riga della testa (riga r- 1).
    • avere una lunghezza ldove l≥ 2.
  • I fili possono essere analizzati con il seguente metodo:
    1. Inizia dalla parte inferiore del filo. Questo sarà un /, |o \atomo, che chiameremo la radice . (I fili vengono analizzati da sinistra a destra, ordinati per radice.)
    2. Trova l'atomo che punta verso la radice.
      • Un |atomo punta su e giù. Un -atomo punta a destra e sinistra (ma non può mai puntare alla radice poiché solo le radici possono trovarsi nella riga inferiore). Un /atomo punta verso sinistra e verso l'alto e un \atomo fa il contrario.
      • Ci sarà sempre esattamente un atomo che punta verso l'atomo di radice.
    3. Trova un atomo inutilizzato (uno che non fa ancora parte di alcun filamento) che punta verso questo atomo e non è nemmeno al di sotto di questo atomo (i capelli non possono crescere verso il basso, ma lateralmente va bene).
      • Se ci sono zero, hai raggiunto la fine del filo!
      • Se ce n'è uno, questo è l'atomo successivo del filo. Ripeti il ​​passaggio 3 con questo atomo. (Questo atomo è ora contrassegnato come "usato" ai fini del passaggio 3, poiché fa parte di un filo.)
      • Non ci saranno mai più atomi inutilizzati qui in nessun punto della testa.

Il formato di input sarà:

  • Una chioma. Può essere inserito così com'è (input multilinea con newline letterali) o con un delimitatore di tua scelta al posto delle newline. Nota che la testa sarà sempre un rettangolo; vale a dire che gli spazi bianchi finali verranno aggiunti se necessario (lo strano pelo della linea retta sulla destra è solo per eliminare gli spazi bianchi finali aggiuntivi per evitare confusione).
  • Un numero ≥ 1 che specifica la quantità di capelli da tagliare. Questo sarà descritto in dettaglio nella prossima sezione.

È possibile accettare input per una funzione, utilizzare STDIN / STDOUT, ecc. (Qualsiasi cosa ragionevole ).

Produzione

Il risultato sarà la chioma con il taglio di capelli applicato. Per dare un taglio di capelli, è sufficiente ridurre la lunghezza di ogni ciocca di capelli della quantità specificata (che sarà sempre 1 o maggiore), a partire dall'estremità del capello che si sposta verso la radice. Tuttavia, lascia sempre intatta la radice!

Ecco un semplice esempio. Dire che l'ingresso per la testa è

\ 
 /
| 
| 

Con un secondo input di 2, taglieresti due atomi dal filamento e ne otterrai un risultato

|
|

E con un input di 42, l'output sarebbe semplicemente

|

Si noti che gli spazi bianchi prima e dopo la testa sono completamente irrilevanti; puoi tagliare nuove righe o aggiungere più imbottitura. Non importa, finché la testa rimane intatta. (Puoi fare quello che vuoi anche con gli spazi bianchi finali).

Casi test

Per tutti i casi di test, verrà utilizzato l'esempio presentato all'inizio di questo post.

Lunghezza taglio capelli = 1:

          /-   |
 /    \  |     |
\      \ \  \  |
 --\    | \  | |
    / |--  / / |
  |-  //--| /  |
| |  ||   //   |
| \  /|  //  \ |

Lunghezza di 3:

         |      
         \     |
 --\    | \    |
    / |--  / / |
  |-  //  | /  |
  |  ||   //   |
| \  /|  //  \ |

Lunghezza di 7:

  |-  /   |     
  |  |    /    |
| \  /|  //  \ |

Lunghezza del 1337:

| \  /|  //  \ |

punteggio

Questo è , quindi vincerà il codice più breve in byte!


Ci sono atomi "-" nella riga inferiore? Il punto 2 sembra dire di sì, il punto 1 sembra dire di no.
edc65,

@ edc65 No, non ci sono. (Modificato per chiarire)
Maniglia della porta

Penso che ci sia un errore nel caso di test. Nella quarta fila dal basso, la -terza fila da sinistra indica |la quarta fila da sinistra
febbraio

@feersum Correct. Il percorso è determinato da ciò che punti al la -, non quello a cui punta . Ad esempio, il |non punta al /nel primo filamento, ma è indicato dal /. (Sì, lo so che è confuso; ho dovuto rifare la GIF più volte perché ho confuso anche me stesso!) Un modo più semplice per capire questo potrebbe essere solo quello di guardare in cima al secondo filone.
Maniglia della porta

So che è determinato da pezzi successivi che indicano quelli precedenti. La mia tesi è che il -dovrebbe essere unito al quarto filamento, non al terzo.
feersum

Risposte:


12

JavaScript (E6) 195 212 222 232

Utilizzando una funzione ricorsiva R per trovare il percorso di ciascun filo e segnare le posizioni a partire da 1 per il più lontano dalla radice. Quindi è facile, in un secondo passaggio, sostituire la posizione contrassegnata inferiore con spazi vuoti.

F=(h,t,
   n=[...h],c=h.search('\n'),
   R=p=>[1,-1,c+2,c+1,c].some((d,i)=>n[p-d]=='--\\|/'[i]?n[p-=d]=1:0)&&R(p)+(R[p]=l++)
  )=>
  n.map((v,p)=>R[p]<t?' ':h[p],n.map((a,p)=>!h[p+c]&a>' '&&R(p,l=0))).join('')

Test nella console FireFox / FireBug

head = "\\         /-- -|\n /   -\\  |  |  |\n\\      \\ \\  \\  |\n --\\    | \\  | |\n    / |--| / / |\n /|-  //--| /  |\n| |  ||   //\\  |\n| \\  /|  //  \\ |";
console.log(F(head,0))
console.log(F(head,1))
console.log(F(head,3))
console.log(F(head,7))
console.log(F(head, 1337))

Produzione

\         /-- -|
 /   -\  |  |  |
\      \ \  \  |
 --\    | \  | |
    / |--| / / |
 /|-  //--| /  |
| |  ||   //\  |
| \  /|  //  \ |

          /-   |
 /    \  |     |
\      \ \  \  |
 --\    | \  | |
    / |--  / / |
  |-  //--| /  |
| |  ||   //   |
| \  /|  //  \ |


         |      
         \     |
 --\    | \    |
    / |--  / / |
  |-  //  | /  |
  |  ||   //   |
| \  /|  //  \ |






  |-  /   |     
  |  |    /    |
| \  /|  //  \ |








| \  /|  //  \ |    
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.