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


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 результатів


Я не думаю .4, що це дійсна цифра для цієї гри.
Джон Дворак

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