Wprowadzenie
Rozważ siatkę znaków, f A\/takich jak
f f f
A
A / \
\ / A
A \/
/
\/
gdzie:
fprzedstawia kran, który wylewa strumień wody w dółArozgałęzia się strumień wody powyżej, więc dokładnie połowa idzie w lewo, a dokładnie połowa idzie w prawo\przesuwa strumień wody powyżej w prawo o jedną jednostkę/przesuwa strumień wody powyżej w lewo o jedną jednostkę- kombinacje
\/tworzą koryto o nieskończonej pojemności, które zbiera strumienie wody nad nim [space]jest pustą przestrzenią, przez którą woda może się poruszać
Z tego możemy sobie wyobrazić ścieżkę, którą podążałaby woda ( *) wychodząca z kranów i opadająca do koryta lub poza obszar kratki:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
Zakładając, że 3 krany wytwarzają taką samą ilość wody pojedynczo, możemy to zobaczyć
- Cała woda z pierwszego kranu trafia do dolnej rynny.
- Połowa wody drugiego kranu trafia do dolnej rynny, a druga połowa jest dzielona między dolną rynnę i spada z siatki.
- Jedna czwarta wody trzeciego kranu trafia do dolnej rynny, jedna czwarta spada z dna kratki, jedna czwarta spada do górnej rynny, a jedna czwarta spada z kratki w prawo.
Na podstawie tego możemy stwierdzić, że (1 + 3/4 + 1/4 + 1/4) / 3 = 75%woda jest chwytana przez koryta i (1/4 + 1/4 + 1/4) / 3 = 25%spada z siatki.
Wyzwania
Możesz wykonać dowolne lub wszystkie z tych wyzwań związanych z konfiguracją przepływu wody ASCII. Wszyscy są golfem, najkrótszą odpowiedzią dla każdego wyzwania jest zwycięzca. Zaakceptowaną odpowiedzią będzie osoba, która ukończy najwięcej wyzwań, z całkowitą długością kodu jako rozstrzygającym.
Wyzwanie 1
Napisz program, który wydobywa część wody, która przepływa do niecki dla danej sieci. Wyjście z powyższego przykładu byłoby po prostu 0.75.
Wyzwanie 2
Napisz program, który, biorąc pod uwagę siatkę, rysuje *kropki w miejscach, w których woda płynie, tak jak zrobiłem powyżej. Nie należy nadpisywać niczego poza znakami spacji, a siatka nie powinna zmieniać rozmiaru. Więc na coś takiego
f
/A
nic nie trzeba robić, ponieważ chociaż woda płynie po obu stronach litery A, nie można jej wyciągnąć w lewo bez usunięcia /i nie można jej przesunąć w prawo bez powiększenia siatki 2 × 2.
Wyzwanie 3 (zaktualizowane)
Napisz program, który przyjmuje dwie nieujemne liczby całkowite, całkowitą T i kwotę, aby zachować K (T> = K). Wygeneruj i narysuj siatkę dokładnie ftaką, że gdy ten kran wyleje T jednostek wody, dokładnie K przepłynie do koryt. Jeśli nie da się tego zrobić w siatce skończonej dla konkretnej pary (T, K), wówczas wypisz „Impossible”.
Wyjaśnienia (dotyczą wszystkich wyzwań)
- Dane wejściowe mogą być wprowadzane przez stdin, plik, a nawet wywołanie funkcji na reprezentacji ciągu siatki. Po prostu wyjaśnij, jak uruchamiać różne wejścia.
- Dane wyjściowe muszą przejść do standardowego wyjścia.
\AiA/aAAsą także korytka jak można się spodziewać.- Siatka W by H będzie zawsze dobrze sformatowanym prostokątem znaków W * H, nie licząc nowych linii. Nie będzie brakujących spacji końcowych i żadnych wystąpień
*. - Wymiary siatki mogą być tak małe jak 1 × 1 i dowolnie duże. (Arbitralnie duży w granicach rozsądku, int.maxValue lub podobny jest dopuszczalnym limitem. To samo dotyczy T i K.)
- Przez nią
fprzepływa strumień powyżej strumienia . - Krany mogą być wszędzie, nie tylko w górnym rzędzie.
Azawsze dzieli ilość nalanej na nią wody dokładnie na pół.
Uwaga: rzeczy takie jak /Ai //są całkowicie poprawne. Woda jest swobodnie przepływać między znakami (choć na wyzwanie 2 nie znajduje się wystarczająco dużo miejsca, aby ją wyciągnąć).
Tak więc w konfiguracji
ff
/A
Lewy fstrumień leje się w dół, uderza /i przesuwa się w lewo. Prawy fstrumień wylewa się, uderza A, połowa idzie w prawo, a połowa idzie w lewo między Ai /.
na przykład
ff
**
*/A*
** *
** *
/AJeśli woda spadnie na A. W przypadku wszystkich wyzwań dobrze byłoby wyjaśnić, czy \Ajest to koryto. W przypadku trzeciego wyzwania należy Azałożyć , że 3 jednostki, które padają, należy podzielić 1.5 / 1.5(tak więc dane wejściowe to tak naprawdę pojedyncza liczba wymierna), czy też 2 / 1w jakim przypadku, która strona otrzymuje 2?
Anastępnie obie strony otrzymają 1,5. Zadaniem programisty jest upewnienie się, że precyzja pływaka nie stanowi problemu.)
fs