Wprowadzenie
Rozważ siatkę znaków, f A\/
takich jak
f f f
A
A / \
\ / A
A \/
/
\/
gdzie:
f
przedstawia kran, który wylewa strumień wody w dółA
rozgałę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 f
taką, ż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.
\A
iA/
aAA
są 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ą
f
przepływa strumień powyżej strumienia . - Krany mogą być wszędzie, nie tylko w górnym rzędzie.
A
zawsze dzieli ilość nalanej na nią wody dokładnie na pół.
Uwaga: rzeczy takie jak /A
i //
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 f
strumień leje się w dół, uderza /
i przesuwa się w lewo. Prawy f
strumień wylewa się, uderza A
, połowa idzie w prawo, a połowa idzie w lewo między A
i /
.
na przykład
ff
**
*/A*
** *
** *
f
s/A
Jeśli woda spadnie naA
. W przypadku wszystkich wyzwań dobrze byłoby wyjaśnić, czy\A
jest to koryto. W przypadku trzeciego wyzwania należyA
zał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 / 1
w jakim przypadku, która strona otrzymuje2
?A
następnie obie strony otrzymają 1,5. Zadaniem programisty jest upewnienie się, że precyzja pływaka nie stanowi problemu.)Odpowiedzi:
Wszystkie wyzwania C # 690 bajtów (416 bajtów + 274 bajtów)
Wyzwania 1 i 2 C #
579446416 bajtówJest to kompletny program, który powinien wykonać Wyzwania 1 i 2. Odczytuje wiersze wejścia ze standardowego wejścia, aż do otrzymania pustej linii. Wyświetla wynik dla Wyzwania 2, a następnie dla Wyzwania 1. Używa klasy dziesiętnej .NET, aby, mam nadzieję, uniknąć błędów zaokrąglania.
Mniej golfa:
Uruchomienie testowe (z obietnicą braku spacji końcowych):
Wyzwanie 3 C # 274 bajtów
Jest to kompletny program, który powinien zakończyć Wyzwanie 3. I a udało się uratować 6bytes pisząc własną całkowitą parser czytać wejście zamiast
Split
ingReadLine
i korzystanialong.Parse
;Mniej golfa:
Uruchomienie testowe (znowu przy braku spacji końcowych, które obiecuję, że są):
źródło
Przede wszystkim mam pytanie dotyczące wyzwania. Ponieważ nie mam wystarczającej reputacji, aby skomentować to pytanie, piszę to tutaj:
/A
(woda płynąca na A),//
(woda płynąca po prawej stronie) i odmiany tej zasady? Czy woda płynie do pierwszego „wolnego miejsca” z boku, czy płynie „poniżej” swojego sąsiada?Wystarczy prosta próba, można ją uprościć (co zrobię później, edytując ten post).
Edycja: druga wersja, nieco mniejsza. Wybrałem inne podejście: zamiast szukać każdej komórki, aby sprawdzić, co się dzieje z góry i po bokach, zaczynam od kranów i „płynę” w dół z rekurencją.
JavaScript, 226 bajtów (wyzwanie 1)
JavaScript, 204 bajty (wyzwanie 2)
JavaScript, 238 bajtów (wyzwanie 1 + 2)
Jak używać
Podaj dwuwymiarową reprezentację mapy. Oto przykład podany w pytaniu:
Wynik
Wyzwanie 1: Po prostu utworzy okno dialogowe (alert) z wynikiem (0,75 dla powyższego przykładu).
Wyzwanie 2: Bezpośrednio zmodyfikuje mapę. Czy powinienem to wydrukować? Jeśli tak, to czy plik console.log jest akceptowany? jako prawidłowy wynik?
Wyzwanie 1 + 2: Oba powyższe połączone, oczywiście ...
źródło
A
lub ukośników. Wyjaśniłem to w pytaniu.Output must go to stdout.
str[0]
ciągi. Byłaby to tablica ciągów zamiast tablicy tablic znaków.Python 3, 186 bajtów (wyzwanie 3)
Pomysł na siatkę wziąłem z odpowiedzi VisualMelon . Funkcja powinna wydrukować prawidłową siatkę na standardowe wyjście dla dowolnie dużych T i K, pod warunkiem, że jest to możliwe (siatka o skończonych rozmiarach).
Jak używać
Wywołaj
c
funkcję z całkowitą kwotą i kwotą, aby zachować jako argumentyźródło