Головоломка четыре четверки

21

Головоломка « Четыре четверки» - это популярная развлекательная математическая головоломка, в которой используются ровно четыре четверки (и никаких других чисел) и определенный набор операций для достижения каждого числа от 0 до заданного максимума.

В этой версии разрешены только следующие операторы:

  • Можно использовать любые символы группировки
  • Сложение ( +), вычитание ( -), умножение ( *), деление ( /)
  • Факториал ( !), Гамма-функция ( Γ)
  • Возведение в степень ( ^), квадратный корень ( )
  • Конкатенация (например, 44два 4с)
  • Десятичная точка (например, 4.4это два 4с), Overbar (например, .4~ = 4/9)

Применяется стандартный порядок операций.

Ваша программа должна сгенерировать, учитывая ввод от 0 до 100 включительно, правильное решение для этого ввода. Если программа выводит неверное решение на любой вход, эта программа недействительна.

Например, с помощью ввода 0ваша программа может сгенерировать 44-44.

Использование внешних модулей не допускается. Только _.4~допускается для черточка оператора - то есть, только один 4может быть за десятичной точкой.

Это код гольф, поэтому выигрывает самое короткое решение.


Редактировать : для большей ясности программа должна вывести набор вышеуказанных операций, примененных ровно к четырем 4секундам - ​​ни больше, ни меньше. Кроме того, .4 = 4/10это действительный термин, и считается как использование только один 4.

летучесть
источник
нет операций округления? :-(
Джон Дворак
@JanDvorak ошибка, нет, это не будет разрешено.
Волатильность
гамма и факториал как разрешены?
Джон Дворжак
@JanDvorak все, что в списке (но только те, которые перечислены) могут быть использованы.
Волатильность
мы можем вывести факториал как префиксную функцию ( !(4)а не (4)!)?
Джон Дворжак

Ответы:

6

GolfScript (129 символов *)

[4.`2'√4'24'4!'6'Γ4'1'Γ√4'120'ΓΓ4']2/:F{.F=[[44.`]]*\{`{+{'+*-'1/{:^;.[~@[\]{'()'1/*}%^*@@^~\]\}/}:|~2/~\+|;}+F/}%+}3*\{\0==}+?1=

Время работы на моем компьютере составляет порядка 4 минут. Умеренное ускорение можно получить за счет двух символов, добавив операцию уникальности .&сразу после %+.

Я использую предварительно закодированные выражения 1, 2, 4, 6, 24, 120, и 44, и строить покоиться от тех , кто использует только +, *и -. Таким образом, мне не нужно делать нецелочисленную арифметику в самой программе. Я попытался получить более простые выражения, поместив более простые предварительно кодированные значения в начале.

Все эти значения являются обязательными , и необходимо поддерживать оба направления вычитания ( complex_expression - simple_expressionи наоборот). Также необходимо включить некоторые операции, которые требуют скобок (в частности, a*(b-c)), поэтому я заключаю в скобки все подвыражения без разбора.

* Я считаю кодовые точки Unicode, предполагая, что программа имеет кодировку UTF-8, и подчеркиваю тот факт, что, если вы не используете последнюю версию Ruby для запуска интерпретатора, он действительно воспринимает ее как символы ASCII. Если вы очень обеспокоены этим, используйте Gдля Gamma и vдля sqrt.

Ну, строго я мог бы снять 44в обмен на , 11как 44/4и , 71как √(Γ√4+(ΓΓ4+Γ√4)!), но это не является хорошим компромиссом.

Питер Тейлор
источник
7

Python 155 байт

h={4:'4',24:'4!',6:'â4',.4:'.4',1:'âû4',4/9.:'.4~'}
f={}
def g(r,s='24',y='4!'):f[eval(s)]=y;[g(r-1,s+o+`k`,y+o+h[k])for k in h for o in'/*-+'if r]
g(3)

Первые три байта ( \xEF\xBB\xBF) являются меткой порядка байтов UTF-8, хотя файл должен быть сохранен в формате ANSI. ûИ âбудет , как интерпретируются с и , Γсоответственно , в cp437 и cp850 , который должен работать на любой коробке Windows.

Время выполнения составляет около 0,4 с на моем компьютере.

Пример использования (назовите файл four_fours.py):

$ python
>>> from four_fours import f
>>> f[39]
'4!+4!/.4/4'
>>> f[87]
'4!*4-4/.4~'
>>> for i in range(101): print i, f[i]
0 4!+4!-4!-4!
1 4!+4!/4!-4!
2 4!-4!+Γ4-4
3 4!-4!+4-Γ√4
4 4!+4!/Γ4-4!
.
.
.
96 4!+4!+4!+4!
97 4!*4!/Γ4+Γ√4
98 4!*4+Γ4-4
99 4!*4+4-Γ√4
100 4!*4!/Γ4+4

Результаты за 0..100 . Из-за способа итерации хеша, он предпочитает использовать 4!как можно чаще.

Редактировать: сохранил количество байтов, добавив Γ√4 = 1, что устраняет необходимость каких-либо группировок, и удалив √4 = 2, что больше не было необходимости.

Примо
источник
4

J 175 161 символ

   f=.')',~'(',;@((<;._2'+ - * % .4 .4~ g(r(4)) r(4) 4 g(4) 4! ( ) '){~(143402 A.i.9)
      /:~(12,11,0,6$0 4 4)+(9$4 7 7)#:((,@(+/,-/,*/,%/)~)^:2,0.4 4r9 1 2 4 6 24)&i.)

   f 1
(.4+.4)+(.4%r(4))

   f 42
(r(4)+4)+(g(4)*g(4))

   f 100
(r(4)+r(4))+(4*4!)

Проверенный формат - это (v op v) op (v op v)где v={0.4 4/9 1 2 4 6 24}иop={+ - * /}

полный 0..100 результатов

randomra
источник
Я не думаю, что .4это правильный номер для этой игры.
Джон Дворак
@JanDvorak это - возможно, я должен был сделать это более ясным
Волатильность