Bangun, urutan, naik

19

Kami memiliki deretan bilangan bulat non-negatif yang meningkat pesat, seperti:

12 11 10

Tunggu! Urutan ini tidak benar-benar meningkat, bukan? Nah, angkanya ditulis dalam basis yang berbeda. Basis yang paling tidak mungkin adalah 2, yang terbesar adalah 10.

Tugasnya adalah menebak basis masing-masing angka yang ditulis, sehingga:

  • urutannya semakin meningkat,
  • jumlah pangkalan dimaksimalkan.

Misalnya, solusi untuk sampel adalah:

6 8 10

karena di bawah pangkalan itu urutan menjadi 8 9 10desimal - urutan yang benar-benar meningkat, dan kami tidak mampu menemukan basis yang urutannya terus meningkat ketat dan yang jumlahnya lebih besar dari 6+8+10.

Karena keterbatasan kedua solusi 3 5 7tidak memuaskan: meskipun urutannya 5 6 7berada di bawah basis tersebut - kita perlu memaksimalkan jumlah basis, dan 3+5+7 < 6+8+10.

Jika tidak ada pangkalan 2<=b<=10adalah mungkin untuk seri meningkat secara ketat, misalnya:

102 10000 10

tunggal

0

harus menjadi output.

Urutan input dapat dilewati dengan cara yang paling nyaman untuk solusi Anda (input standar / parameter baris perintah / argumen fungsi ...).

pawel.boczarski
sumber
1
Apakah 1 3 5urutan meningkat? Bagaimana dengan 1 7 22? (di base 10)
Gagang Pintu
Ya, 1 3 5dan 1 7 22keduanya naik di bawah basis 10. Jadi, solusi untuk kedua kasus adalah 10 10 10, karena kita perlu memaksimalkan jumlah pangkalan sambil memastikan bahwa urutannya meningkat ketika angka ke-n ditafsirkan sebagai ditulis dalam basis sama dengan n istilah-solusi.
pawel.boczarski
2
@ Dennis Ya, maksud saya urutan meningkat secara ketat. 1 1 1atau 3 3 4tidak naik.
pawel.boczarski
3
Jika komentar menunjukkan bahwa pertanyaan itu terbuka untuk salah tafsir, jangan hanya membalas dalam komentar. Edit pertanyaan sehingga orang lain tidak membuang waktu untuk menulis jawaban yang menafsirkannya secara berbeda untuk Anda.
Peter Taylor
3
Dan mengenai masalah ambiguitas, salah satu komentar pada jawaban saya mengklaim bahwa kita harus berasumsi bahwa angka-angka ditulis dalam bentuk kanonik di dasar yang diberikan. Jika demikian, perbaiki frasa " Basis yang paling mungkin adalah 2 " menjadi sesuatu seperti " Basis yang paling mungkin adalah yang lebih besar dari nilai digit terbesar ".
Peter Taylor

Jawaban:

13

Pyth, 31 30 29 byte

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

1 byte berkat @Jakube.

Demonstrasi. Uji Harness.

Masukan diberikan pada STDIN, ruang dipisahkan. Jika input yang dipisahkan baris baru diizinkan, saya dapat mempersingkat program dengan 2 byte.

Penjelasan:

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.

Termasuk 1dalam daftar pangkalan yang mungkin aman karena i, yang menggunakan intbuilt - in Python , tidak memungkinkan 1sebagai pangkalan, dan karena itu selalu melempar kesalahan, yang ditangkap dan disaring.

isaacg
sumber
9

CJam, 43 byte

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

Membaca argumen baris perintah dan mencetak array.

Cobalah online di juru bahasa CJam .

Contohnya

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

Bagaimana itu bekerja

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
sumber
6

Julia, 176 156 145 118 109 99 97 byte

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

Tidak Disatukan:

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

Digunakan dengan input array 1d. Jika fungsi ditugaskan c, maka Anda akan memanggil c([12,11,10])dan itu akan keluar [6,8,10].

