Kiedyś spotkałem się z tą (mini) grą, w której masz 4 lub więcej pionowych rur połączonych kilkoma poziomymi rurami i musisz wrzucić kulkę lub wodę do pionowych rur.
Znam dwa rodzaje:
- Umieść obiekt w wiadrze / koszu pod jednym z wyjść (zgadnij, w którą rurę go wrzucić)
- Zgadnij, z której rury będzie pochodzić obiekt.
Przykładowe rury:
| | |-------|
|-------| |-------|
| |-------| |
|-------|-------|-------|
| |-------| |
|-------| |-------|
|-------| |-------|
| |-------| |
Podstawowe zasady:
- Podczas przechodzenia przez poziomą rurę obiekt spadnie, jeśli to możliwe
- Podczas przechodzenia przez pionową rurę obiekt zamieni się w poziomą rurę, jeśli to możliwe.
Twoja praca
- Napisz program, który utworzy losową siatkę rur (patrz przykładowe rury).
- Powinny być co najmniej 4 rury pionowe i spora liczba rur poziomych co najmniej 10.
- Długość pionowych rur zależy od Ciebie.
- Pokaż ścieżkę, którą pokonał obiekt, aby dotrzeć do dna i pokaż, ile zakrętów trzeba było osiągnąć.
- (Opcjonalnie) wejście w celu ustalenia punktu początkowego, rury ponumerowane 1..N od lewej do prawej.
Pokaz:
| vertical pipe
- horizontal pipe
: vertical pipe used by the object
= horizontal pipe used by the object
V Object starting point
^ Object ending point
Przykład:
V
: | |-------|
:=======: |-------|
| :=======: |
|-----!-:=======: |
| :=======:-------|
|-------| :=======:
|-------| :=======:
| :=======: |
^
14 turns were taken to get to the end.
Bliższe dane
Obiekt wchodzi do rury 1 i zaczyna się przesuwać w dół, idzie w lewo do pierwszej poziomej rury.
Z powrotem w dół i do drugiej rury, a następnie zawracania w trzecią rurę.
Na końcu trzeciej rury widzisz wykrzyknik,
nie powinien być w twoim wyniku, ale użyłem tego, aby pokazać, że obiekt mógł pójść prosto.
Jednak reguła numer 1 zapobiega temu.
Zwycięzca zostanie wyłoniony głosami za 3 tygodnie od teraz 24-02-2014 (dd-mm).
Miłego kodowania ^. ^
popularity-contest
Teun Pronk
źródło
źródło
Odpowiedzi:
Matematyka
Kod 2D generuje wykres pokazujący ścieżkę wody. Wyświetliłem numery wierzchołków dla wygodnego sprawdzania krzyżowego z wyświetlaczem 3D. Zwykle numery wierzchołków byłyby ukryte.
Wejście:
W rzeczywistości wynik zawiera wiele obiektów. Pierwszym obiektem
result[[1]]
jest pokazany tutaj wykres 2D.Trójwymiarowe rury są
Tube
(linie 3D) narysowane w 3 przestrzeni. Współrzędne obliczone na podstawie wierzchołków wykresu 2D wzdłuż 3. współrzędnej, która została wygenerowana losowo (pozwala to rurom przyjmować różne położenia wzdłuż y za każdym razem, gdy kod jest uruchamiany).Osie są wyświetlane, aby pomóc czytelnikowi przekonać się, że rendering 3D jest rzeczywiście oparty na renderowaniu 2D.
Ciekawym wejściem 3D jest:
Liczba lub wiersze, kolumny i kolumna wejściowa są pobierane z kodu 2D. Nie trzeba ich ponownie wprowadzać.
Kod 2D
W najbliższych dniach udokumentuję i uporządkuję kod 2D i 3D.
Kod 3D i wyniki
źródło
DO#
(przez LINQPad, w trybie „C # Program”;)
Będę musiał zastosować Equitable Stroke Control, o ile może dojść do gry w golfa, ale takie jest moje podejście w C # (no cóż, LINQPad, ale kto chce, aby cała płyta kotłowa, która wchodzi w skład pełnej aplikacji C # działała?) .
Definicje siatki są zmienne, z wieloma pionowymi rurami i wysokością ogólnej struktury, i są powtarzalnie losowe, przekazując ziarno (patrz
PipeGrid
konstruktor).Wobec braku ostatecznej odpowiedzi, w jaki sposób obiekt przepływałby, gdyby którykolwiek kierunek był możliwy, pozwoliłem ci określić zachowanie z wielu opcji (patrz
SolveBehavior
wyliczenie /PipeSolver
konstruktor).Począwszy od pionu można zdefiniować (patrz
PipeSolver.Solve
).Założyłem, że rury poziome zawsze znajdują się między dwiema sąsiednimi rurami pionowymi, tzn. Żaden poziom nie może ominąć rury poziomej.
Aktualizacja:
Obawiając się, że mój zwykły tekst wyjściowy może być nieco ponury w tym kontekście popularności, oferuję rozszerzoną wersję, która również rysuje ścieżkę podjętą jako obraz. Modelowałem go jako samochód, jadąc przez okropną sieć dróg, próbując zejść na dno, ale z najgorszym na świecie odbiornikiem GPS, który zmusza cię do skrętu na każdym skrzyżowaniu.
Jako bonus, dzięki temu łatwiej jest zobaczyć „zakręty”.
Ciesz się - vroom vroom !!
Przykładowe wyniki:
(piony: 10, wysokość: 10, losowe ziarno: 5, początkowa rura: 2, rozwiązanie zachowania: FlipFlop})
źródło
DO#
Dobre czasy! :-)
Ten kod zapewnia, że na każdym końcu każdej rury znajduje się co najmniej jedna prosta rura. Zapewnia to również brak niejednoznacznych zwrotów.
Wynik:
źródło
Funciton
Jakby Funciton nie należał już do najbardziej bezsensownych języków na świecie, jest to z pewnością najbardziej bezużyteczny program, jaki do tej pory napisałem.
Ponieważ wygląda to brzydko w StackExchange ze względu na dodatkowe odstępy między wierszami, rozważ wykonanie następujących czynności w konsoli JavaScript przeglądarki, aby to naprawić:
Ponieważ Funciton nie ma generatora liczb losowych, postanowiłem pozwolić ci wprowadzić wzór potoku. Ponieważ kodowanie wzorców jest nieoczywiste, przypadkowe uderzanie w klawisze cyfr na klawiaturze jest tak samo dobre, jak generator liczb losowych.
Dane wejściowe powinny składać się z trzech liczb dziesiętnych oddzielonych spacjami. Pierwsza liczba to szerokość (jedna mniejsza niż liczba pionowych rur); drugi to indeks początkowej rury, a ostatnia to dowolna liczba, która koduje poziomy układ rur; możesz zrobić tak duży, jak chcesz. Jeśli szerokość jest ujemna lub indeks rury jest poza zakresem, wynikiem jest
Impossiburu.
Program automatycznie zapewnia, że nigdy nie ma obok siebie dwóch poziomych rur, które mogłyby powodować niejednoznaczne zakręty.
Wyjaśnienie
Główny program znajduje pierwsze dwie spacje i dzieli liczby. Przebiega trzeci (wzorzec rury),
░
a następnie wywołuje▒
z wynikiem, który zwraca wynik, a także liczbę wykonanych zwojów. Następnie dodaje tekstn turns were taken to get to the end.
, gdzien
obliczana jest liczba zwojów▒
.░
pobiera liczbę i wstawia0
-bit po każdym1
-bit, dzięki czemu nigdy nie ma dwóch kolejnych poziomych rur.▒
generuje dane wyjściowe, sukcesywnie wywołując,▓
a następnie przesuwając odpowiednią liczbę bitów z wzorca potoku, aż osiągnie zero. Również odpowiednio zwiększa lub zmniejsza „bieżącą rurę”.▓
generuje jeden wiersz wyniku. W każdej iteracji przesuwa się jeden bit z wzorca rury, a następnie decyduje, czy wyprowadzić│
(+ 4 spacje),║
(+ 4 spacje)├────┤
,╔════╝
lub╚════╗
; w ostatnich trzech przypadkach usuwa pierwszą postać z następnej iteracji. Ostatnia iteracja generuje│\r\n
lub║\r\n
odpowiednio.Przykładowe dane wyjściowe
Wejście:
Wynik:
Wejście:
Wynik:
Wejście:
Wynik:
źródło
Groovy, 311
Tutaj jest sformatowany:
Dane wyjściowe z próbki:
Inne wyjście:
(Wiem, że grałem w golfa zamiast popularności, ale to tylko mój styl)
źródło
JavaScript
Kanwa HTML nasłuchuje zdarzeń kliknięcia, znajduje najbliższy rząd potoków i używa go jako punktu początkowego. Dane wyjściowe są rysowane na kanwie i istnieje również obszar tekstowy zawierający dane wyjściowe ASCII zdefiniowane przez PO.
Algorytm zapewni, że nigdy nie będzie dwóch łączących rur poziomych. Oprócz tego ograniczenia w zmiennych początkowych zdefiniowane jest prawdopodobieństwo, które służy do losowego określania, czy powinna wystąpić rura pozioma.
JSFIDDLE
Wynik
źródło