Помогите мне отложить на мой компьютер ремонт!

23

Этот вызов принес вам реальное (и трагическое) вдохновение. В последнее время числовой ряд на моей клавиатуре был немного спорадическим. Клавиши 1-9работают иногда - но в других случаях они не дают результата. Как заядлый программист, это ужасно! (Видите этот восклицательный знак? Вот откуда вы знаете, что они работают прямо сейчас.) Не только мне часто нужны сами цифры, но и символы!@#$%^&*( совершенно неэффективны и в половине случаев! Как программист на Си, вместо того, чтобы отвлекаться от моего напряженного графика работы с кодом для исправления моего ноутбука, я больше интересовался решением этой проблемы. В течение последних нескольких недель медленно все числовые литералы в моем коде заменялись шестнадцатеричными, чтобы мне не приходилось искать числа для копирования и вставки. Однако некоторые цифры нелегко набрать без ключей 1-9. Например, число 1нельзя записать так просто в шестнадцатеричном формате, и я прибегнул к замене 1s в моем коде на 0xF - 0xE. Единственные ключи, которые затронуты1-9 , поэтому я поддерживаю полное использование символов , таких как +, -и /. Тем не менее, я не могу использовать умножение или скобки, так как*и (часто ломаются. Это приводит к вашей проблеме.

вход

Целое число, nв стандартный ввод или эквивалент вашего языка. При желании, целому числу может предшествовать или следовать новая строка или другой символ пробела. Кроме того, вы можете получить ввод через аргумент командной строки.

Ваша программа должна правильно реагировать на отрицательный ввод и иметь возможность обрабатывать как минимум 32-разрядные целые числа со знаком.

Выход

Ваша программа должна выводить в некоторой наблюдаемой форме кратчайший (в непробельных символах) возможный способ записи числа nв виде суммы, разности или деления одного или нескольких шестнадцатеричных значений. Существует несколько способов решения этой проблемы, и не требуется, чтобы вы предпочитали любой вывод одинаковой длины по сравнению с любым другим.

Выходные данные должны быть в форме, A % A % A...где Aследует шестнадцатеричное значение, 0xсодержащее только цифры A-F a-f, и %является одним из символов -+/. Позвольте /описать целочисленное деление, а не с плавающей точкой.

(Обратите внимание, что ваш вывод должен приводить nпри оценке сначала делений слева направо, а затем сложений и вычитаний слева направо, как это принято.)

Тестовые случаи

Ввод, вывод

  1. 1

    0xF - 0xE(или 0xF-0xEили 0xB-0xAили 0xd - 0xcили 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

Подсчет очков и правила

Это код-гольф. Ваша предварительная оценка - это количество байтов в вашем исходном файле.

Вы не можете использовать какие-либо цифры 1-9в вашем источнике.

Вы МОЖЕТЕ использовать символы !@#$%^&*(в своем источнике, но каждый получает штраф +20 к вашему счету.

Ваша программа может быть заменена функцией, которая принимает nв качестве аргумента, если эта функция производит какую-то форму удобочитаемого вывода. Возвращаемое значение вашей функции НЕ считается выходным.

Стандартные лазейки не допускаются.

Самый низкий балл побеждает! Удачи!

Я что-то пошёл по форматированию / опросу / ясности? Дай мне знать! Это моя первая отправка на этот сайт!

BrainSteel
источник
Есть ли верхний предел для размера целого числа? Кроме того, отрицательные числа будут представлены с некоторой произвольной точностью (то есть 32-битной)?
FryAmTheEggman
@FryAmTheEggman Отредактировал оригинальный пост, чтобы уточнить. Входные данные могут быть отрицательными, и ваша программа должна правильно реагировать как минимум на 32-битный ввод. Благодарность!
BrainSteel
Связанный: codegolf.stackexchange.com/a/32114/21348
edc65
Для меня это довольно солидная спецификация, но если вам нужны отзывы, я бы рекомендовал опубликовать ее в песочнице (для будущих испытаний), чтобы вы могли получить обратную связь, прежде чем публиковать ее на главной и люди начнут работать над ней. ,
Мартин Эндер
1
Целочисленное или с плавающей точкой деление?
edc65

Ответы:

5

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%, что результатом является правильное приведение событий к целому числу конечного результата (но я вполне уверен, что небольшая ошибка округления не может быть усилено знаком "*")

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

Что-то другое

Теперь что-то смешнее. Я использовал слишком упрощенный синтаксический анализатор выражения, чтобы избежать вызова eval, и, что забавно, это оказалось намного быстрее.

Парсер действительно упрощен, в реальном парсере V и O должны быть массивы, содержащие стек ожидающих значений и стек ожидающих операторов. Здесь V - единственное ожидающее значение (а также возвращаемое значение), а O - строка длиной не более 2 символов. P содержит таблицу приоритетов операторов, для '- + /' => '112'

Это оценка 275 + 4 * 20 => 355

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

Тестирование В консоли Firefox / FireBug измените оповещение с возвратом (гораздо удобнее)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

Немного менее очевидно (но будьте терпеливы)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xAA

edc65
источник
3

Python 2: 185 байт + 2 * 20 = 225

Слишком долго для серьезного ответа. Но поскольку ответов пока нет, я все равно выложу.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

productсоздает все различные расположения разрешенных символов. execпытается расшифровать это. К сожалению, это возвращает исключение, а затем длинный try - catchблок. Если результат в порядке, он печатает и существует.

Штраф в 2 раза из-за этих скобок во время вызовов функций.

Jakube
источник
2
Этот ответ может иметь несколько проблем: (1) 0не является шестнадцатеричным литералом; (2) Деление с использованием отрицательного числа в Python дает другой результат, чем в C.
feersum