四角いルートを見つける


19

正の数、所与のときに、書き込みコードバツ入力として、最大の正の除数出力バツ以下の平方根に等しいバツ

言い換えれば、次のような最大の見つけますn>0

mnmn=バツ

(存在するmを超えるのか等しいnようにm時間nであり、バツ


入力があった場合、例えば除数は、、、、、、および。 、とを得るために、より大きな数字ですべての乗算が、、我々が戻るので、最大で。122 3 4 6 12 1 2 3 12 3 312346121231233


これはので、回答はバイト単位でスコアリングされ、バイト数が少ないほどより良いスコアと見なされます。

テストケース

(1,1)
(2,1)
(3,1)
(4,2)
(5,1)
(6,2)
(7,1)
(8,2)
(9,3)
(10,2)
(11,1)
(12,3)
(13,1)
(14,2)
(15,3)
(16,4)
(17,1)
(18,3)
(19,1)
(20,4)
(21,3)
(22,2)
(23,1)
(24,4)
(25,5)
(26,2)
(27,3)
(28,4)
(29,1)
(30,5)
(31,1)
(32,4)
(33,3)
(34,2)
(35,5)
(36,6)
(37,1)
(38,2)
(39,3)
(40,5)
(41,1)
(42,6)
(43,1)
(44,4)
(45,5)
(46,2)
(47,1)
(48,6)
(49,7)
(50,5)

OEIS A033676


11
古い非アクティブな質問のduがサイトに役立つので、人気のある質問を閉じる方法がわかりません...?早い段階で気づいた場合は、先に進んで打ってください。回答数が2倍で、古い投票数よりも多い場合。それを維持し、どちらかといえば、近くに他の1 ...
Stewieグリフィン

@StewieGriffin「一般的な質問」の問題は、彼らがHNQにいることです。これはおそらくあまり良いことではありません。/サイトがどのように害を被るかはわかりません。答えを古いものに移動するだけです。
user202729

5
HNQは新しいユーザーを引き付ける可能性があり、それは良いことです(IMO)。
スチューイーグリフィン

1
@qwrしかし、核となる考え方は同じです。違いは非常に小さいです。各チャレンジのメソッドは別のメソッドに使用できます。
user202729

1
@ Hand-E-Foodこれが違うとは言わない。実際、この2つのコンテンツは同じだと思います。あなたの質問を閉じた理由は、スレッドの上部にあるコメントの理由と同じです。この質問にはもっと答えがあります。あなたがそこに尋ねたいならば、メタはここにあります。また、これに興味があるかもしれません。
小麦ウィザード

回答:


10

python349の 47バイト

def f(x):
 l=x**.5//1
 while x%l:l-=1
 return l

説明

  • l=x**.5//1→のl平方根以下の最大整数を割り当てるx
  • while x%l:l-=1l均等に分割されませんがx、減少しますl

編集

  • Python2ではなくPython3に言及
  • ...//12バイトを保存するために使用します。(10進数は大丈夫です。ありがとう@Rod)

PPCGへようこそ、最初の回答です!あなたは使用していくつかのバイトを保存することができますinput/ printの代わりにdef/ return、あなたも置き換えることができるint(...)...//1あなたが見ることができるように多くのバイトを保存するためにここに
ロッド

@ 3ではなく、// Rod。(出力に小数が問題ない限り、そうは思いませんでした。)しかし、Python2には感謝します!
hunteke

@hunteke 10進数の出力は問題ありませんが、そうすべきでない理由はわかりません。
小麦ウィザード

「While」ではなく「For」で短くなるので、条件で値を割り当てることができ、「l」の定義を避けることができますか?
マーレディ

8

MATL、7バイト

Z\tn2/)

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

この説明では、サンプル入力として「12」を使用します。説明:

Z\      % Divisors.
        % Stack:
        %   [1 2 3 4 6 12]
  t     % Duplicate.
        % Stack:
        %   [1 2 3 4 6 12]
        %   [1 2 3 4 6 12]
   n    % Number of elements.
        % Stack:
        %   6
        %   [1 2 3 4 6 12]
    2/  % Divide by 2
        % Stack:
        %   3
        %   [1 2 3 4 6 12]
      ) % Index (grab the 3rd element)
        % 3

