Vor einigen Monaten hatte ich diese Frage als Vorrätsel für ein Interview. Wenn ich kürzlich über Blog-Material nachdachte, tauchte es in meinem Kopf als gutes Beispiel für die funktionale Lösung eines Problems auf. Ich werde meine Lösung hier veröffentlichen, sobald ich mit dem Schreiben meines Blogposts fertig bin.
HINWEIS: Diese Frage wurde vor einem Jahr bei StackOverflow gestellt und nach einigen (falschen) Antworten abgelehnt. Ich nehme an, es wurde als offensichtliche Interview- oder Hausaufgabenfrage abgelehnt. Unsere Antworten sollten so tief in den Code eingearbeitet sein, dass jemand nicht daran denken kann, sie zu verwenden!
In einem Rennen setzen Sie mit der folgenden Strategie. Immer wenn Sie eine Wette verlieren, verdoppeln Sie den Wert der Wette für die nächste Runde. Wann immer Sie gewinnen, beträgt der Einsatz für die nächste Runde einen Dollar. Sie beginnen die Runde mit einem Einsatz von einem Dollar.
Wenn Sie zum Beispiel mit 20 Dollar beginnen und die Wette in der ersten Runde gewinnen, die Wette in den nächsten zwei Runden verlieren und dann die Wette in der vierten Runde gewinnen, erhalten Sie 20 + 1-1-2 +4 = 22 Dollar.
Es wird erwartet, dass Sie die Funktion abschließen g
, für die zwei Argumente erforderlich sind:
- Das erste Argument ist eine Ganzzahl,
a
die das anfängliche Geld ist, das wir haben, wenn wir mit dem Wetten beginnen. - Das zweite Argument ist eine Zeichenfolge
r
. Der i-te Charakter des Ergebnisses ist entweder "W" (Sieg) oder "L" (Niederlage), was das Ergebnis der i-ten Runde bezeichnet.
Ihre Funktion sollte den Geldbetrag zurückgeben, den Sie haben, nachdem alle Runden gespielt wurden.
Wenn Sie irgendwann nicht mehr genug Geld auf Ihrem Konto haben, um den Wert der Wette zu decken, müssen Sie anhalten und den Betrag zurückgeben, den Sie zu diesem Zeitpunkt haben.
Probelauf
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
Die Funktion kehrt 1
in diesem Fall zurück
Der Gewinner wird durch die Mindestanzahl von Zeichen IN der implizierten Funktionsdefinition bestimmt. Arbeiten Sie auf Wunsch nach Sprache zusammen. Ich weiß, meine kann verbessert werden!
Antworten:
GolfScript, 33 Zeichen
Beispiele ( online ):
Kommentierter Code:
quelle
Python 2,
726862 BytesNennen Sie es , wie so:
g(15,'LLLWLLLL')
.Dies durchläuft einfach die Zeichenfolge und ändert den Wert des Geldes, das wir basierend auf dem Charakter haben.
Hier ist ein Beispielprogramm, das Tests für diese Funktion ausführt:
Beispielausgabe:
Mit einer kleinen Änderung am Tester können wir den durchschnittlichen Gewinn vieler Läufe erzielen:
Beispielausgabe (hat eine Weile gedauert, da wir die Funktion
5000000
times aufrufen ):Edit: Danke an Howard und Danny für das weitere Golfen.
BEARBEITEN: Jetzt prüft das Programm, ob genügend Geld vorhanden ist, um die Wette abzuschließen. Das spart tatsächlich Bytes.
quelle
c=='L'
mitc<'W'=
. Sie können auch schreiben,b,n=((n,1),(-n,2*n))[c<'W']
wodurch Sie mehr Zeichen sparen (if a<-b:break
,a+=b
).b,n=
Trick ausprobiert (mit[
s auf der Außenseite), aber Python hat sich beschwert. Lass es uns erneut versuchen.if n<=a
und sparen Sie sich etwas Saibling, da Sie es dann nicht müssenbreak
?R, 95 Zeichen
Eingerückt:
Verwendung:
quelle
J -
6355 charJetzt mit dem zusätzlichen Bonus, nicht falsch zu sein! Es ist sogar genauso lange wie zuvor.
Nimmt den Startbetrag als linkes Argument und die Gewinn- / Verlustserie auf der rechten Seite.
Erläuterung: Das Programm teilt sich gleichmäßig in eine Art Komposition aus zwei Funktionen auf, die beide nachstehend beschrieben werden. Der erste verwandelt die Gewinn- / Verlust-Serie in die Werte der Einsätze mit dem entsprechenden Vorzeichen, und der zweite berechnet die Antwort unter Berücksichtigung des ursprünglichen Geldes und dieser umgewandelten Gewinn- / Verlust-Serie.
Beachten Sie, dass wir den Wetten das Geld voranstellen, bevor wir die Teilsummen nehmen, aber den unendlichen Einsatz an das Ende der Liste der Einsatzwerte anhängen. Dies ist es, was den Wert des Kontos über die nächste Wette verschiebt, und die Verwendung von Unendlich ermöglicht es uns, immer das letzte Element als Allheilmittel zu haben.
Verwendung:
quelle
2 LW
. Leider haben Sie nach der ersten Niederlage nicht genug Geld, um überhaupt für den zweiten Durchgang zu wetten.14 f 'LLWLLLLWWLWWWLWLWW'
wir diese Sequenz:14, 13, 11, 15, 14, 12, 8, 0,..
am0
haben wir nicht genug Geld, um zu bieten, also sollte das Programm ausgeben0
.JavaScript (ECMAScript 6 Draft) -
625150 Zeichen (im Funktionskörper)Definiert eine rekursive Funktion
g
mit zwei Argumenten:a
- den aktuellen Geldbetrag, den Sie haben; undr
- die Folge von Gewinnen / Verlusten.Und zwei optionale Argumente:
t
- der Index der aktuellen Wettrunde (anfangs0
)b
- Der Geldbetrag für die aktuelle Wette (zunächst erneut1
).Ungolfed:
JavaScript (ECMAScript 6) -
615854 Zeichen (im Funktionskörper)Erläuterung:
Tests
quelle
b=1,r.split('').map(
,[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 Bytes
Ich habe die Funktion g definiert, die a (den Geldbetrag, den Sie zu Beginn haben) und r (den die Ergebnisse der Wetten sind) nimmt. Sie initialisiert den Betrag der ersten Wette bei 1. Dann für jedes Ergebnis der Wetten, falls dies der Fall ist Bei einem Gewinn ("W" in r) erhalten Sie das Geld und die Wette wird auf 1 zurückgesetzt. Andernfalls verlieren Sie den Betrag der Wette und der Betrag für die nächste Wette verdoppelt sich. Schließlich gibt es das Geld zurück, das Sie haben. Du kannst es so benutzen:
Ich denke, das kann man noch weiter spielen.
quelle
C, 107 Zeichen
Ich benutze hier eine rekursive Funktion, da die Implementierung meistens kürzer ist. Ich bin mir jedoch nicht ganz sicher, ob dies der Fall ist, da ich eine zusätzliche Wrapper-Funktion erstellen musste, damit meine Funktion tatsächlich nur zwei Argumente akzeptiert. Das dritte Argument in Funktion
f
wird für die aktuelle Wette benötigt (der Akkumulator).Ohne die Wrapper-Funktion wäre diese Lösung nur 73 Zeichen lang, aber Sie müssten einen zusätzlichen Parameter mit dem Wert 1 (die Anfangswette) übergeben, um das richtige Ergebnis zu erhalten.
ungolfed:
quelle
C 90
quelle
Javascript, 63
Probeläufe:
JSFiddle mit Protokollierung
Ungolfed:
quelle
Javascript ( ES5 )
696460 Bytes innerhalb der FunktionVariation: ( gleiche Länge )
Testfälle: ( entnommen aus Plannapus-Lösung )
quelle
g(20,'WLLW')
gibt in meiner FireFox-Konsole 25 zurück - diefor...in
Schleife nimmt drei zusätzliche Eigenschaften in der Zeichenfolge auf und durchläuft diese ebenfalls.22
in meiner Konsole angezeigt. Vielleicht hat eine Site, auf der Sie sich befinden, wenn Sie die Konsole geöffnet haben, denString
Prototyp geändert . Ich weiß, dass stackexchange es modifiziert und drei zusätzliche Funktionen hinzufügt.Haskell, 62
oder mit beiden Argumenten (65 Zeichen):
Beachte, dass
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):quelle
Python 2 - 65 Bytes
Jetzt von der derzeit besten Python-Lösung geschlagen, aber ich kann es nicht teilen:
Wie bei einigen anderen Python-Lösungen verwende ich die Funktionsargumente zum Deklarieren
b
außerhalb der Funktionsdefinition, aber da die Funktion rekursiv ist, dient dies tatsächlich einem anderen Zweck als dem Golfen.Ich musste auch die Reihenfolge der Funktionsargumente ändern, damit das Tupel, das in Funktionsargumente entpackt wurde , funktioniert.
Falls Sie sich fragen,
r>"">a>=b
ist die Abkürzung fürr and a>=b
.quelle
Ruby,
7664 (im Funktionskörper) BytesBEARBEITEN: verbesserte die Antwort durch Entfernen von 3 Bytes:
mit func (82 bytes):
mit Lambda (76 Bytes):
der Lauf:
quelle
C #, 74 Zeichen innerhalb der Methode
Mein allererster Versuch auf dieser Seite ...
Oder besser lesbar:
Ziemlich naiv, nicht allzu viele Tricks ... hauptsächlich, indem man davon profitiert, dass Zeichen eine Ordnungszahl und Zeichenfolgen eine Aufzählung sind. Speichern einiger Charaktere durch Schleifen, wenn der Spieler kein Geld mehr hat.
quelle
Golfscript,
51413635 BytesInnere Funktion
Dies setzt voraus, dass wir mit einem positiven Geldbetrag beginnen und dass die Gewinn-Verlust-Zeichenfolge nicht leer ist, sodass mindestens eine Wette ausgeführt werden kann.
Beispiel
gibt
Probieren Sie es online aus.
quelle
C #, 123
Die .NET-Geige
Ein Blogbeitrag erklärt
quelle
Java, 95 Bytes (interne Funktion)
Probieren Sie es online!
quelle
Ruby, 84 Zeichen
Gleicher Ansatz wie meine andere Antwort in C, aber ich wollte Ruby für Code-Golfing ausprobieren. Der Vorteil der C-Version ist, dass ich keine Wrapper-Funktion erstellen muss, sondern einfach die Standardwerte für Parameter verwenden kann.
quelle
K 76
.
quelle
Python, 86
Ich weiß, dass dies bei weitem nicht die kürzeste Lösung ist, aber ich wollte einen anderen Ansatz demonstrieren, bei dem Verluste und nicht einzelne Wetten durchlaufen werden.
int(bin(a)[3:],2)
gibt die Ganzzahl mit dem höchstwertigen Bit aus der binären Darstellung vona
gelöscht an. Dies ist der Geldbetrag, den die Person nach dem Verlust zunehmender Potenzen von 2 hat, bis sie nicht mehr wetten kann, da a derzeit 1 höher ist als ihr tatsächlicher Geldbetrag. In dieser Version wird davon ausgegangen, dass das Anfangskapital positiv ist.quelle
C -
6459 (Innenfunktion)Noch eine C-Antwort. Es nutzt die Tatsache aus, dass der Wert der Variablen auf dem Stapel bleibt. Das scheiterte bei einigen Compilern, aber es funktionierte überall dort, wo ich es getestet habe. Außerdem habe ich die
%2
von tia genommen, um einen Charakter zu retten. Es tut uns leid!quelle
Charge - 212
Beispiel -
quelle
Japt , 38 Bytes
Versuch es
Benötigt wahrscheinlich etwas Golf :) Aber es scheint, korrekte Ergebnisse zu erzielen.
HINWEIS Dies ist ein vollständiges Programm, das durch Voranstellen in eine Funktion umgewandelt werden kann
UV{
. Die Anzahl der Bytes innerhalb der Funktion ist gleich.Transpiled JS erklärt:
quelle
PowerShell ,
6881 BytesProbieren Sie es online!
Diese Herausforderung erfordert einige sehr umständliche Aufgaben, was bedeutet, dass ich ein großes Update nicht verketten konnte. Es wird die Tatsache verwendet, dass 'W' in ASCII 87 und 'L' 76 ist, sodass Sie durch Modifizieren um 2 auf einfache True / False-Werte zugreifen können.
|% t*y
Dies ist die Standardverknüpfung zu CharArray, und die Aktualisierung des Einsatzes mithilfe der Division hat sich als die billigste Methode herausgestellt, die ich finden konnte (teilt ihn entweder durch die Hälfte eines Verlusts (verdoppelt ihn) oder teilt ihn bei einem Gewinn durch sich selbst (setzt ihn auf 1). ).Plus viele Bytes, weil ich Einschränkung verpasst habe. Wird daran arbeiten, den Platz hinunter zu golfen
quelle
05AB1E , 19 Bytes
Port von @Howards GolfScript-Antwort , also stelle sicher, dass du ihn auch positiv bewertest!
Beachten Sie, dass 05AB1E keine Funktionen hat, es sich also stattdessen um ein vollständiges Programm handelt.
Nimmt zuerst die Zeichenfolge und dann die Ganzzahleingabe (Zeilenumbruch in STDIN).
Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .
Erläuterung:
quelle