Yükselme, sıralama, yükselme


19

Negatif olmayan bir tamsayı dizisi, örneğin:

12 11 10

Bekle! Bu dizi kesinlikle artmıyor, değil mi? Sayılar farklı bazlarda yazılır. Mümkün olan en az baz 2, en büyük taban 10'dur.

Görev, her sayının yazıldığı üsleri tahmin etmektir, böylece:

  • dizi kesinlikle artıyor,
  • bazların toplamı maksimize edilir.

Örneğin, numune için çözüm:

6 8 10

çünkü bu bazlar altında dizi 8 9 10ondalık hale gelir - kesinlikle artan bir dizi ve dizinin kesinlikle arttığı ve toplamı daha büyük olan bazları bulamıyoruz 6+8+10.

İkinci sınırlama nedeniyle bir çözüm 3 5 7tatmin edici değildir: dizinin 5 6 7bu bazların altına girmesine rağmen - baz toplamını en üst düzeye çıkarmamız gerekir ve 3+5+7 < 6+8+10.

Herhangi bir temel altında 2<=b<=10serinin kesinlikle artması mümkün değilse , örneğin:

102 10000 10

tek

0

çıktı alınmalıdır.

Giriş dizisi, çözümünüz için en uygun şekilde geçirilebilir (standart giriş / komut satırı parametreleri / işlev bağımsız değişkenleri ...).


