Powstanie, sekwencja, powstanie

19

Mamy ściśle rosnącą sekwencję liczb całkowitych nieujemnych, takich jak:

12 11 10

Czekać! Ta sekwencja nie rośnie ściśle, prawda? Cóż, liczby są zapisane w różnych podstawach. Najmniejsza możliwa baza to 2, największa to 10.

Zadanie polega na odgadnięciu, na jakiej podstawie zapisywana jest każda liczba, aby:

  • sekwencja jest ściśle rosnąca,
  • suma zasad jest zmaksymalizowana.

Na przykład rozwiązaniem dla próbki będzie:

6 8 10

ponieważ pod tymi zasadami sekwencja staje się 8 9 10dziesiętna - ściśle rosnąca sekwencja, a my nie jesteśmy w stanie znaleźć zasad, dla których sekwencja ciągle rośnie i których suma jest większa niż 6+8+10.

Ze względu na drugie ograniczenie rozwiązanie 3 5 7nie jest zadowalające: pomimo faktu, że sekwencja staje się 5 6 7pod tymi zasadami - musimy zmaksymalizować sumę zasad, i 3+5+7 < 6+8+10.

Jeśli pod żadnymi zasadami 2<=b<=10nie można ściśle zwiększyć serii, na przykład:

102 10000 10

pojedynczy

0

powinno być wyjście.

Sekwencję wejściową można przekazać w sposób najbardziej dogodny dla rozwiązania (standardowe parametry wejściowe / parametry wiersza poleceń / argumenty funkcji ...).

pawel.boczarski
źródło
1
Czy 1 3 5sekwencja rośnie? Co 1 7 22? (w bazie 10)
Klamka
Tak, 1 3 5i 1 7 22oba rosną zgodnie z zasadą 10. Tak więc rozwiązaniem dla obu przypadków jest 10 10 10, ponieważ musimy zmaksymalizować sumę zasad, zapewniając jednocześnie, że sekwencja rośnie, gdy n-ta liczba jest interpretowana jako zapisana w bazie równej n -th termin rozwiązania.
pawel.boczarski
2
@Dennis Tak, mam na myśli ściśle rosnącą sekwencję. 1 1 1lub 3 3 4nie powstają.
pawel.boczarski
3
Jeśli komentarze wskazują, że pytanie jest podatne na błędną interpretację, nie odpowiadaj tylko w komentarzach. Edytuj pytanie, aby inni ludzie nie marnowali czasu na pisanie odpowiedzi, które interpretują je inaczej.
Peter Taylor,
3
I na temat dwuznaczności, jeden z komentarzy do mojej odpowiedzi twierdzi, że powinniśmy założyć, że liczby są zapisane w kanonicznej formie w danej bazie. Jeśli tak jest, popraw frazę „ Najmniejsza możliwa podstawa to 2 ” na coś w stylu „ Najmniejsza możliwa podstawa to jedna większa niż największa cyfra ”.
Peter Taylor,

Odpowiedzi:

13

Pyth, 31 30 29 bajtów

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

1 bajt dzięki @Jakube.

Demonstracja. Uprząż testowa.

Dane wejściowe są podawane na STDIN, oddzielone spacją. Jeśli dozwolone jest wprowadzanie separatora nowego wiersza, mogę skrócić program o 2 bajty.

Wyjaśnienie:

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.

Umieszczenie 1na liście możliwych zasad jest bezpieczne, ponieważ ikorzystające z intwbudowanego Pythona nie zezwala 1jako baza i dlatego zawsze zgłasza błąd, który jest wychwytywany i filtrowany.

isaacg
źródło
9

CJam, 43 bajty

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

Odczytuje argumenty wiersza poleceń i wypisuje tablicę.

Wypróbuj online w interpretatorze CJam .

Przykłady

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

Jak to działa

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
źródło
6

Julia, 176 156 145 118 109 99 97 bajtów

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

Nie golfowany:

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

Używany z wejściem tablicy 1d. Jeśli funkcja jest przypisana c, to wywołałbyś c([12,11,10])ją i wyszedł [6,8,10].

