Вы и друг идете в бар. Бармен относится к вам хорошо, поэтому вы решаете дать ему чаевые. Таким образом, вы достаете свой надежный карманный компьютер и пишете быструю программу для расчета чаевых, поскольку в ней нет встроенного калькулятора. Но ждать! Ваши ключи оператора сломаны! Ваша задача - рассчитать 20% чаевых для любой заданной суммы ввода. Входные данные теста будут иметь вид xx.xx, например, 20,96. Вот правила:
- Не использовать следующие операторы в математической форме:
+ - * / %
(спасибо Wally West) - Не использовать встроенные функции процента или API
- Нет доступа к сети
- Не использовать
eval
или аналогичные - Нет калькулятора Windows (да, люди ответили ранее)
- Нет встроенных функций подсказки (не то, чтобы у любого языка была такая)
Выходные данные должны быть округлены до двух десятичных знаков.
Оценка основана на длине в байтах.
-20%, если ваша программа может принять любую сумму чаевых. Вход для суммы будет дан в виде хх например 35, а не 0,35
*
?Ответы:
Javascript 81
РЕДАКТИРОВАТЬ : Результат теперь реальное округление, а не усечены.
Не используйте здесь ЛЮБУЮ математику, только манипуляции со строками и побитовые операторы.
Все
+
символы являются конкатенацией строк или преобразованием строки в число с плавающей точкой .Работает для любого входа и выхода xx.xx в формате (x) x.xx
Трюк объяснил: 20% делится на 10 и умножается на 2.
источник
99.99
, он возвращается19.998
, поэтому он не «округляется до двух десятичных разрядов» согласно ОП.J (9 знаков)
Краткий ответ на J:
источник
^
но здесь~
указывает, что порядок должен быть обратным;(^.2)
является log (.2), и инициал,^.
который выполняется последним, является логарифмом всего, что вычислялось ранее: таким образом, log (32 ^ log (.2))Чистая Баш,
5043 символовЯ уверен, что это будет лучше, но вот начало:
Согласно комментариям:
/
здесь не оператор деления, это часть расширения параметра подстановки шаблона%
здесь не оператор по модулю, это часть расширения параметра-
здесь не оператор вычитания, это отрицание, которое было разрешено согласно комментариямВыход:
источник
/
является частью расширения параметра bash, а не оператором деления. Разрешено или нет?Python 98 * 0,8 = 78,4
Python 74 (без бонуса)
Заметка
+
используется для объединения строк*
используется для создания копий строкиUngolfed
Заметка
В духе вопроса, я считаю, что следующее решение, хотя следует всем правилам вопроса, является злоупотреблением
Python 41
в заключение
Если вы настаиваете на том, что математические символы запрещены, то это 90-символьное решение
Python 90 (без какого-либо математического символа)
источник
*
и+
сломаны КЛЮЧИ (для чего вы их используете).No use of the following in mathematical form operators: + - * / % (Thanks Wally West)
. Другими словами, вопрос необходимо перефразировать. И я не использовал их в математической форме0.05
.`input`
(включая обратные ссылки) вместоraw_input
.APL (9 символов, новый код из 7 символов, фиксированный из 13 символов)
Вычислить 20% от указанной суммы.
В APL
*
есть экспоненциальный оператор.Попробуйте онлайн .
But why use a function for that? See this new version:
Try it online.
Please, before downvoting, the
*
is not forbidden as a KEY and it doesn't mean multiplication here.OK, here is the version rounding to 2 decimals (Dyalog APL):
источник
*
запрещено в любой математической форме согласно правилам испытания.*
запрещено как ключ, а не как его математическое значение.^
) для такого оператора, или используется вызов функции. У OP нет спецификации, которая*
запрещена, только если она используется в контексте умножения. Я подозреваю, что было бы полезно, если бы ОП решило это, чтобы выяснить, кто из нас неправильно истолковывает правила вызова, и устранить путаницу.×
и÷
разрешено, таковых нет в списке.R,
30273634Обновлено с округлением до 2 знаков после запятой
Спас 2 персонажа благодаря планнапу
Создает вектор от 0 до x и принимает 2-й элемент.
Пример:
Дальнейшее объяснение:
создает вектор длиной 6 от 0 до входного значения x с равными интервалами между значениями.
Первое значение составляет 0%, второе 20%, третье 40% и т. Д.
источник
dc + sed + pipes (44 characters)
My third answer (one APL, one J, and now one with the old and venerable dc).
It will ask for an INTEGER input and compute 20% with a tricky way. Input is converted to base 5 (easy to do with many other tools but wait...); a dot is appended before the last digit with sed (unfortunately, dc can't handle strings very well), and THEN, dc converts back from base 5 on a float number (not all tools can do that).
источник
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. С этим и удаляяsed
s-e
s, это 42. Но результат все еще не для спецификации (не 2 десятичных знака)Python, 88
Это не где-то близко, но это демонстрирует, как нормальное умственное разделение на пять должно быть сделано. Это предполагает, что входные данные должны иметь форму xx.xx
Или для ввода любой длины требуется добавление 3 символов.
Объяснение: Мы берем входные данные как строку, а затем перемещаем десятичную точку на одно место вперед (деление на 10). Затем мы бросаем его на поплавок и используем
ldexp
функцию для умножения на 2.Обратите внимание, что в этом ответе
+
используются операторы конкатенации строк, и%
они используются для форматированияprint
.Если вы настаиваете на том, чтобы не использовать ни один из этих символов, вот решение из 159 символов:
источник
+
и-
разрешается поскольку КЛЮЧИ сломаны (то , что они означают в вашей части кода)..split('.')
в моем ответе, расколол один символdc + sed - 45 * 0,8 = 36
(Вдохновленный ответ по ברוכאל )
Пример выполнения (ввод принят через STDIN):
источник
.0+
Идея велика; Я голосовал за ваше решение, вдохновленное моим, но некоторые могут сказать, что вы используете дополнение; может быть какой-то обходной путь? Я пытался,dc -e 9k5o?v2^p
но это на 2 символа больше.-20%
!Математика, 19
Нет использование математических операторов
+
,-
,*
,/
, или%
. Использует свойства логарифмов для вычисления ответа; когда вы упрощаете выражение, вы получаете.2*Input[]
С бонусом ( 30 * 0,8 = 24 ):
Сначала введите процент, а затем сумму.
Когда вы упрощаете выражение, вы получаете
Input[]*Input[]*.01
.Спасибо ברוכאל за помощь в сокращении кода.
источник
Log[E^2]
илиLog[E^Input[]]
можно написать короче. Даже10^-1
можно написать.01
(хотя я не использую Mathematica, но я уверен, что это возможно). Все выражение(E^10^-1)^Log[E^2]
выглядит как-то такE^.2
, не так ли?TI-89 Basic - 39 * 0,8 = 31,2
Работает, введя два числа, затем используя свойства логарифма для вычисления
x * y / 100
.Если я могу предположить ввод от размещения в глобальных переменных
x
иy
, то это намного короче, для оценки 17 * 0,8 = 13,6 :Без бонуса ( 12 ):
Но если его нужно обернуть в функцию, то это работает ( 38 символов, для 30.4 ):
источник
Input x,y
??? Работает в 83/84.Input{x,y}
(есть 83/84ln
?)žr¹msmžr.n
бесстыдный порт этого кода в 05AB1E.PHP 107 * .8 = 85,6
не могу действительно бегать за гольф-кодом с PHP, но по крайней мере я могу работать со строками. принимает оба числа в качестве аргументов командной строки.
пришлось дважды поменять его, так как я не могу использовать -2 :(
источник
Python,
81 8089 символовобъяснение
Технически, это обман, поскольку он усекает до двух десятичных знаков вместо округления, но я могу утверждать, что он округляется (лучше для вас, меньше чаевых).
источник
[-3:]
вместо[-3:-1]
JavaScript 251 (принудительное ограничение: нет +, -, *,? Или% любым способом)
Хотя я знаю, что это не победит, я подумал, что постараюсь получить очки брауни за счет очень строгого подхода и даже не думать об использовании операторов с ограничениями в любой форме или форме ... в результате я придумал эта красота ...
Я использовал побитовые операции для создания функции Add
A
, а затем начал цепочку оттуда:Функция целочисленного деления
D
использовала серию Negated Addition (вычитание в формеA(x,A(~y,1)
над циклом; остальное - манипуляции со строками и конкатенация, чтобы избежать использования+
операторов конкатенации ...Число должно быть предоставлено в десятичной форме с двумя десятичными разрядами, чтобы это работало ...
источник
Perl,
5060 байтВвод ожидается в STDIN. Он должен содержать десятичный разделитель с двумя десятичными цифрами. Вывод записывается в STDOUT.
Обновление: шаг
$_<<=1
удаляет ведущие нули. Поэтомуm|\d{3}$|
не будет соответствовать для счетов <1. Поэтому$_="00$
было добавлено десять байтов , теперь даже0.00
работает.Примеры:
20.96
выход:4.19
12.34
выход:2.47
Безголовая версия:
Сначала число читается из STDIN. Затем удаляется десятичная точка, которая умножается на 100. Затем сумма удваивается с помощью оператора сдвига. Затем десятичная точка вставляется заново, а результат печатается и округляется до двух десятичных цифр.
50 байтов, если счет ≥ 1:
Если
x.xx
больше или равно1.00
, то 10 байтов могут быть удалены:источник
JavaScript (ES6) (Regex) 142
Regex великолепен и может делать много вещей. Это может даже сделать математику!
Читаемая версия:
tip()
Функция ожидает строки аргумента, а не номер.Все экземпляры
*
,/
,+
которые не связаны с математическими операциями.+
это конкатенация строк во всех случаях, когда она используется.*
является частью синтаксиса RegExp/
является разделителем литерала RegExpВвод должен использоваться в
.
качестве десятичной точки, и после десятичной точки должно быть 2 цифры.Фрагмент стека
источник
Haskell 32 символа -20% = 25,6 символа
Злоупотребляет тем фактом, что показатели становятся умножением в логарифмах.
источник