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!


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

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

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


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






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








| \  /|  //  \ |    
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.