Не просто головоломка на чотири четвереньки


11

У цьому варіанті головоломки « Чотири четвереньки» вам слід використовувати до x x's(і жодного іншого числа) та визначеного набору операцій, щоб досягти кожного числа від 0 до 100. Якщо x = 4тоді ви можете використовувати до чотирьох, 4sі це питання стає класичним чотирма четвертками головоломки (за винятком того, що ви можете використовувати до чотирьох чотирьох, а не використовувати саме чотири з них). Ми припускаємо 1 < x <= 9.

У цій версії дозволено використовувати лише такі оператори:

  • Додавання ( +), віднімання ( -), множення ( *), ділення ( /). Зауважте, це справжній поділ, так що 5/2 = 2.5.
  • Експоненція (наприклад, 4 ^ 4), оскільки це не передбачає додаткових символів, якщо писати звичайно вручну.
  • Ви можете створити нові цілі числа шляхом об'єднання xs. Наприклад, ви можете скласти цілі числа 4, 44, 444, 4444.

Ви також можете використовувати дужки для групування номерів просто для того, щоб контролювати порядок оцінки операторів. Наприклад, ви не можете поєднувати дужки з конкатенацією, як у (4/4)(4/4) = (1)(1) = 11.

Ніякі інші символи не можуть використовуватися і застосовується стандартний порядок операцій.

Ваша програма повинна генерувати правильне рішення для цього введення, якщо воно існує, xу визначеному діапазоні, nміж 0і 100включно, якщо воно існує. Інакше ваш код повинен вивести щось, що свідчить про відсутність такого рішення.

Ви повинні мати змогу запустити ваше подання до завершення на вашій машині для будь-яких вхідних значень xта nдозволеного діапазону. Це кодовий гольф, тому найкоротше рішення виграє.

Це старе відповідне запитання використовує більше операторів (і лише 4), а отже, всі числа від 0 до 100 вирішуються, що не відповідає дійсності для цього завдання.

Вхід і вихід

Ваш код приймає два цілі числа xі nяк вхідні дані, і повинен виводити рішення (або вказівку, що немає рішення) у будь-якому зручному для вас читаному форматі. Введення 4 6означає, наприклад, "Використовуючи до чотирьох 4с, зробіть число 6". Так що, якщо вхід є, 4 6вихід може бути (4+4)/4+4.



2
Чи можна поєднувати парен з конкатенацією? наприклад `(4/4) (4/4) = (1) (1) = 11?
Цифрова травма

1
Додавання круглих дужок (і заборона дужок + об'єднання) робить це значно складніше
Драконіс

2
Додаючи оператор експоненції та зовнішній цикл протягом кількості використаних цифр, не додайте IMO нічого нетривіального над codegolf.stackexchange.com/q/82884/194
Пітер Тейлор

2
@PeterTaylor Дуже великі зміни в дужках. Я би голосував за повторне відкриття, якби міг.
felipa

Відповіді:


4

Python 3 , 265 байт

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

Спробуйте в Інтернеті!

Працює для всіх номерів у посиланнях, пов'язаних Інженером Тост.

Підбирається до x=8tio, x=9займає пару хвилин на моїй машині.


Функція gповертає набір усіх комбінацій з щонайбільше xчислом xs. fпотім проходить через них і повертає перше, що оцінює число n.

Кількість можливих значень, знайдених для кожного, xє:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

Всі номери вище , можуть бути отримані з (a+b), (a-b), (a+b), a*b, a/b, (a/b), і a^b. a+bі a-bне давати більше цифр.

a^b також використовується лише один раз, оскільки в іншому випадку створюється величезна кількість (це також перевірено в довідковому документі вище)


Альтернативна версія, яка має коротке замикання, як тільки знайде рішення (не як гольф):

Це набагато швидше, оскільки для x=7..9всіх чисел можна створити.

Python 3 , 338 289 байт

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

Спробуйте в Інтернеті!


Це дуже приємна відповідь! Я думав, ви завжди використовували точно (на відміну від до) x xs (наприклад, (4/4**(4-4))для 4), але виявляється, що це не так.
Ануш

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