상승, 순서, 상승


19

음수가 아닌 정수는 다음과 같이 엄격하게 증가합니다.

12 11 10

기다림! 이 순서는 엄격하게 증가하지 않습니다. 그렇지 않습니까? 글쎄, 숫자는 다른 기초로 작성됩니다. 가장 낮은 기본은 2이고 가장 큰 기본은 10입니다.

과제는 각 숫자가 쓰여진 염기를 추측하는 것입니다.

  • 순서는 엄격히 증가하고 있습니다.
  • 염기의 합이 최대화됩니다.

예를 들어, 샘플 솔루션은 다음과 같습니다.

6 8 10

이 밑에서 시퀀스는 8 9 10십진수 가되므로 엄격하게 증가하는 시퀀스이므로 시퀀스가 ​​계속 증가하고 합계가보다 큰베이스를 찾을 수 없습니다 6+8+10.

두 번째 한계로 인해 솔루션 3 5 7이 만족스럽지 않습니다. 시퀀스가 5 6 7해당 염기에 속하지만 염기 합을 최대화해야합니다 3+5+7 < 6+8+10.

밑이 없으면 2<=b<=10시리즈가 엄격하게 증가 할 수 있습니다.

102 10000 10

단일

0

출력되어야합니다.

입력 순서는 솔루션에 가장 편리한 방식으로 전달 될 수 있습니다 (표준 입력 / 명령 줄 매개 변수 / 함수 인수 ...).


1
1 3 5상승 순서는? 무엇에 대해 1 7 22? (기본 10)
손잡이

예, 1 3 51 7 22두 10. 따라서, 두 경우에 대한 해결책은베이스 하에서되어 상승 10 10 10n의 수를베이스로 작성된 것으로 해석되면 순서가 상승되는 것을 보장하면서 N 동일 우리 염기의 합을 최대화하기 위해 필요하기 때문에, 솔루션 기간.
pawel.boczarski

2
@Dennis 예, 엄격하게 증가하는 시퀀스를 의미합니다. 1 1 1또는 3 3 4상승하지 않습니다.
pawel.boczarski

3
의견이 해당 질문이 오해의 여지가 있음을 나타내면 의견에 답하지 마십시오. 다른 사람들이 귀하와 다르게 해석하는 답변을 작성하는 데 시간을 낭비하지 않도록 질문을 편집하십시오.
피터 테일러

3
그리고 모호한 주제에 대해, 내 대답에 대한 의견 중 하나는 주어진 기준에 따라 숫자가 표준 형식으로 작성되었다고 가정해야한다고 주장합니다. 이 경우 " 최소 가능한 기본은 2 " 라는 문구를 " 최소 가능한 기본은 가장 큰 숫자 값보다 큰 것 "과 같은 것으로 수정하십시오 .
피터 테일러

답변:


13

Pyth, 31 30 29 바이트

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

@Jakube 덕분에 1 바이트.

데모. 테스트 하네스.

STDIN에 입력이 주어지며 공백으로 구분됩니다. 줄 바꿈으로 구분 된 입력이 허용되면 프로그램을 2 바이트 줄일 수 있습니다.

설명:

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.

1가능한 기본 목록을 포함시키는 것은 i파이썬의 int내장 을 사용 1하는을 기본으로 허용하지 않으므로 항상 오류가 발생하여 잡히고 걸러지기 때문에 안전합니다.


9

CJam, 43 바이트

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

명령 행 인수를 읽고 배열을 인쇄합니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .

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

작동 원리

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

줄리아 176 156 145 118 109 99 97 바이트

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

언 골프 드 :

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 배열 입력과 함께 사용합니다. 함수가에 할당 c되면 호출 c([12,11,10])하여 출력 [6,8,10]합니다.

참고 : dec(i)parseint 명령 내에서 사용 했지만 i단일 문자 변수 이름이므로 구성 요소에 액세스 할 필요가 없으므로 "$i"동일한 결과를 얻었습니다.


여기에 몇 가지 좋은 트릭이 있습니다. 잘 했어.
Alex A.

이 코드는 일반적으로 왼쪽에서 오른쪽 순서로 읽는 순서가 엄격하게 줄어드는 지 확인합니다.
pawel.boczarski 오전

@ pawel.boczarski-무슨 뜻인지 잘 모르겠지만 원하는 경우 특정 입력에 대해 출력되는 예를 제공 할 수 있습니다. 예를 들어, 함수에게 이름을 할당하는 경우 c, 다음 c([12,11,10])출력 [6,8,10]에 필요한 기초입니다.
Glen O

@GlenO 아, 알겠습니다. [12 11 10]대신 행 벡터 를 사용 [12,11,10]하여 원하지 않는 효과를 얻었습니다.
pawel.boczarski

@ pawel.boczarski-아, 알겠습니다. 예, 행 벡터로 작업하려면 "flipud"를 "fliplr"로 바꿔야합니다.이 경우베이스의 행 벡터를 반환합니다.
Glen O

5

줄리아 259 204 183 바이트

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

언 골프 + 설명 :

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

좋아, 일부 골프를 할지도 ... map 명령에서 "string"대신 "repr"을 사용하면이 컨텍스트에서 동일하게 작동하고 2 바이트를 절약 할 수 있습니다. "\ = parseint"를 쓴 다음 p (x [1], i) 대신 x [1] \ i를 사용하여 parseint에 대해 중위 연산자를 사용하여 몇 가지를 더 절약 할 수 있습니다. 8 바이트의 순 절약을 위해 p를 사용할 때마다 3을 저장합니다. "maximum (digits (x))를 max (digits (x) ...)"로 대체하여 다른 1 바이트를 절약했습니다.
Glen O

더 큰 절약을 위해 for 루프 사용을 병합하여 for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;드롭 된 2 개에 8 개를 저장 end;하고`for`를 교체에 8 개를 저장하십시오 ,.
Glen O

실제로, 우리는 파서 부분에 대해 더 잘 할 수 있습니다. parseint의 이름 변경을 완전히 삭제하고을 사용 s=map(parseint,x,[i,j,k])하여 원래 솔루션에 비해 18 바이트를 절약하고 이전에 제안한 개선 사항과 비교하여 10을 절약하십시오. 그리고이 아니라 s==sort(unique(s)), 사용하는 all(diff(s).>0)다른 3 바이트를 저장합니다.
Glen O

분명히 할 수있는 일이 더 많이 있지만, 나는 그것을 당신에게 맡기고 대신 내 자신의 접근법을 생각해 낼 것입니다.
Glen O

사소한 수정-최대가 아닌 최대 (...)를 사용하는 것이 좋지만 1 바이트를 저장하는 동안 한 자리 입력 값에 실패하므로 최대 값을 사용해야합니다.
Glen O

4

CJam (39 바이트)

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

이것은 익명 함수로, 입력을 스택의 십진 정수 배열로 가져 와서 출력을 배열 또는 0스택 의 정수로 남겨 둡니다 . 온라인 데모 .


또한 이것은 염기 대신 결과 정수의 합계로 정렬하는 것으로 보이며 이전 개정과 동일한 문제가 있습니다 ( 19기본 9 숫자는 불가).
Dennis

1
흠. 질문은 약간의 개선이 필요한 것 같습니다.
피터 테일러

@PeterTaylor Pah, 변명;)
베타 부패

2

파이썬 2 (147 바이트)

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

x정수 목록으로 함수 를 호출하십시오 .

예:

print x([12,11,10])

인쇄물

[6, 8, 10]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.