Gib mir einen Haarschnitt!

18

Das ist mein Kopf:

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

Es besteht aus genau acht Haaren. Mein Haar ist zu lang. Bitte schneiden Sie jeden einzelnen Strang auf eine von mir angegebene Länge.

Eingang

Die Hauptattraktion in diesem Abschnitt ist das eigentliche Haar. Hier ist eine grafische, farbcodierte Darstellung zusammen mit einer Animation für die Faulen:

farbcodiertes Ding animiertes Ding

Und hier ist eine vollständige Spezifikation für das, was ein Haarsatz ist:

  • Die einzelnen Haare, die wir nennen Stränge werden hergestellt aus den werden /, \, |und -ASCII - Zeichen, von nun an als bekannt Atome .
  • Der gesamte Head of Hear (alle Stränge zusammen) besteht aus cSpalten und rZeilen mit c≥ 1 und r≥ 2.
  • Jeder Strang wird ...
    • Beginnen Sie an der letzten Reihe des Kopfes (Reihe r- 1).
    • hat eine Länge , lwo l≥ 2.
  • Strands können mit der folgenden Methode analysiert werden:
    1. Beginnen Sie am unteren Ende des Strangs. Dies wird eine sein /, |oder \Atom, das wir nennen Wurzel . (Die Stränge werden von links nach rechts analysiert, sortiert nach der Wurzel.)
    2. Finden Sie das Atom, das zur Wurzel zeigt.
      • Ein |Atom zeigt auf und ab. Ein -Atom zeigt nach links und rechts (kann aber niemals auf die Wurzel zeigen, da sich nur Wurzeln in der unteren Reihe befinden können). Ein /Atom zeigt nach links unten und nach oben rechts und ein \Atom macht das Gegenteil.
      • Es wird immer genau ein Atom geben, das auf das Wurzelatom zeigt.
    3. Suchen Sie ein unbenutztes Atom (eines, das noch nicht zu einem Strang gehört), das auf dieses Atom zeigt und sich auch nicht unter diesem Atom befindet (Haare können nicht nach unten wachsen, aber seitwärts sind in Ordnung).
      • Wenn es Null gibt, haben Sie das Ende des Strangs erreicht!
      • Wenn es eines gibt, ist dies das nächste Atom des Strangs. Wiederholen Sie Schritt 3 mit diesem Atom. (Dieses Atom wird jetzt für die Zwecke von Schritt 3 als "verwendet" markiert, da es Teil eines Strangs ist.)
      • An keiner Stelle im Kopf wird es hier mehrere unbenutzte Atome geben.

Das Eingabeformat ist:

  • Ein Haarschopf. Kann unverändert eingegeben werden (mehrzeilige Eingabe mit wörtlichen Zeilenumbrüchen) oder mit einem Begrenzer Ihrer Wahl anstelle von Zeilenumbrüchen. Beachten Sie, dass der Kopf immer ein Rechteck ist. Das heißt, nachgestellte Leerzeichen werden nach Bedarf hinzugefügt (das seltsame gerade Haar auf der rechten Seite dient nur dazu, zusätzliche nachgestellte Leerzeichen zu entfernen, um Verwirrung zu vermeiden).
  • Eine Zahl ≥ 1, die angibt, wie viel Haar geschnitten werden soll. Dies wird im nächsten Abschnitt ausführlich beschrieben.

Sie können Eingaben in eine Funktion akzeptieren, STDIN / STDOUT usw. verwenden (alles, was zumutbar ist ).

Ausgabe

Ihre Ausgabe ist der Haarschopf mit dem angewendeten Haarschnitt. Um einen Haarschnitt zu erzielen, reduzieren Sie einfach die Länge jeder Haarsträhne um den angegebenen Betrag (der immer 1 oder mehr beträgt), beginnend mit dem Endpunkt des Haares, das sich in Richtung Wurzel bewegt. Lassen Sie die Wurzel jedoch immer intakt!

Hier ist ein einfaches Beispiel. Sagen wir, die Eingabe für den Kopf ist

\ 
 /
| 
| 

Bei einer zweiten Eingabe von 2würden Sie zwei Atome aus dem Strang herausschneiden und erhalten ein Ergebnis von

|
|

Und bei einer Eingabe von 42wäre die Ausgabe einfach

|

Beachten Sie, dass Leerzeichen vor und nach dem Kopf völlig irrelevant sind. Sie können zusätzliche Zeilenumbrüche zuschneiden oder mehr Polster hinzufügen. Es spielt keine Rolle, solange der Kopf intakt bleibt. (Sie können auch mit nachgestelltem Leerzeichen machen, was Sie wollen.)

Testfälle

Für alle Testfälle wird das Beispiel verwendet, das zu Beginn dieses Beitrags vorgestellt wurde.

Haarschnittlänge = 1:

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

Länge von 3:

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

Länge von 7:

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

Länge von 1337:

| \  /|  //  \ |

Wertung

Das ist , also gewinnt der kürzeste Code in Bytes!

Türknauf
quelle
Gibt es Atome "-" in der unteren Reihe? Punkt 2 scheint ja zu sagen, Punkt 1 scheint nein zu sagen.
Edc65
@ edc65 Nein, gibt es nicht. (Bearbeitet zur Klarstellung)
Türknauf
Ich denke es liegt ein Fehler im Testfall vor. In der vierten Reihe von unten zeigt der -dritte Strang von links auf |den vierten Strang von links
feersum 19.10.14
@feersum Richtig. Der Pfad wird durch bestimmt , welche Punkte des -, nicht das, was er zeigt . Zum Beispiel zeigt das |nicht auf den /ersten Strang, sondern auf den /. (Ja, ich weiß, dass es verwirrend ist. Ich musste das GIF mehrmals wiederholen, weil ich mich selbst verwirrt habe!) Ein einfacherer Weg, dies zu verstehen, besteht darin, einfach auf den oberen Rand des zweiten Strangs zu schauen.
Türknauf
Ich weiß, dass es an späteren Stücken liegt, die auf frühere verweisen. Mein Argument ist, dass die -an den vierten Strang angeschlossen werden sollte, nicht an den dritten.
Feersum

Antworten:

12

JavaScript (E6) 195 212 222 232

Verwenden Sie eine rekursive Funktion R, um den Pfad jedes Strangs zu finden und die Positionen beginnend mit 1 für die am weitesten von der Wurzel entfernte Position zu markieren. Dann ist es einfach, in einem zweiten Durchgang die untere markierte Position durch Leerzeichen zu ersetzen.

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 in der FireFox / FireBug-Konsole

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))

Ausgabe

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

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


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






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








| \  /|  //  \ |    
edc65
quelle