Catatan: Saya telah menggunakan dec(i)perintah parseint di dalam, tetapi karena iini adalah nama variabel karakter tunggal, dan saya tidak perlu mengakses komponen, saya biasa "$i"mendapatkan hasil yang sama.

Glen O
sumber
Anda punya beberapa trik bagus di sini. Kerja bagus.
Alex A.
Kode ini tampaknya memeriksa basis untuk urutan penurunan ketat di bawah urutan membaca kiri-ke-kanan yang biasa.
pawel.boczarski
@ pawel.boczarski - Saya tidak yakin apa yang Anda maksud, tetapi jika Anda mau, saya dapat memberikan beberapa contoh apa yang dihasilkan untuk input tertentu. Misalnya, jika Anda menetapkan fungsi nama c, maka c([12,11,10])output [6,8,10], yang merupakan pangkalan yang diperlukan.
Glen O
@ Gllen Oh, begitu. Saya menggunakan vektor baris dan [12 11 10]bukan [12,11,10]dan itu memberikan efek yang tidak diinginkan.
pawel.boczarski
@ pawel.boczarski - ah, begitu. Ya, jika Anda ingin itu bekerja dengan vektor baris, Anda harus mengganti "flipud" dengan "fliplr", dalam hal ini akan mengembalikan vektor baris dari basis.
Glen O
5

Julia, 259 204 183 byte

Menyimpan banyak dengan bantuan dari 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)])

Penjelasan + tidak dikumpulkan:

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.
sumber
OK, beberapa golf yang harus dilakukan ... gunakan "repr" bukan "string" pada perintah peta, mereka akan bekerja sama dalam konteks ini dan menyimpan dua byte. Dan kita dapat menyimpan lebih banyak dengan menggunakan operator infiks untuk parseint dengan menulis "\ = parseint" dan kemudian menggunakan x [1] \ i daripada p (x [1], i) - satu byte lagi di "\" bagian, dan kemudian menyimpan tiga untuk setiap penggunaan p untuk penghematan bersih 8 byte. Satu byte lagi disimpan dengan mengganti "maksimum (digit (x)) dengan maks (digit (x) ...)"
Glen O
Untuk penghematan yang lebih besar, gabungkan loop untuk - gunakan for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, simpan delapan untuk dua jatuh end;dan delapan untuk mengganti `untuk` dengan ,.
Glen O
Sebenarnya, kita bisa melakukan yang lebih baik untuk bagian parseint. Jatuhkan pengubahan nama parseint sepenuhnya, dan gunakan s=map(parseint,x,[i,j,k]), hemat 18 byte relatif terhadap solusi asli Anda dan 10 dibandingkan dengan peningkatan yang disarankan sebelumnya. Dan alih-alih s==sort(unique(s)), gunakan all(diff(s).>0)untuk menyimpan 3 byte lagi.
Glen O
Tentu saja ada lebih banyak yang bisa dilakukan, tetapi saya akan menyerahkannya kepada Anda, dan mencoba memunculkan pendekatan saya sendiri.
Glen O
Koreksi kecil - Saya menyarankan menggunakan maks (...) daripada maksimum ... tetapi sementara itu menyimpan satu byte, gagal untuk nilai input satu digit, jadi Anda harus menggunakan maksimum.
Glen O
4

CJam (39 byte)

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

Ini adalah fungsi anonim yang mengambil input sebagai array bilangan bulat desimal pada stack dan meninggalkan output sebagai array atau integer 0pada stack. Demo online .

Peter Taylor
sumber
Juga, ini tampaknya untuk mengurutkan berdasarkan jumlah bilangan bulat yang dihasilkan, bukan basis dan memiliki masalah yang sama dengan revisi saya sebelumnya ( 19tidak bisa menjadi nomor basis 9).
Dennis
1
Hmm. Pertanyaannya sepertinya perlu beberapa perbaikan.
Peter Taylor
@PeterTaylor Pah, alasan;)
Beta Decay
2

Python 2 (147 byte)

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

Panggil fungsi xdengan daftar int.

Contoh:

print x([12,11,10])

cetakan

[6, 8, 10]
Biru
sumber