Hace varios meses tuve esta pregunta como un rompecabezas de preselección para una entrevista. Recientemente, cuando pensaba en el material del blog, apareció en mi cabeza como un buen ejemplo para resolver un problema funcionalmente. Publicaré mi solución a esto tan pronto como termine de escribir mi publicación de blog.
NOTA: Esta pregunta se hizo en StackOverflow hace un año y fue rechazada después de algunas respuestas (incorrectas). Supongo que fue rechazado por ser una entrevista obvia o una pregunta de tarea. ¡Nuestras respuestas aquí deben tener un código lo suficientemente profundo como para que alguien no piense en usarlas!
En una carrera, apuestas usando la siguiente estrategia. Cada vez que pierdes una apuesta, duplicas el valor de la apuesta para la próxima ronda. Siempre que gane, la apuesta para la próxima ronda será de un dólar. Comienzas la ronda apostando un dólar.
Por ejemplo, si comienza con 20 dólares y gana la apuesta en la primera ronda, pierde la apuesta en las siguientes dos rondas y luego gana la apuesta en la cuarta ronda, terminará con 20 + 1-1-2 +4 = 22 dólares.
Se espera que complete la función g
, que toma dos argumentos:
- El primer argumento es un número entero,
a
que es el dinero inicial que tenemos cuando comenzamos a apostar. - El segundo argumento es una cadena
r
. El i-ésimo carácter del resultado será 'W' (ganar) o 'L' (perder), denotando el resultado de la i-ésima ronda.
Su función debe devolver la cantidad de dinero que tendrá después de jugar todas las rondas.
Si en algún momento no tiene suficiente dinero en su cuenta para cubrir el valor de la apuesta, debe detenerse y devolver la suma que tiene en ese momento.
Ejecución de la muestra
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 función vuelve 1
en este caso
El ganador se determina por el menor número de caracteres DENTRO de la definición de función implícita. Coopere por idioma si lo desea. ¡Sé que el mío se puede mejorar!
Respuestas:
GolfScript, 33 caracteres
Ejemplos (en línea ):
Código anotado:
fuente
Python 2,
726862 bytesLlamarlo así:
g(15,'LLLWLLLL')
.Esto simplemente recorre la cadena, cambiando el valor del dinero que tenemos en función del personaje.
Aquí hay un programa de muestra que ejecuta pruebas en esta función:
Salida de muestra:
Con un pequeño cambio en el probador, podemos obtener el beneficio promedio de muchas ejecuciones:
Salida de muestra (tomó bastante tiempo, ya que estamos llamando a los
5000000
tiempos de función )Editar: Gracias a Howard y Danny por seguir jugando al golf.
EDITAR: ahora el programa verifica si hay suficiente dinero para hacer la apuesta. Esto realmente ahorra bytes.
fuente
c=='L'
conc<'W'=
. También puede escribir, lob,n=((n,1),(-n,2*n))[c<'W']
que le ahorra más caracteres (if a<-b:break
,a+=b
).b,n=
truco (con[
s en el exterior), pero Python se quejó. Intentemoslo de nuevo.if n<=a
te ahorraría un poco de carbón ya que no tendrás que hacerlobreak
entonces?R, 95 caracteres
Sangrado:
Uso:
fuente
J -
6355 char¡Ahora con la ventaja añadida de no ser incorrecto! Incluso es exactamente el mismo tiempo que antes.
Toma la cantidad inicial de dinero como argumento izquierdo y la racha de victorias / derrotas a la derecha.
Explicación: El programa se divide de manera uniforme en una composición de dos funciones, ambas detalladas a continuación. El primero convierte la racha de victorias / derrotas en los valores de las apuestas, con el signo correspondiente, y luego el segundo realmente determina la respuesta dado el dinero inicial y esta racha de victorias / derrotas transformada.
Tenga en cuenta que anteponemos el dinero a las apuestas antes de tomar las sumas parciales, pero agregamos la apuesta infinita al final de la lista de valores de apuesta. Esto es lo que cambia el valor del sobrepaso de la cuenta de la próxima apuesta, y el uso del infinito nos permite tener siempre el último elemento como un todo.
Uso:
fuente
2 LW
. Desafortunadamente, después de la primera derrota, no tienes suficiente dinero para apostar por la segunda carrera.14 f 'LLWLLLLWWLWWWLWLWW'
, obtenemos esta secuencia:14, 13, 11, 15, 14, 12, 8, 0,..
en el0
, no tenemos suficiente dinero para ofertar, por lo que el programa debería salir0
.JavaScript (borrador de ECMAScript 6) -
625150 caracteres (en el cuerpo de la función)Define una función recursiva
g
con dos argumentos:a
- la cantidad actual de dinero que tiene; yr
- la cadena de victorias / derrotas.Y dos argumentos opcionales:
t
- el índice de la ronda actual de apuestas (inicialmente0
)b
- la cantidad de dinero para la apuesta actual (de nuevo inicialmente1
).Sin golf:
JavaScript (ECMAScript 6) -
615854 caracteres (en el cuerpo de la función)Explicación:
Pruebas
fuente
b=1,r.split('').map(
a[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
Definí la función g, que toma a (la cantidad de dinero que tiene al inicio) yr (que es el resultado de las apuestas). Inicializa la cantidad de la primera apuesta en 1. Luego, para cada resultado de las apuestas, si es una ganancia ("W" en r) gana el dinero y la apuesta vuelve a 1. De lo contrario, pierde el monto de la apuesta, y el monto de la próxima apuesta se duplica. Finalmente te devuelve el dinero que tienes. Puedes usarlo así:
Creo que esto también se puede jugar al golf.
fuente
C, 107 caracteres
Estoy usando una función recursiva aquí, porque la mayoría de las veces la implementación es más corta. Pero no estoy muy seguro de si es el caso aquí, porque necesitaba hacer una función de contenedor adicional, de modo que mi función solo toma 2 argumentos. El tercer argumento en función
f
es necesario para la apuesta actual (el acumulador).Sin la función de envoltura, esta solución solo tendría 73 caracteres, pero necesitaría pasar un parámetro adicional con el valor 1 (la apuesta inicial) para obtener el resultado adecuado.
sin golf:
fuente
C, 90
fuente
Javascript, 63
Ejecuciones de muestra:
JSFiddle con registro
Sin golf:
fuente
Javascript ( ES5 )
696460 bytes dentro de la funciónVariación: ( misma longitud )
Casos de prueba: ( tomado de la solución de plannapus )
fuente
g(20,'WLLW')
devuelve 25 en mi consola FireFox: elfor...in
bucle recoge tres propiedades adicionales en la cadena y también las repite.22
a mi consola. Pensando que quizás algún sitio en el que estás cuando tienes la consola abierta modificó elString
prototipo. Sé que stackexchange lo modifica y agrega tres funciones adicionales.Haskell, 62
o con ambos argumentos nombrados (65 caracteres):
Tenga en cuenta que
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):fuente
Python 2 - 65 bytes
Ahora superado por la mejor solución actual de Python, pero no puedo compartirlo:
Como algunas otras soluciones de Python, utilizo los argumentos de la función para declarar
b
fuera de la definición de la función, pero como la función es recursiva, esto en realidad tiene un propósito diferente al golf aquí.También necesitaba cambiar el orden de los argumentos de la función para que la tupla desempaquetada en argumentos de la función funcione.
Por si te lo preguntas,
r>"">a>=b
es la abreviatura der and a>=b
.fuente
Ruby,
7664 (en el cuerpo de la función) bytesEDITAR: mejoró la respuesta al eliminar 3 bytes:
usando func (82 bytes):
usando lambda (76 bytes):
la carrera :
fuente
C #, 74 caracteres dentro del método
Mi primer intento en este sitio ...
O, más legible:
Bastante ingenuo, no tantos trucos ... principalmente aprovechando que char es ordinal y string es enumerable. Guardar algunos personajes mediante bucles extraños cuando el jugador se queda sin dinero.
fuente
Golfscript,
51413635 bytesFunción interior
Esto supone que comenzamos con una cantidad positiva de dinero y que la cadena de ganancias y pérdidas no estará vacía, por lo que se puede realizar al menos una apuesta.
Ejemplo
da
Pruébalo en línea.
fuente
C #, 123
El violín .NET
Una publicación de blog que explica
fuente
Java, 95 bytes (función interna)
Pruébalo en línea!
fuente
Ruby, 84 caracteres
El mismo enfoque que mi otra respuesta en C, pero quería probar Ruby para Code-Golfing. La ventaja de la versión C es que no necesito crear una función de contenedor, simplemente puedo usar los valores predeterminados para los parámetros.
fuente
K, 76
.
fuente
Python, 86
Sé que esto no está cerca de la solución más corta, pero quería demostrar un enfoque diferente, que repite las rachas de pérdidas en lugar de las apuestas individuales.
int(bin(a)[3:],2)
le da al número entero el bit más significativo de la representación binaria dea
eliminado, que es la cantidad de dinero que tendrá la persona después de perder poderes crecientes de 2 hasta que ya no pueda apostar, porque a es actualmente 1 mayor que su cantidad real de dinero Esta versión supone que el capital inicial es positivo.fuente
C -
6459 (función interior)Otra respuesta más de C. Aprovecha el hecho de que el valor de la variable permanece en la pila. Así que esto falla con algunos compiladores, pero funcionó correctamente donde sea que lo probé. Además, tomé el
%2
de tia para salvar a un personaje. ¡Lo siento!fuente
Lote - 212
Expample -
fuente
Japt , 38 bytes
Intentalo
Probablemente necesita algo de golf :) Pero parece obtener resultados correctos.
NOTA Este es un programa completo que es trivial para convertirse en una función al anteponer
UV{
. El recuento de bytes dentro de la función será el mismo.Transpiled JS explicado:
fuente
PowerShell ,
6881 bytesPruébalo en línea!
Este desafío necesita algunas tareas muy incómodas, lo que significa que no podría encadenar una gran actualización. Utiliza el hecho de que 'W' es 87 en ASCII y 'L' es 76, por lo que modificar por 2 le da acceso a valores verdaderos / falsos fáciles.
|% t*y
es el atajo estándar de CharArray y la actualización de la apuesta usando la división resultó ser la forma más barata que pude encontrar (lo divide por la mitad en una pérdida (duplicándolo), o lo divide por sí mismo en una victoria (estableciéndolo en 1) )Además de muchos bytes porque omití la restricción. Trabajará en jugar golf en el parche
fuente
05AB1E , 19 bytes
Puerto de @Howard 's GolfScript respuesta , así que asegúrese de que le Upvote así!
Tenga en cuenta que 05AB1E no tiene funciones, por lo que este es un programa completo.
Toma la entrada de cadena primero y la entrada de entero segunda (nueva línea delimitada en STDIN).
Pruébelo en línea o verifique algunos casos de prueba más .
Explicación:
fuente