Być może widziałeś to w Die Hard: With a Vengeance ... To pytanie jest oparte na słynnej 3 i 5-litrowej dzbanku, ale z nieco innym kątem.
Zdobądź kod, który po podaniu liczby całkowitej od 1 do 100 dostarczy ci najszybszych instrukcji, jak odmierzyć do zbiornika odpowiednią liczbę litrów wody z fontanny, używając 3-litrowego dzbanka i 5-litrowego dzbanka.
Nie ma gradacji w żadnym z dzbanków; fontanna jest bogata w wodę i zakłada się, że zbiornik jest opróżniany na początku każdego wykonania kodu.
Nie można uzyskać dostępu do wody ze zbiornika, gdy trafi ona do zbiornika.
Format wykonania jest następujący:
Wejście:
4
na przykład.
Wynik
Wyjmij każdy numerowany krok, jak pokazano, a następnie sumę objętości dzbanka 5L, dzbanka 3L i zbiornika. Format Tally pokazano również poniżej. Liczba kroków musi być również wyprowadzona na końcu kroków.
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into 3L jug
5L: 2, 3L: 3, T: 0
3) Empty 3L jug
5L: 2, 3L: 0, T: 0
4) Pour from 5L jug into 3L jug
5L: 0, 3L: 2, T: 0
5) Fill 5L jug
5L: 5, 3L: 2, T: 0
6) Pour from 5L jug into 3L jug
5L: 4, 3L: 3, T: 0
7) Pour from 5L jug into tank
5L: 0, 3L: 3, T: 4
Volume measured out in 7 turns
Przykład 2
Wejście: 8
Wynik:
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 3L jug
5L: 0, 3L: 3, T: 5
4) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 8
Volume measured out in 4 turns
Konwencje
Fill xL jug
- napełnia powiązany dzbanek do góry z fontannyEmpty xL jug
- opróżnia zawartość powiązanego dzbanka do fontannyPour from xL jug into yL jug
- Wlewa zawartość dzbanka xL do dzbanka yLPour from xL jug into tank
- Wlewa zawartość dzbanka xL do zbiornika
Najkrótszy kod wygrywa.
źródło
Odpowiedzi:
Rubin,
407376365331324323Trudno to odczytać ...
Pobiera dane wejściowe na STDIN. Przykładowy przebieg dla N = 10:
źródło
T-SQL 2012:
14101302Kolejna quiksotyczna próba pytania w SQL, ale ta oferowała przyjemną okazję do zabawy z niektórymi nowymi opcjami funkcji okna w wersji 2012. Ponadto wykorzystuje rekurencyjne CTE, które mogą nie być imponujące w większości języków programowania, ale rekurencja w SQL jest jak przejście z konia i buggy na Ferrari.
Silnik w centrum tego jest w liniach 5-12, który wykorzystuje rekurencyjną CTE i funkcję okna do zbudowania tabeli zawierającej większość liczb potrzebnych do rozwiązania problemu. Zwróć uwagę w szczególności na test 3, 4, 6 lub 9, który zapewnia optymalne podejście do rozwiązania o 3 sekundy od tych liczb. (Technicznie rzecz biorąc, jest remis dla 4 między podejściem 3-1 i 2-2, ale w ten sposób grałem w golfa dla wielu postaci.) Następnie łatwo jest dołączyć do tabeli przeglądowej optymalnych kroków dla różnych części problemu i użyj innej funkcji okna, aby poprawnie ponumerować kroki.
Jeśli nie masz MS SQL leżącego, baw się nim na SQLFiddle.
Wyniki dla danych wejściowych 42:
Edytować:
Grał w golfa przyzwoitą poprawę wyniku przez
źródło
JavaScript: 481
Doceniona pierwsza próba gry w golfa
Bałagan z niektórymi liczbami, ponieważ nie sprawdza, czy lepiej jest wlać 3 lub 5, przykład: 9 daje 9 obrotów zamiast 6, mogę to naprawić później
Wklej to w konsoli
Od 553 do 481 dzięki @WallyWest
źródło
n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns")
dla 481 znaków ...if
sJava, 610
Wziąłem rozwiązanie Sumedh i golfa. Chciałem umieścić to w komentarzach, ale moja reputacja to za mało :(. To o 40% mniej, myślę, że przynajmniej należy się tym podzielić. Nadal jednak daleko od pierwszego ...
Oto nie golfista:
Uwaga: działa tylko przy pierwszym uruchomieniu. Uruchom go ponownie, a wynik będzie niepoprawny (ze względu na zmienną globalną).
Następująca wersja jest bezpieczna, ale tracimy 2 znaki, przechodząc z 610 do 612:
Przykładowe dane wyjściowe dla N = 69:
źródło
Java: 984
Oto kod
Dane wejściowe pochodzą z wiersza poleceń. na przykład: java X 4
źródło
main(String[]s)
,int n=Integer.parseInt(s[0]),t=0,c=0;
,java.io.PrintStream q=System.out;
. Ponadto może być możliwe napisanie pierwszegowhile
jako jednego lub dwóch znaków krótszychfor
. Co więcej, twojeString
są powtarzalne, możesz próbować przechowywać powtarzalne części w zmiennych lub tworzyć funkcje, które budują je przy użyciu tylko jednego prefabrykatuString
.Python 2.7 - 437
Nie jest to najkrótszy kod, ale myślę, że jest to najbardziej optymalny sposób rozwiązania tego problemu.
Jak stwierdziłem w komentarzach, najbardziej optymalny sposób na obliczenie tego:
divmod(amount,5)
. Otrzymasz jedną z 4,3,2,1 jako pozostałą część.Który pozostawia 1 lub 2 jako resztę. Skorzystaj z optymalnego rozwiązania, które może być znane z góry jako:
Kod:
I wyjście dla 4L w 7 krokach:
źródło
Smalltalk (Smalltalk / X),
568560516wejście in:
to zdecydowanie najbardziej zaciemniony program, jaki kiedykolwiek napisałem ...
Edycja: Niektóre inne Smalltalks mogą nie zezwalać na deklarowane automatycznie zmienne obszaru roboczego i będziesz musiał przygotować deklaracje. Również bindWith: może być inny (expandWith: '<p>').
przykładowe wyjście dla n = 17:
źródło
C
567609poprzednia nieprawidłowa wersja:
a oto kod odśluzowany:
źródło
C (
480465 bajtów)Wersja optymalna (dodaje 10 bajtów)
Prawdopodobnie można tu grać w golfa - zabijały mnie funkcje wyjściowe. To powinno dać optymalne rozwiązanie (najmniejszą liczbę kroków). Podobnie jak w innym kodzie tutaj, wypełnia i opróżnia dzbanki 5L, aż osiągnie poziom poniżej 5, a następnie przełączy się na dzbanki 3L. Testuje 2 specjalne przypadki (6 i 9) i jeśli je znajdzie, przełącza się na dzbanki 3L. Instrukcje uzyskania 1L i 2L są zakodowane na stałe.
Bardziej czytelna wersja:
Edycje:
Wyjście testowe dla n = 11 (wersja optymalna):
źródło
T-SQL (2012):
794689580Zainspirowany odpowiedzią T-SQL @ Jonathan-Van-Matre w połączeniu z algorytmem @ Lego-Stormtroopr . Chciałem to zrobić, ponieważ podobało mi się 99 butelek piwa wyzwanie .
Próbowałem zachować okno (
OVER
do minimum funkcje ) zamiast funkcji matematycznych / boolowych.SQLFiddle jest tutaj .
Wejście:
11
Czytelny dla człowieka:
źródło
input = 8
input = 11
Python 3 (417 znaków)
Wyjaśniono
Zauważ, że mamy 4 przedmioty, a mianowicie dzbanek o pojemności 3 litrów, dzbanek o pojemności 5 litrów, zbiornik i foutain. Jedyne operacje, jakie możemy wykonać, to przenosić wodę z obiektu
a
na obiektb
. To jest funkcjao(a, b)
robi w moim kodzie, przesuwa wodę i drukuje ją i wciąż liczy.Wydziwianie
N=['3L jug','5L jug','tank',0]
. Tutaj potrzebuję ostatniego elementu, którego należy unikaćIndexError
. Można go również używać jako globalnej zmiennej zliczającej, bezglobal
słowa kluczowego ekspansywnego . Na przykład,N[3] += 1
Ponieważ
0 <= a < 4, 0 <= b < 4
w funkcjio(a, b)
możemy kodować(a, b)
cyfrę szesnastkową za pomocą(a << 2) | b
i zdekodować ją za pomocądivmod(x, 4)
. Dzięki tej sztuczce wszystkie 5 rozwiązań (reminder=0, 1, 2, 3, 4
) można zakodować w tablicy['','c1c12','d46','c2','d434d46']
, która jest nieco krótsza niż w oryginalnej formie:A=[ (), ((3,0),(0,1),(3,0),(0,1),(0,2)), ((3,1),(1,0),(1,2)), ((3,0),(0,2)), ((3,1),(1,0),(0,3),(1,0),(3,1),(1,0),(1,2)) ]
Wyjście próbki (n = 17)
źródło
COBOL (IBM Enterprise COBOL) 192 linie 72 znaków
To jest dowód koncepcji na pytanie i początek jednego dla Golf-COBOL :-)
Pytanie wymaga najszybszego. Tak więc, wdrażaj równoległość. Nawet jedna osoba może z łatwością napełnić jednocześnie jeden dzbanek o pojemności 3 litrów i jeden dzbanek o pojemności 5 litrów.
Po prostu podziel dane wejściowe przez osiem, pozostawiając resztę. Wykonaj kilka szybkich napełnień 5L / 3L dokładnie tyle razy, ile osiem pasuje dokładnie, a następnie upuść jeden z pozostałych siedmiu litrów.
Najciekawsze z pozostałych to cztery litry. Robiąc to jako jeden litr plus trzy litry, przepycha o wiele mniej wody, tylko 18 litrów w porównaniu do 23 dla innych możliwości.
Kod (działa)
W ten sposób uzyskuje się całkowity spadek komunikatów diagnostycznych dla kodu rozpoczynającego się w niewłaściwym miejscu i brak wymaganych kropek.
Żadna z diagnoz nie wskazuje żadnego wpływu na kod obiektu. Więc pomimo tego, że jest to błąd RC = 8, wiem, że obiekt będzie OK, więc połączyłem go i uruchomiłem.
Oto moce od jednego do ośmiu litrów. Następnie wszystkie wyniki mogą być intuicyjne. 17 i 100 podano jako przykłady równoległości.
Nadal można wiele zrobić, aby wycisnąć program z postaci, poprawne wyjście było najważniejsze. Liczenie znaków na liniach o stałej długości to zupełnie inna sprawa.
Przykładowe dane wyjściowe:
źródło