Dostajesz kilka probówek ASCII, Twoim zadaniem jest zmniejszenie liczby używanych probówek.
Każda probówka wygląda następująco:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
Oczywiście ~~
jest poziom wody. Probówka może być również pusta, w którym to przypadku nie ma żadnych ~~
znaków. Pojedyncza rurka może zawierać do 8 jednostek poziomu wody.
Otrzymujesz skończoną liczbę probówek z różnymi poziomami wody w środku. Musisz wlać wodę do możliwie najmniejszej ilości probówek i wyprowadzić wynik.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Jak widać, probówki są oddzielone pojedynczą spacją. Puste probówki nie powinny być pokazywane na wyjściu. To jest kod golfowy, więc wygrywa kod z najmniejszą liczbą bajtów.
Przypadki testowe: http://pastebin.com/BC0C0uii
Miłej gry w golfa!
Odpowiedzi:
Pyth,
484544 bajtówWypróbuj online.
Drukuje pojedyncze końcowe miejsce w każdej linii.
źródło
JavaScript (ES6),
159148 bajtówWysyła końcowy kanał. Edycja: Zapisano 11 bajtów przy pewnej pomocy @Arnauld.
źródło
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
powinien zaoszczędzić 4 bajty. Zamiast tego możesz zainicjować n do -1 i użyćn>>3
i~n&7^i
zapisać jeszcze jeden bajt.-1
pomysł, ale udało mi się go ulepszyćreplace
.1/"\n"
to prawda.Perl, 150 bajtów
149 bajtów kodu +
-n
flaga.Nie wyjaśnię całego kodu, tylko kilka rzeczy:
$l+=9-$.for/~~/g
liczy, ile wody jest na wejściu.Druga część kodu drukuje dane wyjściowe. Chodzi o to, aby umieścić jak najwięcej w pełni wypełnionych probówek, a ostatnia zawiera wodę, która pozostała (jeśli w ogóle). Tak algorytm jest na 4 części: drukuje pierwszej linii wody (w górnej części rurki)
say"|~~| "x$v.($@="| | ")x$r
. Następnie wydrukować puste fragmenty rur, aż osiągnie poziom wody w ostatniej rury:say$:=$@x$%for$l%8..6
. Następnie wydrukować poziom, gdzie woda ostatnia rura jest:say$@x$v."|~~|"x$r
. Następnie wydrukować wszystkie pozostałe „pustych” poziomy:say$:for 2..$l%8;
. I wreszcie, wydrukować dolnej linii:say"|__| "x$%
.Nazwy zmiennych sprawiają, że trudno odczytać (
$%
,$@
,$:
), ale pozwala na słowa kluczowe, jakx
ifor
do zapisania po zmiennej bez spacji.Aby uruchomić:
Nie jestem bardzo zadowolony z tego, jak długo trwa ta odpowiedź. Próbowałem jak najlepiej wykorzystać mój algorytm, ale inne podejście może być prawdopodobnie krótsze. Spróbuję wkrótce nad tym popracować.
źródło
Befunge,
144138 bajtówWypróbuj online!
Pierwsze dwa wiersze przetwarzają dane wejściowe, w zasadzie ignorując wszystko oprócz pierwszego znaku w każdej tubie, który może być znacznikiem poziomu. Bierzemy wartość ASCII tego znaku, dzielimy przez 2 i mod 2 (dając nam 1 lub 0 w zależności od tego, czy jesteśmy na znaczniku poziomu, czy nie), mnożymy to przez liczbę wierszy (odliczając od 8, dając nam w ten sposób wartość poziomu dla tej rurki) i dodaj ją do bieżącej sumy.
Dane wyjściowe są obsługiwane w dwóch kolejnych wierszach, zaczynając zasadniczo po prawej stronie trzeciego wiersza. Najpierw obliczamy liczbę rurek, biorąc całkowity poziom wody plus 7 podzielone przez 8. Następnie, podczas iteracji nad rzędami wszystkich rurek, obliczamy postać wyświetlaną w określonej rurce ( t , odliczając do 0) dla dany wiersz ( r , odliczanie od 8 do 0) w następujący sposób:
Obliczony typ char wynosi -1 dla najniższego rzędu (podstawy rury), 0 dla każdego innego obszaru, który nie jest poziomem wody, i 1 dla poziomu wody. Można go zatem wykorzystać jako proste wyszukiwanie w tabeli odpowiedniego znaku wyjściowego (można zobaczyć tę tabelę na początku wiersza 4).
źródło
Haskell, 186 bajtów
Przykład użycia:
Umieszcza końcowe miejsce w każdej linii. Jak to działa:
Głównym bólem był brak funkcji, która liczy, jak często podciąg występuje w ciągu. Jest
count
wData.Text
, ale to prowadzi do importowania bandą konfliktów nazw, które są zbyt drogie, aby rozwiązać.źródło
Python, 261 bajtów
Czuję, że czegoś mi brakuje. Ponadto, jeśli kilka pustych wierszy jest akceptowalnych dla pustych danych wyjściowych, mogę stracić niektóre bajty. Przyjmuje dane wejściowe jak
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.źródło
Rubin , 139 bajtów
(138 bajtów kodu plus jeden bajt dla
-n
)Wypróbuj online!
Kilka wyjaśnień:
Aktualizacja 1: Dodano szczegóły dotyczące zmiennych,
gsub
oszustwa i fazyEND{
…}
.Aktualizacja 2: (± 0 bajtów ogółem)
n||=0
zamiastn=n||0
(-1 bajt)-n
(+1 bajt)źródło
Python 3, 404 bajty
Ten program tworzy pełne zamierzone dane wyjściowe z poziomami wody zarówno w formacie ASCII, jak i liczbowym.
źródło