Арифметика ... Ток ... Тик ... Ток

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 !!" не является допустимым.
nobillygreen
источник
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 символа

Поскольку до сегодняшнего дня ответа не дано, я сдаю то, что получил. К сожалению, блок try / исключением слишком толстый, я не нашел способа сохранить символы там. Это действительно сложно с вложенными циклами там, я думаю, что не все можно сделать с помощью понимания списка, но, возможно, кто-то может сказать мне, как.

Тем не менее, я сам ограничил задачу использованием только базовой математики '+ - * /' и без скобок.

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 можно найти на моей наклейке .

Оливер Фридрих
источник