Levántate, secuencia, levántate

19

Tenemos una secuencia estrictamente creciente de enteros no negativos, como:

12 11 10

¡Espere! Esta secuencia no está aumentando estrictamente, ¿verdad? Bueno, los números están escritos en diferentes bases. La base menos posible es 2, la más grande es 10.

La tarea es adivinar las bases de cada número escrito, de modo que:

  • la secuencia está aumentando estrictamente,
  • La suma de las bases se maximiza.

Por ejemplo, la solución para la muestra será:

6 8 10

porque bajo esas bases la secuencia se vuelve 8 9 10decimal, una secuencia estrictamente creciente, y no somos capaces de encontrar bases para las cuales la secuencia sigue siendo estrictamente creciente y cuya suma es mayor que 6+8+10.

Debido a la segunda limitación, una solución 3 5 7no es satisfactoria: a pesar de que la secuencia se encuentra 5 6 7bajo esas bases, necesitamos maximizar la suma de las bases, y 3+5+7 < 6+8+10.

Si bajo ninguna base 2<=b<=10es posible que la serie aumente estrictamente, por ejemplo:

102 10000 10

soltero

0

debe ser de salida.

La secuencia de entrada se puede pasar de la manera que sea más conveniente para su solución (entrada estándar / parámetros de línea de comando / argumentos de función ...).

pawel.boczarski
fuente
1
¿Es 1 3 5una secuencia ascendente? ¿Qué hay de 1 7 22? (en base 10)
Pomo de la puerta
Sí, 1 3 5y 1 7 22ambos están subiendo por debajo de la base 10. Entonces, la solución para ambos casos es 10 10 10, porque necesitamos maximizar la suma de las bases mientras aseguramos que la secuencia aumenta cuando el enésimo número se interpreta como escrito en una base igual a n -th plazo de solución.
pawel.boczarski
2
@ Dennis Sí, me refiero a una secuencia estrictamente creciente. 1 1 1o 3 3 4no están subiendo
pawel.boczarski
3
Si los comentarios indican que la pregunta está abierta a malas interpretaciones, no solo responda en los comentarios. Edite la pregunta para que otras personas no pierdan el tiempo escribiendo respuestas que la interpreten de manera diferente para usted.
Peter Taylor
3
Y sobre el tema de las ambigüedades, uno de los comentarios en mi respuesta afirma que debemos suponer que los números están escritos en forma canónica en la base dada. Si es así, corrija la frase " La base mínima posible es 2 " a algo así como " La base mínima posible es una mayor que el valor de dígito más grande ".
Peter Taylor

Respuestas:

13

Pyth, 31 30 29 bytes

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

1 byte gracias a @Jakube.

Demostración. Arnés de prueba.

La entrada se da en STDIN, espacio separado. Si se permite la entrada separada de nueva línea, puedo acortar el programa en 2 bytes.

Explicación:

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.

Incluirlo 1en la lista de posibles bases es seguro porque i, que utiliza el intincorporado de Python , no permite 1como base y, por lo tanto, siempre arroja un error, que se detecta y se filtra.

isaacg
fuente
9

CJam, 43 bytes

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

Lee argumentos de la línea de comandos e imprime una matriz.

Pruébelo en línea en el intérprete de CJam .

Ejemplos

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

Cómo funciona

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).
Dennis
fuente
6

Julia, 176 156 145 118 109 99 97 bytes

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

Sin golf:

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

Se usa con una entrada de matriz 1d. Si se asigna la función a c, entonces llamaría c([12,11,10])y saldría [6,8,10].

Nota: Lo había usado dec(i)dentro del comando parseint, pero como ies un nombre de variable de un solo carácter y no necesito acceder a un componente, solía "$i"obtener el mismo resultado.

Glen O
fuente
Tienes algunos buenos trucos aquí. Buen trabajo.
Alex A.
Este código parece verificar las bases para una secuencia estrictamente decreciente bajo el orden habitual de lectura de izquierda a derecha.
pawel.boczarski
@ pawel.boczarski: no estoy seguro de lo que quiere decir, pero si lo desea, puedo proporcionar algunos ejemplos de lo que genera para ciertas entradas. Por ejemplo, si asigna a la función el nombre c, las c([12,11,10])salidas [6,8,10], que son las bases requeridas.
Glen O
@GlenO Oh, ya veo. Usé el vector de fila en [12 11 10]lugar de [12,11,10]y eso dio el efecto no deseado.
pawel.boczarski
@ pawel.boczarski - ah, ya veo. Sí, si desea que funcione con vectores de fila, deberá reemplazar "flipud" con "fliplr", en cuyo caso devolverá un vector de fila de las bases.
Glen O
5

Julia, 259 204 183 bytes

Salvé un montón con la ayuda de Glen O.

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 + explicación:

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
Alex A.
fuente
OK, hay que jugar al golf ... use "repr" en lugar de "string" en el comando map, funcionarán igual en este contexto y guardarán dos bytes. Y podemos ahorrar algunos más usando un operador infijo para parseint escribiendo "\ = parseint" y luego usando x [1] \ i en lugar de p (x [1], i) - un byte más en "\" parte, y luego guardar tres para cada uso de p para un ahorro neto de 8 bytes. Otro byte guardado al reemplazar "máximo (dígitos (x)) con máximo (dígitos (x) ...)"
Glen O
Para un ahorro mayor, combine los bucles for - use for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, ahorrando ocho para los dos end;s eliminados y ocho para reemplazar `for` con ,.
Glen O
En realidad, podemos hacerlo aún mejor para la parte parseint. Elimine el cambio de nombre de parseint por completo y úselo s=map(parseint,x,[i,j,k]), ahorrando 18 bytes en relación con su solución original y 10 en comparación con mi mejora sugerida anterior. Y en lugar de s==sort(unique(s)), use all(diff(s).>0)para guardar otros 3 bytes.
Glen O
Ciertamente, se puede hacer más, pero se lo dejaré a usted y trataré de desarrollar mi propio enfoque.
Glen O
Corrección menor: sugerí usar max (...) en lugar de máximo ... pero aunque ahorra un byte, falla para los valores de entrada de un solo dígito, por lo que debe usar el máximo.
Glen O
4

CJam (39 bytes)

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

Esta es una función anónima que toma la entrada como una matriz de enteros decimales en la pila y deja la salida como una matriz o el entero 0en la pila. Demo en línea .

Peter Taylor
fuente
Además, esto parece ordenar por la suma de los enteros resultantes en lugar de las bases y tiene el mismo problema que tenía mi revisión anterior ( 19no puede ser un número base 9).
Dennis
1
Hmm La pregunta parece necesitar alguna mejora.
Peter Taylor
@PeterTaylor Pah, excusas;)
Beta Decay
2

Python 2 (147 bytes)

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

Llame a la función xcon una lista de las entradas.

Ejemplo:

print x([12,11,10])

huellas dactilares

[6, 8, 10]
Azul
fuente