これは、多くの幸運な偶然のおかげで機能します。

  1. MATLは1つのインデックスを使用します
  2. 非整数であれば、我々は、インデックス(これは任意の完璧な正方形の入力のために起こります)、その後、<n>)インデックス意志n

1
......まあ、私はしっかりと踏みにじられました!
ジュゼッペ

MATLでこれに答えたのはあなたでなければなりませんでした:-)
ルイスメンドー

ところで私はあなたがに短縮することができると思うZ\J2/)J2/またはインデックスとして使用.5jするend/2場合に同等に
略して

整数以外の値を持つ「インデックス」は明らかではないため、奇数の除数を持つ数値に適用した場合の動作を説明する価値があります。
カミルドラカリ

@KamilDrakariそれはどうですか?
DJMcMayhem

7

C(gcc) -lm、35バイト

i;f(n){for(i=sqrt(n);n%i;i--);n=i;}

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


2
ところで、これはGCC sqrtが組み込み関数として認識しているためにのみ機能します。で-fno-builtin-sqrt、gccはint sqrt(int)aを想定し、渡さないdouble。x86-64ではdouble、整数とは異なるレジスタで渡されます。32ビットでは、a doubleはスタックで2スロットを使用するため、ガベージ(または、32ビットがゼロの場合、仮数の底に整数を持つ非正規数)を渡すことにもなります。デバッグビルドを作成していない限り、これは壊れます。これは、戻り値レジスタ内の式を評価するgccのデフォルトの最適化されていないコード生成に依存しているためです。
ピーター

@PeterCordesはい、それはコードゴルフであり、医療機器ではありません:-)
cleblanc

まあ、私は偽のリターンハックのファンではありません。それはもはやCでさえなく、たまたまデフォルトである1つのコンパイラー設定を持つ実装の詳細です。(「少なくとも1つの実装で動作する必要がある」というルールを実際に拡張しています。)sqrt()問題は異なります。呼び出し元がに変換する方法intを何らかの方法で知っている必要があるため、どのように動作するのか興味がありましたdouble。他の誰かが興味を持った場合のために、私はその答えをコメントとして投稿しました。効果的にgccが持っているsqrt(試作品を含む)などを内蔵し、そうでない場合は、これは我々が時々 SO ASM Qsの中で見るの理由で失敗する
ピーター・コルド

i;f(n){for(i=0;++i<n/i||n%i;);}31Bで、で動作gcc -O用いx86-64では、(コマンドラインオプションの2つの又は3以上のバイトを原価計算。)に||代わりに|残すために、GCC原因n/iから結果をidiv(EAX、リターン値レジスタのgodbolt.org/g/RJYeui)。++iシーケンスポイントのないundefined-behaviourは、たまたま機能します。(生産ASMは基本的に同じである私のx86マシンコードの答え。)では-O0、gccが常に残しているようだiEAXに、多分私達はそれを使用することができます...
ピーターコルド

とにかく、C以外のgcc実装の詳細な回答が好きな人は、このx86-64 gccの回答が好きかもしれません(31 + 2バイト)
ピーター


5

APL(Dyalog Unicode)16 14 12バイト

私はそれを学んだばかりなので、APLでいくつかの答えを書くことができてうれしいです。ゴルフにご協力いただきありがとうございます。ゴルフの提案は大歓迎です。オンラインでお試しください!

APLの詳細については、APL Orchardをご覧ください。

編集: -2バイトでコードの問題を修正します。その問題を指摘してくれたH.PWizに感謝します。再びすべてを短縮することから-2バイト。

⌈/{⍳⌊⍵*÷2}∨⊢

アンゴルフ

⌈/{⍳⌊⍵*÷2}∨⊢
             GCD of the following...
               The right argument, our input.
  {⍳⌊⍵*÷2}
                 Our input.
      2         To the power of 1/2, i.e. square root.
                 Floor.
                 Indices up to floor(sqrt(input)).
                In total, range from 1 to floor(sqrt(input)).
