バランスの取れたベース間で変換します!


13

バランスの取れたベース:

バランスの取れた基数は通常、通常の基数と同じですが、数字が正または負になる場合がありますが、通常の基数では数字のみが正になる場合があります。

ここで上から、塩基のバランスのとれた塩基は、bとして表すことができるbalbので、バランスのとれたベース4 = - bal4

このチャレンジの定義では、ベースのバランスの取れたベースの桁の範囲bはから-(k - 1)でありb - k、ここで

k = ceil(b/2)

さまざまなバランスの取れた基数の桁の範囲の例:

bal10:
  k = ceil(10/2) = 5
  range = -(5 - 1) to 10 - 5 = -4 to 5
        = -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
  k = ceil(5/2) = 3
  range = -(3 - 1) to 5 - 3 = -2 to 2
        = -2, -1, 0, 1, 2

バランスのとれた基数での数値の表現は、基本的に通常の基数と同じです。たとえば、数27(基数10)からbal4(バランスのとれた基数4)の表現は2 -1 -1

  2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)

仕事:

あなたのタスクは、3つの入力が与えられます:

  • 変換される数(n
    • この入力は柔軟です。「I / Oの柔軟性」を参照してください
  • n現在(b)にあるベース
  • nc)に変換されるベース

どこで2 < b, c < 1,000

の平衡ベースc表現で数値を返しnます 出力は柔軟にすることもできます。

プログラム/関数はn、入力自体からの長さを決定する必要があります。

I / Oの柔軟性:

入力nと出力は次の方法で表すことができます。

  • 言語の配列の定義
  • 任意の文字を区切り文字とする文字列(スペース、コンマなど)

例:

これらはPython配列をn出力として使用することに注意してください。「I / O柔軟性」の定義に収まる限り、言語に合ったものを使用できます。

[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]

これはなので、バイト単位の最短コードが勝ちです!


最初の答えでは、4は有効なbal7数字ではありません。答えは[1、-3、-1]であるべきだと思います。そして、2番目のテストケース([1,2,2、-1,2])と3番目のテストケース([1,1,0、-2,1,0])についても異なる回答が得られます...?
グレッグマーティン

@GregMartinああ、おっと-私はそれらを手で計算したので、いくつかの問題があるはずです。気づいてくれてありがとう!念のため、ソリューションを再確認できますか?
clismique

@GregMartin @ Qwerp-Derp 3番目のテストケースは[1,1,1,-2,1,0]
-ngenisis

回答:


2

Mathematica、85バイト

#~FromDigits~#2~IntegerDigits~#3//.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}&

説明

#~FromDigits~#2

#1整数ベース#2(入力2)に変換(1は暗示-入力1、数字のリスト)。

... ~IntegerDigits~#3

結果の整数を基数#3(入力3)に変換し、数字のリストを作成します。

... //.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}

数字のリストを繰り返し置き換えます。数字がfloor(#3/ 2)よりも大きい場合は、その数字#3から減算1し、左側の数字に追加します。左側に何もない場合は、a 0を挿入してを追加し1ます。


通常、ソリューションについて少し話し、Mathematicaを知らないかもしれない人に説明することをお勧めします。
アタコ

@ATaco説明を追加しました!
ジョンファンミン

私はこれに少し戸惑っています。関数定義以外で使用されるオプションのパターンを見たことはありません。{...}置換ルールは1つしかないため、アウターは必要ありません。
-ngenisis

1
@JungHwanMin確かに、私が混乱させているのは、これがの一致にどのように影響するかですp___。これは、またはのp___いずれかが続く最短を見つけますa_,b_b_、それとも各オプションパターンを必要とするパターン全体をチェックしてから、一致(または3番目のオプション)が見つかるまでオプションパターンを徐々にドロップしますか?
-ngenisis

1
@ngenisis前のコメント(削除済み)で間違っていたと思いFixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&ます。{p___,a_,b_,q___}(すべての可能な場合p)最初に一致し、次に{p___,b_,q___}一致します。2番目の置換bは、が最初にある場合にのみ適用されます。これはb、条件を満たしている中間が存在する場合、{p___,a_,b_,q___}代わりに一致するためです。
ジョンファンミン

1

Perl 6、121バイト

->\n,\b,\c{sub f{sum [R,](@^n)Z*($^b X**0..*)}
first {f(b,n)==f c,$_},map {[$_-($_>floor c/2)*c for .base(c).comb]},0..*}

低速ブルートフォースソリューション。

使い方:

  • map {[ .base(c).comb]}, 0..*-baseで自然数のレイジー無限シーケンスを生成しcます。各数は数字の配列として表されます。
  • $_ - ($_ > floor c/2) * c -減算して変換する c-floor(c / 2)より大きい各桁からしてます。
  • first { f(b, n) == f(c, $_) }, ...-基数として解釈されたときに、基数として解釈されるc入力配列nと等しいシーケンスの最初の配列を取得しますb番号。
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }-配列@^nをbaseの数に変換するヘルパー関数。$^b逆の配列をbaseのべき乗のシーケンスで圧縮することで得られる積の合計を取得します。

1

JavaScript(ES6)、89バイト

(n,b,c,g=(n,d=n%c,e=d+d<c)=>[...(n=n/c+!e|0)?g(n):[],e?d:d-c])=>g(n.reduce((r,d)=>r*b+d))

100バイトはの負の値に対して機能しますn

(n,b,c,g=(n,d=(n%c+c)%c)=>[...(n-=d,n/=c,d+d<c||(d-=c,++n),n?g(n):[]),d])=>g(n.reduce((r,d)=>r*b+d))

0

Mathematica、118 114バイト

IntegerDigits[#3~FromDigits~#2,k=⌊#/2⌋;#]//.{{a_,x___}/;a>k:>{1,a-#,x},{x___,a_,b_,y___}/;b>k:>{x,a+1,b-#,y}}&

およびは、それぞれ3バイト文字U+230AおよびU+230Bです。#3base 10からbaseに変換してからbase #2に変換します#(したがって、引数の順序は例と逆になります)。桁が最大許容桁より大きい場合、k=⌊#/2⌋その桁をデクリメントし#、次の桁をインクリメントします(先頭に追加する必要がある場合があります1)。すべての桁が未満になるまでこれを続けてくださいk

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