ค้นหา Squarish Root


19

เขียนโค้ดที่เมื่อได้รับเป็นจำนวนบวกxเป็น input ออกผลลัพธ์เป็นตัวหารบวกที่ใหญ่ที่สุดของxน้อยกว่าหรือเท่ากับรากที่สองของxx

ในคำอื่น ๆ หาที่ใหญ่ที่สุดn>0เช่นนั้น

mn:mn=x

(มีอยู่mมากกว่าหรือเท่ากับnเช่นที่mครั้งnคือx )


ตัวอย่างเช่นถ้าใส่ได้12ตัวหารเป็น1 , 2 , 3 , 4 , 6และ12 1 , 2และ3ทั้งหมดคูณด้วยตัวเลขขนาดใหญ่ที่จะได้รับ12แต่3เป็นที่ใหญ่ที่สุดเพื่อให้เรากลับ3121231233


นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์น้อยกว่าซึ่งถือว่าเป็นคะแนนที่ดีกว่า

กรณีทดสอบ

(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
ฉันไม่เห็นว่าการปิดคำถามยอดนิยมในฐานะที่เป็นบทซ้ำของคำถามที่ไม่ได้ใช้งานเก่าช่วยเว็บไซต์ ... หากคุณสังเกตเห็นมันก่อนให้แน่ใจว่าไปข้างหน้าและค้อนมัน หากมีจำนวนคำตอบเป็นสองเท่าและมี upvotes มากกว่าคำตอบเดิม ให้มันและถ้ามีอะไรที่ใกล้ชิดอีกคนหนึ่ง ...
สตีวีกริฟฟิ

@StewieGriffin ปัญหาเกี่ยวกับ "คำถามยอดนิยม" คือพวกเขากำลังใช้ HNQ ซึ่งอาจไม่ใช่สิ่งที่ดีมาก / ฉันไม่เห็นว่ามันเป็นอันตรายต่อเว็บไซต์ทั้งคุณสามารถย้ายคำตอบไปยังเว็บไซต์เก่าได้
user202729

5
HNQ อาจดึงดูดผู้ใช้ใหม่และนั่นเป็นสิ่งที่ดี (IMO)
Stewie Griffin

1
@qwr แต่แนวคิดหลักเหมือนกัน ความแตกต่างนั้นเล็กมาก วิธีการในแต่ละความท้าทายสามารถนำมาใช้สำหรับอีกวิธีหนึ่ง
user202729

1
@ Hand-E-Food ฉันไม่ได้อ้างว่าอันนี้แตกต่าง อันที่จริงฉันเชื่อว่าทั้งสองมีเนื้อหาเหมือนกัน เหตุผลของฉันสำหรับการปิดคำถามของคุณเหมือนกับในความคิดเห็นที่ด้านบนของเธรดคำถามนี้มีคำตอบเพิ่มเติม เมตาอยู่ที่นี่หากคุณต้องการถาม นอกจากนี้คุณยังอาจมีความสนใจในเรื่องนี้
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


10

Python3 , 49 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-=1→ในขณะที่lไม่เท่ากันแบ่งพร่องxl

การแก้ไข

  • พูดถึง Python3 ไม่ใช่ Python2
  • ใช้...//1เพื่อบันทึกสองไบต์ (ทศนิยมไม่เป็นไร! ขอบคุณ @Rod)

ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี! คุณสามารถบันทึกไม่กี่ไบต์โดยใช้input/ printแทนdef/ returnคุณยังสามารถแทนที่int(...)ด้วย...//1เพื่อบันทึกไบต์เพิ่มเติมตามที่คุณเห็นที่นี่
Rod

@ เร็วไม่ // 1 ตามที่ฉันตั้งใจได้กล่าวว่า Python3 (ถ้าทศนิยมไม่เป็นไรสำหรับเอาท์พุทซึ่งฉันไม่คิดอย่างนั้น) แต่สำหรับ Python2 ขอบคุณ!
hunteke

@ houkeke การแสดงผลทศนิยมทำได้ดีฉันไม่เห็นเหตุผลที่มันไม่ควรจะเป็น
ข้าวสาลีตัวช่วยสร้าง

มันจะสั้นลงด้วย "สำหรับ" แทนที่จะเป็น "ในขณะที่" เพื่อให้คุณสามารถกำหนดค่าในเงื่อนไขอาจหลีกเลี่ยงการกำหนด "l"?
Malady

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
...... ดีฉันได้รับการอุทานอย่างเด็ดขาด!
Giuseppe

ต้องเป็นคุณที่ตอบคำถามนี้ใน MATL :-)
Luis Mendo

