Introdução
Dado um conjunto de porcentagens de opções em uma pesquisa, calcule o número mínimo de eleitores que deve haver na pesquisa para gerar essas estatísticas.
Exemplo: Qual é o seu animal de estimação favorito?
- Cachorro:
44.4%
- Gato:
44.4%
- Rato:
11.1%
Resultado: 9
(número mínimo possível de eleitores)
Especificações
Aqui estão os requisitos para o seu programa / função:
- Você recebe uma matriz de valores percentuais como entrada (em stdin, como argumento de função, etc.)
- Cada valor percentual é um número arredondado para uma casa decimal (por exemplo,
44.4 44.4 11.1
). - Calcule o número mínimo possível de votantes na enquete cujos resultados renderiam essas porcentagens exatas quando arredondados para uma casa decimal (em stdout ou valor de retorno da função).
- Bônus : -15 caracteres, se você puder resolver de uma maneira "não trivial" (ou seja, não envolve a iteração de todos os números possíveis de eleitores até encontrar o primeiro que funcione)
Exemplo
>./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
Pontuação
Isso é código-golfe, então os personagens mais curtos possíveis vencem. Quaisquer bônus são subtraídos da contagem total de caracteres.
code-golf
math
reverse-engineering
mellamokb
fonte
fonte
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%
o total, e toda vez que há um arredondamento, você soma0.5%
o total. Os últimos quatro casos de teste foram construídos propositadamente para explorar esse fenômeno de maneira otimizada. No primeiro caso de teste que resulta em2000
, cada uma das 9 primeiras entradas representa1
voto (e todas são arredondadas para cima0.5%
), enquanto a última representa1991
votos (e é arredondada para baixo ~0.5%
). Se você calcular essas porcentagens manualmente e arredondar para uma casa decimal, verá que todas estão corretas.Respostas:
APL (Dyalog Classic) ,
4843 bytes-5 bytes por Adám
Programa completo, recebendo informações de stdin.
Experimente online! O link é para a versão dfn.
Ungolfed
Experimente online!
normalize
divide (÷
) todos os elementos do seu argumento correto (⊢
) pela sua soma (+/
).round(y)
arredonda y para 3 casas decimais formatando (⍕
) e depois avaliando (⍎
) cada elemento de y.find_max(y)
retorna uma matriz com 1 onde max (y) é encontrado e 0 em outro lugar.increase(x,y)
usa x (as porcentagens de meta) e y (a matriz dos totais atuais de votos) e calcula onde adicionar 1 em y para aproximar as porcentagens de x.vote_totals(x,y)
usa x (as porcentagens de meta) e y (totaliza o voto inicial) e executa f repetidamente, adicionando votos até que as porcentagens sejam arredondadas para x.f ⍣ g
significa executarf
repetidamente até queg(y,f(y))
seja verdadeira. Nesse caso, ignoramosf(y)
.h(x)
define y como 0 (equivalente a uma matriz de 0s devido à vetorização), executa g e soma os totais finais de votos.fonte
Python, 154
Ele funciona para o último exemplo agora.
Exemplo é executado:
fonte
99.1
como o último valor1/2000 = 0.05%
(0.1%
arredondado) e1991/2000 = 99.55%
(99.6%
arredondado). Portanto, se houver dez opções em uma enquete e nove delas forem votadas uma vez, enquanto a última obtiver votos em 1991, isso daria essas porcentagens.J, 57 caracteres
Usou o método trivial. É preciso entrada do teclado.
t
cria uma tabela de pesquisa e a segunda linha procura a entrada dentro da tabela. Posso fornecer uma explicação expandida do código, se alguém estiver interessado.Procurei usar a porcentagem para criar uma fração e, em seguida, obter a forma mais baixa da fração para descobrir o número, mas não consegui descobrir uma maneira de fazê-la funcionar com o arredondamento dos resultados.
fonte
Python, 154
fonte
[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%
arredondado) e1991/2000 = 99.55%
(99.6%
arredondado). Portanto, ele totaliza 100%, mas o arredondamento o torna realmente confuso.VBA - 541
Isso tem alguns erros flagrantes, mas foi minha tentativa de encontrar uma solução não trivial / de loop até obter o número certo. Ainda não joguei o jogo completamente, apesar de achar que não há muito a acrescentar a esse respeito. No entanto, eu gastei muito tempo nisso e isso machuca minha cabeça agora. Sem mencionar, as regras provavelmente são muito violadas e se aplicam mais ou menos apenas a esses exemplos.
Isso funciona muito bem em muitos testes simples que eu executei (ou seja, totais totais, 2 ou 3 entradas), mas falha em alguns dos testes apresentados pelo desafio. No entanto, descobri que se você aumentar a precisão decimal da entrada (fora do escopo do desafio), a precisão aumentará.
Grande parte do trabalho envolve encontrar o MDC para o conjunto de números fornecidos, e eu meio que consegui isso
Function g()
, embora seja com certeza incompleto e provavelmente uma fonte de pelo menos alguns dos erros em minhas saídas.Entrada é uma sequência de valores delimitada por espaço.
Casos de teste (entrada ==> esperado / retornado):
fonte
Debug.Print
paraDebug.?
C # (.NET Core) , 286 bytes
Experimente online!
Economizou muitos bytes graças a Peter Taylor e Embodiment of Ignorance
fonte
}
no final.Zip
método Linq .1>0
é mais curto quetrue
, é preferível.Python 3 ,
140139137 bytesExperimente online!
Dá a resposta certa para os dois primeiros casos de teste e se depara com os limites de recursão do Python para os outros. Isso não é muito surpreendente, pois cada verificação é feita em um novo nível de recursão. É curto, no entanto ...
(Uma explicação das variáveis usadas pode ser encontrada no link TIO)
deve funcionar para 136 bytes, mas não devido à precisão de flutuação.
fonte