⌈/            The maximum of the GCDs of our input with the above range.

なぜ逆順で取り消し線を引くのですか?...私はよく見ます--- 16 --- --- 14 --- 12ではなく12 --- 14 --- --- 16 ---。
user202729

@ user202729率直に言って、しばらく経ちましたが、取り消し線の順序をかなり忘れていました。間もなく修正します。
Sherlock9

実際には問題ではありません。リーダーボードスニペットは両方をサポートしています。
user202729



3

x86 32ビット(IA32)マシンコード:18 16バイト

変更ログ:n=1テストケースを正しく処理し、2バイトを保存して、EAXで返します。

n/i <= i(つまり、sqrtに到達するまで)カウントアップし、その後に最初の正確な除数を使用します。

これの64ビットバージョンは、x86-64 System V呼び出し規約を使用してCから呼び出し可能
int squarish_root_countup(int edi)です。

nasm -felf32 -l/dev/stdout squarish-root.asm

58                         DEF(squarish_root_countup)
59                             ; input: n in EDI
60                             ; output: EAX
61                             ; clobbers: eax,ecx,edx
62                         .start:
63 00000025 31C9               xor    ecx, ecx
64                         .loop:                    ; do{
65                         
66 00000027 41                 inc    ecx                ; ++i
67 00000028 89F8               mov    eax, edi
68 0000002A 99                 cdq
69 0000002B F7F9               idiv   ecx                ; edx=n%i    eax=n/i
70                         
71 0000002D 39C1               cmp    ecx, eax
72 0000002F 7CF6               jl     .loop          ; }while(i < n/i
73                                                   ;          || n%i != 0);  // checked below
74                             ; falls through for i >= sqrt(n)
75                             ; so quotient <= sqrt(n) if we get here
76                         
77                                                   ; test edx,edx / jnz  .loop
78 00000031 4A                 dec    edx            ; edx-1 is negative only if edx was zero to start with
79 00000032 7DF3               jge   .loop           ; }while(n%i >= 1);
80                             ; falls through for exact divisors
81                         
82                             ; return value = quotient in EAX
83                         
84 00000034 C3                 ret

           0x10 bytes = 16 bytes.

85 00000035 10             .size: db $ - .start

オンラインでお試しください!argv [1]の最初のバイトを整数として直接使用し、その結果をプロセスの終了ステータスとして使用するasm呼び出し元を使用します。

$ asm-link -m32 -Gd squarish-root.asm && 
for i in {0..2}{{0..9},{a..f}};do 
    printf "%d   " "0x$i"; ./squarish-root "$(printf '%b' '\x'$i)"; echo $?;
done

0   0  # bash: warning: command substitution: ignored null byte in input
1   1
2   1
3   1
4   2
5   1
6   2
7   1
8   2
9   3
10   0       # this is a testing glitch: bash ate the newline so we got an empty string.  Actual result is 2 for n=10
11   1
12   3
13   1
14   2
15   3
16   4
   ...

1
n = 1は1だけではありませんか?テストケースとしてリストされており、除数≤√1= 1です。
qwr

答えは1で機能するはずです。アルゴリズムで機能しない場合は、ハードコーディングする必要があります。
小麦ウィザード

2
@qwr:すべての入力で機能する短いバージョンに更新されました。
ピーター

2

Japt -h8 6バイト

â f§U¬

それを試してみてください

Oliverのおかげで2バイト節約


説明

           :Implicit input of integer U
â          :Divisors of U
  f        :Filter
   §       :  Less than or equal to
    U¬     :  Square root of U
           :Implicitly get the last element in the array and output it

フラグにはまだバイトがかかりませんか?
mbomb007

@ mbomb007いいえ。フラグの各インスタンスは新しい言語エントリと見なされます。
オリバー

気にしないで。私はまだそのメタ投稿を見ていなかったと思います。
mbomb007



2

雪だるま、38バイト