BTW ฉันคิดว่าคุณสามารถร่นไปZ\J2/)( J2/หรือเท่ากัน.5jหมายถึงend/2เมื่อใช้เป็นดัชนี)
หลุยส์ Mendo

มันอาจคุ้มค่าที่จะอธิบายพฤติกรรมเมื่อนำไปใช้กับตัวเลขที่มีตัวหารจำนวนคี่เนื่องจาก "ดัชนี" ที่มีค่าที่ไม่ใช่จำนวนเต็มไม่ชัดเจน
Kamil Drakari

@KamilDrakari เป็นไงบ้าง?
DJMcMayhem

7

C (gcc) -lm , 35 ไบต์

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

ลองออนไลน์!


2
BTW ใช้งานได้เพียงเพราะการรับรู้ของ GCC sqrtว่าเป็นฟังก์ชันในตัว ด้วย-fno-builtin-sqrt, gcc อนุมานและไม่ผ่านint sqrt(int) doubleบน x86-64 doubleถูกส่งผ่านในรีจิสเตอร์ที่แตกต่างจากจำนวนเต็ม ใน 32 บิต a doubleจะใช้ 2 ช่องบนสแต็กดังนั้นคุณจะต้องผ่านการทิ้งขยะ (หรือ subnormal ที่มีจำนวนเต็มเป็นด้านล่างของ mantissa ถ้า32 บิตด้านบนเป็นศูนย์) สิ่งนี้จะหยุดพักเว้นแต่ว่าคุณกำลังสร้างการดีบักเนื่องจากอาศัยการเข้ารหัสที่ไม่ได้รับการเพิ่มประสิทธิภาพเริ่มต้นของ gcc ในการประเมินนิพจน์ในการลงทะเบียนค่าส่งคืน
Peter Cordes

@PeterCordes ใช่มันกอล์ฟรหัสไม่ได้เป็นอุปกรณ์ทางการแพทย์ :-)
cleblanc

ฉันไม่ใช่แฟนของแฮ็คที่กลับมาหลอก นั่นไม่ใช่แม้แต่ C อีกต่อไปมันเป็นเพียงรายละเอียดการนำไปใช้งานด้วยการตั้งค่าคอมไพเลอร์เดียวซึ่งเป็นค่าเริ่มต้น (จริงๆแล้วมันยืดกฎ "ต้องทำงานอย่างน้อยหนึ่งการใช้งาน") sqrt()ปัญหาแตกต่างกัน: ฉันอยากรู้ว่ามันทำงานอย่างไรเพราะผู้โทรต้องรู้ว่าจะแปลงintเป็นdoubleอย่างไร ฉันโพสต์คำตอบว่าเป็นความคิดเห็นในกรณีที่คนอื่นอยากรู้ gcc อย่างมีประสิทธิภาพมีsqrt(รวมถึงต้นแบบ) เป็นตัวในตัวมิฉะนั้นสิ่งนี้จะล้มเหลวด้วยเหตุผลบางครั้งที่เราเห็นใน SO Asm Qs
Peter Cordes

i;f(n){for(i=0;++i<n/i||n%i;);}คือ 31B และทำงานร่วมกับgcc -Ox86-64 (การคิดต้นทุน 2 หรือ 3 ไบต์เพิ่มเติมสำหรับตัวเลือกบรรทัดคำสั่ง) การใช้||แทน|สาเหตุ gcc จะปล่อยn/iผลลัพธ์จากidivใน EAX การลงทะเบียนมูลค่าส่งคืน ( godbolt.org/g/RJYeui ) พฤติกรรมที่ไม่ได้กำหนดจาก++iโดยไม่มีจุดต่อเนื่องเกิดขึ้นกับการทำงาน (asm ที่ผลิตนั้นเป็นแบบเดียวกับคำตอบรหัสเครื่องของฉัน x86 ) ด้วย-O0gcc ดูเหมือนจะออกจากiEAX เสมอ แต่บางทีเราสามารถใช้มันได้ ...
Peter Cordes

