Загадка «два нулі-один-п’ять»


13

Фон

Ця головоломка є варіацією головоломки на чотири четвереньки (сама тема минулого питання ). Як і ця головоломка, мета - знайти математичні вирази для різних цілих чисел, використовуючи лише чотири цифри та певні математичні оператори. У цьому випадку, однак, дозволені цифри становлять лише 2, 0, 1 і 5 . Кожен повинен з’являтися точно один раз у рішенні та у правильному порядку. Дивно, але так можна представити багато цілих чисел. Розробникам рекомендується спершу спробувати вирішити це вручну, оскільки це дивно приємно.

Правила

Константи можуть бути побудовані з однієї чи декількох цифр:

Допускаються такі одинарні операції:

  • Унарне заперечення: -x
  • Квадратний корінь: sqrt (x)
  • Цілісний факторіал: х!

Дозволені наступні бінарні операції:

  • Стандартні арифметичні оператори: x + y, xy, x * y і x / y
  • Довільна експоненція: x ^ y
  • Довільні корені: rt [x] (y) (= x'th корінь y)

Завдання

Ваша програма повинна роздрукувати вирази для якомога більшої кількості цілих чисел від 0 до 100, а потім вивести кількість створених виразів.

  • Розчини повинні бути надруковані у форматі n = [expr].
  • У виразах повинні бути використані всі цифри 2, 0, 1, 5, один раз у тому порядку.
  • Вирази повинні бути надруковані, використовуючи позначення, описані вище. Непотрібні дужки дозволені, але не обов'язкові, як і пробіли. Порядок пріоритету оператора - це одинарне заперечення, факториальне, експоненційне, множення / ділення та додавання / віднімання.
  • Програмі не потрібно повертати рішення для всіх чисел. Програма, яка просто виводить 0, є дійсною; однак див. розділ підрахунків нижче.
  • Програма повинна працювати за 15 хвилин на сучасному комп’ютері.

Ви можете написати програму або функцію. Вирази повинні бути надруковані до STDOUT (або найближчої альтернативи). Кількість виразів можна роздрукувати в STDOUT або повернути у вигляді цілого числа. Діють стандартні обмеження для гольфу.

Приклад виведення

0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4

Оцінка балів

Оновлення : @orlp відзначив недолік у системі балів. Див. Http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challenge для обговорення того, як чи потрібно це виправити.

Рішення оцінюються спочатку за кількістю виробів, які вони виробляють, а потім за довжиною коду в байтах. Отже, 1000-байтна програма, яка видає 80 результатів, буде бити 100-байтну програму, яка видає лише 79 (хоча останню можна легко розширити, щоб включити відсутні результати).

Для тих, хто хотів би мотивувати ціль, нижче наведена нижня межа кількості виразів, які можна представити. Я не планую подавати заявку, тому, можливо, виграти менше, ніж!

Принаймні 85 (із 101), хоча це може бути і вище.

Табло

Як додатковий стимул, ось короткий підсумок прогресування балів. Щоразу, коли ви виграєте найвищий бал, сміливо додайте себе до вершини таблиці (або попросіть когось іншого).

  • 0 виразів, 1 байт (Pyth): реалізація, яка виводить 0

Чи .20 дозволена константа?
Лука

1
@Luke: так, хоча він також може бути представлений у вигляді (.2 + 0), тому він не збільшує експресивність
Uri Granta

1
@orlp Зауважте, що провідні нулі та дроби, що перевищують нуль, не додають вираженості: наприклад, 015 = 0 + 15 і 1,5 = 1 + .5.
Урі Гранта

1
@ mbomb007 Це занадто складно. Ось коротке пояснення, яке я написав: gist.github.com/orlp/e92b3b7d26ad9b11378e
orlp

2
@UriZarfaty Тоді є 99 різних корисних наборів констант: gist.github.com/orlp/eb997e49e41878c76d0a
orlp

Відповіді:


9

85, ~ 2400 байт

Мені трохи сумно, що це проблема з кодовим гольфом, оскільки я вважаю, що всі мої попередні зусилля виявилися досить марними, коли я опублікую це:

  0 = ((2*0)^15)
  1 = ((2^0)^15)
  2 = (2-(0^15))
  3 = (20*.15)
  4 = (20*(1/5))
  5 = (20-15)
  6 = ((.20+1)*5)
  7 = ((20*.1)+5)
  8 = (2*((0-1)+5))
  9 = ((.20/.1~)*5)
 10 = (20/(1/.5))
 11 = ((((2-0)+1))!+5)
 12 = (20*(.1+.5))
 13 = ((-(2)-0)+15)
 14 = (20-(1+5))
 15 = ((2*0)+15)
 16 = ((2^0)+15)
 17 = ((2-0)+15)
 18 = (20-(1/.5))
 19 = (20-(1^5))
 20 = (20^(1^5))
 21 = (20+(1^5))
 22 = (20+(1/.5))
 23 = (((2-0)/.1~)+5)
 24 = ((20-1)+5)
 25 = ((20^1)+5)
 26 = ((20+1)+5)
 27 = (rt[.2](((0)!+1))-5)
 28 = (2*(-((0)!)+15))
 29 = ((((2+(0)!)+1))!+5)
 30 = ((2-0)*15)
 31 = (20+sqrt((1+(5)!)))
 32 = ((20*.1)^5)
 33 = ((.2^-((0)!))/.15~~)
 34 = (2+(((0)!+1)^5))
 35 = (20+15)
 36 = (20*(1/.5~))
 37 = (rt[.2](((0)!+1))+5)
 38 = ((20-1)/.5)
 39 = (-((2^0))+(sqrt(.1~)*(5)!))
 40 = (20*(1/.5))
 41 = (((.2~^-((0)!))/.1~)+.5)
 42 = ((20+1)/.5)
 43 = (-(2)+(((0)!/.1~)*5))
 44 = (20+((-(1)+5))!)
 45 = (20/(1-.5~))
 46 = ((.2+((0)!/.1~))*5)
 47 = (2+(((0)!/.1~)*5))
 48 = (2*(((0-1)+5))!)
 49 = ((((2+(0)!))!/.1~)-5)
 50 = (((2^0)/.1)*5)
 51 = ((.2+((0)!/.1))*5)
 52 = (2+(((0)!/.1)*5))
 54 = (((2+(0)!)/.1)/.5~)
 55 = ((2+((0)!/.1~))*5)
 56 = (((.2-(0)!)+sqrt(.1~))*-((5)!))
 58 = (-(2)+sqrt((((((0)!/sqrt(.1~)))!)!*5)))
 59 = ((((2+(0)!))!/.1~)+5)
 60 = (20/(.1~^.5))
 62 = (2*(-((0)!)+sqrt(rt[-(.1)](.5))))
 64 = ((2-0)^(1+5))
 65 = ((20/sqrt(.1~))+5)
 66 = ((-(((2+(0)!))!)/.1~)+(5)!)
 67 = (((((2+(0)!))!)!*.1)-5)
 69 = ((2^(((0)!/sqrt(.1~)))!)+5)
 70 = (((.2^-((0)!))/-(.1))+(5)!)
 72 = ((2+(0)!)*((-(1)+5))!)
 75 = ((.2^-((0)!))*15)
 76 = (rt[(-(2)^-((0)!))](.1~)-5)
 77 = (((((2+(0)!))!)!*.1)+5)
 78 = (2*(-((0)!)+(sqrt(.1~)*(5)!)))
 80 = (-(20)*(1-5))
 81 = (201-(5)!)
 82 = (2*((0)!+(sqrt(.1~)*(5)!)))
 84 = (((.2-(0)!)+.1)*-((5)!))
 85 = (((((2+(0)!))!)!*.1~)+5)
 86 = (rt[(-(2)^-((0)!))](.1~)+5)
 88 = (rt[.2]((-((0)!)-1))+(5)!)
 90 = ((20/.1~)*.5)
 93 = (((2+(0)!)/-(.1~))+(5)!)
 95 = ((20-1)*5)
 96 = ((.20-1)*-((5)!))
 98 = (-(20)*(.1-5))
 99 = ((-(20)-1)+(5)!)
100 = (20/(1/5))
85

З цього моменту це лише завдання стиснення. Можливо, я змагатимусь пізніше, можливо, не стану. Для мене найбільше задоволення було в тому, щоб знайти найбільшу формулу.

Підказка для тих, хто бореться писати рішення - час виконання не повинен бути проблемою. Якщо у вас занадто багато формул для перевірки, вам потрібна краща евристика, щоб викинути безнадійні рішення та дублікати. Код, який я написав, щоб створити вище, працює на ~ 5 сек на Python.


rt [.1] (-. 5) - 0,1-й корінь -0,5, а не -0,5-й корінь 0,1.
Урі Гранта

Також я починаю підозрювати, що переможець цілком може бути стислим текстовим висновком. Треба було б придумати кращий спосіб уникнути цього :-(
Урі Гранта

@UriZarfaty О, я виправлю це в своєму коді і повторно запустіть, дайте мені одну секунду.
orlp

Я значно переоцінив, наскільки великим буде вихід у порівнянні з розміром програми. Враховуючи невеликий діапазон символів та зайві дужки, я думаю, що рішення насправді стиснеться занадто добре.
Урі Гранта

1
@ mbomb007 Я не робив жодних спроб очистити його, і я думаю, що код у поточному стані порушений - спробуйте коментувати деякі речі: gist.github.com/orlp/878da16b5b7c650ebd09 .
orlp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.