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.