Vários meses atrás, eu tive essa pergunta como um quebra-cabeça de pré-triagem para uma entrevista. Recentemente, ao pensar no material do blog, ele apareceu na minha cabeça como um bom exemplo para resolver um problema funcionalmente. Vou postar minha solução assim que terminar de escrever minha postagem no blog.
NOTA: Esta pergunta foi feita no StackOverflow há um ano e foi rebaixada após algumas respostas (incorretas). Suponho que foi prejudicada por ser uma pergunta óbvia de entrevista ou lição de casa. Nossas respostas aqui devem ter um código suficientemente profundo para que alguém não pense em usá-las!
Em uma corrida, você aposta usando a seguinte estratégia. Sempre que você perde uma aposta, você dobra o valor da aposta para a próxima rodada. Sempre que você vencer, a aposta para a próxima rodada será de um dólar. Você começa a rodada apostando um dólar.
Por exemplo, se você começar com 20 dólares e vencer a aposta na primeira rodada, perder a aposta nas próximas duas rodadas e depois vencer a aposta na quarta rodada, você terminará com 20 + 1-1-2 +4 = 22 dólares.
Espera-se que você complete a função g
, que requer dois argumentos:
- O primeiro argumento é um número inteiro,
a
que é o dinheiro inicial que somamos quando iniciamos as apostas. - O segundo argumento é uma string
r
. O i-ésimo caráter do resultado será 'W' (vitória) ou 'L' (derrota), indicando o resultado da i-ésima rodada.
Sua função deve retornar a quantidade de dinheiro que você terá depois que todas as rodadas forem jogadas.
Se, em algum momento, você não tiver dinheiro suficiente em sua conta para cobrir o valor da aposta, pare e devolva a soma que tiver nesse momento.
Amostra de execução
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
A função retorna 1
neste caso
O vencedor é determinado pelo menor número de caracteres DENTRO da definição de função implícita. Cooperar por idioma, se desejar. Eu sei que o meu pode ser melhorado!
Respostas:
GolfScript, 33 caracteres
Exemplos ( online ):
Código anotado:
fonte
Python 2,
726862 bytesChamá-lo assim:
g(15,'LLLWLLLL')
.Isso simplesmente percorre a cadeia, alterando o valor do dinheiro que baseamos no personagem.
Aqui está um exemplo de programa que executa testes nesta função:
Saída de amostra:
Com uma pequena alteração no testador, podemos obter o lucro médio de muitas execuções:
Saída de amostra (demorou um pouco, pois estamos chamando os
5000000
tempos de função ):Edit: Obrigado a Howard e Danny por mais golfe.
EDIT: agora o programa verifica se há dinheiro suficiente para fazer a aposta. Isso realmente salva bytes.
fonte
c=='L'
porc<'W'=
. Você também pode escrever ob,n=((n,1),(-n,2*n))[c<'W']
que economiza mais caracteres (if a<-b:break
,a+=b
).b,n=
truque (com[
s do lado de fora), mas o python reclamou. Vamos tentar de novo.if n<=a
pouparia um pouco de char, já que não será necessáriobreak
?R, 95 caracteres
Recuado:
Uso:
fonte
J -
6355 charAgora, com o bônus adicional de não estar incorreto! É exatamente exatamente como antes.
Toma a quantia inicial de dinheiro como argumento à esquerda e a sequência de vitórias / perdas à direita.
Explicação: O programa divide-se igualmente em algo como uma composição de duas funções, ambas detalhadas abaixo. O primeiro transforma a sequência de ganhos / perdas nos valores das apostas, com o sinal correspondente, e o segundo efetivamente descobre a resposta dada o dinheiro inicial e essa sequência de ganhos / perdas transformada.
Observe que anexamos o dinheiro às apostas antes de receber as somas parciais, mas anexamos a aposta infinita ao final da lista de valores das apostas. É isso que muda o valor da conta em excesso da próxima aposta e o uso do infinito nos permite ter sempre o último elemento como um exemplo.
Uso:
fonte
2 LW
. Infelizmente, após a primeira derrota, você não tem dinheiro suficiente para apostar na segunda rodada.14 f 'LLWLLLLWWLWWWLWLWW'
, obtemos a seguinte sequência:14, 13, 11, 15, 14, 12, 8, 0,..
no0
, não temos dinheiro suficiente para fazer lances, portanto o programa deve sair0
.JavaScript (rascunho do ECMAScript 6) -
625150 caracteres (no corpo da função)Define uma função recursiva
g
com dois argumentos:a
- a quantidade atual de dinheiro que você tem; er
- a sequência de vitórias / derrotas.E dois argumentos opcionais:
t
- o índice da rodada atual de apostas (inicialmente0
)b
- a quantia em dinheiro da aposta atual (novamente inicialmente1
).Ungolfed:
JavaScript (ECMAScript 6) -
615854 caracteres (no corpo da função)Explicação:
Testes
fonte
b=1,r.split('').map(
para[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
Eu defini a função g que recebe a (a quantidade de dinheiro que você tem no início) e r (que é o resultado das apostas) Inicializa o valor da primeira aposta em 1. Em seguida, para cada resultado das apostas, se for uma vitória ("W" em r), você ganha o dinheiro e a aposta volta para 1. Caso contrário, você perde o valor da aposta e o valor da próxima aposta dobra. Finalmente, ele retorna o dinheiro que você tem. Você pode usá-lo assim:
Eu acho que isso pode ser jogado além disso.
fonte
C, 107 caracteres
Estou usando uma função recursiva aqui, porque na maioria das vezes a implementação é mais curta. Mas não tenho muita certeza se é esse o caso aqui, porque eu precisava criar uma função adicional para o wrapper, de modo que minha função, na verdade, leva apenas 2 argumentos. O terceiro argumento na função
f
é necessário para a aposta atual (o acumulador).Sem a função wrapper, essa solução teria apenas 73 caracteres, mas seria necessário passar um parâmetro adicional com o valor 1 (a aposta inicial) para obter o resultado adequado.
ungolfed:
fonte
C, 90
fonte
Javascript, 63
Amostras de execuções:
JSFiddle com registro
Ungolfed:
fonte
Javascript ( ES5 )
696460 bytes na funçãoVariação: ( mesmo comprimento )
Casos de teste: ( retirado da solução de plannapus )
fonte
g(20,'WLLW')
retorna 25 no meu console do FireFox - ofor...in
loop pega três propriedades extras na string e itera sobre elas também.22
no meu console. Talvez um site em que você esteja usando o console aberto tenha modificado oString
protótipo. Eu sei que stackexchange modifica e adiciona três funções extras.Haskell, 62
ou com os dois argumentos nomeados (65 caracteres):
Observe que
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):fonte
Python 2 - 65 bytes
Agora derrotado pela melhor solução atual do Python, mas não posso compartilhar:
Como algumas outras soluções Python, eu uso os argumentos da função para declarar
b
fora da definição da função, mas como a função é recursiva, isso realmente serve a algum outro propósito além do golfe aqui.Eu também precisava alterar a ordem dos argumentos da função para que a tupla descompactasse em argumentos da função funcionasse.
Caso você queira saber,
r>"">a>=b
é a abreviação der and a>=b
.fonte
Ruby,
7664 (no corpo da função) bytesEDIT: melhorou a resposta removendo 3 bytes:
usando func (82 bytes):
usando lambda (76 bytes):
a corrida :
fonte
C #, 74 caracteres dentro do método
Minha primeira tentativa neste site ...
Ou, mais legível:
Bastante ingênuo, não há muitos truques ... principalmente aproveitando o char sendo ordinal e a string sendo enumerável. Salvando alguns caracteres por looping externo quando o jogador ficar sem dinheiro.
fonte
Golfscript,
51413635 bytesFunção interna
Isso pressupõe que começamos com uma quantia positiva de dinheiro e que a sequência de perdas e ganhos não estará vazia, para que pelo menos uma aposta possa ser realizada.
Exemplo
dá
Experimente online.
fonte
C #, 123
O violino do .NET
Uma postagem no blog explicando
fonte
Java, 95 bytes (função interna)
Experimente online!
fonte
Ruby, 84 caracteres
A mesma abordagem da minha outra resposta em C, mas eu queria tentar ruby para o Code-Golfing. A vantagem da versão C é que não preciso criar uma função de invólucro, posso simplesmente usar os valores padrão para parâmetros.
fonte
K, 76
.
fonte
Python, 86
Eu sei que isso não é nem de longe a solução mais curta, mas eu queria demonstrar uma abordagem diferente, que itera mais sobre as perdas do que sobre as apostas individuais.
int(bin(a)[3:],2)
fornece o número inteiro com o bit mais significativo da representação binária dea
excluída, que é a quantidade de dinheiro que a pessoa terá depois de perder poderes crescentes de 2 até que não possa mais apostar, porque a é atualmente 1 maior que a sua quantidade real de dinheiro. Esta versão assume que o capital inicial é positivo.fonte
C -
6459 (Função interna)Mais uma resposta em C. Aproveita o fato de que o valor da variável permanece na pilha. Portanto, esta falha ocorreu com alguns compiladores, mas funcionou corretamente onde quer que eu testei. Além disso, peguei o
%2
da tia para salvar um personagem. Desculpe!fonte
Lote - 212
Exemplo -
fonte
Japt , 38 bytes
Tente
Provavelmente precisa de golfe :) Mas parece que está obtendo resultados corretos.
OBSERVAÇÃO Este é um programa completo que é trivial para se transformar em uma função anexando
UV{
. A contagem de bytes dentro da função será a mesma.JS Transpilado Explicado:
fonte
PowerShell ,
6881 bytesExperimente online!
Esse desafio precisa de algumas tarefas muito estranhas, o que significa que eu não poderia encadear uma grande atualização. Ele usa o fato de que 'W' é 87 em ASCII e 'L' é 76, portanto, a modificação por 2 fornece acesso a valores verdadeiros / falsos fáceis.
|% t*y
é o atalho padrão do toCharArray e a atualização da aposta usando a divisão acabou sendo a maneira mais barata que eu pude encontrar (divide-a pela metade em uma perda (dobrando-a) ou dividida por si mesma em uma vitória (definindo como 1) )Além de muitos bytes, porque eu perdi a restrição. Vai trabalhar no golfe no patch
fonte
05AB1E , 19 bytes
Porto da resposta do GolfScript de @Howard , por isso não deixe de vota-lo também!
Observe que 05AB1E não possui funções, portanto, este é um programa completo.
Coloca a entrada da string primeiro e a entrada inteira em segundo (nova linha delimitada em STDIN).
Experimente online ou verifique mais alguns casos de teste .
Explicação:
fonte