Uwaga: Użyłem dec(i)w poleceniu parsowania, ale ponieważ ijest to nazwa zmiennej jednoznakowej i nie muszę uzyskiwać dostępu do komponentu, "$i"uzyskiwałem ten sam wynik.

Glen O
źródło
Masz tutaj kilka dobrych sztuczek. Dobra robota.
Alex A.,
Ten kod wydaje się sprawdzać zasady pod kątem ściśle malejącej sekwencji w zwykłej kolejności czytania od lewej do prawej.
pawel.boczarski
@ pawel.boczarski - Nie jestem pewien, co masz na myśli, ale jeśli chcesz, mogę podać przykłady tego, co wyprowadza dla niektórych danych wejściowych. Na przykład, jeśli przypiszesz tej funkcji nazwę c, wówczas c([12,11,10])wyjścia [6,8,10], które są wymaganymi podstawami.
Glen O
@GlenO Oh, rozumiem. Użyłem wektora wiersza [12 11 10]zamiast [12,11,10]i to dało niepożądany efekt.
pawel.boczarski
@ pawel.boczarski - ah, rozumiem. Tak, jeśli chcesz, aby działał z wektorami wierszy, musisz zastąpić „flipud” przez „fliplr”, w którym to przypadku zwróci wektor wiersza baz.
Glen O
5

Julia, 259 204 183 bajtów

Uratowałem sporo z pomocą 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)])

Niegolfowane + wyjaśnienie:

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.
źródło
OK, trochę golfa do zrobienia ... użyj polecenia „repr” zamiast „string” w poleceniu map, będą one działać tak samo w tym kontekście i zaoszczędzą dwa bajty. I możemy zaoszczędzić jeszcze kilka, używając operatora poprawki dla parsowania pisząc „\ = parsowanie”, a następnie używając x [1] \ i zamiast p (x [1], i) - jeszcze jeden bajt w „\” część, a następnie zapisując trzy dla każdego użycia p dla oszczędności netto 8 bajtów. Kolejny bajt zapisany przez zamianę „maksimum (cyfry (x)) na maksimum (cyfry (x) ...)”
Glen O
Aby uzyskać większe oszczędności, scal pętle for - użyj for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, oszczędzając osiem dla upuszczonych dwóch end;si osiem, aby zastąpić `for` z ,.
Glen O
W rzeczywistości możemy zrobić jeszcze lepiej dla części parsowania. Porzuć całkowicie zmianę nazwy parsowania i użyj s=map(parseint,x,[i,j,k]), oszczędzając 18 bajtów w stosunku do twojego oryginalnego rozwiązania i 10 w porównaniu z moją poprzednią sugerowaną poprawą. Zamiast s==sort(unique(s))używać, all(diff(s).>0)aby zapisać kolejne 3 bajty.
Glen O
Z pewnością można zrobić więcej, ale zostawię to tobie i spróbuję wymyślić własne podejście.
Glen O
Drobna korekta - zasugerowałem użycie maksimum (...) zamiast maksimum ... ale chociaż oszczędza jeden bajt, nie udaje się przy jednocyfrowych wartościach wejściowych, więc musisz użyć maksimum.
Glen O
4

CJam (39 bajtów)

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

Jest to anonimowa funkcja, która przyjmuje dane wejściowe jako tablicę liczb dziesiętnych na stosie i pozostawia dane wyjściowe jako tablicę lub liczbę całkowitą 0na stosie. Demo online .

Peter Taylor
źródło
Ponadto wydaje się, że sortuje się według sumy wynikowych liczb całkowitych zamiast zasad i ma ten sam problem, co moja poprzednia wersja ( 19nie może być liczbą podstawową 9).
Dennis
1
Hmm Pytanie wydaje się wymagać poprawy.
Peter Taylor,
@PeterTaylor Pah, wymówki;)
Beta Decay
2

Python 2 (147 bajtów)

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

Wywołaj funkcję xz listą liczb int.

Przykład:

print x([12,11,10])

odbitki

[6, 8, 10]
niebieski
źródło