Tăng, trình tự, tăng


19

Chúng tôi có một chuỗi số nguyên không âm tăng dần, như:

12 11 10

Chờ đợi! Trình tự này không tăng nghiêm ngặt, phải không? Vâng, những con số được viết trong các cơ sở khác nhau. Cơ sở ít nhất có thể là 2, lớn nhất là 10.

Nhiệm vụ là đoán căn cứ từng số được viết, sao cho:

  • trình tự đang tăng nghiêm ngặt,
  • tổng của các cơ sở được tối đa hóa.

Chẳng hạn, giải pháp cho mẫu sẽ là:

6 8 10

bởi vì theo các cơ sở đó, chuỗi trở thành 8 9 10số thập phân - một chuỗi tăng nghiêm ngặt và chúng tôi không có khả năng tìm các cơ sở mà chuỗi vẫn tăng nghiêm ngặt và tổng của nó lớn hơn 6+8+10.

Do giới hạn thứ hai, một giải pháp 3 5 7không thỏa đáng: mặc dù thực tế là chuỗi trở thành 5 6 7dưới các cơ sở đó - chúng ta cần tối đa hóa tổng cơ sở, và 3+5+7 < 6+8+10.

Nếu không có căn cứ, 2<=b<=10thì loạt phim có thể tăng nghiêm ngặt, chẳng hạn:

102 10000 10

Độc thân

0

nên là đầu ra.

Trình tự đầu vào có thể được truyền theo cách thuận tiện nhất cho giải pháp của bạn (tham số tiêu chuẩn / tham số dòng lệnh / đối số chức năng ...).


1
1 3 5một chuỗi tăng? Thế còn 1 7 22? (ở cơ sở 10)
Doorknob

Có, 1 3 51 7 22cả hai đều tăng theo cơ sở 10. Vì vậy, giải pháp cho cả hai trường hợp là 10 10 10bởi vì chúng ta cần tối đa hóa tổng số cơ sở trong khi đảm bảo rằng chuỗi tăng khi số thứ n được hiểu là được viết trong cơ sở bằng n -thứ hạn của giải pháp.
pawel.boczarski

2
@Dennis Vâng, ý tôi là nghiêm túc tăng trình tự. 1 1 1hoặc 3 3 4không tăng.
pawel.boczarski

3
Nếu các bình luận chỉ ra rằng câu hỏi mở để giải thích sai, đừng chỉ trả lời trong các bình luận. Chỉnh sửa câu hỏi để người khác không lãng phí thời gian viết câu trả lời khác với bạn.
Peter Taylor

3
Và về vấn đề mơ hồ, một trong những ý kiến ​​về câu trả lời của tôi cho rằng chúng ta nên cho rằng các con số được viết dưới dạng chính tắc trong cơ sở đã cho. Nếu đúng như vậy, vui lòng sửa cụm từ " Cơ sở ít nhất có thể là 2 " thành một cái gì đó như " Cơ sở ít nhất có thể là một cơ sở lớn hơn giá trị chữ số lớn nhất ".
Peter Taylor

Câu trả lời:


13

Pyth, 31 30 29 byte

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

1 byte nhờ @Jakube.

Trình diễn. Khai thác thử nghiệm.

Đầu vào được đưa ra trên STDIN, không gian được phân tách. Nếu đầu vào phân tách dòng mới được cho phép, tôi có thể rút ngắn chương trình thêm 2 byte.

Giải trình:

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.

Bao gồm 1trong danh sách các cơ sở có thể là an toàn bởi vì i, sử dụng intnội dung dựng sẵn của Python , không cho phép 1làm cơ sở và do đó luôn đưa ra một lỗi, được phát hiện và lọc ra.


9

CJam, 43 byte

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

Đọc các đối số dòng lệnh và in một mảng.

Hãy thử trực tuyến trong trình thông dịch CJam .

Ví dụ

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

Làm thế nào nó hoạt động

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

Ung dung:

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

Được sử dụng với đầu vào mảng 1d. Nếu chức năng được gán cho c, thì bạn sẽ gọi c([12,11,10])và nó sẽ xuất ra [6,8,10].

