クレイジーだが合理的な基盤


11

ベース10、ベース2、ベース36、さらにはベース-10に基づいて多くの課題がありますが、他のすべての合理的なベースはどうでしょうか?

仕事

基数10の整数と有理数基数を指定すると、その基数の整数を(配列、文字列などとして)返します。

処理する

合理的なベースを想像するのは難しいので、Exploding Dotsを使用して視覚化しましょう。

ベース3で17を表すこのアニメーションを検討してください。

ここに画像の説明を入力してください

各ドットは単位を表し、ボックスは数字を表します。右端のボックスは自分の場所、中央のボックスは3 ^ 1の場所、左端のボックスは3 ^ 2の場所です。

私たちは自分の場所に17個の点から始めることができます。ただし、これは3を基数としているため、1の場所は3未満でなければなりません。したがって、3つのドットを「爆発」させ、左側のボックスにドットを作成します。爆発可能なドットのない安定した位置になるまでこれを繰り返します(つまり、同じボックスに3つのドット)。

したがって、基数10の17は基数3の122です。


分数ベースは、いくつかのドットを複数のドットに分解することに似ています。ベース3/2は3ドットを爆発させて2を作成します。

ベース3/2で17を表現:

ここに画像の説明を入力してください

したがって、基数10の17は基数3/2の21012です。


負の基底も同様に機能しますが、記号を追跡する必要があります(-1に等しいいわゆるアンチドットを使用します。白丸で表されます)。

ベース-3で17を表現:

ここに画像の説明を入力してください

すべてのボックスの記号を同じにするために、余分な爆発があります(ゼロを無視して)。

したがって、基数10の17は基数-3の212です。

上記の2つのケースの組み合わせでは、負の有理数ベースも同様に機能します。

ルール

  • 標準的な抜け穴はありません。
  • 出力の各「数字」の符号は同じ(またはゼロ)でなければなりません。
  • すべての数字の絶対値は、基数の分子の絶対値より小さくなければなりません。
  • ベースの絶対値は1より大きいと仮定できます。
  • 有理数ベースは、その最小の縮小形にあると仮定できます。
  • 入力では、分子のベースと分母を別々に使用できます。
  • 数値に複数の表現がある場合、それらのいずれかを出力できます。(例えば、ベース10に12とすることができる{-2, -8}{1, 9, 2}ベース-10で)

テストケース:

フォーマット: {in, base} -> result

{7, 4/3}        ->  {3, 3}
{-42, -2}       ->  {1, 0, 1, 0, 1, 0}
{-112, -7/3}    ->  {-6, -5, 0, -1, 0}
{1234, 9/2}     ->  {2, 3, 6, 4, 1}
{60043, -37/3}  ->  {-33, -14, -22, -8}

一部の入力には複数の表現がある場合があるため、TIOでこのMathematicaスニペットを使用して出力をテストすることをお勧めします

これはであるため、各言語でのバイト数が最短の提出が勝ちです!


爆発ドットの詳細については、グローバル数学プロジェクトのWebサイトをご覧ください!彼らにはたくさんのかっこいいマティーグッズがあります!


回答:


6

パイソン242の 39バイト

n,a,b=input()
while n:print n%a;n=n/a*b

オンラインでお試しください!

@xnorに短い形式を見つけてくれてありがとう。

廃止バージョン(42バイト):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

オンラインでお試しください!

パラメーター:入力、分子(符号付き)、分母。

配列を返します。最下位桁が最初です。

Pythonの除算とモジュロは分母の符号に従うため、これは機能します。したがって、同じ符号を明示的に気にする必要はありません。

テストケースの出力:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]

4
珍しいことに、プログラムが短いように見えます。
xnor

@xnorありがとう、私はいつも何かを書くその方法をいつも忘れています...-
バブラー

4

アフイ(エソトープ)、91バイト

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

オンラインでお試しください!

取りintegernumerator of basedenominator of base

TIOインタープリターの制限により、各入力は改行で終了する必要があります。

@BubblerのPython 2 answerの実装。幸いなことに、このAheuiインタープリターはPythonで作成されているため、同じトリックを使用できます。


4
o_Oこの言語は一体何なのか…D:
HyperNeutrino

3

05AB1E11 10バイト

[D_#²‰`,³*

オンラインでお試しください!

取りintegernumerator of baseそしてdenominator of baseすべての答えのような。05AB1EインタープリターはPython(?)で記述されているため、BubblerのPython 2アンサートリックは05AB1Eでも使用できます。

説明

[D_#²‰ `、³*
[ 無限ループ
 D_#数値が0の場合、ループを終了します(暗黙的な入力
                                         最初の反復で)
     ²基数の分子を取得する
      ‰Divmod
       `すべての要素をスタックにプッシュします
        、残りを印刷する
         ³基数の分母を取得する
          *乗算します。

したがって、プログラムはこのPythonコードとほぼ同じように機能します。

i1、i2、i3 = input()
スタック= []
一方、1:
 stack =(stackまたは[i1])
 スタック+ = [stack [-1]]
 スタックでない場合[-1]:ブレーク
 スタック+ = [i2]
 stack = stack [:-2] + [divmod(stack [-2]、stack [-1])]]
 stack = stack [:-1] + list(stack [-1])
 印刷スタック[-1]
 stack = stack [:-1]
 スタック+ = [i3]
 stack = stack [:-2] + [stack [-2] * stack [-1]]

11> 10ありがとう、ニール


ここの_代わりに使用できると思います0Q
ニール

@Neilそうですね、負のブール値を忘れてしまいました!
朝琴シエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.