Підйом, послідовність, підйом


19

У нас суворо зростає послідовність невід’ємних цілих чисел, наприклад:

12 11 10

Зачекайте! Ця послідовність не суворо зростає, чи не так? Ну, номери пишуться різними базами. Найменше можлива база - 2, найбільша - 10.

Завдання полягає в тому, щоб відгадати основи, записане кожне число, щоб:

  • послідовність суворо збільшується,
  • сума основ максимальна.

Наприклад, рішення для вибірки буде:

6 8 10

тому що за цими основами послідовність стає 8 9 10десятковою - суворо зростаюча послідовність, і ми не здатні знайти бази, для яких послідовність залишається строго зростаючою і сума яких більша за 6+8+10.

Через друге обмеження рішення 3 5 7не є задовільним: незважаючи на те, що послідовність стає 5 6 7під цими базами - нам потрібно максимально збільшити суму баз, і 3+5+7 < 6+8+10.

Якщо немає підстав 2<=b<=10, то серія може суворо збільшуватися, наприклад:

102 10000 10

неодружений

0

повинні бути вихідними.

Послідовність введення можна передавати так, як це найбільш зручно для вашого рішення (стандартні параметри вводу / командного рядка / аргументи функції ...).


1
Чи 1 3 5піднімається послідовність? Про що 1 7 22? (в базі 10)
Дверна ручка

Так, 1 3 5і 1 7 22обидва піднімаються під базою 10. Отже, рішення для обох випадків полягає в 10 10 10тому, що нам потрібно максимізувати суму баз, гарантуючи, що послідовність зростає, коли n-е число інтерпретується як написане в базі, рівне n -й термін рішення.
pawel.boczarski

2
@Dennis Так, я маю на увазі суворо зростаючу послідовність. 1 1 1або 3 3 4не ростуть.
pawel.boczarski

3
Якщо коментарі свідчать про те, що питання відкрите для неправильного тлумачення, не відповідайте просто в коментарях. Відредагуйте питання, щоб інші люди не витрачали час на написання відповідей, які тлумачать його по-різному.
Пітер Тейлор

3
Що стосується двозначностей, один із коментарів до моєї відповіді стверджує, що ми повинні вважати, що цифри написані в канонічній формі в даній базі. Якщо це так, виправте словосполучення " Найменше можлива основа - 2 " на щось на кшталт " Найменше можлива основа є на одне більше, ніж найбільше значення цифри ".
Пітер Тейлор

Відповіді:


13

Pyth, 31 30 29 байт

e+0f.x!sgM.:iVczdT2ZosN^STlcz

1 байт завдяки @Jakube.

Демонстрація. Тестовий джгут.

Вхід подається на STDIN, пробіл розділений. Якщо дозволено введення розділеного рядка для нового рядка, я можу скоротити програму на 2 байти.

Пояснення:

e+0f.x!sgM.:iVczdT2ZosN^STlcz
                                  Implicit: z = input(), T = 10, Z = 0, d = ' '
                        ST        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                          lcz     len(z.split())
                       ^          All combinations w/replacement of that length.
                    osN           Order by increasing sum.
   f                              Filter on
              czd                 z.split(' ')
            iV   T                Vectorize the "Convert to base" operation over 
                                  the integers as strings and the base sequence.
          .:      2               Take length 2 subsequences.
        gM                        Map the >= operation over them.
      !s                          Sum and logically negate.
    .x             Z              If that throws an error, returns 0 (e.g. reject)
 +0                               Prepend a 0, in case no sequences are found.
e                                 Take the end of the list.

Включення 1до списку можливих баз є безпечним, оскільки i, використовуючи intвбудований Python , не дозволяє 1в якості основи, а тому завжди видає помилку, яка потрапляє та фільтрується.


9

CJam, 43 байти

0B,2>ea,m*{:+~}${ea::~_2$.b__Q|$=*@.b=}=p];

Читає аргументи командного рядка та друкує масив.

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Приклади

$ cjam rise.cjam 12 11 10
[6 8 10]
$ cjam rise.cjam 19 18 17
0

Як це працює

0       e# Push a 0 (default return value).
B,2>    e# Push [0 ... 10] and remove the first two elements.
ea,     e# Push the number of command-line arguments (n).
m*      e# Cartesian power. Pushes all vectors of {2 ... 10}^n.
{:+~}$  e# Sort by the negated sums.
{       e# Find; for each vector V in {2 ... 10}^n:
  ea::~ e#   Evaluate each character of each command-line argument.
  _2$   e#   Copy the results and V.
  .b    e#   Vectorized base conversion (list to integer).
  __    e#   Push two copies.
  Q|$   e#   Deduplicate and sort the last copy.
  =     e#   Compare it to the first. Pushes 1/0 if equal/unequal.
  *     e#   Repeat the original result of .b that many times.
  @.b   e#   Vectorized base conversion (integer to list).
  =     e#   Compare the result to the modified command-line arguments.
        e#   Equality makes sure that the base was greater than all digits.
}=      e# If pushed 1, push V and break.
p       e# Print. Either prints the last V or 0 if none matched.
];      e# Clear the stack to avoid implicitly printing the 0 (if still present).

6

Юлія, 176 156 145 118 109 99 97 байт

A->try p=NaN;flipud(map(i->(k=11;t=p;while t<=(p=parseint("$i",k-=1))end;k),flipud(A)))catch;0end

Безголівки:

function anonfunc(i)
  # Start with k=11 so that it evaluates to 10 on first while iteration
  k=11
  # set t to the previous value of p
  # Note: p here gets held over between iterations within the map
  t=p
  # Iterate through, dropping k by 1 and evaluating the integer in
  # base k and stopping if the value drops below t
  # Note: "p=" expression inside conditional to ensure k-=1 is evaluated
  # at least once (to make NaN work as desired)
  while t<=(p=parseint("$i",k-=1))
  end
  # if it dropped below t, return the base, k to be the corresponding
  # element in the map
  return k