((}1vn2nD`#nPnF|:|NdE|;:,#NMo*|,;bW*))

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

((
  }        activate variables b, e, and g
  1vn2nD`  e=1/2
  #        retrieve the input into b
  nP       set b=b^e, which is sqrt(input)
  nF       floor the square root
  |        move b into g so there's space for a while loop
  :        body of the loop
    |NdE|  decrement the value in g
  ;:       loop condition
    ,#     assign b=input, e=current value
    NMo    store the modulo in g
    *|     discard the input value and place the modulo in the condition slot
    ,      put the current value back into g
  ;bW      continue looping while the modulo is nonzero
  *        return the result
))

2

dc、24

?dsnv1+[1-dlnr%0<m]dsmxp

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

説明:

?                         # read input
 d                        # duplicate
  sn                      # store copy 1 in register n
    v                     # take the square root of copy 2
     1+                   # add 1
       [          ]       # define macro to:
        1-                #   subtract 1
          d               #   duplicate
           ln             #   load from register n
             r            #   reverse top 2 stack members
              %           #   calculate modulo
               0<m        #   if not 0, recursively call macro m again
                   d      # duplicate macro
                    sm    # store copy 1 in register m
                      x   # execute copy 2
                       p  # print final value

2

J、24 19バイト

シャーロックのGCDアイデアのおかげで-5バイト