Lưu ý: Tôi đã sử dụng dec(i) bên trong lệnh parseint, nhưng vì ilà tên biến một ký tự và tôi không cần truy cập vào một thành phần, tôi đã sử dụng "$i"để có kết quả tương tự.


Bạn đã có một số thủ thuật tốt ở đây. Công việc tốt đẹp.
Alex A.

Mã này dường như kiểm tra các cơ sở cho trình tự giảm nghiêm ngặt theo thứ tự đọc từ trái sang phải thông thường.
pawel.boczarski

@ pawel.boczarski - Tôi không chắc ý của bạn là gì, nhưng nếu bạn thích, tôi có thể cung cấp một số ví dụ về những gì nó xuất ra cho một số đầu vào nhất định. Chẳng hạn, nếu bạn gán hàm cho tên c, thì c([12,11,10])đầu ra [6,8,10]là các cơ sở bắt buộc.
Glen O

@GlenO ơi, tôi hiểu rồi. Tôi đã sử dụng vector hàng [12 11 10]thay vì [12,11,10]và điều đó mang lại hiệu quả không mong muốn.
pawel.boczarski

@ pawel.boczarski - à, tôi hiểu rồi. Vâng, nếu bạn muốn nó hoạt động với các vectơ hàng, bạn cần thay thế "flipud" bằng "fliplr", trong trường hợp đó, nó sẽ trả về một vectơ hàng của các cơ sở.
Glen O

5

Julia, 259 204 183 byte

Lưu một bó với sự giúp đỡ từ 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 + giải thích:

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

OK, một số golf phải được thực hiện ... sử dụng "repr" thay vì "chuỗi" trong lệnh bản đồ, chúng sẽ hoạt động giống nhau trong ngữ cảnh này và lưu hai byte. Và chúng ta có thể tiết kiệm thêm một chút bằng cách sử dụng toán tử infix cho parseint bằng cách viết "\ = parseint" và sau đó sử dụng x [1] \ i thay vì p (x [1], i) - thêm một byte trong "\" một phần, và sau đó lưu ba cho mỗi lần sử dụng p để tiết kiệm ròng 8 byte. Một byte khác được lưu bằng cách thay thế "tối đa (chữ số (x)) bằng tối đa (chữ số (x) ...)"
Glen O

Để tiết kiệm lớn hơn, hãy hợp nhất các vòng lặp for - sử dụng for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;, tiết kiệm tám cho hai end;giây và tám để thay thế `cho` bằng ,.
Glen O

Trên thực tế, chúng ta có thể làm tốt hơn nữa cho phần parseint. Bỏ hoàn toàn việc đổi tên phân tích cú pháp và sử dụng s=map(parseint,x,[i,j,k]), tiết kiệm 18 byte so với giải pháp ban đầu của bạn và 10 so với cải tiến được đề xuất trước đây của tôi. Và thay vì s==sort(unique(s)), sử dụng all(diff(s).>0)để lưu thêm 3 byte.
Glen O

Chắc chắn có nhiều việc có thể làm, nhưng tôi sẽ để lại cho bạn và thay vào đó hãy cố gắng đưa ra phương pháp của riêng tôi.
Glen O

Hiệu chỉnh nhỏ - Tôi đã đề xuất sử dụng max (...) thay vì tối đa ... nhưng trong khi nó lưu một byte, nó không thành công cho các giá trị đầu vào một chữ số, do đó bạn phải sử dụng tối đa.
Glen O

4

CJam (39 byte)

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

Đây là một hàm ẩn danh lấy đầu vào là một mảng các số nguyên thập phân trên ngăn xếp và để lại đầu ra dưới dạng một mảng hoặc số nguyên 0trên ngăn xếp. Bản demo trực tuyến .


Ngoài ra, điều này dường như sắp xếp theo tổng của các số nguyên kết quả thay vì các cơ sở và nó có cùng một vấn đề mà bản sửa đổi trước đây của tôi có ( 19không thể là số 9 cơ sở).
Dennis

1
Hừm. Câu hỏi dường như cần một số cải tiến.
Peter Taylor

@PeterTaylor Pah, xin lỗi;)
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

Gọi hàm x với một danh sách các số nguyên.

Thí dụ:

print x([12,11,10])

in

[6, 8, 10]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.