อย่างไรก็ตามถ้าคุณชอบคำตอบในการติดตั้ง gcc ที่ไม่ใช่ C คุณอาจต้องการคำตอบ x86-64 gcc ที่เกิดขึ้นเนื่องจาก asm ที่คอมไพเลอร์สร้างขึ้นเพื่อพฤติกรรมที่ไม่ได้กำหนดไว้อย่างชัดเจน: ลองออนไลน์! (31 + 2 ไบต์)
Peter Cordes


5

APL (Dyalog Unicode) , 16 14 12 ไบต์

ฉันดีใจที่ฉันสามารถเขียนคำตอบใน APL เนื่องจากฉันเพิ่งเรียนรู้ ขอบคุณAdámมากสำหรับความช่วยเหลือเกี่ยวกับการเล่นกอล์ฟ คำแนะนำการเล่นกอล์ฟยินดีอย่างมากลองออนไลน์!

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ APL, ดูที่APL ออชาร์ด

แก้ไข: -2 ไบต์เพื่อแก้ไขปัญหาเกี่ยวกับรหัสของฉัน ขอบคุณ H.PWiz ที่ชี้ให้เห็นปัญหานั้น -2 ไบต์จากการย่อทุกอย่างอีกครั้ง

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

Ungolfing

⌈/{⍳⌊⍵*÷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

4

Husk , 4 ไบต์

→←½Ḋ

ลองออนไลน์!

คำอธิบาย

→←½Ḋ
   Ḋ      Divisors of (implicit) input.
  ½       Bisect.
→←        Take the last element of the first half.


3

x86 รหัสเครื่อง 32 บิต (IA32): 18 16 ไบต์

changelog: จัดการn=1กรณีทดสอบอย่างถูกต้องบันทึก 2 ไบต์และส่งกลับใน EAX

นับจนถึง n/i <= i (เช่นเมื่อเราไปถึง sqrt) และใช้ตัวหารแรกที่แน่นอนหลังจากนั้น

เวอร์ชัน 64- บิตนี้สามารถเรียกได้จาก C พร้อมกับ x86-64 System V การเรียกประชุมเช่น
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

ลองออนไลน์! ด้วย asm caller ที่ใช้ไบต์แรกของ argv [1] เป็นจำนวนเต็มโดยตรงและใช้ผลลัพธ์เป็นสถานะทางออกของกระบวนการ

$ 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: อัปเดตด้วยเวอร์ชันที่สั้นกว่าซึ่งใช้งานได้กับอินพุตทั้งหมด
Peter Cordes

2

Japt -h, 8 6 ไบต์

â f§U¬

ลองมัน

บันทึก 2 ไบต์ขอบคุณOliver


คำอธิบาย

           :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 ไม่แต่ละอินสแตนซ์ของการตั้งค่าสถานะจะถือว่าเป็นรายการภาษาใหม่
Oliver

ไม่เป็นไร. ฉันเดาว่าฉันยังไม่เห็นเมตาโพสต์นั้น
mbomb007



2

Snowman , 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 ไบต์

-5 ไบต์ขอบคุณแนวคิด GCD ของ Sherlock

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

ลองออนไลน์!

คำตอบเดิม

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

ลองออนไลน์!

แจง

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

คำอธิบาย

  • 1 + i.@<.@%: ให้ช่วง 1 .. floor(sqrt)จะช่วยให้ช่วง
  • คำกริยาทั้ง(A) Bรูปเป็นตะขอโดยมีช่วงเหนือผ่านไปเป็น ARG ทางขวา]และหมายเลขเดิมส่งผ่านเป็น ARG ด้านซ้าย[และหมายเลขเดิมผ่านเป็นหาเรื่องซ้าย ดังนั้น...
  • ] | [ ให้ส่วนที่เหลือของแต่ละรายการในช่วงแบ่งออกเป็นหาเรื่องดั้งเดิม
  • และ 0 = ] | [ให้ divisors โดยไม่เหลือ
  • ] #~ ... จากนั้นกรองช่วงออกจากรายการเหล่านั้นเท่านั้น
  • และ{:ให้รายการสุดท้ายในรายการคือรายการที่ใหญ่ที่สุด


1

Haskell , 36 ไบต์

f x=[z|y<-[1..],z<-[1..y],y*z==x]!!0

ลองออนไลน์!

นี่คือคำตอบของฉันสำหรับความท้าทายนี้ สิ่งนี้ใช้ความเข้าใจในรายการเฉพาะเพื่อค้นหาคำตอบ ในรายการความเข้าใจของเราที่เราเลือกYจากรายการอนันต์[1..]ที่เป็นจำนวนเต็มบวกและเราเลือกZ[1..y]จากรายการ ซึ่งหมายความว่า(Y,Z) เป็นคู่ที่สั่งซื้อทั้งหมดเช่นนั้น YZ.

จากนั้นเราเลือกเฉพาะคู่เหล่านั้นเช่นนั้น YZ=xหมายถึงเราทำรายการของตัวเลขทั้งหมดที่คูณด้วย x. ตอนนี้เนื่องจากความเข้าใจของเราขึ้นอยู่กับY แล้ว Z นี่หมายความว่าคู่ของเราอยู่ในลำดับที่มากขึ้น Yหรือมากกว่ามีประโยชน์ตามลำดับจากมากไปน้อยของ Z.

ดังนั้นเพื่อให้ได้ขนาดที่ใหญ่ที่สุด Z พวกเรารับ Zเป็นขององค์ประกอบแรก นี่คือผลลัพธ์ของเรา



1

Forth (gforth) , 53 ไบต์

วิธีที่สั้นที่สุดดูเหมือนว่าจะใช้ stack point floating และfsqrtสั้นที่สุดที่ฉันจะได้รับหากไม่มี 62 bytes ใช้/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 bytes

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

Try it online!

I'm not really sure this answer is very good. I feel like there may be a nice way to solve this task however I'm just not clever enough.

Explanation

I tried to do an exploded view of the answer but there are so many moving parts it was not very enlightening, so here is an explanation of what the code does.

The first important bit is this

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

This takes the two numbers on top of the stack and if they are unequal increments the second one, if they are equal it increments the first one and replaces the second one with zero. If we repeat this code a bunch we will get all the pairs (x,y) such that xy.

The next part is multiplication, taken with modification from the wiki. This multiplication is special because it preserves the existing values without destroying them. It goes like:

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

So we are multiplying all these ordered pairs. For each result we check if it is equal to the input. If so we terminate and return the smaller item in the pair.





0

Rust, 71 70 bytes

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

Pre-uglified version

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
}

