y乗がxで割り切れる最小の正数


15

仕事

少なくとも整数の整数が与えられた場合x、-th乗がで割り切れる正の最小数を見つけます。y2yx

考えるx=96y=2、出力は次のようになります24ので、24最小の正であるn満たしますn^2 is divisible by 96

テストケース

x  y output
26 2 26
96 2 24
32 3 4
64 9 2
27 3 3

得点

これは、。バイト数が最も少ないソリューションが優先されます。

参照資料



1
ウィルXいつもよりも大きいですかY
16

@Fatalizeそれは何と関係がありますか?
リーキー修道女

Xより小さいのテストケースはありません。常により大きいY場合、いくつかの回答(少なくとも私の場合)の長さを減らすことができます。私はそれを大きくしたり小さくしたりすることができますが、後者のテストケースは素晴らしいでしょう。XYX
16

1
参照リストは、OEISエントリの順序のとんでもない意性について私が見た中で最高の例です。
スパー

回答:


7

Brachylog19 17 16 15 12バイト

@LeakyNunのおかげで2バイト節約されました。

:[I:1]*$r=#>

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

説明

               Input = [X, Y]
:[I:1]*        Get a list [X*I, Y] (I being any integer at this point)
       $r=     Get the first integer which is the Yth root of X*I
          #>   This integer must be strictly positive
               This integer is the Output


@LeakyNunありがとう。ただし、これははるかに遅くなります。
-19:23で

なぜこれが遅くなるのですか?
リーキー修道女


4
:有名なFatalize引用すると、「複雑さを気にしない」
漏れ修道女

6

ゼリー、6 バイト

ÆE÷ĊÆẸ

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ÆE÷ĊÆẸ  Main link. Arguments: x, y

ÆE      Yield the exponents of x's prime factorization.
  ÷     Divide them by y.
   Ċ    Ceil; round the quotients up to the nearest integer.
    ÆẸ  Return the integer with that exponents in its prime factorization.

1
R*%⁸i0また、6バイトです。
リーキー修道女

別の答えが必要だと思います。
デニス

6

JavaScript(ES7)、32バイト

f=(x,y,i=1)=>i**y%x?f(x,y,i+1):i

定義しfたことはありません。機能をに割り当てる必要があると思いますf
kamoroso94

1
@ kamoroso94申し訳ありませんが、私はそれを永遠にやっています。
ニール


5

Pythonの3、60 43 39バイト

助けてくれた@LeakyNunと@ Sp3000に感謝

f=lambda x,y,i=1:i**y%x<1or-~f(x,y,i+1)

引数を介して入力を受け取り、出力を返す関数。

使い方

この関数は、再帰を使用してi、で始まる整数を繰り返しチェックしi=1、必要な条件(ここi**y%x<1で)を満たすものが見つかるまで繰り返します。これはor、条件の論理とi+1インクリメントの式の結果(ここでは)を取得することで実現されます-~f(x,y,i+1)。この式はFalse、満足のいく値jが見つかるまで継続的に評価され、その時点で評価されTrueて再帰が停止します。これらはそれぞれPython 0と同等1であり、関数は1インクリメント部分を介して繰り返し追加されているため、関数は(j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j必要に応じてを。

Ideoneでお試しください


1
def f(x,y,i=1):¶ while i**y%x:i+=1¶ print(i)
リーキー修道女

@LeakyNunありがとう。私はそれを少し短くする方法を考えました(43対44)
TheBikingViking

2
39:f=lambda x,y,z=1:z**y%x<1or-~f(x,y,z+1)
Sp3000

@ Sp3000あなたの関数はTrue代わりに戻りませんzか?
リーキー修道女

@LeakyNunパーツがありません-~が、はい、1のTrue場合xは返されます。
Sp300016

4

Haskell、31バイト

x#y=[n|n<-[1..],mod(n^y)x<1]!!0

使用例:96#2-> 24

直接実装:すべての整数を試す n、条件を満たすものを保持し、最初のを選択します。


2
また31:x#y=until(\n->mod(n^y)x<1)(+1)0
xnor

4

05AB1E(10バイト)

>GN²m¹ÖiNq

オンラインで試す

  • > 最初の引数を読み取り、インクリメントし、スタックにプッシュします
  • Gスタックをポップし(aN、値を取るプログラムの残りを含むループを開始します1, 2, ... a - 1
  • N²mN入力履歴から2番目のエントリをプッシュしてから、両方をポップし、最初のエントリを2番目の累乗にします。
  • ¹ 入力履歴から最初のエントリをスタックにプッシュします。
  • Ö前の2つのスタックエントリをポップa % b == 0し、スタックをプッシュします。
  • iスタックからポップします。trueの場合、プログラムの残りを実行します。それ以外の場合、ループは継続します。
  • NNスタックをプッシュします。
  • q プログラムを終了します。

プログラムが終了すると、スタックの一番上の値が出力されます。


あなたの言語に精通している人にとってこのコードがどのように機能するかについての説明を投稿してください。
ローハンジュンジュンワラ

そのリンクは興味深いようです。
リーキー修道女

2
とてもいい最初の答え。
エミグナ

3

MATL、9バイト

y:w^w\&X<

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

説明

y       % Take x and y implicitly. Push x again
        % STACK: x, y, x
:       % Range from 1 to x
        % STACK: x, y, [1, 2, ..., x]
w       % Swap
        % STACK: x, [1, 2, ..., x], y
^       % Power, element-wise
        % STACK: x, [1^y,  2^y, ..., x^y]
w       % Swap
        % STACK: [1^y, 2^y, ..., x^y], x
\       % Modulo, element-wise
        % STACK: [mod(1^y,x), mod(2^y,x), ..., mod(x^y,x)]
        % A 0 at the k-th entry indicates that x^y is divisible by x. The last entry
        % is guaranteed to be 0
&X<     % Arg min: get (1-based) index of the first minimum (the first zero), say n
        % STACK: n
        % Implicitly display

スタック操作。
漏れの修道女

1
うん。私はジェリーがすべての「コピー」と「スワップ」を回避するため、ここで大きな利点があると思う
ルイスメンドー

ありませんfindか?
リーキー修道女

@LeakyNunはい、fですが、ゼロ以外のすべてのインデックスが検索されます。だからそれはする必要があります~f1):否定、見つけ、最初のエントリを取得
ルイスメンドー

3

実際には12 11バイト

Leaky Nunの多くの提案に感謝します。ゴルフの提案を歓迎します。オンラインでお試しください!

;)R♀ⁿ♀%0@íu

