Подъем, последовательность, подъем


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
@ Денис Да, я имею в виду строго возрастающую последовательность. 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встроенную 1функцию Python , не допускает в качестве базы и поэтому всегда выдает ошибку, которая перехватывается и отфильтровывается.


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

Ungolfed:

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)])

Ungolfed + объяснение:

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, они будут работать одинаково в этом контексте и сохранят два байта. И мы можем сохранить еще несколько, используя инфиксный оператор для parseint, написав "\ = parseint" и затем используя x [1] \ i вместо p (x [1], i) - еще один байт в "\" часть, а затем сохранить три для каждого использования р для чистой экономии 8 байт. Сохраняется еще один байт, заменяя «максимум (цифры (x)) на максимум (цифры (x) ...)»
Глен О

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

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

Там, конечно , больше , что может быть сделано, но я оставлю его вам, и попытаться придумать мой собственный подход вместо этого.
Глен O

Незначительная коррекция - я предложил использовать максимум (...), а не максимум ... но, хотя он сохраняет один байт, он не подходит для однозначных входных значений, поэтому вы должны использовать максимум.
Глен O

4

CJam (39 байт)

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

Это анонимная функция, которая принимает входные данные в виде массива десятичных целых чисел в стеке и оставляет выходные данные в виде массива или целого числа 0в стеке. Демо онлайн .


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

1
Хм. Вопрос, похоже, нуждается в некотором улучшении.
Питер Тейлор

@PeterTaylor Pah, извините;)
Beta Decay

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со списком целых.

Пример:

print x([12,11,10])

печать

[6, 8, 10]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.