Introducción
Dado un conjunto de porcentajes de opciones en una encuesta, calcule el número mínimo de votantes que debe haber en la encuesta para generar esas estadísticas.
Ejemplo: ¿Cuál es tu mascota favorita?
- Perro:
44.4%
- Gato:
44.4%
- Ratón:
11.1%
Salida: 9
(número mínimo posible de votantes)
Especificaciones
Estos son los requisitos para su programa / función:
- Se le proporciona una matriz de valores porcentuales como entrada (en stdin, como argumento de función, etc.)
- Cada valor de porcentaje es un número redondeado a un decimal (por ejemplo,
44.4 44.4 11.1
). - Calcule el número mínimo posible de votantes en la encuesta cuyos resultados arrojarían esos porcentajes exactos cuando se redondea a un decimal (en stdout o valor de retorno de función).
- Bonificación : -15 caracteres si puede resolver de una manera "no trivial" (es decir, no implica iterar a través de cada número posible de votantes hasta que encuentre el primero que funcione)
Ejemplo
>./pollreverse 44.4 44.4 11.1
9
>./pollreverse 26.7 53.3 20.0
15
>./pollreverse 48.4 13.7 21.6 6.5 9.8
153
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6
2000
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7
667
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7
2000
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8
401
Tanteo
Este es el código de golf, por lo que gana los personajes más cortos posibles. Cualquier bonificación se resta aún más del recuento total de caracteres.
code-golf
math
reverse-engineering
mellamokb
fuente
fuente
26.7 53.3 20.0
(4 8 3 de 15),48.4 13.7 21.6 6.5 9.8
(74 21 33 10 15 de 153) etc.0.5%
del total, y cada vez que hay un redondeo hacia arriba, suma0.5%
al total. Los últimos cuatro casos de prueba se construyeron a propósito para explotar de manera óptima este fenómeno. En el primer caso de prueba que resulta2000
, cada una de las primeras 9 entradas representa el1
voto (y se redondean todas0.5%
), mientras que la última representa los1991
votos (y se redondea hacia abajo ~0.5%
). Si calcula esos porcentajes manualmente y redondea a 1 decimal, verá que todos son correctos.Respuestas:
APL (Dyalog Classic) ,
4843 bytes-5 bytes por Adám
Programa completo tomando información de stdin.
Pruébalo en línea! El enlace es a la versión dfn.
Sin golf
Pruébalo en línea!
normalize
divide (÷
) todos los elementos de su argumento correcto (⊢
) por su suma (+/
).round(y)
redondea y a 3 decimales formateando (⍕
) y luego evaluando (⍎
) cada elemento de y.find_max(y)
devuelve una matriz con 1 donde se encuentra max (y) y 0 en otro lugar.increase(x,y)
toma x (los porcentajes de las metas) e y (la matriz de los totales de votos actuales) y calcula dónde sumar 1 en y para acercar los porcentajes a x.vote_totals(x,y)
toma x (los porcentajes de goles) ey (los totales de votos iniciales) y ejecuta f repetidamente, agregando votos hasta que los porcentajes redondeen a x.f ⍣ g
significa ejecutarf
repetidamente hasta queg(y,f(y))
sea verdadera. En este caso lo ignoramosf(y)
.h(x)
establece y en 0 (equivalente a una matriz de 0 debido a la vectorización), ejecuta gy suma el total de votos finales.fuente
Pitón, 154
Funciona para el último ejemplo ahora.
Ejecuciones de ejemplo:
fuente
99.1
como el último valor1/2000 = 0.05%
(0.1%
redondeado) y1991/2000 = 99.55%
(99.6%
redondeado). Entonces, si hay diez opciones en una encuesta y nueve de ellas se votan una vez, mientras que la última obtiene 1991 votos, entonces daría esos porcentajes.J, 57 caracteres
Usó el método trivial. Toma entrada del teclado.
t
crea una tabla de búsqueda y la segunda línea busca la entrada dentro de la tabla. Puedo proporcionar una explicación ampliada del código si alguien está interesado.Había buscado usar el porcentaje para crear una fracción y luego obtener la forma más baja de la fracción para calcular el número, pero no pude encontrar una manera de hacerlo funcionar con el redondeo de los resultados.
fuente
Pitón, 154
fuente
[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,99.6]
?1/2000 = 0.05%
(0.1%
redondeado) y1991/2000 = 99.55%
(99.6%
redondeado). Por lo tanto, en realidad totaliza el 100%, pero el redondeo lo hace realmente confuso.VBA - 541
Esto tiene algunos errores evidentes, pero fue mi intento de encontrar una solución no trivial / en bucle hasta obtener el número correcto. No lo he jugado completamente, aunque no creo que haya mucho que agregar al respecto. Sin embargo, he pasado demasiado tiempo en esto, y ahora me duele la cabeza. Sin mencionar que las reglas están probablemente muy rotas y se aplican más o menos a estos ejemplos solamente.
Esto funciona muy bien para muchas pruebas simples que ejecuté (es decir, totales, 2 o 3 entradas), pero falla en algunas de las pruebas presentadas por el desafío. Sin embargo, descubrí que si aumenta la precisión decimal de la entrada (fuera del alcance del desafío), la precisión mejora.
Gran parte del trabajo implica encontrar el mcd para el conjunto de números proporcionados, y de alguna manera lo logré
Function g()
, aunque sin duda es incompleto y probablemente sea una fuente de al menos algunos de los errores en mis resultados.La entrada es una cadena de valores delimitada por espacios.
Casos de prueba (input ==> esperado / devuelto):
fuente
Debug.Print
aDebug.?
C # (.NET Core) , 286 bytes
Pruébalo en línea!
Ahorré muchos bytes gracias a Peter Taylor y Encarnación de la ignorancia
fuente
}
al final.Zip
método Linq .1>0
es más corto quetrue
, se prefiere.Python 3 ,
140139137 bytesPruébalo en línea!
Da la respuesta correcta para los dos primeros casos de prueba y se encuentra con los límites de recursión de Python para los demás. Esto no es muy sorprendente, ya que cada verificación se realiza en un nuevo nivel de recursión. Es corto, sin embargo ...
(Puede encontrar una explicación de las variables utilizadas en el enlace TIO)
debería funcionar para 136 bytes, pero no debido a la precisión flotante.
fuente