Daj mi fryzurę!

18

Oto moja głowa:

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

Składa się z dokładnie ośmiu włosów. Moje włosy są za długie. Wytnij każdy pojedynczy pas na określoną przeze mnie długość.

Wejście

Główną atrakcją w tej sekcji jest faktyczna głowa włosów. Oto graficzna, kolorowa reprezentacja wraz z animacją dla leniwych:

oznaczone kolorami animowana rzecz

A oto pełna specyfikacja tego, czym jest zestaw włosów:

  • Poszczególne włosy, które będziemy nazywać nici , zostaną wykonane z /, \, |i -znaków ASCII, odtąd znany jako atomów .
  • Cała głowa słuchu (wszystkie pasma łącznie) będą ckolumnami po rrzędach, gdzie c≥ 1 i r≥ 2.
  • Każda nić będzie ...
    • zacznij od ostatniego rzędu głowy (rząd r- 1).
    • mają długość, w lktórej l≥ 2.
  • Nici można analizować następująco:
    1. Zacznij od dolnej części pasma. Będzie to /, |czy \atom, który nazywamy pierwiastek . (Pasemka są analizowane od lewej do prawej, uporządkowane według katalogu głównego).
    2. Znajdź atom wskazujący na rdzeń.
      • A |punktów atomów w górę i w dół. A -punkty atom lewo i prawo (ale nie może wskazywać na korzeniu ponieważ tylko korzenie mogą być w dolnym rzędzie). A /punkty atom lewo-dół i góra-prawo, a\ atom nie odwrotnie.
      • Zawsze będzie dokładnie jeden atom wskazujący na atom korzenia.
    3. Znajdź nieużywane atom (taki, który nie jest jeszcze częścią nici), który wskazuje na ten atom i nie znajduje się również poniżej tego atomu (włosy nie mogą rosnąć w dół, ale na boki jest w porządku).
      • Jeśli jest zero, osiągnąłeś koniec pasma!
      • Jeśli istnieje, jest to kolejny atom pasma. Powtórz krok 3 z tym atomem. (Ten atom jest teraz oznaczony jako „użyty” do celów kroku 3, ponieważ jest częścią nici).
      • W żadnym punkcie głowy nigdy nie będzie wielu niewykorzystanych atomów.

Format wejściowy będzie:

  • Głowa włosów. Może być wprowadzany w obecnym stanie (wejście wielowierszowe z dosłownymi znakami nowej linii) lub z ogranicznikiem do wyboru zamiast znaków nowego wiersza. Pamiętaj, że głowa zawsze będzie prostokątem; tj. końcowe białe spacje zostaną dodane w razie potrzeby (dziwne proste włosy po prawej stronie mają na celu wyeliminowanie dodatkowych białych spacji, aby uniknąć zamieszania).
  • Liczba ≥ 1 określająca, ile włosów należy obciąć. Zostanie to szczegółowo opisane w następnej sekcji.

Możesz zaakceptować wejście do funkcji, użyć STDIN / STDOUT itp. (Cokolwiek rozsądnego ).

Wynik

Twój wynik będzie głową włosów z zastosowaną fryzurą. Aby uzyskać fryzurę, po prostu zmniejsz długość każdego pasma włosów o określoną ilość (która zawsze będzie wynosić 1 lub więcej), zaczynając od punktu końcowego włosów przesuwających się w kierunku korzenia. Jednak zawsze opuszczają korzeń nienaruszony!

Oto prosty przykład. Powiedz, że wejście dla głowy to

\ 
 /
| 
| 

Z drugim wejściem 2odetniesz dwa atomy z nici i uzyskasz wynik

|
|

I z wejściem 42, wyjście byłoby po prostu

|

Zauważ, że białe znaki przed i po głowie są całkowicie nieistotne; możesz przyciąć dodatkowe znaki nowej linii lub dodać więcej wypełnienia. To nie ma znaczenia, dopóki głowa pozostaje nienaruszona. (Możesz również robić, co chcesz, z końcowymi spacjami).

Przypadki testowe

Dla wszystkich przypadków testowych zostanie użyty przykład przedstawiony na samym początku tego postu.

Długość fryzury = 1:

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

Długość 3:

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

Długość 7:

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

Długość 1337:

| \  /|  //  \ |

Punktacja

To jest , więc wygra najkrótszy kod w bajtach!

Klamka
źródło
Czy w dolnym rzędzie są atomy „-”? Punkt 2 wydaje się mówić tak, punkt 1 wydaje się mówić nie.
edc65,
@ edc65 Nie, nie ma. (Edytowane w celu wyjaśnienia)
Klamka
Myślę, że w przypadku testowym jest błąd. W czwartym rzędzie od dołu -trzeci pas z lewej strony |na czwartym pas z lewej
feersum,
@feersum Prawidłowe. Ścieżka zależy od tego, co wskazuje na -, a nie od tego , na co wskazuje . Na przykład, |nie wskazuje /na pierwszą nić, ale wskazuje na to /. (Tak, wiem, że to mylące; musiałem kilkakrotnie przerobić GIF, ponieważ myliłem nawet siebie!) Łatwiejszym sposobem na zrozumienie tego może być spojrzenie na górę drugiego pasma.
Klamka
Wiem, że zależy to od późniejszych utworów wskazujących na wcześniejsze. Moim argumentem jest to, że -należy połączyć je z czwartą nicią, a nie z trzecią.
feersum

Odpowiedzi:

12

JavaScript (E6) 195 212 222 232

Za pomocą funkcji rekurencyjnej R znajdź ścieżkę każdej nici i zaznacz pozycje od 1 dla najdalej od nasady. Następnie w drugim przejściu łatwo jest zastąpić dolną zaznaczoną pozycję spacjami.

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

Przetestuj w konsoli 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))

Wynik

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

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


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






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








| \  /|  //  \ |    
edc65
źródło