Il y a plusieurs mois, j'avais cette question comme un puzzle de présélection pour une interview. Récemment, en pensant au matériel de blog, il m'est apparu comme un bon exemple à utiliser pour résoudre un problème de manière fonctionnelle. Je publierai ma solution dès que j'aurai fini d'écrire mon blog.
REMARQUE: Cette question a été posée sur StackOverflow il y a un an et a été déclassée après quelques réponses (incorrectes). Je suppose qu'il a été sous-estimé pour être une interview évidente ou une question de devoirs. Nos réponses ici devraient être suffisamment approfondies pour que quelqu'un ne pense pas à les utiliser!
Dans une course, vous misez en utilisant la stratégie suivante. Chaque fois que vous perdez une mise, vous doublez la valeur de la mise pour le tour suivant. Chaque fois que vous gagnez, la mise pour le prochain tour sera d'un dollar. Vous commencez le tour en misant un dollar.
Par exemple, si vous commencez avec 20 dollars et que vous gagnez le pari au premier tour, perdez le pari aux deux tours suivants et gagnez ensuite le pari au quatrième tour, vous vous retrouverez avec 20 + 1-1-2 +4 = 22 dollars.
Vous devez terminer la fonction g
, qui prend deux arguments:
- Le premier argument est un entier
a
qui est l'argent initial que nous avons lorsque nous commençons les paris. - Le deuxième argument est une chaîne
r
. Le ième caractère du résultat sera soit «W» (victoire) ou «L» (perte), dénotant le résultat du ième tour.
Votre fonction devrait retourner le montant d'argent que vous aurez après avoir joué tous les tours.
Si à un moment donné, vous n'avez pas assez d'argent sur votre compte pour couvrir la valeur du pari, vous devez arrêter et retourner la somme que vous avez à ce moment-là.
Exemple d'exécution
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
La fonction retourne 1
dans ce cas
Le gagnant est déterminé par le moins de caractères à L'INTÉRIEUR de la définition de fonction implicite. Coopérez par langue si vous le souhaitez. Je sais que le mien peut être amélioré!
Réponses:
GolfScript, 33 caractères
Exemples (en ligne ):
Code annoté:
la source
Python 2,
726862 octetsAppelez cela comme ceci:
g(15,'LLLWLLLL')
.Cela passe simplement à travers la chaîne, changeant la valeur de l'argent que nous avons en fonction du personnage.
Voici un exemple de programme qui exécute des tests sur cette fonction:
Exemple de sortie:
Avec un petit changement dans le testeur, nous pouvons obtenir le bénéfice moyen de nombreuses exécutions:
Exemple de sortie (a pris un certain temps, car nous appelons la fonction
5000000
times):Edit: Merci à Howard et Danny pour le golf.
EDIT: le programme vérifie maintenant s'il y a suffisamment d'argent pour faire le pari. Cela économise en fait des octets.
la source
c=='L'
parc<'W'=
. Vous pouvez également écrireb,n=((n,1),(-n,2*n))[c<'W']
ce qui vous permet d'économiser plus de caractères (if a<-b:break
,a+=b
).b,n=
astuce (avec[
s à l'extérieur), mais python s'est plaint. Essayons encore.if n<=a
vous ferait pas économiser de l'omble car vous n'aurez pas à le fairebreak
?R, 95 caractères
Dentelé:
Usage:
la source
J -
6355 carMaintenant avec le bonus supplémentaire de ne pas être incorrect! C'est même exactement aussi longtemps qu'avant.
Prend le montant de départ comme argument de gauche et la séquence de victoires / défaites à droite.
Explication: Le programme se divise également en quelque chose comme une composition de deux fonctions, toutes deux détaillées ci-dessous. Le premier transforme la séquence de victoires / défaites en valeurs des paris, avec le signe correspondant, puis le second détermine la réponse en fonction de l'argent initial et de cette séquence de victoires / défaites transformée.
Notez que nous ajoutons l'argent aux paris avant de prendre les sommes partielles, mais nous ajoutons le pari infini à la fin de la liste des valeurs de pari. C'est ce qui décale la valeur du compte au-dessus du pari suivant, et l'utilisation de l'infini nous permet d'avoir toujours le dernier élément comme fourre-tout.
Usage:
la source
2 LW
. Malheureusement, après la première défaite, vous n'avez pas assez d'argent pour miser pour la deuxième manche.14 f 'LLWLLLLWWLWWWLWLWW'
, nous obtenons cette séquence:14, 13, 11, 15, 14, 12, 8, 0,..
à la0
, nous n'avons pas assez d'argent pour enchérir, donc le programme devrait sortir0
.JavaScript (ECMAScript 6 Draft) -
625150 caractères (dans le corps de la fonction)Définit une fonction récursive
g
avec deux arguments:a
- le montant actuel que vous avez; etr
- la chaîne de victoires / défaites.Et deux arguments facultatifs:
t
- l'indice du tour de paris en cours (initialement0
)b
- le montant d'argent pour le pari en cours (à nouveau initialement1
).Non golfé:
JavaScript (ECMAScript 6) -
615854 Caractères (dans le corps de la fonction)Explication:
Les tests
la source
b=1,r.split('').map(
pour[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 octets
J'ai défini la fonction g qui prend a (le montant d'argent que vous avez au début) et r (qui est le résultat des paris) Il initialise le montant du premier pari à 1. Puis pour chaque résultat des paris, s'il est une victoire ("W" en r) vous gagnez de l'argent et la mise revient à 1. Sinon, vous perdez le montant de la mise, et le montant pour la prochaine mise double. Enfin, il rend l'argent que vous avez. Vous pouvez l'utiliser comme ceci:
Je pense que cela peut être joué en plus.
la source
C, 107 caractères
J'utilise une fonction récursive ici, car la plupart du temps, l'implémentation est plus courte. Mais je ne sais pas trop si c'est le cas ici, car j'avais besoin de créer une fonction wrapper supplémentaire, donc ma fonction ne prend en fait que 2 arguments. Le troisième argument en fonction
f
est nécessaire pour la mise actuelle (l'accumulateur).Sans la fonction wrapper, cette solution ne compterait que 73 caractères, mais vous auriez besoin de passer un paramètre supplémentaire avec la valeur 1 (le pari initial) pour obtenir le bon résultat.
non golfé:
la source
C, 90
la source
Javascript, 63
Exemples de cycles:
JSFiddle avec enregistrement
Non golfé:
la source
Javascript ( ES5 )
696460 octets dans la fonctionDéclinaison: ( même longueur )
Cas de test: ( tirés de la solution de plannapus )
la source
g(20,'WLLW')
renvoie 25 dans ma console FireFox - lafor...in
boucle récupère trois propriétés supplémentaires dans la chaîne et les itère également.22
dans ma console. Penser peut-être à un site sur lequel vous ouvrez lorsque la console est ouverte a modifié leString
prototype. Je sais que stackexchange le modifie et ajoute trois fonctions supplémentaires.Haskell, 62
ou avec les deux arguments nommés (65 caractères):
Notez que
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):la source
Python 2 - 65 octets
Maintenant battu par la meilleure solution Python actuelle, mais je ne peux pas ne pas la partager:
Comme certaines autres solutions Python, j'utilise les arguments de fonction pour déclarer
b
dehors de la définition de la fonction, mais comme la fonction est récursive, cela sert en fait un autre objectif que de jouer au golf ici.J'ai également eu besoin de changer l'ordre des arguments de fonction pour que le décompactage de tuple en arguments de fonction fonctionne.
Au cas où vous vous poseriez la question,
r>"">a>=b
c'est court pourr and a>=b
.la source
Rubis,
7664 (dans le corps de la fonction) octetsEDIT: amélioré la réponse en supprimant 3 octets:
en utilisant func (82 octets):
en utilisant lambda (76 octets):
la course :
la source
C #, 74 caractères à l'intérieur de la méthode
Ma toute première tentative sur ce site ...
Ou, plus lisible:
Assez naïf, pas beaucoup de trucs ... profitant principalement du caractère ordinal et de la chaîne dénombrable. Sauvegarde de quelques personnages en boucle superflue lorsque le joueur manque d'argent.
la source
Golfscript,
51413635 octetsFonction intérieure
Cela suppose que nous commençons avec une somme d'argent positive et que la chaîne gagnant-perdant ne sera pas vide, de sorte qu'au moins un pari puisse être effectué.
Exemple
donne
Essayez-le en ligne.
la source
C #, 123
Le violon .NET
Un article de blog expliquant
la source
Java, 95 octets (fonction interne)
Essayez-le en ligne!
la source
Ruby, 84 caractères
Même approche que mon autre réponse en C, mais je voulais essayer ruby pour Code-Golfing. L'avantage de la version C est que je n'ai pas besoin de créer une fonction wrapper, je peux simplement utiliser les valeurs par défaut pour les paramètres.
la source
K, 76
.
la source
Python, 86
Je sais que c'est loin d'être la solution la plus courte, mais je voulais démontrer une approche différente, qui répète les séquences de pertes plutôt que les paris individuels.
int(bin(a)[3:],2)
donne l'entier avec le bit le plus significatif de la représentation binaire dea
supprimé, qui est la somme d'argent que la personne aura après avoir perdu des pouvoirs croissants de 2 jusqu'à ce qu'elle ne puisse plus parier, car a est actuellement 1 plus élevé que le sien. montant réel d'argent. Cette version suppose que le capital initial est positif.la source
C -
6459 (fonction intérieure)Encore une autre réponse C. Il profite du fait que la valeur de la variable reste sur la pile. Donc, mon échec avec certains compilateurs, mais cela a fonctionné correctement partout où j'ai testé. De plus, j'ai pris le
%2
tia pour sauver un personnage. Pardon!la source
Lot - 212
Exemple -
la source
Japt , 38 octets
Essayez-le
A probablement besoin de jouer au golf :) Mais il semble obtenir des résultats corrects.
REMARQUE Il s'agit d'un programme complet qui est trivial pour se transformer en fonction en ajoutant
UV{
. Le nombre d'octets à l'intérieur de la fonction sera le même.Transpiled JS expliqué:
la source
PowerShell ,
6881 octetsEssayez-le en ligne!
Ce défi nécessite des tâches très délicates, ce qui signifie que je ne pouvais pas enchaîner une grosse mise à jour. Il utilise le fait que «W» est 87 en ASCII et «L» est 76, donc le modding par 2 vous donne accès à des valeurs vraies / fausses faciles.
|% t*y
est le raccourci standard toCharArray et la mise à jour du pari en utilisant la division s'est avérée être le moyen le moins cher que je pouvais trouver (le divise par moitié en cas de perte (en le doublant), ou le divise par lui-même en cas de victoire (en le définissant sur 1) ).Plus de nombreux octets parce que j'ai manqué la contrainte. Va travailler sur le golf sur le patch
la source
05AB1E , 19 octets
Port de @Howard réponse GolfScript s » , alors assurez - vous de lui Upvote aussi bien!
Notez que 05AB1E n'a aucune fonction, c'est donc un programme complet à la place.
Prend l'entrée chaîne en premier et l'entrée entière en second (nouvelle ligne délimitée dans STDIN).
Essayez-le en ligne ou vérifiez d'autres cas de test .
Explication:
la source