Przygoda Golferów
To pierwsze wyzwanie! Później będzie więcej wyzwań, które będą wymagały danych z poprzedniego wyzwania :)
Rozdział 1: Wazon
Wyobraźmy sobie chwilę .. Jesteś potężnym Bogiem, twoje moce są nieograniczone, ale wymagają jednej rzeczy: Duszy. Każda dusza jest tutaj reprezentowana przez bajt, każdy używany bajt poświęca duszę. Zatem celem jest oczywiście uratowanie jak największej liczby ludzi przy jednoczesnym poświęceniu jak najmniejszej liczby dusz.
Twoim pierwszym wyzwaniem jest uratowanie małej wioski, diabeł chce nie zniszczyć całej wioski, jeśli rozwiążesz jego wyzwanie.
Wyzwanie :
Masz pionowy wazon, który może zawierać dokładnie 10 rzeczy (w tym powietrze). Jeśli umieścisz coś w wazonie, grawitacja sprawi, że spadnie on na dno. Jeśli wazon jest już pełny (i zawsze jest pełny, jeśli uważasz go za „pełen powietrza”), dane wejściowe zastąpią element na górze wazy.
Oto zestaw dozwolonych rzeczy:
- Powietrze
0 /
- Skała
1 / -
- Liść
2 / ~
- Bomba
3 / x
Jeśli na szczycie „Bomby” znajduje się kamień lub liść, eksploduje i zniszczy przedmiot na nim.
Dane wejściowe to lista rzeczy, które umieszczasz w wazonie za każdym razem.
Przykład: 11231 : Umieścisz 2 skały, potem liść, potem bombę i wreszcie ostatnią skałę.
Gdy wazon jest statyczny, możesz zacząć liczyć zgodnie z następującą zasadą:
- Rock dodaje 1 jednostkę do akumulatora
- Liść mnoży akumulator przez 2
- Bomba obniża akumulator o 1
- Powietrze nic nie robi
(Musisz zacząć liczyć od góry wazy)
Oto symulację, którą otrzymujemy, używając „11231” jako danych wejściowych:
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
Wyjście wyniesie 2 (obliczone jako ((0 x 2) + 1) + 1
) Nie trzeba drukować wszystkich stanów wazonu!
Program podstawowy (Python3)
Możesz go wykonać, aby zrozumieć, jak to działa.
def printVase(vase):
for i in vase:
if i == 1:
print("|-|")
elif i == 2:
print("|~|")
elif i == 3:
print("|x|")
else:
print("| |")
def updateVase(vase):
changed = False
for i in range(len(vase), -1, -1):
if i < len(vase) - 1:
if vase[i+1] == 3 and vase[i] in [1,2]:
vase[i], vase[i+1] = 0, 0
changed = True
if not vase[i+1] and vase[i] in [1, 2, 3]:
vase[i], vase[i+1] = vase[i+1], vase[i]
changed = True
return changed
userInput = input("Vase : ")
vase = [0 for i in range(0, 10)]
oldVase = vase
while updateVase(vase) or userInput != "":
if userInput != "":
vase[0] = int(userInput[0])
userInput = userInput[1::]
printVase(vase)
input()
accumulator = 0
for i in vase:
if i == 1:
accumulator += 1
if i == 2:
accumulator *= 2
if i == 3:
accumulator -= 1
print(accumulator)
Wersja golfowa (Python3, bez wyświetlacza wazowego): 360 bajtów = 360 punktów
def u(v):
c=0
for i in range(len(v),-1,-1):
if i<len(v)-1:
if v[i+1]==3 and v[i]in[1,2]:v[i],v[i+1],c=0,0,1
if not v[i+1]and v[i]in[1,2,3]:v[i],v[i+1],c=v[i+1],v[i],1
return c
l,v=input(),[0 for i in range(0, 10)]
while u(v)or l!="":
if l!="":v[0],l=int(l[0]),l[1::]
a=0
for i in v:
if i==1:a+=1
if i==2:a*=2
if i==3:a-=1
print(a)
Jeśli chcesz sprawdzić, czy Twój program działa poprawnie, możesz przetestować to wejście: 12122111131
Prawidłowa odpowiedź to 43 :) (Dzięki Emigna)
Teraz punkty:
- (x) punkty, w których: x jest liczbą bajtów potrzebną do napisania programu. Jeśli odpowiesz po opublikowaniu następnego wyzwania, punkty za to wyzwanie nie zostaną dodane do całkowitej liczby punktów.
Celem jest zachowanie minimalnej liczby punktów podczas całego wyzwania :) Jeśli pominiesz jedną z części wyzwania, domyślnie otrzymasz (wx + 1) punkty za pominiętą część (gdzie wx to najgorszy wynik dla tego wyzwania).
Dane, które będą wymagane do następnego wyzwania:
Wyjście, gdy wejście = 10100000200310310113030200221013111213110130332101
Obecny mistrz: Emigna
Powodzenia wszystkim !
333
konstruują wazon[0, 0, 0, 0, 0, 0, 0, 3, 3, 3]
w algorytmie golfowym, a więc wynik-3
, ale czy nie powinien to być[0, 0, 0, 0, 0, 0, 0, 0, 0, 3]
wynik-1
zgodny ze specyfikacją?Odpowiedzi:
Python 2 -
208191 185 180 172 164156 bajtówPodział polega na tym, że usuwa powietrze i bomby, jeśli są na stosie, wtedy się liczy.
EDYCJA: Zamieniłem na Python 2, aby zapisać bajt, ale teraz dane wejściowe należy umieścić w nawiasach klamrowych, takich jak „3312123”
EDIT2: Jestem także trochę dumny z liczby akumulatorów
EDIT3: Dziękuję za wszystkie sugestie, których nigdy bym nie pomyślał, że mogę to osiągnąć tak nisko
źródło
t[:10][::-1]
zamiast,reverse()
aby zapisać 4 bajty, a także może użyć Python 2, aby zapisać nawias wprint
? Przychodzi jeszcze 5 dusz dla mnie uratowanych :)05AB1E ,
2836 bajtów05AB1E wykorzystuje kodowanie CP-1252 .
Wypróbuj online!
źródło
T£ÀRS
->
Łzy->
płaczę w porządku ...Siatkówka ,
5856 bajtówWypróbuj online!
źródło
Python 2,
150146 bajtówDzięki Pâris Douady za formułę punktów i za zaoszczędzenie 4 bajtów.
źródło
for c in input()
bezpośrednioJavaScript,
267264249 dusz poświęconychWersja edytowana, ponieważ poprzednia była niepoprawna dla większych danych wejściowych. Grał w golfa nieco dalej, przekształcając się
string.prototype.replace()
w wywołanie funkcji dostępne w tablicy. Wyjaśnienie:f('11231');
zwraca2
. Wypróbuj onlineźródło
Haskell,
221 202 181 177166 bajtówduszWypróbuj na ideone . Pobiera pozycje jako listę liczb całkowitych.
Stosowanie:
(Edytuj: stary) Objaśnienie:
źródło
f "0000000000" ""
, po prostu nie potrzebujesz spacji między nimi. Dodałem wyjaśnienie do kodu.