上昇、シーケンス、上昇


19

次のように、非負整数の厳密に増加するシーケンスがあります。

12 11 10

待つ!このシーケンスは厳密には増えていませんよね?まあ、数字は異なるベースで書かれています。可能な最小のベースは2、最大は10です。

タスクは、各数値が書き込まれたベースを推測することです。

  • シーケンスは厳密に増加しています。
  • 塩基の合計が最大化されます。

たとえば、サンプルのソリューションは次のようになります。

6 8 10

これらの基底の下では、シーケンスは8 9 1010進数になります-厳密に増加するシーケンスであり、シーケンスが厳密に増加したままで、合計がより大きいベースを見つけることはできません6+8+10

2番目の制限のため、解決策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 5そして1 7 22両方の10だから、両方の場合のための解決策は、ベースの下に上昇している10 10 10n番目の数は、ベースに書き込まれると解釈される場合のシーケンスが上昇していることを保証しながら、Nに等しく、我々は塩基の和を最大化する必要があるため、 -ソリューションの第ターム。
pawel.boczarski

2
@Dennisはい、厳密にシーケンスを増やします。1 1 1または3 3 4上昇していません。
pawel.boczarski

3
質問が誤解に対して開かれていることをコメントが示している場合、コメントで返信するだけではありません。他の人があなたとは異なる解釈をする回答を書くのに時間を無駄にしないように、質問を編集してください。
ピーターテイラー

3
そして、あいまいさについては、私の答えに対するコメントの1つは、数字が与えられた基数で標準形式で書かれていると仮定すべきだと主張しています。その場合、「最小可能ベースは2」というフレーズを「最小ベースは最大桁値より大きい1ように修正してください。
ピーターテイラー

回答:


13

Pyth、31 30 29バイト

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

@ジャクベのおかげで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.

Pythonのビルトインを使用するがベースとして許可されていないため、常にエラーをスローする1ためi、可能なベースのリストに含めることは安全です。int1


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

1次元配列入力で使用されます。関数がに割り当てられている場合、c呼び出しc([12,11,10])て出力します[6,8,10]

注:dec(i)parseintコマンド内で使用していましたiが、1文字の変数名であり、コンポーネントにアクセスする必要がない"$i"ため、同じ結果が得られました。


ここにいくつかの良いトリックがあります。よくやった。
アレックスA.

このコードは、通常の左から右への読み取り順序で厳密に減少するシーケンスのベースをチェックしているようです。
pawel.boczarski

@ pawel.boczarski-どういう意味かわかりませんが、もし望むなら、それが特定の入力に対して何を出力するかの例を提供できます。たとえば、あなたが機能に名前割り当てた場合c、その後、c([12,11,10])出力[6,8,10]に必要な塩基です。
グレンO

@GlenOああ、なるほど。[12 11 10]代わりに行ベクトルを使用したため[12,11,10]、望ましくない効果が得られました。
pawel.boczarski

@ pawel.boczarski-ああ、なるほど。ええ、行ベクトルを使用したい場合は、「flipud」を「fliplr」に置き換える必要があります。この場合、ベースの行ベクトルが返されます。
グレンO

5

ジュリア、259の 204 183バイト

グレン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 +説明:

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、いくつかのゴルフを行う必要があります... mapコマンドで「string」の代わりに「repr」を使用します。このコンテキストでも同じように機能し、2バイトを節約します。そして、「\ = parseint」と記述し、p(x [1]、i)ではなくx [1] \ iを使用して、parseintに中置演算子を使用することにより、さらにいくつかを保存できます。一部とし、pを使用するたびに3を節約して、8バイトのネット節約を実現します。「maximum(digits(x))をmax(digits(x)...)に置き換える」ことによって保存された別の1バイト
グレンO

より大きな節約のために、forループをマージします- for i=M(A[1]):10,j=M(A[2]):10,k=M(A[3]):10 <code here>end;ドロップされた2 end;秒間に8を節約し、`for`をに置き換えるために8を節約し,ます。
グレンO

実際、parseint部分についてはさらに改善することができます。parseintの名前変更を完全に削除し、を使用s=map(parseint,x,[i,j,k])して、元のソリューションと比較して18バイト節約し、以前の提案された改善と比較して10バイト節約します。ではなくs==sort(unique(s))、を使用all(diff(s).>0)してさらに3バイトを保存します。
グレンO

確かにもっとできることがありますが、私はそれをあなたに任せて、代わりに私自身のアプローチを考えてみます。
グレンO

軽微な修正-最大ではなくmax(...)を使用することをお勧めしますが、1バイトを節約しますが、1桁の入力値では失敗するため、最大を使用する必要があります。
グレンO

4

CJam(39バイト)

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

これは、入力をスタックの10進整数の配列として受け取り、出力を配列または0スタックの整数として残す匿名関数です。オンラインデモ


また、これは19基数ではなく結果の整数の合計でソートされているようで、以前のリビジョンと同じ問題があります(基数9の数値にすることはできません)。
デニス

1
うーん 質問には改善が必要なようです。
ピーターテイラー

@PeterTaylor Pah、言い訳;)
ベータ崩壊

2

Python 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

関数を呼び出す xintのリストを使用しをます。

例:

print x([12,11,10])

プリント

[6, 8, 10]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.