Підсумуйте повноваження на n


14

Напрямки

Напишіть програму, яка за вхідним цілим числом n ( n >= 0) видає найменше додатне ціле число m де:

  • n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
  • aі bє кінцевими послідовностями однакової довжини
  • всі елементи aменшеm
  • всі елементи bменшеm
  • всі елементи aє різними і цілимиa[x] >= 0
  • всі елементи bє різними і цілимиb[x] >= 0
  • a[x]і b[x]не є обома 0 (оскільки 0 ^ 0 невизначено)

Це , тому виграє найменше байтів.

Приклади

In 0 -> Out 1
Possible Sum: 

In 1 -> Out 2
Possible Sum: 1^0

In 2 -> Out 3
Possible Sum: 2^1

In 3 -> Out 3
Possible Sum: 2^1 + 1^0

In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1

In 16 -> Out 5
Possible Sum: 2^4

In 17 -> Out 4
Possible Sum: 3^2 + 2^3

In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3

In 24 -> Out 5
Possible Sum: 4^2 + 2^3

In 27 -> Out 4
Possible Sum: 3^3

In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0

Як ми повинні скласти послідовність унікальних, негативних цілих чисел, що мають нескінченну суму?
feersum

Крім того, перший випадок не має сенсу, оскільки вистачить суми з 0 доданками.
feersum

@feersum Я не зовсім розумію ваше запитання. Моє рішення для цього - пошук грубої сили всіх комбінацій, де m<2тоді m<3і m<4т.д., поки я не знайду суму, що дорівнює n. Крім того, я думав про те, щоб сума 0була без термінів, але тоді, що є результатом? м>?
kukac67

1
Для кінцевих послідовностей ви зазвичай робите щось подібне n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k].
Нестабільність

1
Приємне запитання. Лише одна підказка на першому тестовому випадку: aі bє кінцевими послідовностями довжини 0, тому немає цілого числа, mяке б не задовольняло обмеженням, а оскільки немає найменшого цілого числа, відповідь не визначається. Можливими виправленнями буде запит на найменше натуральне число m(у такому випадку ви повинні змінити очікувану відповідь на 0) або найменше додатне ціле число m.
Пітер Тейлор

Відповіді:


2

GolfScript (59 символів)

~:T),{),.0{2$0-{2${{4$2$^}2*@3$\?4$+f~}%\;~}%+\;\;}:f~T&}?)

Демонстрація в Інтернеті

При цьому використовується рекурсія для перерахування значень, досяжних для даної задачі, mі пошук першого, mякий працює. Це злегка натхнене відповіддю xnor, але зовсім інше в реалізації.

Розсічення

~:T                  # Evaluate input and store in T (for Target)
),{                  # Search [0 1 ... T] for the first m which matches a predicate
  ),.0               #   Push [0 ... m] to the stack twice and then 0
                     #   Stack holds: possibleAs possibleBs sum
  {                  #   Define the recursive function f
    2$0-{            #     Map over A in possibleAs (except 0)
      2${            #       Map over B in possibleBs (except 0)
        {4$2$^}2*    #         Duplicate respective possibles and remove selected values
        @3$\?4$+     #         Compute sum' = sum + A^B
        f            #         Recursive call gives an array [sums]
        ~            #         Push the sums to the stack individually
        }%           #       End map: this collects the sums into a combined array
      \;             #       Pop A, leaving just the combined [sums] inside the map
      ~              #       Repeat the trick: push to the stack individually
    }%               #     End map, collecting into a combined array
                     #     Stack now holds: possibleAs possibleBs sum [sums]
    +                #     Include the original sum in the array of reachable sums
    \;\;             #     Pop possibleAs and possibleBs
  }:f                #   End function definition
  ~                  #   Evaluate the function
  T&                 #   Test whether the sums contain T
}?                   # End search
)                    # Increment to get m

6

Пітона, 120

f=lambda n,A,B:n*all(f(n-a**b,A-{a},B-{b})for a in A for b in B)
g=lambda n,m=1,M={0}:f(n,M-{0},M)and g(n,m+1,M|{m})or m

Функція fє допоміжною функцією , яка перевіряє , є чи nможе НЕ бути виражена у вигляді суми ступенів з різними підставами з Aі показників з B. Він використовує природну рекурсивну стратегію:n має бути ненульовим, і ми намагаємось зробити кожен можливий вибір основи та експонента, і всі вони повинні провалитися. Видаляємо їх із дозволених списків і зменшуємо nна відповідну суму.