Edits

  • Save a byte with > 0 over != 0. (Thanks to @CatWizard)

Can != be replaced with >?
Wheat Wizard

Good call! Yes.
hunteke



0

Pyret, 93 bytes

{(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)))}

You can try this online by copying it into the online Pyret editor!

The above evaluates to an anonymous function. When it is applied to an integer, it returns a result according to the specification.



0

A port of this Mathematica answer.

Jelly, 11 bytes

½ðḞ³÷Ċ³÷µÐL

Try it online!

This (11 bytes) also works, and don't depend on ³:

½Ḟ÷@Ċ÷@ʋƬµṪ

Unfortunately ½Ḟ÷@Ċ÷@ʋÐL (10 bytes) doesn't work. And apparently Ƭ and ÐĿ is not exactly the same (when the link is dyadic)


Method: (let n be the input)

  • Start with an upper bound i=n of the answer a.
  • At each step:
    • If i is not an integer, then the upper bound can be made i (because the result must be an integer)
    • If ni is not an integer, then ainaninanian÷ni.
  • So we repeatedly replace i with n÷ni until it's fixed.

0

Java 8, 65 54 bytes

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

Port of @hunteke's Python 3 answer.

Try it online.


Old 65 bytes answer:

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

Try it online.

Explanation:

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.