Настройка:
Социальная сеть сообщает о количестве голосов в сообщении двумя способами: количество чистых голосов (общее количество голосов - общее количество голосов) и процент голосов, которые были проголосовавшими , округляются до ближайшего целого числа (округляется в сторону увеличения до 0,5). Число чистых голосов является целым числом (не обязательно положительным), а второе гарантировано будет целым числом от 0 до +100 включительно. Количество положительных голосов и количество отрицательных голосов являются либо нулевыми, либо положительными 32-разрядными целыми числами (вы можете указать знак со знаком или без знака). Предположим, что при нулевом общем количестве голосов процент проголосовавших считается равным нулю.
Соревнование:
С учетом этих двух целых чисел (нетто-голосов и% голосов), какую самую короткую программу вы можете написать, которая определяет наименьшее количество общих голосов, полученных постом, с соблюдением всех вышеуказанных ограничений?
Входные ограничения гарантированы. Если ввод не удовлетворяет вышеуказанным ограничениям, поведение программы зависит от вас. Бонус слава, если он не входит в бесконечный цикл или иным образом вылетает. Подумайте о возврате отрицательного числа, если вам нужны дополнительные указания
Основные правила:
- Это код-гольф , поэтому выигрывает самое короткое действительное решение (измеряется в байтах).
- Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. Бонусы за клиентский веб-язык, такой как Javascript.
- Если у вас есть интересные решения на нескольких языках, опубликуйте их отдельно .
- К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата или полные программы. Ваш звонок.
- Лазейки по умолчанию запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение того, как работает код.
- Имейте в виду, что если вы выполняете целочисленную операцию деления, которая усекает (например, 20/3 = 6), а не округляет , это может быть не совсем правильно.
- Дополнительные тестовые случаи, которые исследуют крайние случаи в вышеупомянутых ограничениях, приветствуются.
- Хотя ожидаемый тип возвращаемого значения является числовым, вместо 0 можно использовать логическое «false» .
Пример тестовых случаев:
Первый столбец - это просто ссылочный номер, включенный для облегчения обсуждения.
ref net %up answer
1 0 0 => 0
2 -5 0 => 0
3 -4 17 => 1
4 -3 29 => 2
5 -2 38 => 3
6 -1 44 => 4
7 0 50 => 1
8 5 100 => 5
9 4 83 => 5
10 3 71 => 5
11 2 63 => 5
12 1 56 => 5
13 1234 100 => 1234
14 800 90 => 894 (tip: don't refer to this as the "last test case;" others may be added.)
1000, 100
. Можете ли вы подтвердить, что ожидаемый ответ1000
?Ответы:
JavaScript (ES6), 47 байт
Принимает входные данные в синтаксисе карри
(n)(p)
, где n - количество чистых голосов, а p - процент голосов. Может вернутьсяfalse
за0
.Попробуйте онлайн!
комментарии
Краевые случаи
Пусть F n (u) = u / (u - n / 2) * 50 + 0,5
Если u = 0 и n = 0 , то F n (u) = NaN и F n (u) XOR p = p . Таким образом, мы возвращаем u = 0, если n = p = 0 (первая итерация первого тестового случая), или продолжаем рекурсию, если p! = 0 (первая итерация 7-го тестового случая).
Если u> 0 и u = n / 2 , то F n (u) = + бесконечность и - снова - F n (u) XOR p = p . Если p = 0 , мы просто продолжим следующую итерацию. (Это происходит в 9-м и 11-м тестовых случаях.)
источник
Stax , 17 байт
Запустите и отладьте его
Это грубая сила. Он начинается с 0 для возможных голосов и увеличивается до тех пор, пока не будет удовлетворять формуле.
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник
Чисто ,
114107104 байтаПопробуйте онлайн!
Определяет функцию
$ :: Int Int -> Real
, где аргументы представляют собой целые числа со знаком, а возвращаемое значение представляет собой число с плавающей запятой двойной точности, точно представляемое 32-разрядным целым числом со знаком.Он проверяет каждое значение
c
в уравнении,b=-cd/(d+1)
чтобы найтиb
удовлетворяющий,a+c=b
иb/(b+c)=d
, поскольку наименьшийc
результат приводит к наименьшемуb
, берут первый элемент множества всех решений.источник
05AB1E , 13 байтов [слегка сломан]
Попробуйте онлайн!
Объяснение:
Чтобы решить эту проблему, я предположил, что входные данные a, b и ожидаемый результат x. Учитывая информацию в настройке, это дало мне уравнение:
Перестановка для х дает
Единственный тестовый случай, для которого это не работает, это 0, 50 - я просто жестко запрограммирован, чтобы проверить это.
источник
Go 1.10, 154 байта
Попробуйте это на Go Playground!(TIO запускает Go 1.9, в котором нет математики. Раунд)
Неуправляемая версия
В интересах добавления объяснения вышеприведенная формула для r может быть получена путем одновременного решения
n=v-d
иu = 100 * v/(v + d)
для v, где v и d являются числом повышающих и понижающих голосов соответственно. Производная формула не определена для v = 50, поэтому мы должны обработать этот случай (что мы делаем с первым оператором if).источник