Допоможіть мені зволікати з ремонтом комп’ютера!


23

Цей виклик вам приносить справжнє (і трагічне) натхнення. Останнім часом рядок цифр на моїй клавіатурі трохи спорадично. Клавіші 1-9працюють іноді, але в інших випадках вони не мають результату. Як завзятий програміст, це жахливо! (Дивіться цей знак оклику? Ось так ви знаєте, що вони зараз працюють.) Мені не тільки часто потрібні самі цифри, але й символи!@#$%^&*(також є неефективними в половині часу! Як програміст на C, замість того, щоб забирати час від мого напруженого розкладу малювання з кодом, щоб виправити мій ноутбук, я був більше зацікавлений у вирішенні проблеми. Протягом останніх декількох тижнів повільно всі літеральні цифри в моєму коді були замінені шістнадцятковими, так що мені не доведеться ходити на полювання за номерами, щоб скопіювати та вставити. Однак деякі цифри не легко ввести без клавіш 1-9. Наприклад, число 1не можна записати так просто шістнадцятковим, і я вдався до заміни 1s у своєму коді на 0xF - 0xE. Єдині клавіші, які уражаються 1-9, тому я підтримую повне використання символів , таких як +, -і /. Однак я не можу використовувати множення чи круглі дужки як*і (часто ламаються. Це призводить до вашого завдання.

Вхідні дані

Ціле число, nstdin або еквівалент вашої мови. За бажанням, цілому числу може передувати або слідувати новий рядок або інший символ пробілу. Крім того, ви можете отримати вхід через аргумент командного рядка.

Ваша програма повинна правильно реагувати на негативний вхід і мати можливість обробляти принаймні 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аргумент до тих пір, поки ця функція створює певну форму, зрозумілу людині. Повернене значення функції НЕ враховується як вихід.

Стандартні лазівки заборонені.

Найнижчий рахунок виграє! Удачі!

Я щось підробляв до форматування / запитання / чіткості? Дай мені знати! Це моє перше подання на цей сайт!


Чи є верхня межа розміру цілого числа? Також чи будуть представлені негативні числа з якоюсь довільною точністю (тобто 32 біт)?
FryAmTheEggman

@FryAmTheEggman Відредагував оригінальний пост для уточнення. Введення може бути негативним, і ваша програма повинна правильно реагувати на щонайменше 32-бітний вхід. Спасибі!
BrainSteel


Це виглядає як досить солідна специфікація для мене, але якщо вам потрібні відгуки, я рекомендую опублікувати його в пісочниці (для майбутніх викликів), щоб ви могли отримати зворотній зв'язок перед тим, як опублікувати його на головній, і люди почнуть працювати над ним .
Мартін Ендер

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 (це робить код ще більш неясним)

Редагування коду переглянуто з урахуванням уникнення '('. Видалено ifs та явне створення 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)
}

Щось ще

Тепер щось смішніше. Я використовував надто спрощений аналізатор expressione, щоб уникнути виклику 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


3

Пітон 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 рази штраф, через ті дужки під час виклику функцій.


2
Ця відповідь може мати кілька питань: (1) 0не є шістнадцятковим буквалом; (2) Відділ, що включає в себе негативне число в Python, дає інший результат, ніж у C.
feersum
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.