元の12バイトのアプローチ。オンラインでお試しください!

1WX│1╖╜ⁿ%WX╜

別の12バイトのアプローチ。オンラインでお試しください!

w┬i)♀/♂K@♀ⁿπ

13バイトのアプローチ。オンラインでお試しください!

k╗2`╜iaⁿ%Y`╓N

アンゴルフ:

最初のアルゴリズム

       Implicitly pushes y, then x.
;      Duplicate x.
)      Rotate duplicate x to bottom of the stack.
R      Range [1, x] (inclusive).
♀ⁿ     Map a**y over the range.
♀%     Map a**y%x over the range.
0@í    new_list.index(0)
u      Increment and print implicitly at the end of the program.

元のアルゴリズム

       Implicitly pushes x, then y.
1WX    Pushes a truthy value to be immediately discarded 
         (in future loops, we discard a**y%x)
|      Duplicates entire stack.
         Stack: [y x y x]
1╖     Increment register 0.
╜      Push register 0. Call it a.
ⁿ      Take a to the y-th power.
%      Take a**y mod x.
W      If a**y%x == 0, end loop.
X      Discard the modulus.
╜      Push register 0 as output.

第三のアルゴリズム

       Implicitly pushes y, then x.
w      Pushes the full prime factorization of x.
┬      Transposes the factorization (separating primes from exponents)
i      Flatten (into two separate lists of primes and exponents).
)      Rotate primes to the bottom of the stack.
♀/     Map divide over the exponents.
♂K     Map ceil() over all of the divided exponents.
@      Swap primes and modified exponents.
♀ⁿ     Map each prime ** each exponent.
π      Product of that list. Print implicitly at the end of the program.

4番目のアルゴリズム

     Implicitly pushes x, then y.
k╗   Turns stack [x y] into a list [x, y] and saves to register 0.
2    Pushes 2.
  `    Starts function with a.
  ╜i   Pushes register 0 and flattens. Stack: [x y a]
  a    Inverts the stack. Stack: [a y x]
  ⁿ%   Gets a**y%x.
  Y    Logical negate (if a**y is divisible by x, then 1, else 0)
  `    End function.
╓    Push first (2) values where f(x) is truthy, starting with f(0).
N    As f(0) is always truthy, get the second value.
     Print implicitly at the end of the program.

@LeakyNunあなたのゴルフの提案の1つを待っています。D–
Sherlock9

@LeakyNunあなたがそれらを自分で投稿したくない限り、私はそれらのアプローチも投稿したいと思います。
シャーロック9

+1のにやにや笑い;)
漏れの修道女

2

R、61バイト39バイト37バイト、34バイト

私はまだRプログラミングの初心者であり、これがRで作成する最初の関数であることがわかりましたYay!)まだ改善の余地があると思います。

function(x,y){for(n in 2:x){if(n^y%%x==0){cat(x,y,n);break}}}

オンラインテストは、RollAppのRStudioで実行できます。


主な進捗:

function(x,y){which.max((1:x)^y%%x==0)}

which.maxこれは、ベクトル内の最高値を返し、複数ある場合は最初を返すため、機能します。この場合、多くのFALSE(0)といくつかのTRUE(1)のベクトルがあるため、最初のTRUEを返します。


別の進歩:

function(x,y)which.max((1:x)^y%%x==0)

