Этот вызов принес вам реальное (и трагическое) вдохновение. В последнее время числовой ряд на моей клавиатуре был немного спорадическим. Клавиши 1-9
работают иногда - но в других случаях они не дают результата. Как заядлый программист, это ужасно! (Видите этот восклицательный знак? Вот откуда вы знаете, что они работают прямо сейчас.) Не только мне часто нужны сами цифры, но и символы!@#$%^&*(
совершенно неэффективны и в половине случаев! Как программист на Си, вместо того, чтобы отвлекаться от моего напряженного графика работы с кодом для исправления моего ноутбука, я больше интересовался решением этой проблемы. В течение последних нескольких недель медленно все числовые литералы в моем коде заменялись шестнадцатеричными, чтобы мне не приходилось искать числа для копирования и вставки. Однако некоторые цифры нелегко набрать без ключей 1-9
. Например, число 1
нельзя записать так просто в шестнадцатеричном формате, и я прибегнул к замене 1
s в моем коде на 0xF - 0xE
. Единственные ключи, которые затронуты1-9
, поэтому я поддерживаю полное использование символов , таких как +
, -
и /
. Тем не менее, я не могу использовать умножение или скобки, так как*
и (
часто ломаются. Это приводит к вашей проблеме.
вход
Целое число, n
в стандартный ввод или эквивалент вашего языка. При желании, целому числу может предшествовать или следовать новая строка или другой символ пробела. Кроме того, вы можете получить ввод через аргумент командной строки.
Ваша программа должна правильно реагировать на отрицательный ввод и иметь возможность обрабатывать как минимум 32-разрядные целые числа со знаком.
Выход
Ваша программа должна выводить в некоторой наблюдаемой форме кратчайший (в непробельных символах) возможный способ записи числа n
в виде суммы, разности или деления одного или нескольких шестнадцатеричных значений. Существует несколько способов решения этой проблемы, и не требуется, чтобы вы предпочитали любой вывод одинаковой длины по сравнению с любым другим.
Выходные данные должны быть в форме, A % A % A...
где A
следует шестнадцатеричное значение, 0x
содержащее только цифры A-F a-f
, и %
является одним из символов -+/
. Позвольте /
описать целочисленное деление, а не с плавающей точкой.
(Обратите внимание, что ваш вывод должен приводить n
при оценке сначала делений слева направо, а затем сложений и вычитаний слева направо, как это принято.)
Тестовые случаи
Ввод, вывод
1
0xF - 0xE
(или0xF-0xE
или0xB-0xA
или0xd - 0xc
или0xF/0xF
)15
0xF
255
0xFF
30
0xF + 0xF
Подсчет очков и правила
Это код-гольф. Ваша предварительная оценка - это количество байтов в вашем исходном файле.
Вы не можете использовать какие-либо цифры 1-9
в вашем источнике.
Вы МОЖЕТЕ использовать символы !@#$%^&*(
в своем источнике, но каждый получает штраф +20 к вашему счету.
Ваша программа может быть заменена функцией, которая принимает n
в качестве аргумента, если эта функция производит какую-то форму удобочитаемого вывода. Возвращаемое значение вашей функции НЕ считается выходным.
Стандартные лазейки не допускаются.
Самый низкий балл побеждает! Удачи!
Я что-то пошёл по форматированию / опросу / ясности? Дай мне знать! Это моя первая отправка на этот сайт!
источник
Ответы:
JavaScript 287 (187 + 20 * 5)
295 (195 + 20 * 5) 338 (198 + 20 * 7)Функция, которая проверяет все возможные комбинации 6 разрешенных шестнадцатеричных цифр (от 0xA до 0xF) и 3 разрешенных операторов. Выводится через всплывающее окно и не возвращает значение, как требуется.
Я использовал [] для группировки выражений через запятую, но не смог избежать 5
7открытых скобок для циклов и вызова функций.Чтобы избежать цифр, есть переменные A, B, C для 1,2,3 (это делает код еще более неясным)
Исправлен код редактирования с акцентом на избежание '('. Удалено
if
s и явное создание RegExpОсторожно: эта функция невероятно медленная, она превысит ограничение по времени для скрипта в FireFox, даже для небольшого ввода, например 90.
Чтобы перечислить все возможные выражения, я использую число, начинающееся с 3 и увеличивающееся до бесконечности. Кодировка цифр :
0,1,2 - операторы +, -, / от
4 до 9 - шестнадцатеричные цифры. A..F
3 не допускается.
Каждое число проверяется с помощью регулярного выражения.
/3|[0-2]{2}/
чтобы избежать цифры 3 и иметь 2 последовательных оператора ( проверьте также избегайте трейлинга и ведущих операторов - см. код)Полученная строка является чем-то вроде
0xA + 0xA - 0xD
действительного javascript, поэтому я использую eval для ее оценки. К сожалению, оператор '/' в JavaScript является с плавающей точкой, а не целым числом, поэтому я не уверен на 100%, что результатом является правильное приведение событий к целому числу конечного результата (но я вполне уверен, что небольшая ошибка округления не может быть усилено знаком "*")Что-то другое
Теперь что-то смешнее. Я использовал слишком упрощенный синтаксический анализатор выражения, чтобы избежать вызова eval, и, что забавно, это оказалось намного быстрее.
Парсер действительно упрощен, в реальном парсере V и O должны быть массивы, содержащие стек ожидающих значений и стек ожидающих операторов. Здесь V - единственное ожидающее значение (а также возвращаемое значение), а O - строка длиной не более 2 символов. P содержит таблицу приоритетов операторов, для '- + /' => '112'
Это оценка 275 + 4 * 20 => 355
Тестирование В консоли Firefox / FireBug измените оповещение с возвратом (гораздо удобнее)
Немного менее очевидно (но будьте терпеливы)
источник
Python 2: 185 байт + 2 * 20 = 225
Слишком долго для серьезного ответа. Но поскольку ответов пока нет, я все равно выложу.
product
создает все различные расположения разрешенных символов.exec
пытается расшифровать это. К сожалению, это возвращает исключение, а затем длинныйtry - catch
блок. Если результат в порядке, он печатает и существует.Штраф в 2 раза из-за этих скобок во время вызовов функций.
источник
0
не является шестнадцатеричным литералом; (2) Деление с использованием отрицательного числа в Python дает другой результат, чем в C.