Historia
Hace mucho tiempo, Bobby creó una billetera Bitcoin con 1 Satoshi (1e-8 BTC, la unidad monetaria más pequeña) y se olvidó de ella. Como muchos otros, más tarde pensó "Maldita sea, si solo invirtiera más en ese entonces ...".
Sin detenerse a soñar despierto, dedica todo su tiempo y dinero a construir una máquina del tiempo. Pasa la mayor parte de su tiempo en su garaje, sin darse cuenta de los asuntos mundanos y los rumores que circulan sobre él. Completa el prototipo un día antes de que su electricidad esté a punto de apagarse debido a pagos atrasados. Al levantar la vista de su banco de trabajo, ve una camioneta de la policía que se detiene en su casa, parece que los vecinos entrometidos pensaron que estaba ejecutando un laboratorio de metanfetamina en su garaje y llamó a la policía.
Sin tiempo para ejecutar pruebas, toma una memoria USB con los datos de la tasa de cambio de los últimos años, conecta el condensador de flujo al descombobulador cuántico y se encuentra transportado al día en que creó su billetera.
Tarea
Teniendo en cuenta los datos del tipo de cambio, descubra cuánto dinero puede ganar Bobby. Sigue una regla muy simple: "Compra bajo - vende alto" y dado que comienza con un capital infinitamente pequeño, asumimos que sus acciones no tendrán impacto en los tipos de cambio del futuro.
Entrada
Una lista de flotantes> 0, ya sea como una cadena separada por un solo carácter (nueva línea, tabulación, espacio, punto y coma, lo que prefiera) pasado como argumento de línea de comando al programa, leído desde un archivo de texto o STDIN o pasado como un parámetro a una función. Puede usar tipos de datos numéricos o matrices en lugar de una cadena porque es básicamente una cadena con corchetes.
Producto
El factor por el cual el capital de Bobbys se multiplica por el final de la negociación.
Ejemplo
Input: 0.48 0.4 0.24 0.39 0.74 1.31 1.71 2.1 2.24 2.07 2.41
Tipo de cambio: 0.48 $ / BTC, ya que está a punto de caer, vendemos todos los Bitcoins por 4.8 nanodólares. Factor = 1 Tipo de cambio: 0.4, no hacer nada
Tipo de cambio: 0.24 $ / BTC y en aumento: convierta todo $ a 2 Satoshis. Factor = 1 (el valor en dólares aún no ha cambiado)
Tipo de cambio: 0.39 - 2.1 $ / BTC: no hacer nada
Tipo de cambio: 2.24 $ / BTC: vender todo antes de la caída. 44.8 nanodólar, factor = 9.33
Tipo de cambio: 2.07 $ / BTC: comprar 2.164 Satoshis, factor = 9.33
Tipo de cambio: 2.41 $ / BTC: comprar 52.15 nanodólar, factor = 10.86
Output: 10.86
Detalles adicionales
Puede ignorar casos extremos extraños como entrada constante, valores cero o negativos, solo un número de entrada, etc.
Siéntase libre de generar sus propios números aleatorios para probar o usar gráficos de acciones reales. Aquí hay una entrada más larga para la prueba (Salida esperada aprox. 321903884.638)
Explique brevemente qué hace su código Los
gráficos son apreciados pero no necesarios
fuente
Respuestas:
APL, 16 caracteres
Esta versión utiliza @Frxstrem 's más simple algoritmo y @xnor ' s
max(r,1)
idea.También supone que la serie está aumentando en general, es decir, el primer valor de bitcoin es más pequeño que el último. Esto es consistente con la descripción del problema. Para obtener una fórmula más general, se deben descartar las dos primeras tasas, agregando 2 caracteres:
{×/1⌈÷/⊃1↓⍵,¨¯1⌽⍵}
Ejemplo:
Explicación:
Comience con los datos del tipo de cambio:
Empareje cada número con el anterior (el primero se emparejará con el último) y póngalos en una matriz:
Reduzca cada fila por división, mantenga las que tengan una relación> 1 y combine las razones por multiplicación. Esto eliminará cualquier factor de repetición en una fila de tasas crecientes sucesivas, así como la relación espuria entre la primera y la última tasa de cambio:
fuente
Python, 47
Ejemplo ejecutado en el caso de prueba .
Toma una lista de carrozas. Multiplica recursivamente el factor de ganancia de los dos primeros elementos hasta que queden menos de dos elementos. Para el caso base, da
True
cuál es igual1
.El uso
pop
da el mismo número de caracteres.Lo mismo ocurre al final de la lista.
A modo de comparación, mi código iterativo en Python 2 es 49 caracteres, 2 caracteres más largos
Comenzar con
c=-1
un truco para hacer que el primer "movimiento" imaginario nunca muestre ganancias. Al iniciar el producto en-1
lugar de1
permitirnos asignar ambos elementos juntos, lo rechazamos de forma gratuita antes de imprimirlo.fuente
([n:(n+1)*500 + 1] for n in range(N_elem/500) )
y multiplicar los factores parcialessys.setrecursionlimit
(en CPython)Python,
79817677 bytesx
es la entrada codificada como una lista. La función devuelve el factor.fuente
1.
lugar de1
al final de la función, de lo contrario obtengo TypeError: el descriptor ' mul ' requiere un objeto 'flotante' pero recibió un 'int'f=
parte.CJam, 33 bytes
Esto se puede jugar más al golf.
Toma información de STDIN, como
y genera el factor en STDOUT, como
Pruébalo en línea aquí
fuente
Pyth , 18
Explicación:
max(H[1]/H[0],1)
idea gracias a @xnorfuente
C #,
333, 313Mi primer intento Probablemente podría optimizarlo más, pero como dije, ¡primer intento, así que me acostumbraré!
Entrada
Salida
Editar: Gracias a DenDenDo por sugerir no usar math.floor para redondear y usar int en lugar de bool para cortar caracteres. ¡Recordará eso para futuros rompecabezas!
fuente
Math.Floor(...)
que no se requiere. Además, no sé si es posible en C #, pero generalmente puede usar 1 y 0 paratrue
yfalse
.