Функція g- основна функція. Він шукає роботу, mяка працює. M- це набір дозволених значень до m-1. Видаляємо 0з дозволених показників зупинку0**0 (що Python оцінює до 1) від використання. Це нічого не шкодить, оскільки 0**xце марно 0для всіх інших x.


Ви могли б змінити n and all()до n*all().
grc

@grc Ах, вам насправді не потрібне коротке замикання, оскільки воно знижується. Дякуємо за покращення.
xnor

4

Python 2, 138 байт

from itertools import*
S=lambda n,m=0,R=[]:m*any(n==sum(map(pow,*C))for k in R for C in product(*tee(permutations(R,k))))or S(n,m+1,R+[m])

(Дякую @Jakube за всі поради)

Я ніколи не дізнався так багато про це itertools модуль, як у мене з цього одного питання. Останній випадок займає близько хвилини.

Почнемо з пошуку з m = 1 та збільшення до тих пір, поки не отримаємо рішення. Для перевірки рішення ми повторюємо:

  • k = 0 to m-1, де k кількість доданків у рішенні
  • Всі можливі комбінації термінів (зчеплення двох перестановок підмножини [0, 1, ... m-1]з розміром k), потім підведення підсумків і перевірка, чи є у насn

Зверніть увагу , що ми ітерацію kдо m-1- хоча технічноm умови можливі в загальному, завжди є рішення з m-1точки зору, як 0^0не допускається і 0^bвносить нічого. Це насправді важливо, тому що0^0 Python трактується як 1, що здається проблемою, але це, мабуть, не має значення!

Ось чому.

Припустимо, що рішення, знайдене помилково, використовується 0^0як 1, наприклад 3^2 + 1^1 + 0^0 = 11. Оскільки ми генеруємо лише m-1терміни, їх мають бути деякіj ми не використовуємо як основу (тут j = 2). Тут ми можемо поміняти базу 0 для jотримання дійсного рішення 3^2 + 1^1 + 2^0 = 11.

Якщо б ми ітеративна до всіх mтермінів, то ми , можливо, отримали неправильні рішення , як m = 2для n = 2через 0^0 + 1^1 = 2.


Хороший. Можна зберегти 4 байти, використовуючи Imap, хоча. imap(pow,C,D) ... for C,D in
Якубе

@Jakube Я насправді переглядаю документ, itertoolsколи ми говоримо: У мене вже є інша економія - tee.
Sp3000

Я також. Також моя помилка. Чому хтось пропонує imap, коли є map?? -1 байт
Якубе

Параметр за замовчуванням для teeвже є n=2. Економить 2 байти.
Якубе

@Jakube Ahaha спасибі Це, мабуть, перший раз, коли я коли-небудь користувався mapз більш ніж одним ітерабельним, і насправді це питання дало мені багато перших.
Sp3000

4

GolfScript ( 90 84 байт)

[0.,.]](~:T),(+{:x;{:|2,{:c)|=x),^{c[1$x]=:A^x^:-;[|~-+@A-?+@A+@]}%}/+~}%.[]*T&}?)\;

Демонстрація в Інтернеті

Розсічення

[0.,.]             # Base case: [sum As Bs] is [0 [] []]
](~:T              # Collect it in an array of cases; fetch parameter, eval, store in T.
),(+               # Create array [1 2 ... T 0]. Putting 0 at the end means that it won't
                   # be reached except when T is 0, and nicely handles that special case.
{                  # Loop over the values from that array...
  :x;              #   ...assigning each in turn to x (and popping it from the stack)
  {                #   Stack holds array of [sum As Bs] cases; map them...

    :|             #     Store [sum As Bs] in |
    2,{:c          #     For c in [0 1]...
      )|=x),^      #       Get [0 1 ... x]^ either As or Bs, depending on c
      {            #       Map these legal new As or Bs respectively...
        c[1$x]=:A  #         Work out which of that value or x is the new A
        ^x^:-;     #         And the other one is the new B
        [          #         Begin gathering in an array
          |~       #           Push sum As Bs to the stack
          -+       #           Add - to Bs to get Bs'
          @A-?+    #           Rotate sum to top and add A^- to get sum'
          @A+      #           Rotate As to top and add A to get As'
          @        #           Final rotation to put elements in the right order
        ]          #         Gather in array [sum' As' Bs']
      }%           #       End map
    }/             #     End for
    +~             #     Push all the elements corresponding to x^B and A^x on to the stack
  }%               #   End map, collecting the untouched [sum As Bs] and all the new
                   #   [sum' As' Bs'] arrays into a new array of reached cases.
  .[]*T&           #   Flatten a copy of that array and filter to values equal to T.
                   #   This gives a truthy value iff we've found a way to make T.
}?                 # Loop until we get a truthy value, and push the corresponding x
)\;                # Increment to get the value of m and discard the array of cases

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


