異なるベースの素数


17

チャレンジ:

基数10の数字が与えられます。10から2までのカウントダウンの各ベースに対して:

  1. 元の入力番号を基数10の文字列として取得し、基数に対して無効な数字の数字を削除します。
  2. そのベースの結果の数値文字列を解釈します。これにより1または0が得られた場合、プロセス全体を終了します。
  3. 最大の素因数を10進数として出力または印刷します。

出力は、最大の素因数の配列にすることができます。

サンプルケース:

入力:

987654321

出力:

379721
10593529
1091
179
1493
293
19
7

代わりに:

[379721,10593529,1091,179,1493,293,19,7]

これは、987654321の最大素因数を印刷87654321 9 = 42374116 10、7654321 8 = 2054353 10、及びそれが1に達するまでに2止まります。


2
私はそのプロセスについては不明です。おそらく例からそれを理解することができますが、これは必要ではないので明確な指示が必要です。そこで、より低い基数に変換し、無効な数字を削除してから、最大の素因数を出力しますか?この要素をどのベースに印刷しますか?次に、最大の素因数と底の素因数で同じプロセスを実行しますか?または、因数分解した数でそれを行いますか?10または9から始めますか?
xnor

サイトへようこそ!
DJMcMayhem

2
課題をより明確にするために書き直しました。これがあなたの意図したものであることを願っています。そうでない場合は、お気軽に変更してください。
-xnor

4
主要な操作に追加される最大の素因数ステップは、ベース変換です。多くの言語は、素因数分解を組み込みで直接実行しますが、残りは基本的に2番目の別の課題を実行する必要があります。ベース変換もビルトインまたはバストです。操作がビルトインとして行われる場合、それらはゴルフのためのよく踏まれた地面であり、実際に因数分解とベース変換がそうであると期待します。それでも、最初の挑戦には良いが、次回のために心に留めておくべきこと。
-xnor

3
これがGoogle Code Jamに触発された可能性はありますか?
メゴ

回答:


6

Pyth、25バイト

sfTm>1PiFdC,.u-N`tYKrT1zK
                       z   get input as a string
            .u      rT1    cumulative reduce over [10,9,...,2]
              -N`tY        remove one minus the number (10,9,...) from the input
          C,       K    K  pair each step along the chain with corresponding base
   m                       map over [["987654321", 10],...]:
       iFd                   apply the base-conversion (splat over i)
      P                      prime factorization, smallest to largest
    >1                       take [the last element], or [] if empty (1 or 0)
 fT                        remove the []s from 0s or 1s
s                          join the one-element arrays together

ここで試してみてください。



4

MATL17 15バイト

9:PQ"G@ZAYfXzX>

これは、数値を引用符付きの文字列として受け取ります。これはデフォルトで許可されています。

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

説明

9:PQ     % Push array [10, 9, ..., 2]
"        % For each number in that array. These are the bases to be considered
  G      %   Push input. Forces for input to be taken implicitly first time
  @      %   Push current base
  ZA     %   Convert from that base to base 10, discarding non-valid digits
  Yf     %   Prime factors. Gives empty for input 1, and 0 for input 0
  Xz     %   Non-zero values. Gives empty if previous result was 0, or else
         %   leaves it as it was
  X>     %   Maximum of array. For empty input gives empty
         % Implicitly end for each
         % Implicitly display. Empty arrays are not displayed

これは、1で終了しない入力に対しては、最後に0を出力します。
poi830

入力 '98765432'および '98765'(ランダムな例)の場合、終了する前に正しい数値を出力してから0を出力します。
poi830

1
poi830 @今解決
ルイスMendo

1

ジュリア、101バイト

f(s,x=[],b=10)=(t=filter(c->c<=47+b,s))>"1"&&b>1?f(s,[x;maximum(keys(factor(parse(Int,t,b))))],b-1):x

これは、入力を文字列として受け入れ、配列を返す再帰関数です。

ゴルフをしていない:

function f(s, x=[], b=10)
    # Filter the string down to only the digits valid for base b
    t = filter(c -> c <= 47 + b, s)

    # If the filtered string isn't "1" or "0" and b is a valid base
    if t > "1" && b > 1
        # Call the function again, appending the maximum prime factor
        # of t in base b to the argument x and decrementing the base
        f(s, [x; maximum(keys(factor(parse(Int, t, b))))], b-1)
    else
        # Otherwise return the array
        x
    end
end

1

Mathematica、83バイト

FactorInteger[Select[IntegerDigits@#,#<a&]~FromDigits~a][[-1,1]]~Table~{a,10,2,-1}&

無名関数。リストを返します。正直言ってそれほど複雑ではありません。


0

ルビー、120バイト

再帰関数。入力を文字列として受け取ります。

f=->n,b=2{require'prime';i=n.tr([*b.to_s..?9].join,"").to_i(b)
b>10?[]:f[n,b+1]+[*i>1?Prime.prime_division(i).max[0]:p]}

1
-rprime代わりにコマンドラインフラグを使用して、いくつかのバイトを保存できますrequire
ドアノブ

-rprime何らかの理由で私のために仕事はしていません...
バリューインク

0

Pyke、19バイト、非競合

(splat_node機能を追加)
DTAbPe
;1TtD=T`"":r

ここで試してみてください!

入力を引用符で囲み、エラーで終了します。

説明(改行は\ nに置き換えられます):

D                    - Duplicate the first item on the stack (And get it from input first time)
 TAb                 - Convert input to base (whatever's in T, 10 default)
    Pe               - get the highest prime factor of the number
      \n;1           - print it out and get rid of it
          TtD=T      - T -= 1
               `"":  - input = input.replace(str(t), "")
                   r - GOTO start
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.