Kilka miesięcy temu miałem to pytanie jako łamigłówkę przed przesiewową rozmową kwalifikacyjną. Ostatnio, gdy myślę o blogu, pojawił się w mojej głowie jako dobry przykład, który można wykorzystać do funkcjonalnego rozwiązania problemu. Prześlę swoje rozwiązanie tego problemu, gdy tylko skończę pisać mój blog.
UWAGA: To pytanie zostało zadane na StackOverflow rok temu i zostało odrzucone po kilku (niepoprawnych) odpowiedziach. Zakładam, że zostało to uznane za oczywiste pytanie za wywiad lub zadanie domowe. Nasze odpowiedzi powinny być wystarczająco głęboko zakodowane w golfa, aby ktoś nie pomyślał o ich użyciu!
W wyścigu obstawiasz stosując następującą strategię. Ilekroć przegrywasz zakład, podwajasz wartość zakładu w następnej rundzie. Za każdym razem, gdy wygrasz, zakład na następną rundę będzie wynosić jednego dolara. Rundę zaczynasz od obstawienia jednego dolara.
Na przykład, jeśli zaczniesz od 20 dolarów i wygrasz zakład w pierwszej rundzie, przegrasz zakład w następnych dwóch rundach, a następnie wygrasz zakład w czwartej rundzie, skończysz z 20 + 1-1-2 +4 = 22 dolary.
Oczekuje się, że ukończysz funkcję g
, która wymaga dwóch argumentów:
- Pierwszym argumentem jest liczba całkowita,
a
która jest kwotą początkową, jaką mamy, kiedy rozpoczynamy obstawianie. - Drugi argument to ciąg znaków
r
. I-tą postacią wyniku będzie „W” (wygrana) lub „L” (przegrana), oznaczający wynik i-tej rundy.
Twoja funkcja powinna zwrócić ilość pieniędzy, którą będziesz mieć po rozegraniu wszystkich rund.
Jeśli w którymś momencie nie masz wystarczającej ilości pieniędzy na koncie, aby pokryć wartość zakładu, musisz przerwać i zwrócić sumę, którą masz w tym momencie.
Przykładowy przebieg
1st round - Loss: 15-1 = 14
2nd round - Loss: 14-2 = 12 (Bet doubles)
3rd round - Loss: 12-4 = 8
4th round - Win: 8 + 8 = 16
5th round - Loss:16-1 = 15 (Since the previous bet was a win, this bet has a value of 1 dollar)
6th round - Loss: 15-2 = 13
7th round - Loss: 13-4 = 9
8th round - Loss: 9-8 = 1
W 1
tym przypadku funkcja powraca
Zwycięzca jest określany przez najmniejszą liczbę znaków WEWNĄTRZ domyślnej definicji funkcji. W razie potrzeby współpracuj według języka. Wiem, że moje można ulepszyć!
Odpowiedzi:
GolfScript, 33 znaki
Przykłady ( online ):
Kod z adnotacjami:
źródło
Python 2,
726862 bajtówNazwijmy to tak:
g(15,'LLLWLLLL')
.To po prostu zapętla łańcuch, zmieniając wartość pieniędzy, które mamy na podstawie postaci.
Oto przykładowy program, który uruchamia testy tej funkcji:
Przykładowe dane wyjściowe:
Po niewielkiej zmianie testera możemy uzyskać średni zysk z wielu przebiegów:
Przykładowe dane wyjściowe (zajęło sporo czasu, ponieważ wywołujemy
5000000
czasy funkcji ):Edycja: Podziękowania dla Howarda i Danny'ego za dalszą grę w golfa.
EDYCJA: teraz program sprawdza, czy jest wystarczająco dużo pieniędzy, aby postawić zakład. To faktycznie oszczędza bajty.
źródło
c=='L'
zc<'W'=
. Możesz także pisać,b,n=((n,1),(-n,2*n))[c<'W']
co pozwala zaoszczędzić więcej znaków (if a<-b:break
,a+=b
).b,n=
podstępu ([
s na zewnątrz), ale python narzekał. Spróbujmy jeszcze raz.if n<=a
uratowałby cię trochę, bo nie będziesz musiałbreak
?R, 95 znaków
Zębaty:
Stosowanie:
źródło
J -
6355 znakówTeraz z dodatkową premią za nie bycie niepoprawnym! To nawet dokładnie tak długo jak wcześniej.
Bierze początkową kwotę pieniędzy jako lewy argument i pasmo wygranej / straty po prawej stronie.
Objaśnienie: Program dzieli się równomiernie na coś w rodzaju kompozycji dwóch funkcji, obie wyszczególnione poniżej. Pierwszy przekształca pasmo wygranych / przegranych w wartości zakładów, z odpowiednim znakiem, a następnie drugi faktycznie rozpoznaje odpowiedź, biorąc pod uwagę początkowe pieniądze i tę przekształconą pasmo wygranych / przegranych.
Pamiętaj, że przekazujemy pieniądze na zakłady przed pobraniem kwot częściowych, ale dołączamy nieskończony zakład na końcu listy wartości zakładów. Właśnie to przesuwa wartość konta nad następny zakład, a użycie nieskończoności pozwala nam zawsze mieć ostatni element jako catch-all.
Stosowanie:
źródło
2 LW
. Niestety po pierwszej przegranej nie masz wystarczająco dużo pieniędzy, aby postawić nawet na drugi bieg.14 f 'LLWLLLLWWLWWWLWLWW'
otrzymujemy tę sekwencję:14, 13, 11, 15, 14, 12, 8, 0,..
u0
, nie mamy wystarczająco dużo pieniędzy, aby oferty, więc program powinien wypisać0
.JavaScript (wersja robocza ECMAScript 6) -
625150 znaków (w treści funkcji)Definiuje funkcję rekurencyjną
g
z dwoma argumentami:a
- aktualna ilość posiadanych pieniędzy; ir
- ciąg zwycięstw / strat.I dwa opcjonalne argumenty:
t
- indeks bieżącej rundy zakładów (początkowo0
)b
- kwota pieniędzy na bieżący zakład (ponownie początkowo1
).Nie golfowany:
JavaScript (ECMAScript 6) -
615854 znaków (w treści funkcji)Wyjaśnienie:
Testy
źródło
b=1,r.split('').map(
na[b=1].map.call(r,
(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)
a>=b&&(c=r[t])?g((c=c>'L')?a+b:a-b,r,t+1,c||2*b):a
Python, 74 bajty
Zdefiniowałem funkcję g, która bierze (ilość pieniędzy, którą masz na początku) ir (która jest wynikiem zakładów) Inicjuje kwotę pierwszego zakładu na 1. Następnie dla każdego wyniku zakładów, jeśli jest wygrana („W” wr) zyskujesz pieniądze, a zakład wraca do 1. W przeciwnym razie przegrywasz kwotę zakładu, a kwota następnego zakładu podwaja się. Wreszcie zwraca pieniądze, które masz. Możesz użyć tego w następujący sposób:
Myślę, że można to jeszcze pograć w golfa.
źródło
C, 107 znaków
Używam tutaj funkcji rekurencyjnej, ponieważ przez większość czasu implementacja jest krótsza. Ale nie jestem do końca pewien, czy tak jest tutaj, ponieważ musiałem utworzyć dodatkową funkcję otoki, więc moja funkcja faktycznie bierze tylko 2 argumenty. Trzeci argument w funkcji
f
jest potrzebny dla bieżącego zakładu (akumulatora).Bez funkcji otoki rozwiązanie to miałoby tylko 73 znaki, ale trzeba by przekazać dodatkowy parametr o wartości 1 (zakład początkowy), aby uzyskać właściwy wynik.
bez golfa:
źródło
C, 90
źródło
JavaScript, 63
Przykładowe przebiegi:
JSFiddle z logowaniem
Nie golfowany:
źródło
JavaScript ( ES5 )
696460 bajtów w ramach funkcjiWariacja: (ta sama długość )
Przypadki testowe: ( wzięte z rozwiązania plannapusa )
źródło
g(20,'WLLW')
zwraca 25 w mojej konsoli FireFox -for...in
pętla przejmuje trzy dodatkowe właściwości w łańcuchu i iteruje nad nimi.22
do konsoli. Myśląc, że może strona, na której jesteś, gdy masz otwartą konsolę, zmodyfikowałaString
prototyp. Wiem, że stackexchange to modyfikuje i dodaje trzy dodatkowe funkcje.Haskell, 62
lub z nazwanymi obydwoma argumentami (65 znaków):
Uwaga:
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):źródło
Python 2 - 65 bajtów
Teraz pobity przez obecne najlepsze rozwiązanie Python, ale nie mogę go nie udostępnić:
Podobnie jak niektóre inne rozwiązania Pythona, używam argumentów funkcji do deklarowania
b
poza definicją funkcji, ale ponieważ funkcja jest rekurencyjna, w rzeczywistości służy to celowi innemu niż gra w golfa.Musiałem także zmienić kolejność argumentów funkcji, aby krotka rozpakowała się w argumenty funkcji aby działało .
Jeśli się zastanawiasz,
r>"">a>=b
jest skrótemr and a>=b
.źródło
Ruby,
7664 (w ciele funkcji) bajtówEDYCJA: poprawiono odpowiedź, usuwając 3 bajty:
przy użyciu func (82 bajtów):
przy użyciu lambda (76 bajtów):
bieg :
źródło
C #, 74 znaki wewnątrz metody
Moja pierwsza próba na tej stronie ...
Lub bardziej czytelny:
Dość naiwny, nie tyle sztuczek ... głównie wykorzystujących porządek char i porządek strunowy. Uratowanie kilku postaci przez zewnętrzne zapętlenie, gdy graczowi zabraknie pieniędzy.
źródło
Golfscript,
51413635 bajtówFunkcja wewnętrzna
Zakłada się, że zaczynamy od dodatniej kwoty pieniężnej i że łańcuch wygranych i przegranych będzie niepusty, aby można było wykonać co najmniej jeden zakład.
Przykład
daje
Wypróbuj online.
źródło
C #, 123
Skrzypce .NET
Wpis na blogu wyjaśniający
źródło
Java, 95 bajtów (funkcja wewnętrzna)
Wypróbuj online!
źródło
Ruby, 84 znaków
Takie samo podejście jak moja inna odpowiedź w C, ale chciałem spróbować ruby do gry w golfa. Zaletą wersji C jest to, że nie muszę tworzyć funkcji otoki, mogę po prostu użyć domyślnych wartości parametrów.
źródło
K, 76
.
źródło
Python, 86
Wiem, że to nigdzie nie jest w pobliżu najkrótszego rozwiązania, ale chciałem wykazać inne podejście, które powtarza serię przegranych zamiast pojedynczych zakładów.
int(bin(a)[3:],2)
podaje liczbę całkowitą z najbardziej znaczącym bitem reprezentacji binarneja
usuniętej, czyli kwotę, którą osoba będzie miała po utracie rosnących uprawnień 2, dopóki nie będzie już mogła obstawiać, ponieważ a jest obecnie o 1 wyższy niż jego faktyczna ilość pieniędzy. Ta wersja zakłada, że kapitał początkowy jest dodatni.źródło
C -
6459 (funkcja wewnętrzna)Jeszcze jedna odpowiedź C. Wykorzystuje fakt, że wartość zmiennej pozostaje na stosie. To moja porażka z niektórymi kompilatorami, ale działała poprawnie gdziekolwiek testowałem. Również wziąłem
%2
z tia, aby uratować postać. Przepraszam!źródło
Partia - 212
Przykład -
źródło
Japt , 38 bajtów
Spróbuj
Prawdopodobnie potrzebuje gry w golfa :) Ale wydaje się, że osiąga prawidłowe wyniki.
UWAGA Jest to pełny program, który w prosty sposób można zamienić w funkcję przez dodanie
UV{
. Liczba bajtów w funkcji będzie taka sama.Wyjaśnienie JS:
źródło
PowerShell ,
6881 bajtówWypróbuj online!
To wyzwanie wymaga kilku niezręcznych zadań, co oznacza, że nie mogłem połączyć jednej dużej aktualizacji. Wykorzystuje fakt, że „W” wynosi 87 w ASCII, a „L” wynosi 76, więc modowanie o 2 daje dostęp do łatwych wartości prawda / fałsz.
|% t*y
to standardowy skrót toCharArray, a aktualizacja zakładu za pomocą podziału okazała się najtańszym sposobem, jaki mogłem znaleźć (dzieli go albo przez połowę straty (podwajając), albo dzieli się sam przez siebie wygraną (ustawiając na 1) ).Plus wiele bajtów, ponieważ brakowało mi ograniczenia. Będzie działać na polu golfowym
źródło
05AB1E , 19 bajtów
Port odpowiedzi GolfScript na @Howard , dlatego też oceń go!
Zauważ, że 05AB1E nie ma żadnych funkcji, więc jest to pełny program.
Najpierw pobiera ciąg znaków, a drugi liczbę całkowitą (znak nowej linii w STDIN).
Wypróbuj online lub sprawdź kilka innych przypadków testowych .
Wyjaśnienie:
źródło