Я дуже радий, що CJam цього разу не набагато коротший, ніж стандартний python = P
недолік

@flawr, це GolfScript, а не CJam. CJam, ймовірно, може бути трохи коротшим, оскільки він має вбудований для декартових продуктів. І може бути, що ідея xnor про рекурсивну функцію також дає коротший GolfScript.
Пітер Тейлор

Пробачте, просто переплутав їх =)
недолік

4

Хаскелл, 143 130

import Data.List
p n=head$[1..]>>=(\m->[m|let x=permutations[0..m-1]>>=inits,a<-x,b<-x,sum(zipWith(\x y->x^y*signum(x+y))a b)==n])

Приклад використання: p 23->6 .

Це простий брутальний пошук. Для кожного списку [0..0], [0..1], [0..2] ... [0..∞]візьміть усі початкові сегменти перестановок (наприклад, [0..2]: перестановки:, [012], [102], [210], [120], [201], [021]початкові сегменти для 1-ї перестановки:, [0], [01], [012]2-й: [1], [10], [102]тощо). Для кожної комбінації 2 цих списків обчислюють суму повноважень. Зупиніться, коли перший дорівнює n.


ви повинні використовувати, >>=а не concatMap. вони точно такі ж, але з аргументами навернуто.
гордий haskeller

@proudhaskeller: Так, дякую!
німі

2

Пітон: 166 символів

from itertools import*;p=permutations
f=lambda n,r=[0]:any(n==sum(map(lambda x,y:(x+y>0)*x**y,a,b))for j in r for a,b in product(p(r,j),p(r,j)))*1or 1+f(n,r+[len(r)])

Пояснення

Функція fстворює всі можливі цілі числа, які можна виразити як суму потужностей чисел у r. Якщо починається з r = [0]. Якщо будь-яке з цих цілих чисел дорівнює n, воно повертає довжину r, інакше він називає себе рекурсивно з розширенимr .

Обчислення всіх цілих чисел, які можна виразити у вигляді суми, виконується двома петлями. Перший цикл - це те for j in r, що повідомляє нам довжину виразу (2 ^ 3 + 1 ^ 2 має довжину 2). Внутрішня петля ітералізує всі комбінації перестановок rдовжини j. Для кожного я обчислюю суму повноважень.


2

JavaScript (ES6) 219 224

Рекурсивна функція. Починаючи з m = 1, я пробую всі комбінації цілого числа 1..m для основ і 0..m для експонентів (0 база даремно задано 0 ^ 0 == undefined).
Якщо рішення не знайдено, збільште m і повторіть спробу.
Спеціальний випадок для введення 0 (на мою думку, це все-таки помилка в специфікаціях)

Функція C рекурсивно генерує всі комбінації з масиву заданої довжини, так що

C(3, [1,2,3]) --> [[3,2,1], [3,1,2], [2,3,1], [2,1,3], [1,3,2], [1,2,3]]

Третій рівень everyвикористовується для об'єднання масиву a баз і b експонентів ( zipу JavaScript немає функції). Використання everyдля зупинки на ранніх етапах, коли в двох масивах є рішення, що не використовує всі елементи.

F=(n,j=1,k=[],
  C=(l,a,o=[],P=(l,a,i=l)=>{
    for(l||o.push(a);i--;)
      e=[...a],P(l-1,e.concat(e.splice(i,1)))
  })=>P(l,a)||o
)=>n&&C(k.push(j++),k)[E='every'](a=>C(j,[0,...k])[E](b=>a[E](x=>t-=Math.pow(x,b.pop()),t=n)))
?F(n,j,k):j

Тест в консолі FireFox / FireBug

;[0,1,2,3,6,16,17,23,24,27,330].map(x=>[x,F(x)])

Вихідні дані

[[0, 1], [1, 2], [2, 3], [3, 3], [6, 4], [16, 5], [17, 4], [23, 6], [ 24, 5], [27, 4], [330, 7]]

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