([:>./+.)1+i.@<.@%:

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

元の答え

([:{:]#~0=]|[)1+i.@<.@%:

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

解析済み

┌───────────────────────────────┬──────────────────────┐
│┌──┬──┬───────────────────────┐│┌─┬─┬────────────────┐│
││[:│{:│┌─┬─────┬─────────────┐│││1│+│┌─────────┬─┬──┐││
││  │  ││]│┌─┬─┐│┌─┬─┬───────┐││││ │ ││┌──┬─┬──┐│@│%:│││
││  │  ││ ││#│~│││0│=│┌─┬─┬─┐│││││ │ │││i.│@│<.││ │  │││
││  │  ││ │└─┴─┘││ │ ││]│|│[││││││ │ ││└──┴─┴──┘│ │  │││
││  │  ││ │     ││ │ │└─┴─┴─┘│││││ │ │└─────────┴─┴──┘││
││  │  ││ │     │└─┴─┴───────┘│││└─┴─┴────────────────┘│
││  │  │└─┴─────┴─────────────┘││                      │
│└──┴──┴───────────────────────┘│                      │
└───────────────────────────────┴──────────────────────┘

説明

  • 1 + i.@<.@%: 範囲を与える 1 .. floor(sqrt)
  • 動詞全体(A) Bがフックを形成し、上記の範囲は]Aに右引数として渡され、元の数値は左引数として渡され[ます。したがって...
  • ] | [ 元の引数に分割された範囲内の各アイテムの残りを提供します。
  • そして0 = ] | [、余りのない除数を与えます。
  • ] #~ ... その後、範囲のみをフィルタリングし、それらのみを残します。
  • そして{:、リストの最後の項目、つまり最大のものを提供します。




1

Forth(gforth)、53バ​​イト

最短の方法は、浮動小数点スタックとを使用するfsqrtことのようです。これなしで取得できる最短は、62バイトを使用/modして、商が除数より大きいかどうかを確認することでした。

: f dup s>f fsqrt f>s 1+ begin 1- 2dup mod 0= until ;

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

説明

  1. 平方根を計算する
  2. 平方根から始めて、元の数の係数が見つかるまで1ずつ減分します

コードの説明

: f                \ Start a word definition
dup                \ duplicate the input
s>f fsqrt          \ move the number to the float stack and get the square root
f>s                \ truncate result and move to integer stack
1+                 \ add 1 to the square root
begin              \ start indefinite loop
  1- 2dup          \ decrement divisor and duplicate input and divisor
  mod              \ calculate n % divisor
0= until           \ if result equals 0 (no remainder) end the loop
;                  \ end the word definition


1

Brain-Flak、144バイト

{({}{}<<>({}<>)<>([({})()]<>({}(<>)())){(<{}({}[()]{}<({}())>)>)}{}((({}<>)<>(({})))[({}[{}])])>[({<({}[()])><>({})<>}{}<><{}>)])}{}{}<>{}({}<>)

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

この答えが非常に良いかどうかはよくわかりません。このタスクを解決する良い方法があるかもしれませんが、私は十分に賢くはありません。

説明

答えの分解図を表示しようとしましたが、あまりにも多くの可動部分があり、あまり啓発的ではなかったので、ここでコードの機能の説明をします。

最初の重要なビットはこれです

({}<>)<>([({})()]<>({}(<>)())){(<{}({}[()]{}<({}())>)>)}{}

これは、スタックの2つの数値を取得し、それらが等しくない場合は2番目の数値を増分し、等しい場合は最初の数値を増分し、2番目の数値をゼロで置き換えます。このコードを何度も繰り返した場合、すべてのペアを取得しますバツy そのような バツy

次の部分は、wikiから変更を加えた乗算です。この乗算は、既存の値を破壊せずに保持するため、特別です。次のようになります:

((({}<>)<>(({})))[({}[{}])])({<({}[()])><>({})<>}{}<><{}>)

したがって、これらすべての順序付きペアを乗算しています。結果ごとに、入力と等しいかどうかを確認します。その場合、ペア内の小さいアイテムを終了して返します。





0

さび、71 70バイト

fn f(x:u64)->u64{let mut l=(x as f64).sqrt()as u64;while x%l>0{l-=1}l}

事前修正版

fn f(x: u64) -> u64 {                    // function takes u64, gives u64
  let mut l = (x as f64).sqrt() as u64;  // l takes integer'ed root value
  while x % l > 0 {                      // loop while l leaves remainder
    l -= 1                               // decrement
  }
  l                                      // return the found value
}

編集

  • > 0overでバイトを保存します!= 0。(@CatWizardに感謝)

!=に置き換えることができます>か?
小麦ウィザード

いいね!はい。
hunteke



0

Pyret、93バイト

{(z):rec f={(i,x):if num-modulo(i, x) == 0:x else:f(i,x - 1)end}
f(z,num-floor(num-sqrt(z)))}

オンラインのPyretエディターにコピーしてこれをオンラインで試すことができます!

上記は、匿名関数に評価されます。整数に適用されると、仕様に従って結果を返します。



0

このMathematica回答の移植版

ゼリー、11バイト

½ðḞ³÷Ċ³÷µÐL

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

これ(11バイト)も機能し、依存しません³

½Ḟ÷@Ċ÷@ʋƬµṪ

残念ながら½Ḟ÷@Ċ÷@ʋÐL(10バイト)は機能しません。そして、どうやらƬÐĿまったく同じではありません(リンクが二項の場合)


メソッド:(let n 入力する)

  • 上限から始めます =n 答えの a
  • 各ステップで:
    • もし 整数ではない場合、上限を設定できます (結果は整数でなければならないため)
    • もし n 整数ではない場合、 anannanan÷n
  • だから私たちは繰り返し置き換えます n÷n それが修正されるまで。

0

Java 8、65 54バイト

n->{int r=(int)Math.sqrt(n);for(;n%r>0;r--);return r;}

@huntekeのPython 3回答のポート。

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


古い65バイトの答え:

n->{int r=1,i=n;for(;i-->1;)r=n%i<1&n/i<=i&n/i>r?n/i:r;return r;}

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

説明:

n->{                // Method with integer as both parameter and return-type
  int r=1,          //  Result-integer, starting at 1
  i=n;for(;i-->1;)  //  Loop `i` in the range (n, 1]
    r=n%i<1         //   If `n` is divisible by `i`,
      &n/i<=i       //   and if `n` divided by `i` is smaller than or equal to `i` itself,
      &n/i>r?       //   and if `n` divided by `i` is larger than the current `r`
       n/i          //    Set `n` divided by `i` as the new result `r`
      :             //   Else:
       r;           //    Leave result `r` unchanged
  return r;}        //  Return the result `r`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.