Das Golfer-Abenteuer
Dies ist die erste Herausforderung! Es wird später mehr Herausforderungen geben, die Daten von der vorherigen Herausforderung erfordern :)
Kapitel 1: Die Vase
Stellen wir uns eine Minute vor. Sie sind ein mächtiger Gott, Ihre Kräfte sind grenzenlos, erfordern jedoch eines: Seelen. Jede Seele wird hier durch ein Byte dargestellt, jedes Byte, das Sie verwenden, opfert eine Seele. Das Ziel ist also offensichtlich, die größte Menge an Menschen zu retten und gleichzeitig die geringste Menge an Seelen zu opfern.
Ihre erste Herausforderung besteht darin, ein kleines Dorf zu retten. Der Teufel ist bereit, nicht das gesamte Dorf zu zerstören, wenn Sie seine Herausforderung lösen.
Die Herausforderung :
Sie haben eine vertikale Vase, die genau 10 Dinge enthalten kann (inklusive Luft). Wenn Sie etwas in diese Vase geben, wird das Ding durch die Schwerkraft auf den Boden fallen. Wenn die Vase bereits voll ist (und wenn Sie sie als "voll mit Luft" betrachten, ist sie immer voll), ersetzt der Eingang das Element am oberen Rand der Vase.
Hier ist die Menge der erlaubten Dinge:
- Luft
0 /
- Ein Stein
1 / -
- Ein Blatt
2 / ~
- Eine Bombe
3 / x
Wenn sich ein Stein oder ein Blatt auf "A Bomb" befindet, wird es explodieren und das Ding auf der Oberseite zerstören.
Die Eingabe ist die Liste der Dinge, die Sie in jeder Runde in die Vase setzen.
Beispiel: 11231: Du legst 2 Steine, dann ein Blatt, dann eine Bombe und schließlich einen letzten Stein.
Wenn die Vase statisch ist, können Sie mit der folgenden Regel zu zählen beginnen:
- Rock fügt dem Akku 1 Einheit hinzu
- Blatt multipliziert den Akku mit 2
- Bombe dekrementiert den Akku um 1
- Luft macht nichts
(Sie müssen von der Oberseite der Vase zu zählen beginnen)
Hier ist die Simulation, die wir mit "11231" als Eingabe erhalten:
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
Und die Ausgabe wird 2 (berechnet als ((0 x 2) + 1) + 1
) sein. Es müssen nicht alle Zustände der Vase gedruckt werden!
Das Basisprogramm (Python3)
Sie können es ausführen, um zu verstehen, wie es funktioniert.
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)
Golf-Version (Python3, kein Vase-Display): 360 Bytes = 360 Punkte
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)
Wenn Sie testen möchten, ob Ihr Programm ordnungsgemäß funktioniert, können Sie die folgende Eingabe testen: 12122111131
Richtige Antwort ist 43 :) (Danke Emigna)
Nun zu den Punkten:
- (x) Punkte, bei denen: x die Anzahl der zum Schreiben Ihres Programms benötigten Bytes ist. Wenn Sie nach dem Posten der nächsten Herausforderung antworten, werden Punkte für diese Herausforderung nicht zu Ihrer Gesamtpunktzahl hinzugefügt.
Ziel ist es, während der gesamten Herausforderung eine Mindestpunktzahl zu erhalten :) Wenn Sie einen Teil der Herausforderung überspringen, erhalten Sie standardmäßig (wx + 1) Punkte für den übersprungenen Teil (wobei wx die schlechteste Punktzahl ist) für diese Herausforderung).
Daten, die für die nächste Herausforderung benötigt werden:
Ausgabe bei Eingabe = 10100000200310310113030200221013111213110130332101
Aktueller Champion: Emigna
Allen viel Glück !
333
eine Vase[0, 0, 0, 0, 0, 0, 0, 3, 3, 3]
in Ihrem Golf-Algorithmus und somit eine Punktzahl von-3
, aber sollte es nicht[0, 0, 0, 0, 0, 0, 0, 0, 0, 3]
eine Punktzahl-1
sein, die Ihrer Spezifikation entspricht?Antworten:
Python 2 -
208191 185 180 172 164156 BytesDer Zusammenbruch ist, dass Luft entfernt wird und die Bomben, wenn sie auf dem Stapel liegen, zählen.
BEARBEITEN: Ich habe zu Python 2 gewechselt, um ein Byte zu speichern, aber jetzt sollte die Eingabe in geschweiften Klammern wie '3312123' stehen.
EDIT2: Ich bin auch ein bisschen stolz auf die Anzahl der Akkus
EDIT3: Danke für all deine Vorschläge, ich hätte nie gedacht, dass ich es so niedrig bekommen könnte
quelle
t[:10][::-1]
stattdessenreverse()
, um 4 Bytes zu speichern, und verwenden Sie möglicherweise auch Python 2, um eine Klammer auf demprint
? Zu speichern . Kommt zu 5 weiteren Seelen, die für mich gerettet wurden :)05AB1E ,
2836 Bytes05AB1E verwendet die CP-1252- Codierung.
Probieren Sie es online!
quelle
T£ÀRS
->
Tränen->
Ich weine in Ordnung ...Retina ,
5856 BytesProbieren Sie es online!
quelle
Python 2,
150 bis146 BytesVielen Dank an Pâris Douady für die Punktformel und für das Speichern von 4 Bytes.
quelle
for c in input()
direktJavascript,
267264249 Seelen geopfertBearbeitete Version, da die vorherige für größere Eingaben falsch war. Golfen Sie weiter, indem Sie einen
string.prototype.replace()
Funktionsaufruf mit Array-Zugriff ausführen . Erläuterung:f('11231');
kehrt zurück2
. Probieren Sie es online ausquelle
Haskell,
221 202 181 177166SeelenBytesProbiere es auf ideone aus . Nimmt Elemente als Ganzzahlliste.
Verwendung:
(Edit: Old) Erklärung:
quelle
f "0000000000" ""
, zwischen denen braucht man nur keine Leerzeichen. Ich habe dem Code eine Erklärung hinzugefügt.