最後に、Pythonを使用して2バイトの答えを打ちました。:)

別の進歩:(もう一度!)

function(x,y)which.min((1:x)^y%%x)

Axemanuser5957401に助けてくれてありがとう。


あなたのテストリンクは死んでいると思います。
TheBikingViking

@TheBikingVikingそれを指摘してくれてありがとう。遅めの昼食を食べた後に編集します
アナスタシアロマノバ秀

2
あなたが使用するならばwhich.min、あなたは==0。弾性率は低くない0よりも数、戻ります
user5957401

1
@ user5957401 Edited.Bolshoe spasibo ...
アナスタシア

34バイトの同じ長さのために、あなたは同様を持っていましたfunction(x,y)which(!(1:x)^y%%x)[1]
プランナパス

2

dc、 23 22バイト

入力方法に関するヒントを提供してくれたDeliothに感謝します。

sysxz[zdlylx|0<F]dsFxp

スタック上でzテストケースを直接インクリメントするにはスタック深度演算子を使用し、モジュラーべき乗にはモジュラーべき乗演算子|を使用します。残りがゼロ以下になるまでテストを繰り返します。


1
技術的には?最初は必要ありません。何かを呼び出す標準的な方法は> echo "x y [program]"|dcであり、ここでxyはQuestion-xとyと同じで、通常どおりスタックにドロップされます。
デリオス

@Delioth興味深い、ありがとう!私は常にこの-eオプションを使用しましたが、今後はそれを使用します。
ジョー

@Delioth、私にとっては、引用符を使用"するとdc、で実装されていないことを思い出させるエラーがスローされますが、引用符を使用しないと明らかにシェルエラーが発生します。これについて何かすることはありますか?stderr無視できることはわかっていますが、それでも気になります。
ジョー


1

Perl 6の 26の  25バイト

{first * **$^y%%$^x,1..$x}
{first * **$^y%%$^x,1..*}

説明:

# bare block with two placeholder parameters 「$^y」 and 「$^x」
{
  # find the first value
  first

  # where when it 「*」 is taken to the power
  # of the outer blocks first parameter 「$^y」
  * ** $^y
  # is divisible by the outer blocks second parameter 「$^x」
  %% $^x,

  # out of the values from 1 to Inf
  1 .. *
}



0

PowerShell v2 +、48バイト

param($x,$y)(1..$x|?{!(("$_*"*$y+1|iex)%$x)})[0]

入力$xとを受け取ります$y。から1までの範囲を構築し、それらの数値のフィルタリングに$x使用Where-Objectします。フィルタは文字列"$_*"(つまり、アスタリスク付きの現在の番号)を$y取得し、文字列乗算を使用してそれらの時間を連結し、最後にファイナル1を追加し、それをパイプしますiex(略しInvoke-Expression、同様eval)。[math]::Pow($_,$y)PowerShellにはべき乗演算子がなく、2バイト短いため、これはの代わりになります。これはモジュロ演算子に渡さ%れます$x-したがって、それが割り切れる場合、これはになりますので0、それを括弧でカプセル化し、ブール値を取ります!(...)渡されます。したがって、割り切れる場合、このフィルターに含まれ、他のすべての数値は除外されます。

最後に、結果の数値を括弧でカプセル化し(...)[0]インデックスを取得します。入力された範囲はソートされているため1..$x、これが最小になります。それはパイプラインに残っており、印刷は暗黙的です。

テストケース

PS C:\Tools\Scripts\golfing> (26,2),(96,2),(32,3),(64,9),(27,3)|%{($_-join', ')+' -> '+(.\smallest-positive-number-divisor.ps1 $_[0] $_[1])}
26, 2 -> 26
96, 2 -> 24
32, 3 -> 4
64, 9 -> 2
27, 3 -> 3


0

Perl、29 26バイト

+3を含む-p(コードにはが含まれているため+1ではない'

STDINの入力で実行する

power.pl <<< "96 2"

power.pl

#!/usr/bin/perl -p
/ /;1while++$\**$'%$`}{

0

Pyth、9バイト

AQf!%^THG

[x, y]STDIN のフォームのリストの入力を受け取り、結果を出力するプログラム。

オンラインで試す

使い方

AQf!%^THG  Program. Input: Q
AQ         G=Q[0];H=Q[1]
  f        First truthy input T in [1, 2, 3, ...] with function:
     ^TH    T^H
    %   G   %G
   !        Logical not (0 -> True, all other modulus results -> False)
           Implicitly print

-1

PHP 59バイト

申し訳ありませんが、携帯電話からこれをテストすることはできません。:)

function blahblah($x,$y){
  for($i=0;1;$i++){
    if(!$i^$y%$x){
      return $i;
    }
  }
}

ゴルフ

function b($x,$y){for($i=0;1;$i++){if(!$i^$y%$x)return $i;}

あなたは$ Xを使用する必要があります$ Zを使用していると私はあなたがループ内で$ Iをインクリメントしているとは思わない
theLambGoat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.