Арифметика… нок… галочка… носок


15

Це питання вам запропонувала гра, в яку я люблю грати, коли застрягла в довгих телефонних зустрічах.

Враховуючи будь-які два рази за 24 годинний годинник (з 00:00 до 23:59), скільки дійсних математичних рівнянь може бути сформовано за весь час між ними, використовуючи лише основні арифметичні операції?

Введення: дві чотиризначні рядки (без двокрапки), що представляють дійсні часи протягом 24 годинного циклу.

Приклади:

Для введення = 0000, 1300

03:26 produces: "0+3*2=6" and "03*2=6" etc.
11:10 produces quite a few, including: "1*1=1+0" and "1=1=1^0" and  "1=11^0" etc.
12:24 produces: "1/2=2/4" and "1=(2*2)/4" etc.

Дійсні операції:

  • доповнення
  • віднімання
  • множення
  • поділ (плаваюча точка)
  • експоненцію
  • факторіальний

Інші допустимі символи

  • Круглі скобки
  • Знаки рівності

Найкоротший код виграє.

Примітки

  • Мета - знайти кількість дійсних виразів між двома разів, а не кількість разів, що містять дійсне вираження.
  • Два рази, подані як вхідні дані, включаються в діапазон разів.
  • Ви можете групувати цифри будь-яким способом, так що "1223" може бути "12 23" або "1 2 23" або "1 223" і т.д. і т.д.
  • Ви можете використовувати стільки круглих дужок, скільки потрібно.
  • Ви можете використовувати більше, ніж один =знак. Наприклад, час 11:11має дійсне вираження 1=1=1=1.
  • Якщо перший раз трапляється хронологічно після другого разу, діапазон разів повинен завершуватися так, ніби переходять на наступний день.
  • Цифри повинні залишатися в їх первісному порядку - ви не можете повторно замовляти цифри.
  • Під час кластеризації чисел нулі можуть абсолютно бути найпершою цифрою, і в цьому випадку вони ігноруються ("0303", кластеризовані як "03 03", - це лише дві цифри зі значенням 3.)
  • НЕ МОЖЕТЕ використовувати знак мінус як одинарне заперечення. Тому "12:01" НЕ створює "1-2 = - (01)", але НЕ виробляє "1-2 = 0-1".
  • НЕ МОЖЕТЕ додавати десяткових знаків до цифр. Тому "12:05" НЕ створює "1/2 = 0,5".
  • Ніякого прив'язування фабрикантів - після цифри може бути не більше одного "!", Не більше, інакше багато разів мали б нескінченні рішення. Наприклад: "5!" діє, але "5 !!" не вірно.


4
" Дійсні операції включають ", здається, заважають вам додавати тестові випадки. Було б краще питання, якби ви змінили це на " Дійсні операції " та додали кілька тестових випадків. Було б також корисним бути точним щодо кінцевих точок: для введення чи 0000 1300повинні бути отримані рівняння, отримані 0000та 1300включені до підрахунку?
Пітер Тейлор

1
Давши цифри "1423", зробіть "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3" і "1 + 4 = (2 +3) "рахувати як одне чи чотири рівняння? І ... які всі рівняння "0000"? Я думаю про 100 можливостей, а то й більше ... Чи може це бути?
боббел

2
Чи є якесь обмеження щодо використання одинарних операторів? Відсутність такого обмеження в правилах, факториал можна застосовувати неодноразово, і таким чином ідеальне рішення може виявитися неможливим.
Майкл Стерн

1
Майкл, це чудове спостереження. Тож заради головоломки я думаю, що я обмежу її однією факторією на "цифру", якщо це має сенс. Для цього 5! діє, але 5 !! не вірно.
nobillygreen

Відповіді:


1

Python3, 363 символів

Оскільки до сьогодні жодної відповіді не дано, я передаю те, що отримав. На жаль, спроба / крім блоку занадто жирна, я не знайшов способу зберегти символи там. Дуже складно з вкладеними петлями там, не все можна зробити із розумінням списку, я думаю, але, можливо, хтось може мені сказати, як.

Однак я обмежив завдання лише використовувати базову математику '+ - * /' і без дужок.

a,b = input().split()
r=0
for time in [c for c in range(int(a),int(b)) if c/10%10<6]:
 t,*ts='%04d'%time
 e=[t]
 for d in ts:
  e=[(n+o+d,n+d)[o==' '] for o in ' -+*/=' for n in e]
 for h in [g for g in [e.split('=') for e in e if '='in e] if len(g)>1]:
  for k in h:
   try:
    if eval(h[0]) != eval(k):
     break
   except:
    break
  else:
   r+=1
print(r)

Мій повний код (сподіваюся щось пояснювальний) на цьому CodeGolf можна знайти на моїй пастбіні .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.