1
1 3 5yükselen dizisi? Ne olmuş 1 7 22? (taban 10'da)
Kapı tokmağı

Evet, 1 3 5ve 1 7 22her ikisi de taban 10 altında yükseliyor. Yani, her iki durum için de çözüm 10 10 10, çünkü n. Sayı n'ye eşit olarak yazılır olarak yorumlandığında dizinin yükseldiğinden emin olurken bazların toplamını en üst düzeye çıkarmamız gerekiyor. çözüm süresi.
pawel.boczarski

2
@Dennis Evet, kesinlikle artan bir sekans demek. 1 1 1veya 3 3 4yükselmiyor.
pawel.boczarski

3
Yorumlar, sorunun yanlış yorumlamaya açık olduğunu gösteriyorsa, yalnızca yorumlarda yanıt vermeyin. Soruyu diğer insanların sizin için farklı yorumladığı cevapları yazmakla zaman kaybetmeyecek şekilde düzenleyin.
Peter Taylor

3
Ve belirsizlikler konusunda, cevabımdaki yorumlardan biri, sayıların verilen tabanda kanonik biçimde yazıldığını varsaymamız gerektiğini iddia ediyor. Bu durumda, lütfen " Mümkün olan en düşük taban 2 " ifadesini " Mümkün olan en düşük taban, en büyük basamak değerinden büyüktür " gibi bir ifadeyle düzeltin .
Peter Taylor

Yanıtlar:


13

Pyth, 31 30 29 bayt

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

@ Jakube sayesinde 1 bayt.

Gösteri. Test Donanımı.

Giriş STDIN'de, boşlukla ayrılmış olarak verilir. Satır başı ayrılmış girişe izin verilirse, programı 2 bayt kısaltabilirim.

Açıklama:

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.

1Olası bazlar listesine dahil etmek güvenlidir, çünkü iPython'un intyerleşimini kullanan , 1bir üs olarak izin vermez ve bu nedenle her zaman yakalanan ve filtrelenen bir hata atar.


9

CJam, 43 bayt

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

Komut satırı bağımsız değişkenlerini okur ve bir dizi yazdırır.

CJam yorumlayıcısında çevrimiçi deneyin .

Örnekler

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

Nasıl çalışır

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

Julia 176 156 145 118 109 99 97 bayt

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 dizi girişi ile kullanılır. İşlev atandıysa c, çağırırsınız c([12,11,10])ve çıktı verilir [6,8,10].

Not: dec(i)Ayrıştırma komutunun içinde kullandım , ancak itek karakterli bir değişken adı olduğundan ve bir bileşene erişmem gerekmediğinden "$i", aynı sonucu elde ettim .


Burada iyi numaralar var. İyi iş.
Alex A.

Bu kod, tabanları her zamanki soldan sağa okuma sırasına göre kesinlikle azalan sekans açısından kontrol ediyor gibi görünüyor.
pawel.boczarski

@ pawel.boczarski - Ne demek istediğinizden emin değilim, ancak isterseniz bazı girdiler için çıktılarına bazı örnekler verebilirim. Örneğin, işlev adı atarsanız c, o c([12,11,10])çıkışları [6,8,10]gerekli bazlar vardır.
Glen O

@GlenO Oh, anlıyorum. Bunun [12 11 10]yerine sıra vektörü kullandım [12,11,10]ve bu istenmeyen bir etki yarattı.
pawel.boczarski

@ pawel.boczarski - ah, anlıyorum. Evet, eğer satır vektörleriyle çalışmasını istiyorsanız, "flipud" u "fliplr" ile değiştirmeniz gerekir, bu durumda üslerin bir satır vektörünü döndürür.
Glen O

5

Julia 259 204 183 bayt

Glen O'nun yardımıyla bir grup kurtardı.

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 + açıklaması:

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

Tamam, bazı golf yapılacak ... harita komutunda "dize" yerine "repr" kullanın, bu bağlamda aynı çalışır ve iki bayt kaydeder. Ayrıştırma için bir "infix operatörü" kullanarak "\ = parseint" yazıp p (x [1], i) yerine x [1] \ i kullanarak bir kaç tane daha kaydedebiliriz - "\" ve ardından 8 baytlık net tasarruf için p'nin her kullanımı için üç tasarruf. "Maksimum (basamak (x)) ile max (basamak (x) ...)" değiştirilerek kaydedilen bir başka bayt
Glen O

Daha büyük bir tasarruf için, döngüler için birleştirin - kullanın for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, bırakılan iki end;s için sekiz ve `` ile '' değiştirmek için sekiz tasarruf edin ,.
Glen O

Aslında, parseint kısmı için daha iyisini yapabiliriz. Ayrıştırmayı yeniden adlandırmayı tamamen bırakın ve s=map(parseint,x,[i,j,k])daha önce önerdiğim iyileştirmeye kıyasla orijinal çözümünüze göre 18 bayt ve 10 bayt tasarruf edin. Ve yerine 3 bayt daha kaydetmek için s==sort(unique(s))kullanın all(diff(s).>0).
Glen O

Kesinlikle yapılabilecek daha çok şey var, ama bunu size bırakacağım ve onun yerine kendi yaklaşımımı bulmaya çalışacağım.
Glen O

Küçük düzeltme - Maksimum yerine maksimum (...) kullanmanızı öneririm ... ancak bir bayt kaydederken, tek basamaklı giriş değerleri için başarısız olur, bu nedenle maksimum kullanmanız gerekir.
Glen O

4

CJam (39 bayt)

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

Bu, girdiyi yığın üzerinde ondalık tamsayılar dizisi olarak alan ve çıktıyı yığın üzerinde bir dizi veya tamsayı olarak bırakan anonim bir işlevdir 0. Çevrimiçi demo .


Ayrıca, bu, bazlar yerine elde edilen tamsayıların toplamına göre sıralanıyor gibi görünüyor ve önceki revizyonumda da aynı sorun var ( 19bir taban 9 numarası olamaz).
Dennis

1
Hmm. Sorunun biraz iyileştirilmesi gerekiyor gibi görünüyor.
Peter Taylor

@PeterTaylor Pah, bahaneler;)
Beta

2

Python 2 (147 bayt)

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

İşlevi xgiriş listesiyle çağırın .

Misal:

print x([12,11,10])

baskılar

[6, 8, 10]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.