Monter, enchaîner, monter

19

Nous avons une séquence strictement croissante d'entiers non négatifs, comme:

12 11 10

Attendez! Cette séquence n'est pas strictement croissante, n'est-ce pas? Eh bien, les nombres sont écrits dans différentes bases. La base la moins possible est 2, la plus grande est 10.

La tâche consiste à deviner les bases de chaque nombre est écrit, de sorte que:

  • la séquence est strictement croissante,
  • la somme des bases est maximisée.

Par exemple, la solution pour l'échantillon sera:

6 8 10

car sous ces bases la séquence devient 8 9 10décimale - une séquence strictement croissante, et nous ne sommes pas capables de trouver des bases pour lesquelles la séquence reste strictement croissante et dont la somme est supérieure à 6+8+10.

En raison de la deuxième limitation, une solution 3 5 7n'est pas satisfaisante: malgré le fait que la séquence devienne 5 6 7sous ces bases - nous devons maximiser la somme des bases, et 3+5+7 < 6+8+10.

Si sous aucune base 2<=b<=10il est possible que la série augmente strictement, par exemple:

102 10000 10

Célibataire

0

devrait être sortie.

La séquence d'entrée peut être passée de la manière la plus pratique pour votre solution (entrée standard / paramètres de ligne de commande / arguments de fonction ...).

pawel.boczarski
la source
1
Est-ce 1 3 5une séquence montante? Et alors 1 7 22? (en base 10)
Poignée de porte
Oui, 1 3 5et 1 7 22montent tous les deux sous la base 10. Donc, la solution pour les deux cas est 10 10 10, parce que nous devons maximiser la somme des bases tout en garantissant que la séquence augmente quand le nième nombre est interprété comme étant écrit en base égale à n -ème terme de solution.
pawel.boczarski
2
@ Dennis Oui, je veux dire une séquence strictement croissante. 1 1 1ou 3 3 4ne montent pas.
pawel.boczarski
3
Si les commentaires indiquent que la question est susceptible d'interprétation erronée, ne répondez pas simplement dans les commentaires. Modifiez la question afin que d'autres personnes ne perdent pas de temps à écrire des réponses qui l'interprètent différemment pour vous.
Peter Taylor
3
Et au sujet des ambiguïtés, un des commentaires sur ma réponse prétend que nous devons supposer que les nombres sont écrits sous forme canonique dans la base donnée. Si tel est le cas, veuillez corriger l'expression " La base la moins possible est 2 " à quelque chose comme " La base la moins possible est supérieure de un au plus grand chiffre ".
Peter Taylor

Réponses:

13

Pyth, 31 30 29 octets

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

1 octet grâce à @Jakube.

Manifestation. Harnais de test.

L'entrée est donnée sur STDIN, séparés par des espaces. Si l'entrée séparée par la nouvelle ligne est autorisée, je peux raccourcir le programme de 2 octets.

Explication:

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.

L'inclusion 1dans la liste des bases possibles est sûre car i, qui utilise le intmodule intégré de Python , ne permet pas 1comme base, et donc génère toujours une erreur, qui est interceptée et filtrée.

isaacg
la source
9

CJam, 43 octets

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

Lit les arguments de ligne de commande et imprime un tableau.

Essayez-le en ligne dans l' interpréteur CJam .

Exemples

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

Comment ça fonctionne

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
la source
6

Julia, 176 156 145 118 109 99 97 octets

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

Non 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

Utilisé avec une entrée de tableau 1d. Si la fonction est affectée à c, alors vous appelleriez c([12,11,10])et elle sortirait [6,8,10].

Remarque: J'avais utilisé dec(i)à l'intérieur de la commande parseint, mais comme il is'agit d'un nom de variable à un seul caractère et que je n'ai pas besoin d'accéder à un composant, j'ai utilisé "$i"pour obtenir le même résultat.

Glen O
la source
Vous avez de bonnes astuces ici. Bon travail.
Alex A.
Ce code semble vérifier les bases pour une séquence strictement décroissante dans l'ordre habituel de lecture de gauche à droite.
pawel.boczarski
@ pawel.boczarski - Je ne sais pas ce que vous voulez dire, mais si vous le souhaitez, je peux fournir quelques exemples de ce qu'il produit pour certaines entrées. Par exemple, si vous attribuez le nom à la fonction c, puis les c([12,11,10])sorties [6,8,10], qui sont les bases requises.
Glen O
@GlenO Oh, je vois. J'ai utilisé le vecteur ligne [12 11 10]au lieu de [12,11,10]et cela a donné l'effet indésirable.
pawel.boczarski
@ pawel.boczarski - ah, je vois. Oui, si vous voulez qu'il fonctionne avec des vecteurs de ligne, vous devez remplacer "flipud" par "fliplr", auquel cas il retournera un vecteur de ligne des bases.
Glen O
5

Julia, 259 204 183 octets

Enregistré un tas avec l'aide 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)])

Non golfé + explication:

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.
la source
OK, un peu de golf à faire ... utilisez "repr" au lieu de "string" dans la commande map, ils fonctionneront de la même manière dans ce contexte et économiseront deux octets. Et nous pouvons en économiser un peu plus en utilisant un opérateur infix pour parseint en écrivant "\ = parseint" puis en utilisant x [1] \ i plutôt que p (x [1], i) - un octet de plus dans le "\" partie, puis enregistrer trois pour chaque utilisation de p pour une économie nette de 8 octets. Un autre octet sauvé en remplaçant "maximum (chiffres (x)) par max (chiffres (x) ...)"
Glen O
Pour une plus grande économie, fusionnez les boucles for - utilisez for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, en économisant huit pour les deux end;s perdus et huit pour remplacer `for` par ,.
Glen O
En fait, nous pouvons faire encore mieux pour la partie analyse. Supprimez entièrement le changement de nom de parseint et utilisez s=map(parseint,x,[i,j,k]), en économisant 18 octets par rapport à votre solution d'origine et 10 par rapport à mon amélioration suggérée précédente. Et plutôt que s==sort(unique(s)), utilisez all(diff(s).>0)pour enregistrer 3 autres octets.
Glen O
Il y a certainement plus à faire, mais je vous laisse le soin de tenter ma propre approche.
Glen O
Correction mineure - J'ai suggéré d'utiliser max (...) plutôt que maximum ... mais bien qu'il enregistre un octet, il échoue pour les valeurs d'entrée à un chiffre, vous devez donc utiliser le maximum.
Glen O
4

CJam (39 octets)

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

Il s'agit d'une fonction anonyme qui prend l'entrée sous forme de tableau d'entiers décimaux sur la pile et laisse la sortie sous forme de tableau ou d'entier 0sur la pile. Démo en ligne .

Peter Taylor
la source
De plus, cela semble trier par la somme des entiers résultants au lieu des bases et cela a le même problème que ma révision précédente avait ( 19ne peut pas être un nombre de base 9).
Dennis
1
Hmm. La question semble devoir être améliorée.
Peter Taylor
@PeterTaylor Pah, excuses;)
Beta Decay
2

Python 2 (147 octets)

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

Appelez la fonction xavec une liste des entrées.

Exemple:

print x([12,11,10])

impressions

[6, 8, 10]
Bleu
la source