end

function f(A)
  # Using try/catch to return 0 if no acceptable base found
  try
    # This is a trick to make sure the comparison in the while loop
    # evaluates to false on the first use of it (last value in A)
    p=NaN
    # Apply anonfunc to each element of A, starting with the last element
    # and store the result in S
    S=map(anonfunc,flipud(A))
    # S is backwards, so flip it and return it
    return flipud(S)
  catch
    # Will throw to here if parseint fails with the base due to having
    # a digit not acceptable in the base
    return 0
  end
end

Використовується з введенням 1d масиву. Якщо функція призначена c, ви б зателефонували, c([12,11,10])і вона виведе [6,8,10].

Примітка: я використовував dec(i)всередині команди parseint, але оскільки iце ім'я змінної з одним символом, і мені не потрібно звертатися до компонента, я використовував "$i"такий же результат.


У вас тут є кілька хороших хитрощів. Хороша робота.
Алекс А.

Цей код, схоже, перевіряє бази на строго зменшувану послідовність у звичайному порядку зчитування зліва направо.
pawel.boczarski

@ pawel.boczarski - Я не впевнений, що ви маєте на увазі, але якщо ви хочете, я можу навести кілька прикладів того, що він дає для певних входів. Наприклад, якщо ви призначите ім'я функції c, то c([12,11,10])виходи [6,8,10], які є необхідними базами.
Глен О

@GlenO О, бачу. Я використовував рядок вектор [12 11 10]замість, [12,11,10]і це дало небажаний ефект.
pawel.boczarski

@ pawel.boczarski - ах, бачу. Так, якщо ви хочете, щоб він працював з векторами рядків, вам потрібно буде замінити "flipud" на "fliplr", і в цьому випадку він поверне векторний рядок баз.
Глен О

5

Юлія, 259 204 183 байт

Зберегли купу з допомогою Глена О.

A->(M(x)=maxabs(digits(x))+1:10;S=[];X={};for i=M(A[1]),j=M(A[2]),k=M(A[3]) s=map(parseint,map(dec,A),[i,j,k]);all(diff(s).>0)&&(S=[S,sum(s)];X=[X,{[i,j,k]}])end;X==[]?0:X[indmax(S)])

Недоліковані + пояснення:

function f(A)
    # Define a function to obtain the smallest possible base range
    M(x) = (maxabs(digits(x)) + 1):10

    # Define container arrays for the sums and bases
    S = []
    X = {}

    # Loop over all possible bases for each of the elements
    for i = M(A[1]), j = M(A[2]), k = M(A[3])
        # Parse each element of the input as a string
        # in the given base
        s = map(parseint, map(dec, A), [i,j,k])

        # Push the sum and bases if s is rising
        if all(diff(s) .> 0)
            S = [S, sum(s)]
            X = [X, {[i,j,k]}]
        end
    end

    # If X is empty, return 0, otherwise return the bases
    isempty(X) ? 0 : X[indmax(S)]
end

Гаразд, деякий гольф, який потрібно зробити ... використовуйте "repr" замість "string" в команді map, вони працюватимуть однаково в цьому контексті і зберігають два байти. І ми можемо зберегти ще декілька, скориставшись оператором інфікування для парсейнту, записавши "\ = парсейнт", а потім за допомогою x [1] \ i, а не p (x [1], i) - ще один байт у "\" частина, а потім збереження трьох для кожного використання p для чистої економії 8 байт. Ще один байт збережено, замінивши "максимум (цифри (х)) на макс (цифри (х) ...)")
Glen O

Для більшої економії об’єднайте циклі for - використовуйте for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, економте вісім для випали двох end;s та вісім для заміни `на` на ,.
Глен О

Насправді ми можемо зробити ще краще для розбору. Повністю перестаньте перейменувати парсент та скористайтеся s=map(parseint,x,[i,j,k]), заощадивши 18 байт відносно оригінального рішення та 10 порівняно з попереднім запропонованим вдосконаленням. А замість цього s==sort(unique(s))використовуйте all(diff(s).>0)для збереження ще 3 байти.
Glen O

Зрозуміло, що можна зробити, але я залишу це вам і спробую натомість придумати власний підхід.
Глен О

Незначне виправлення - я запропонував використовувати max (...), а не максимальний ... але, хоча він зберігає один байт, він не вдається для однозначних вхідних значень, тому вам доведеться використовувати максимум.
Глен О

4

CJam (39 байт)

{Afb:X,9,2f+m*{X\.b__$_&=*},{:+}$0\+W=}

Це анонімна функція, яка приймає вхід як масив десяткових цілих чисел на стеку і залишає вихід як масив або ціле число 0в стеку. Інтернет демо .


Крім того, це, здається, сортується за сумою отриманих цілих чисел замість бази, і це та сама проблема, яку мала моя попередня редакція ( 19не може бути базовим числом 9).
Денніс

1
Хм. Здається, питання потребує певного вдосконалення.
Пітер Тейлор

@PeterTaylor Pah, вибачення;)
бета-розпад

2

Python 2 (147 байт)

def x(s):
 q=int;c=10;o=q(s[-1])+1;l=[]
 for i in map(str,s)[::-1]:
    n=q(i,c)
    while o<=n:
        c-=1;n=q(i,c)
        if 3>c:return 0
    l=[c]+l;o=n
 return l

Викличте функцію xзі списком ints.

Приклад:

print x([12,11,10])

відбитки

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