ค้นหาหมายเลขที่ราบรื่นที่สุด


59

ความท้าทายของคุณคือการหาจำนวนที่ราบรื่นที่สุดในช่วงที่กำหนด ในคำอื่น ๆ หาจำนวนที่มีปัจจัยสำคัญที่สุดที่เล็กที่สุด

จำนวนเรียบเป็นหนึ่งที่มีปัจจัยสำคัญที่ใหญ่ที่สุดมีขนาดเล็ก ตัวเลขประเภทนี้มีประโยชน์สำหรับอัลกอริทึมการแปลงฟูริเยร์ที่รวดเร็วการเข้ารหัสและแอปพลิเคชันอื่น ๆ

ตัวอย่างเช่นในช่วงที่5, 6, 7, 8, 9, 108 เป็นจำนวนที่ราบรื่นที่สุดเพราะปัจจัยหลักที่ยิ่งใหญ่ที่สุดของ 8 คือ 2 ในขณะที่ตัวเลขอื่น ๆ ทั้งหมดมีปัจจัยหลักที่ 3 หรือมากกว่า

อินพุต:อินพุตจะเป็นจำนวนเต็มบวกสองตัวซึ่งกำหนดช่วง จำนวนเต็มต่ำสุดที่อนุญาตในช่วงคือ 2 คุณสามารถเลือกได้ว่าช่วงดังกล่าวจะรวมเฉพาะเอกสิทธิ์กึ่งกึ่งกลาง ฯลฯ ตราบใดที่สามารถระบุช่วงโดยพลการภายในขอบเขตของภาษาของคุณ คุณอาจใช้ตัวเลขผ่านฟังก์ชั่นอินพุต stdin อาร์กิวเมนต์บรรทัดคำสั่งหรือวิธีการอื่นใดที่เทียบเท่ากับภาษาของคุณ ไม่มีการเข้ารหัสข้อมูลพิเศษในอินพุต

เอาท์พุท:ส่งคืนพิมพ์หรือเทียบเท่าหนึ่งจำนวนเต็มในช่วงอินพุตที่ราบรื่นที่สุด (ปัจจัยที่น้อยที่สุด) การส่งคืนผลลัพธ์หลายรายการเป็นทางเลือก แต่ถ้าคุณเลือกที่จะทำผลลัพธ์ต้องคั่นอย่างชัดเจน รูปแบบเอาต์พุตดั้งเดิมนั้นใช้ได้สำหรับผลลัพธ์หลายรายการ

โปรดระบุในคำตอบของคุณว่าคุณรับเข้าและส่งออกอย่างไร

เกณฑ์การให้คะแนน:รหัสกอล์ฟ นับตามตัวอักษรหากเขียนเป็น ASCII หรือ 8 * bytes / 7 หากไม่ได้อยู่ใน ASCII

กรณีทดสอบ:

หมายเหตุ: เหล่านี้เป็นช่วงสไตล์ Python รวมถึงระดับต่ำสุด แต่ไม่ใช่ระดับสูง เปลี่ยนตามความเหมาะสมกับโปรแกรมของคุณ ผลลัพธ์เดียวเท่านั้นที่จำเป็น

smooth_range(5,11)
8
smooth_range(9,16)
9, 12
smooth_range(9,17)
16
smooth_range(157, 249)
162, 192, 216, 243
smooth_range(2001, 2014)
2002

มีการระบุช่วงเป็น (เริ่มต้น, ความยาว) แทนที่จะยอมรับ (เริ่มต้น, สิ้นสุด) หรือไม่?
CodesInChaos

1
@CodesInChaos แน่นอน มันอยู่ภายใต้อนุประโยค "หรืออะไรก็ตาม"
isaacg

3
ฉันไม่เห็นประเด็นในการลงโทษคำตอบที่ไม่ใช่ ASCII มันจะง่ายกว่าถ้านับจำนวนไบต์ในทุกกรณี
nyuszika7h

1
@ nyuszika7h Ascii มีขนาดเล็กกว่าไบต์อย่างมาก - ใช้เพียง 7 บิต ดังนั้นฉันแสดงว่าตัวละครตัวหนึ่งโดย 7 บิตและปรับขนาดภาษาอื่น ๆ ตามลำดับ อย่างไรก็ตามหากภาษานั้นไม่ใช่ ASCII แต่สามารถแพ็คอักขระทั้งหมดเป็น 7 บิตฉันจะไม่คิดค่าบริการเพิ่มเติม ดู J / K vs. APL tl; dr Bytes ง่ายขึ้น แต่ให้ APL และ อัล ข้อได้เปรียบที่ลึกซึ้ง แต่ไม่ยุติธรรม
isaacg

3
@isaacg คุณสนับสนุนให้มีการสร้างภาษาเทียมโดยใช้ชุดอักขระขนาดเล็ก ถ้าเราให้คะแนนชุดอักขระ 7 บิตแตกต่างจากชุดอักขระ 8 บิตใครบางคนสามารถแพ็คภาษาที่ทันสมัยที่สุดเป็น 6 บิต (64 ตัวอักษรทำให้เรา AZ, 0-9, ช่องว่างไม่กี่อัน, เครื่องหมายวรรคตอน 20 และเหลือน้อย) .
Sparr

คำตอบ:


99

CJam - 13

q~,>{mfW=}$0=

ลองที่http://cjam.aditsu.net/

อินพุต2001 2014
ตัวอย่าง: เอาต์พุตตัวอย่าง:2002

คำอธิบาย:

q~อ่านและประเมินค่าอินพุตผลักตัวเลข 2 ตัวบนสแต็ก (พูด min และ max)
,ทำให้ array [0 1 ... max-1] แบ่ง
>ส่วนของอาร์เรย์เริ่มต้นที่ min ทำให้เกิด [min ... max-1]
{…}$เรียงลำดับอาร์เรย์โดยใช้บล็อกเพื่อคำนวณคีย์การเรียงลำดับเพื่อ
mfรับอาร์เรย์พร้อมกับปัจจัยสำคัญทั้งหมดของตัวเลขเพื่อให้
W=ได้องค์ประกอบสุดท้ายของอาร์เรย์ (W = -1) จึงได้รับปัจจัยสำคัญที่ใหญ่ที่สุดที่จะใช้เป็น sorting key
0=จะได้รับองค์ประกอบแรกของอาร์เรย์ (เรียงลำดับ)


38
ฉันเดาว่านั่น
Eric Tressler

5
ฉันต้องการเพิ่มฟังก์ชั่นตัวประกอบให้เป็นพี ธ
isaacg

6
ภาษานี้เป็นเวทมนตร์
Brobin

8
นี่ใกล้เคียงกับการดึง HQ9 + s ** t เท่าที่จะทำได้โดยไม่ต้องกลายเป็นช่องโหว่ น่ากลัว!
Ingo Bürk

25
mfWมีคนแก้ไขมันใน 13 ตัวอักษรars. ຈل͜ຈ༽ ノ
internets teh ทำจาก catz

66

Regex ( . NET PCRE รส), 183 129 ไบต์

อย่าลองทำที่บ้าน!

นี่ไม่ใช่การแข่งขันเพื่อชัยชนะ แต่ Eric Tressler แนะนำให้แก้ปัญหานี้โดยไม่มีอะไรนอกจาก regex และฉันไม่สามารถต้านทานให้มันได้ สิ่งนี้อาจเป็นไปได้ใน PCRE เช่นกัน (และยิ่งสั้นลงดูด้านล่าง) แต่ฉันเลือก. NET เพราะโซลูชันของฉันต้องการ lookbehinds ความยาวโดยพลการ ไปเลย:

(?<=^(1+),.*)(?=\1)(?=((11+)(?=.*(?=\3$)(?!(11+?)\4+$))(?=\3+$)|(?!(11+)\5+$)1+))(?!.+(?=\1)(?:(?!\2)|(?=((11+)(?=.*(?=\7$)(?!(11+?)\8+$))(?=\7+$)|(?!(11+)\9+$)1+)).*(?=\2$)(?=\6)))1+

อินพุตถูกเข้ารหัสเป็นช่วงที่คั่นด้วยเครื่องหมายจุลภาคโดยรวมซึ่งตัวเลขทั้งสองจะได้รับในรูปแบบ unary โดยใช้1s การแข่งขันจะเป็นS1 ต่อท้ายซึ่งSเป็นจำนวนที่ราบรื่นที่สุดในช่วง ความสัมพันธ์จะขาดไปในจำนวนที่น้อยที่สุด

ดังนั้นตัวอย่างที่สองจากคำถามจะเป็นสตริงต่อไปนี้ (ขีดเส้นใต้การจับคู่)

111111111,1111111111111111
                 =========

มันขึ้นอยู่กับ (ตอนนี้ค่อนข้างเป็นที่รู้จักกันดี) นายกตรวจสอบ regex , รูปแบบที่ฝังอยู่ในนั้นมหันต์ 6 ครั้ง

นี่คือรุ่นที่ใช้การเว้นวรรคและข้อคิดเห็นสำหรับผู้ที่ต้องการทราบว่าเกิดอะไรขึ้น

# Note that the beginning of the match we're looking for is somewhere
# in the second part of the input.
(?<=^(1+),.*)          # Pick up the minimum range MIN in group 1
(?=\1)                 # Make sure there are at least MIN 1s ahead

                       # Now there will be N 1s ahead of the cursor
                       # where MIN <= N <= MAX.


(?=(                   # Find the largest prime factor of this number
                       # store it in group 2.
  (11+)                # Capture a potential prime factor P in group 3
  (?=                  # Check that it's prime
    .*(?=\3$)          # Move to a position where there are exactly 
                       # P 1s ahead
    (?!(11+?)\4+$)     # Check that the remaining 1s are not composite
  )
  (?=\3+$)             # Now check that P is a divisor of N.
|                      # This does not work for prime N, so we need a 
                       # separate check
  (?!(11+)\5+$)        # Make sure that N is prime.
  1+                   # Match N
))

(?!                    # Now we need to make sure that here is not 
                       # another (smaller) number M with a smaller 
                       # largest prime factor

  .+                   # Backtrack through all remaining positions
  (?=\1)               # Make sure there are still MIN 1s ahead

  (?:
    (?!\2)             # If M is itself less than P we fail 
                       # unconditionally.
  |                    # Else we compare the largest prime factors.
    (?=(               # This is the same as above, but it puts the
                       # prime factor Q in group 6.
      (11+)
      (?=
        .*(?=\7$)
        (?!(11+?)\8+$)
      )
      (?=\7+$)
    |
      (?!(11+)\9+$)
      1+
    ))
    .*(?=\2$)          # Move to a position where there are exactly 
                       # P 1s ahead
    (?=\6)             # Try to still match Q (which means that Q is
                       # less than P)
  )
)
1+                     # Grab all digits for the match

คุณสามารถทดสอบออนไลน์ได้มากกว่าที่นี่ อย่าลองอินพุตที่มีขนาดใหญ่เกินไป แต่ฉันไม่รับประกันเกี่ยวกับประสิทธิภาพของสัตว์ประหลาดตัวนี้

แก้ไข:

ฉันลงเอยพอร์ตนี้เพื่อ PCRE (ซึ่งต้องการเพียงสองขั้นตอน) และทำให้ regex สั้นลงเกือบหนึ่งในสาม นี่คือเวอร์ชั่นใหม่:

^(1+),.*?\K(?=\1)(?=((11+)(?=.*(?=\3$)(?!(11+?)\4+$))(?=\3+$)|(?!(11+)\5+$)1+))(?!.+(?=\1)(?:(?!\2)|(?=((?2))).*(?=\2$)(?=\6)))1+

นี่คือสิ่งเดียวกันโดยมีการเปลี่ยนแปลงสองอย่าง:

  • PCRE ไม่สนับสนุน lookbehind ความยาวโดยพลการ (ซึ่งฉันเคยได้รับMINในกลุ่ม1) อย่างไรก็ตามPCREจะสนับสนุน\Kซึ่งรีเซ็ตการเริ่มต้นของการจับคู่เป็นตำแหน่งเคอร์เซอร์ปัจจุบัน ดังนั้น(?<=^(1+),.*)จะกลายเป็น^(1+),.*?\Kซึ่งบันทึกสองไบต์แล้ว
  • การประหยัดที่แท้จริงมาจากคุณสมบัติการเรียกซ้ำของ PCRE ฉันไม่ได้ใช้การเรียกซ้ำ แต่คุณสามารถใช้(?n)เพื่อจับคู่กลุ่มnอีกครั้งคล้ายกับการเรียกรูทีนย่อย ตั้งแต่ regex (?2)เดิมที่มีรหัสสำหรับการหาจำนวนของปัจจัยสำคัญที่ใหญ่ที่สุดเป็นครั้งที่สองผมก็สามารถที่จะเข้ามาแทนที่กลุ่มทั้งคนที่สองด้วยง่าย

37
พระมารดาแห่งพระเจ้า
Newb

1
@ Timwi ฉันต้องตรวจสอบว่าปัจจัยสำคัญที่สุด (กลุ่ม3หรือ7) เป็นนายกจริง ๆ สิ่งนี้ต้องการให้มีสำเนาของปัจจัยอื่นหลังจากจับภาพครั้งแรกซึ่งจะไม่เกิดขึ้นสำหรับช่วงเวลา ในขณะที่ฉันทำงานกับมันใน. NET โดยใส่ lookbehind ไว้ที่นั่นเพื่อให้ฉันสามารถย้ายกลับเล็กน้อยสำหรับการตรวจสอบนี้เป็นไปไม่ได้ในรุ่น PCRE ที่สั้นลงเนื่องจากการขาด lookbehinds ความยาวตัวแปร อาจเป็นไปได้ที่จะตัดให้สั้นลง แต่ฉันไม่คิดว่าเพียงแค่เปลี่ยน+ไปใช้*งาน
Martin Ender

2
@MartinEnder สวัสดี! ฉันคิดว่าคุณใช้เวลานานกว่าความท้าทายนี้ แต่ฉันเพิ่งท่องเข้าไปเห็นทางออกของ regex และไม่สามารถช่วยได้ แต่ไม่สนใจคำเตือนของคุณที่ด้านบนสุดของโพสต์นี้ :) ฉันคิดว่ามันยากที่จะอ่านรหัสของคนอื่น ดังนั้นหลังจากดู regex ของคุณและสับสนฉันพยายามตั้งแต่เริ่มต้นและคิดสิ่งนี้: (.*),.*?\K(?=(..+)((?=((?(R)\6|\2))*$).*(?=\4$)(?!(..+)\5+$)))(?!.+(?=\1)(?=(..+)(?3)).*(?!\2)\6).+ 99 ไบต์ใน PCRE นอกจากนี้ฉันได้เจองานของคุณมากมายในเว็บไซต์นี้และฉันก็เป็นแฟนตัวยง: D รอคอยที่จะเข้าร่วมการต่อสู้ในอนาคต!
jaytea

1
ฉันกำลังเล่นรหัสกอล์ฟพร้อมกับความคิดเห็นนั้นดังนั้นฉันจะใส่ภาคผนวกที่นี่: คุณสามารถถอด 4b \4$ออกจาก lookahead และติดมันหลังจาก lookahead เชิงลบ แต่สิ่งนี้ส่งผลกระทบต่อประสิทธิภาพการทำงานอย่างรุนแรง (ทุกกลุ่มย่อยของตัวเลข <= \ 4 ถูกตรวจสอบเพื่อความสมบูรณ์มากกว่าเพียงแค่ 4 ตัวเอง) และล้มเหลวในอินพุตที่ยาวขึ้น
jaytea

1
@jaytea ขออภัยที่สละเวลากลับไปหาคุณในเรื่องนี้ เมื่อคุณเขียนเรื่องตั้งแต่เริ่มต้นฉันคิดว่าคุณควรโพสต์คำตอบแยกต่างหาก นั่นเป็นคะแนนที่ดีและคุณสมควรได้รับเครดิตสำหรับมัน :)
Martin Ender

16

Regex (รสชาติ PCRE), 66 (65🐌) ไบต์

แรงบันดาลใจจากการเห็นว่าทั้งMartin Enderและjaytea , อัจฉริยะสองคนของ regex เขียนโซลูชันของ regex ให้กับกอล์ฟรหัสนี้ฉันเขียนของตัวเองตั้งแต่เริ่มต้น การตรวจสอบเฉพาะนายกที่มีชื่อเสียงไม่ปรากฏที่ใดก็ได้ในโซลูชันของฉัน

อย่าอ่านสิ่งนี้หากคุณไม่ต้องการให้เวทมนตร์ Regex ของคุณเสียหาย หากคุณต้องการถ่ายภาพเพื่อหาเวทมนตร์นี้ด้วยตัวเองฉันขอแนะนำให้เริ่มต้นด้วยการแก้ปัญหาบางอย่างใน ECMAScript regex:

  1. จับคู่หมายเลขเฉพาะ (ถ้าคุณไม่คุ้นเคยกับการทำสิ่งนี้ใน regex)
  2. จับคู่พลังของ 2 (ถ้าคุณยังไม่ได้ทำ) หรือเพียงแค่ทำงานผ่านRegex Golfซึ่งรวมถึง Prime และ Powers ตรวจสอบให้แน่ใจว่าได้ทำทั้งชุดปัญหาคลาสสิกและ Teukon
  3. ค้นหาวิธีที่สั้นที่สุดในการจับคู่พลังของ N โดยที่ N เป็นค่าคงที่ (เช่นที่ระบุใน regex ไม่ใช่อินพุต) ซึ่งสามารถประกอบได้ (แต่ไม่จำเป็นต้องเป็น) ตัวอย่างเช่นจับคู่พลังของ 6

  4. ค้นหาวิธีการจับคู่พลัง Nth โดยที่ N มีค่าคงที่> = 2 ตัวอย่างเช่นจับคู่สี่เหลี่ยมที่สมบูรณ์แบบ (สำหรับวอร์มอัพจับคู่มหาอำนาจ )

  5. จับคู่คำชี้แจงการคูณที่ถูกต้อง ตรงกับตัวเลขสามเหลี่ยม

  6. จับคู่หมายเลขฟีโบนักชี (ถ้าคุณบ้าอย่างที่ฉันเป็น) หรือถ้าคุณต้องการที่จะยึดติดกับสิ่งที่สั้นกว่าให้จับคู่คำแถลงการยกกำลังที่ถูกต้อง (สำหรับการอุ่นเครื่อง โบนัสทำเช่นเดียวกันกับหมายเลขใด ๆ ปัดเศษตามที่คุณต้องการ) หรือตัวเลขแฟคทอเรียล (สำหรับวอร์มอัพจับคู่หมายเลขดั้งเดิม)

  7. จับคู่ตัวเลขมากมาย (ถ้าคุณบ้าเหมือนฉัน)

  8. คำนวณจำนวนอตรรกยะเพื่อความแม่นยำที่ร้องขอ (เช่นหารอินพุทด้วยสแควร์รูทของ 2 คืนผลลัพธ์การปัดเศษเป็นคู่)

(เอ็นจิ้น regex ที่ฉันเขียนอาจช่วยได้เนื่องจากมันเร็วมากที่เลขเอกภาพทางคณิตศาสตร์ regexes และรวมถึงโหมดตัวเลขแบบเอกนารีซึ่งสามารถทดสอบช่วงของตัวเลขธรรมชาติ ด้วยตัวคั่น) โดยค่าเริ่มต้นจะเป็น ECMAScript ที่เข้ากันได้ แต่มีส่วนขยายเพิ่มเติม (ซึ่งสามารถเลือกเพิ่มชุดย่อยของ PCRE หรือแม้แต่ lookahead โมเลกุลสิ่งที่ไม่มี regex engine อื่น))

ไม่เช่นนั้นอ่านต่อและอ่านGitHub Gist นี้ (คำเตือน, สปอยเลอร์จำนวนมาก) ซึ่งบันทึกการเดินทางของการผลัก ECMAScript regex เพื่อจัดการกับฟังก์ชั่นจำนวนธรรมชาติของการเพิ่มความยากลำบาก (เริ่มต้นด้วยชุดปริศนาของ Teukon การเดินทาง)

เช่นเดียวกับวิธีแก้ปัญหา regex อื่น ๆ สำหรับปัญหานี้อินพุตจะได้รับเป็นตัวเลขสองหลักในหน่วย bijective unary คั่นด้วยเครื่องหมายจุลภาคแทนช่วงที่ครอบคลุม ส่งคืนหมายเลขเดียวเท่านั้น regex สามารถแก้ไขได้เพื่อส่งกลับตัวเลขทั้งหมดที่ใช้ปัจจัยหลักที่เล็กที่สุดเหมือนกัน แต่เป็นการจับคู่ที่มีความยาวผันแปรและต้องใส่\Klookahead หรือส่งคืนผลลัพธ์เป็นการจับภาพแทนการจับคู่

เทคนิคที่ใช้ที่นี่ของการหารโดยนัยซ้ำ ๆ โดยปัจจัยหลักที่เล็กที่สุดนั้นเหมือนกับเทคนิคที่ใช้ในสตริงการแข่งขันที่มีความยาวคือคำตอบพลังงานที่สี่ที่ฉันโพสต์ในขณะที่กลับ

ไม่มีความกังวลใจเพิ่มเติม: ((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$

คุณสามารถลองได้ที่นี่

และเวอร์ชันฟรีที่มีระยะห่างพร้อมความคิดเห็น:

                        # No ^ anchor needed, because this algorithm always returns a
                        # match for valid input (in which the first number is less than
                        # or equal to the second number), and even in /g mode only one
                        # match can be returned. You can add an anchor to make it reject
                        # invalid ranges.

((.+).*),               # \1 = low end of range; \2 = conjectured number that is the
                        # smallest number in the set of the largest prime factor of each
                        # number in the range; note, it is only in subsequent tests that
                        # this is implicitly confined to being prime.
                        # We shall do the rest of our work inside the "high end of range"
                        # number.

(?!                     # Assert that there is no number in the range whose largest prime
                        # factor is smaller than \2.
  .*(?=\1)              # Cycle tail through all numbers in the range, starting with \1.

  (                     # Subroutine (?3):
                        # Find the largest prime factor of tail, and leave it in tail.
                        # It will both be evaluated here as-is, and later as an atomic
                        # subroutine call. As used here, it is not wrapped in an atomic
                        # group. Thus after the return from group 3, backtracking back
                        # into it can increase the value of tail – but this won't mess
                        # with the final result, because only making tail smaller could
                        # change a non-match into a match.

    (                   # Repeatedly divide tail by its smallest prime factor, leaving
                        # only the largest prime factor at the end.

      (?=(..+)(\5+$))   # \6 = tool to make tail = \5 = largest nontrivial factor of
                        # current tail, which is implicitly the result of dividing it
                        # by its smallest prime factor.
      \6                # tail = \5
    )*
  )
  (?!\2)                # matches iff tail < \ 2
)

# now, pick a number in the range whose largest prime factor is \2
.*(?=\1)                # Cycle tail through all numbers in the range, starting with \1.
\K                      # Set us up to return tail as the match.
(?3)                    # tail = largest prime factor of tail
\2$                     # Match iff tail == \2, then return the number whose largest
                        # prime factor is \2 as the match.

อัลกอริทึมสามารถย้ายไปยัง ECMAScript ได้ง่ายโดยแทนที่การเรียกรูทีนย่อยด้วยสำเนาของรูทีนย่อยและส่งคืนการจับคู่เป็นกลุ่มการจับภาพแทนการใช้ \ K ผลลัพธ์คือความยาว 80 ไบต์:

((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)

ลองออนไลน์!

โปรดทราบว่า((.+).*)สามารถเปลี่ยนเป็น((.+)+)ลดขนาดได้ 1 ไบต์ (จาก 66 เป็น65 ไบต์ ) โดยไม่สูญเสียฟังก์ชันการทำงานที่ถูกต้อง แต่ regex จะขยายตัวอย่างช้าๆแบบช้า

ลองออนไลน์! (79 รุ่น ECMAScript exponential-slowdown version)


11

Python 2, 95

i=input()
for a in range(*i):
 s=a;p=2
 while~-a:b=a%p<1;p+=1-b;a/=p**b
 if p<i:i=p;j=s                                        
print j

ค้นหาความนุ่มนวลของตัวเลขโดยการหารทดลองจนกระทั่งจำนวนคือ 1 iเก็บความเรียบที่เล็กที่สุดจนถึงjจำนวนที่ให้ความเรียบนั้น

ขอบคุณ @xnor สำหรับการเล่นกอล์ฟ


1
ที่if/elseจะต้องมีการย่อให้สั้น b=a%p<1;p+=1-b;a/=p**bความคิดแรกของฉันคือ หรือผู้บริหารที่เรียกใช้หนึ่งในสองในสตริง interleaved นอกจากนี้อาจใช้while~-aงานได้
xnor

isaacg - ฉันรักคำตอบนี้! ช่างเป็นวิธีที่ยอดเยี่ยมที่คุณค้นพบเพื่อค้นหาตัวประกอบที่สำคัญที่สุด! ฉันได้อัปเดตคำตอบเพื่อขอยืมวิธีการของคุณแล้วและมอบเครดิตให้คุณในวิธีการนี้
ทอดด์เลห์แมน

สุดยอดทางออก! การใช้s,p=a,2, i,j=p,sความคิด, @ XNOR ของลบเยื้องซ้ำซ้อนและการวางบล็อกขณะที่เป็นหนึ่งเส้นอัตราผลตอบแทน 95 ตัวอักษร ไม่แน่ใจว่าคุณเกิดมากับ 98 ... ได้อย่างไร
Falko

รหัสนี้เต็มรูปแบบของอีโมติคอน :)
โรเซนธาล

@Falko การเปลี่ยนแปลงทั้งสองนี้ไม่มีการบันทึกอักขระ 7-> 7
isaacg

10

J, 22 20 19 ตัวอักษร

({.@/:{:@q:)@(}.i.)

เช่น

   2001 ({.@/: {:@q:)@(}. i.) 2014
2002

(ฟังก์ชั่นที่รับสองอาร์กิวเมนต์คือใส่ใน J)


ฉันยังมีรอยแตกที่มันไม่ได้สั้นเท่ากับคำตอบนี้ ยัง:(#~ (= <./)@:(i:"1&1)@:*@:(_&q:))@:([ + i.@-~)
Augıʇǝɥʇuʎs

นี่{:คือเหมือนกัน>./และบันทึก 1 ไบต์
Randomra

@randomra คุณพูดถูก - โทรได้ดี!
FireFly

สวย. TIO หากคุณต้องการเพิ่ม: ลองออนไลน์!
โยนาห์

9

Haskell, 96 94 93 86 80 ตัวอักษร

x%y|x<2=y|mod x y<1=div x y%y|0<1=x%(y+1)
a#b=snd$minimum$map(\x->(x%2,x))[a..b]

การใช้งานผ่าน GHCi (เชลล์ Haskell):

>5 # 9
8
>9 # 15
9

แก้ไข:ตอนนี้เป็นอัลกอริทึมที่ง่ายกว่ามาก

วิธีนี้รวมถึงตัวเลขทั้งสองในช่วง (ดังนั้น8 # 9และ7 # 8ทั้งคู่คือ 8)

คำอธิบาย:

ฟังก์ชัน (%) รับพารามิเตอร์สองตัวคือ x และ y เมื่อ y เป็น 2 ฟังก์ชันจะคืนค่าความเรียบของ x

อัลกอริทึมจากที่นี่ง่าย - รับรายการรวมของความเรียบของตัวเลขทั้งหมดในการป้อนข้อมูลด้วยความเรียบแต่ละการจัดเก็บการอ้างอิงไปยังหมายเลขเดิมของมันเรียงลำดับแล้วจะได้รับที่เล็กที่สุดและกลับมาเป็นหมายเลขอ้างอิง


นี่คือเวอร์ชันจาวาสคริปต์ที่ไม่ได้บรรจุด้วยอัลกอริทึมเดียวกัน:

function smoothness(n,p)
{
    p = p || 2
    if (x == 1)
        return p
    if (x % p == 0)
        return smoothness(x/p, p)
    else
        return smoothness(x,p+1);
}
function smoothnessRange(a, b)
{
    var minSmoothness = smoothness(a);
    var min=a;
    for(var i=a+1;i <= b;i++)
        if(minSmoothness > smoothness(i))
        {
            minSmoothness = smoothness(i)
            min = i
        }
    return min;
}

เป็นไปได้ไหมที่จะใช้นามแฝงน้อยที่สุดกับบางสิ่งที่สั้นกว่านี้? ดูเหมือนว่ามันจะบันทึกตัวละครบางตัว
isaacg

ฉันลองมัน แต่เนื่องจากข้อ จำกัด monomorphism จริง ๆ แล้วมันมีค่าใช้จ่ายตัวละครตัวหนึ่ง
ภูมิใจ haskeller

คุณไม่สามารถทำได้ m = ขั้นต่ำ? Haskell ยังคงเป็นปริศนา
isaacg

1
@isaacg เพื่อหลีกเลี่ยงข้อ จำกัด monomorphism อย่างใดอย่างหนึ่งจะต้องเขียนm l=minimum l
ภูมิใจ haskeller

2
ฉันกำลังจะโพสต์วิธีการแก้ปัญหา Haskell จนกว่าฉันจะเห็นคุณที่เต้นแม้รุ่นที่ไม่สมบูรณ์ของฉัน ... +1
nyuszika7h

9

Mathematica, 61 45 39 ตัวละคร

Range@##~MinimalBy~Last@*FactorInteger&

การใช้งาน spec อย่างตรงไปตรงมาเป็นฟังก์ชั่นที่ไม่มีชื่อ

  • รับช่วง (รวม)
  • ตัวคูณจำนวนเต็มทั้งหมด
  • ค้นหาขั้นต่ำเรียงตามปัจจัยหลักที่ใหญ่ที่สุด

8

Lua - 166 ตัวอักษร

ฉันไม่ได้ไม่ได้ (ยัง) ชื่อเสียงพอที่จะแสดงความคิดเห็นในการแก้ปัญหาของ AndoDaanแต่ที่นี่มีการปรับปรุงบางอย่างเกี่ยวกับรหัสของเขา

a,b=io.read("*n","*n")s=b for i=a,b do f={}n=i d=2 while n>1 do while n%d<1 do f[#f+1]=d n=n/d end d=d+1 end p=math.max(unpack(f))if p<s then s=p c=i end end print(c)

การเปลี่ยนแปลง:

  • n%d==0โดยn%d<1ซึ่งเทียบเท่าในกรณีนี้
  • ลบช่องว่าง
  • แทนที่table.insert(f,d)ด้วยf[#f+1]=d ( #fคือจำนวนองค์ประกอบของ f)

อ่าดีใจที่ได้เห็นที่นี่ อ่าสองคนแรกที่ฉันควรจะตรวจสอบและจับได้ แต่การปรับปรุงครั้งที่สามของคุณนั้นใหม่สำหรับฉัน (ฉันหมายถึงแตกต่างจากที่ฉันคุ้นเคย) นั่นจะช่วยฉันได้มากที่นี่และหลายครั้งที่ golf.shinh.com ขอบคุณ!
AndoDaan

8

Bash + coreutils, 56 ไบต์

seq $@|factor|sed 's/:.* / /'|sort -nk2|sed '1s/ .*//;q'

อินพุตมาจากอาร์กิวเมนต์บรรทัดคำสั่งสองข้อ (ขอบคุณ @ nyuszika7h !!!) เอาต์พุตเป็นผลลัพธ์เอกพจน์ที่พิมพ์ไปยัง STDOUT

  • seq จัดเตรียมช่วงของตัวเลขหนึ่งตัวต่อบรรทัดจากอาร์กิวเมนต์บรรทัดรับคำสั่ง
  • factorอ่านตัวเลขเหล่านั้นและส่งออกแต่ละหมายเลขตามด้วยเครื่องหมายจุดคู่และรายการที่เรียงลำดับของปัจจัยหลักของตัวเลข ดังนั้นปัจจัยสำคัญที่สุดคือตอนท้ายของแต่ละบรรทัด
  • ตัวแรกsedจะลบเครื่องหมายโคลอนและทั้งหมดยกเว้นตัวประกอบนายกตัวสุดท้าย / ตัวที่ใหญ่ที่สุดดังนั้นจึงทิ้งรายการของแต่ละหมายเลข (คอลัมน์ 1) และตัวประกอบตัวที่ใหญ่ที่สุด (คอลัมน์ 2)
  • sort ตัวเลขในลำดับที่เพิ่มขึ้นโดยคอลัมน์ 2
  • การsedจับคู่สุดท้ายบรรทัดที่ 1 (หมายเลขที่มีตัวประกอบสำคัญที่สุดมีขนาดเล็กที่สุดในรายการ) ลบทุกอย่างรวมถึงและหลังช่องว่างแรกจากนั้นออก sedพิมพ์ผลลัพธ์ของการทดแทนนี้โดยอัตโนมัติก่อนที่จะออก

เอาท์พุท:

$ ./smooth.sh 9 15
12
$ ./smooth.sh 9 16
16
$ ./smooth.sh 157 249
162
$ ./smooth.sh 2001 2014
2002
$ 

ช่วงหมายเหตุในบริบทนี้รวมถึงจุดปลายทั้งสอง


1
seq $@สั้นลง 3 ไบต์หากคุณสามารถสันนิษฐานได้ว่ามีเพียงสองอาร์กิวเมนต์เท่านั้น
nyuszika7h

@ nyuszika7h ความคิดที่ดี - ขอบคุณ!
บาดเจ็บทางดิจิตอล

5

Python 2, 67

f=lambda R,F=1,i=2:[n for n in range(*R)if F**n%n<1]or f(R,F*i,i+1)

การคิดเกี่ยวกับกอล์ฟอื่นทำให้ฉันมีความคิดสำหรับอัลกอริธึมใหม่ในการตรวจสอบความนุ่มนวลดังนั้นคำตอบที่ล่าช้า

ตัวประกอบที่สำคัญของปัจจัยรวมถึงว่าช่วงเวลาที่มากที่สุดi! iดังนั้นถ้าnเป็นผลิตภัณฑ์ของช่วงเวลาที่แตกต่างกัน, ความเรียบเนียนของมัน (ปัจจัยสำคัญที่ใหญ่ที่สุด) เป็นที่เล็กที่สุดiที่เป็นตัวหารของn i!การบัญชีสำหรับปัจจัยสำคัญในการทำซ้ำที่เราสามารถใช้แทนพลังงานที่สูงพอn i!โดยเฉพาะอย่างยิ่ง(i!)**nพอเพียง

รหัสพยายามเพิ่มแฟกทอเรียลF=i!อัปเดตซ้ำ เรากรองตัวหารของFในช่วงอินพุตและส่งออกหากมีและย้ายไปที่(i+1)!อื่น

กรณีทดสอบ:

>> f([157, 249])
[162, 192, 216, 243]

4

C,  149   95

แก้ไขคำตอบ:

ฉันไม่สามารถรับเครดิตสำหรับโซลูชันนี้ คำตอบที่อัปเดตนี้ยืมวิธีที่สวยงามที่ใช้โดยisaacgในโซลูชัน Python ของเขา ฉันต้องการดูว่ามันเป็นไปได้ที่จะเขียนมันใน C เป็นแบบซ้อนfor/ whileวนโดยไม่มีเครื่องหมายปีกกาหรือไม่และเป็น!

R(a,b,n,q,p,m){for(;a<b;m=p<q?a:m,q=p<q?p:q,n=++a,p=2)while(n>1)if(n%p)p++;else n/=p;return m;}

คำอธิบาย:

  • ฟังก์ชั่นR(a,b,n,q,p,m)สแกนช่วงaไปb-1และกลับจำนวนนุ่มนวลแรกที่พบ การภาวนาต้องยึดมั่นในรูปแบบดังต่อไปนี้เพื่อให้ตัวแปรภายในฟังก์ชันที่มีการเริ่มต้นได้อย่างมีประสิทธิภาพดังนี้R(a,b,a,b,2,0)n=a;q=b;p=2;m=0;

คำตอบเดิม :

นี่คือคำตอบเดิมของฉัน ...

P(n,f,p){for(;++f<n;)p=p&&n%f;return p;}
G(n,f){for(;--f>1;)if(n%f==0&&P(f,1,1))return f;}
R(a,b,p,n){for(;++p;)for(n=a;n<b;n++)if(G(n,n)==p)return n;}

คำอธิบาย:

  • ฟังก์ชันP(n,f,p)ทดสอบค่าnสำหรับค่าดั้งเดิมและส่งกลับค่าจริง (ไม่ใช่ศูนย์) ถ้าnเป็นค่าเริ่มต้นหรือเท็จ (ศูนย์) ถ้าnไม่ใช่ค่าเฉพาะ fและpทั้งสองจะต้องผ่านเป็น 1
  • ฟังก์ชั่นส่งกลับปัจจัยสำคัญที่ยิ่งใหญ่ที่สุดของG(n,f) จะต้องผ่านการเป็นnfn
  • ฟังก์ชั่นR(a,b,p,n)สแกนช่วงaไปb-1และกลับจำนวนนุ่มนวลแรกที่พบ pจะต้องผ่านเป็น 1. nสามารถเป็นค่าใด ๆ

ไดรเวอร์ทดสอบ:

test(a,b){printf("smooth_range(%d, %d)\n%d\n",a,b,S(a,b,1,0));}
main(){test(5,11);test(9,16);test(9,17);test(157,249);test(2001,2014);}

เอาท์พุท:

smooth_range(5, 11)
8
smooth_range(9, 16)
9
smooth_range(9, 17)
16
smooth_range(157, 249)
162
smooth_range(2001, 2014)
2002

ฉันจะเถียงว่านี่เป็นข้อผิดพลาดของ "ไม่มีการเข้ารหัสข้อมูลพิเศษในอินพุต"
เล่นแร่แปรธาตุ

@Alchymist - คุณอาจจะถูก ... แต่ฉันไม่คิดว่าจะมีข้อมูลเพิ่มเติมที่แท้จริงในการหลอกหลอก อย่างน้อยก็ไม่มีข้อมูลใด ๆ ที่เป็นเงื่อนงำใด ๆ ที่เป็นคำตอบ
ทอดด์เลห์แมน

4

Haskell - 120

import Data.List
import Data.Ord
x!y=(minimumBy(comparing(%2)))[x..y]
x%y|x<y=y|x`mod`y==0=(x`div`y)%y|otherwise=x%(y+1)

ตัวอย่างการใช้งาน:

> 5 ! 10
8
> 9 ! 15
9
> 9 ! 16
16
> 157 ! 248
162
> 2001 ! 2013
2002

1
คุณไม่สามารถใช้<1แทนได้==0หรือ
dfeuer

ใช่ว่าจะเป็นการปรับปรุงที่ดี มีสิ่งเล็ก ๆ น้อย ๆ มากมายที่สามารถทำได้ดีกว่านี้ โชคดีที่คำตอบนี้ได้ทำทั้งหมดแล้ว: codegolf.stackexchange.com/a/36461
Taylor Fausak

4

Q, 91 ตัวอักษร K, 78 ตัวอักษร

{(x+{where x=min x}{(-2#{x div 2+(where 0=x mod 2_til x)@0}\[{x>0};x])@0}'[(x)_til y+1])@0}

k อาจจะโกนตัวละครโหล

แก้ไข: แน่นอนรักษาขอบเขตบนเป็นไม่รวมในเวลานี้

{*:x+{&:x=min x}{*:-2#{6h$x%2+*:&:x={y*6h$x%y}[x]'[2_!x]}\[{x>0};x]}'[(x)_!y]}

4

หมายเหตุ: คำตอบนี้ไม่ได้รับอนุญาต

คำตอบนี้ใช้คุณสมบัติหลายอย่างของ Pyth เพิ่มหลังจากถามความท้าทาย

ฉันได้เพิ่มคุณสมบัติใหม่อีกอันหนึ่งเรียกช่วงเอกภาพบน 2 องค์ประกอบทูเปิลซึ่งทำให้การแก้ปัญหาสั้นลงด้วยอักขระสองตัว:

Pyth , 7

hoePNUQ

ตอนนี้อินพุทถูกแยกด้วยเครื่องหมายจุลภาค ที่เหลือก็เหมือนกัน


คำตอบนี้ใช้คุณสมบัติของ Pyth ซึ่งถูกเพิ่มเข้ามาหลังจากถามคำถามนี้โดยเฉพาะหลังจากเห็นโซลูชัน CJam ที่ยอดเยี่ยมของ @ aditsu ที่ถูกกล่าวว่าฉันต้องการที่จะแสดงให้เห็นถึงสิ่งที่เพิ่มคุณสมบัติที่ทำไปได้ คุณลักษณะคือPซึ่งเป็นฟังก์ชั่น arity-1 ซึ่งอินพุตจำนวนเต็มจะส่งกลับรายการของปัจจัยหลักทั้งหมดของอินพุตซึ่งเรียงลำดับน้อยที่สุดไปหามากที่สุด

Pyth , 9

hoePNrQvw

ใช้ช่วงสไตล์ Python บรรทัดใหม่คั่นด้วย STDIN เอาต์พุตโซลูชันที่เล็กที่สุดไปยัง STDOUT

คำอธิบาย:

      Q = eval(input())                         Implicit, because Q is present.
h     head(                                     First element of
 o         order_by(                            Sort, using lambda expression as key.
                    lambda N:                   Implicit in o
  e                          end(               Last element of
   PN                            pfact(N)),     List containing all prime factors of N.
  r                 range(                      Python-style range, lower inc, upper exc.
   Q                      Q,                    A variable, initialized as shown above.
   vw                     eval(input()))))      The second entry of the range, same way.

แบบทดสอบ:

$ newline='
'

$ echo "9${newline}16" | ./pyth.py -c 'hoePNrQvw'
9

$ echo "9${newline}17" | ./pyth.py -c 'hoePNrQvw'
16

$ echo "157${newline}249" | ./pyth.py -c 'hoePNrQvw'
162

$ echo "2001${newline}2014" | ./pyth.py -c 'hoePNrQvw'
2002

@ MartinBüttner Yep ตามที่เสนอโดยความเห็นของเขาเกี่ยวกับการแก้ปัญหา
CJam

@ MartinBüttnerใช่แล้ว P เป็นคุณสมบัติใหม่ ฉันจะตอบคำถามนั้น
isaacg

1
อนุญาตหรือไม่ไม่เพียง แต่ฉันชอบ แต่ฉันยังคิดว่า "มาโคร" สั้น ๆ นั้นสามารถอ่านได้ถ้าคุณให้ความสนใจ - พวกมันเปลี่ยนเป็น Python ที่ตรงไปตรงมา มีบางสิ่งที่ต้องพูดสำหรับภาษากอล์ฟที่ดีสำหรับการเล่นกอล์ฟ แต่ไม่จำเป็นต้องทำให้งงงวย
Kuba Ober

@ KubaOber ขอบคุณ Kuba นั่นคือความตั้งใจของฉันในการเขียน Pyth เสมอเพื่อทำให้มันเป็นกอล์ฟและสามารถอ่านได้มากที่สุด ฉันดีใจที่มันทำงาน
isaacg

3

Lua - 176 ตัวอักษร

a,b=io.read("*n","*n")s=b for i=a,b do f={}n=i d=2 while n>1 do while n%d==0 do table.insert(f, d)n=n/d end d=d+1 end p=math.max(unpack(f))if p<s then s=p c=i end end print(c)

ฉันควรหยุดเล่นกอล์ฟที่ Lua จริงๆ ไม่มีประเด็น


14
IMHO รหัสการเล่นกอล์ฟเหมือนมวย: มีคลาสน้ำหนัก ภาษาที่กำหนดอาจไม่ชนะทันที แต่มันก็สนุกและให้ความกระจ่างกับการเล่นกอล์ฟในชั้นเรียน / ภาษานั้น
Michael Easter

3

Clojure - 173 170 ตัวอักษร

ฉันเป็นมือใหม่ Clojure แข็งแรงเล่นกอล์ฟ:

(defn g[x,d](if(and(= 0(mod x d))(.isProbablePrime(biginteger d) 1))d 0))(defn f[i](apply max-key(partial g i)(range 2(inc i))))(defn s[a,b](first(sort-by f(range a b))))

ตัวอย่างการวิ่ง:

ช่วง ได้แก่ low-end, ยกเว้น high-end: [a, b) พิมพ์เฉพาะตัวเลขที่ราบรื่นที่สุดหากเกิดขึ้นหลายครั้ง

(println (s 5 11))
(println (s 9 16))
(println (s 9 17))
(println (s 157, 249))
(println (s 2001, 2014))

อัตราผลตอบแทน:

bash$ java -jar clojure-1.6.0.jar range.clj
8
9
16
192
2002

Ungolfed:

(defn g [x,d] (if (and (= 0(mod x d)) (.isProbablePrime (biginteger d) 1)) d 0))
(defn f [i] (apply max-key (partial g i) (range 2 (inc i))))
(defn s [a,b] (first (sort-by f (range a b))))

1
ช่วงที่มีค่าต่ำสุดและไม่รวมค่าสูงสุดจะเขียนเป็น [a, b)
murgatroid99

อ๋อขอบคุณสำหรับบันทึก
Michael Easter

3

ทับทิม, 65 62

require'prime'
s=->a,b{(a..b).min_by{|x|x.prime_division[-1]}}

ด้วยการขอโทษที่https://codegolf.stackexchange.com/a/36484/6828นี่เป็นเวอร์ชั่น golfed (และง่ายขึ้นเล็กน้อย) ของเวอร์ชั่นนั้น ใช้ช่วงแบบรวมเนื่องจากอักขระนั้นสั้นกว่า

1.9.3-p327 :004 > s[157,249]
 => 192 
1.9.3-p327 :005 > s[5,11]
 => 8 
1.9.3-p327 :006 > s[9,15]
 => 12 
1.9.3-p327 :007 > s[9,16]
 => 16 

และขอขอบคุณ YenTheFirst สำหรับการบันทึกอักขระสามตัว


1
คุณสามารถหนีไปได้โดยปราศจาก [0] เนื่องจากการเปรียบเทียบอาร์เรย์จะจัดลำดับความสำคัญขององค์ประกอบแรกอยู่ดี สิ่งนี้จะให้ผลลัพธ์ที่แตกต่างกัน แต่ยังคงถูกต้อง
YenTheFirst

3

C # LINQ: 317 303 289 262

using System.Linq;class P{static void Main(string[]a){System.Console.Write(Enumerable.Range(int.Parse(a[0]),int.Parse(a[1])).Select(i=>new{i,F=F(i)}).Aggregate((i,j)=>i.F<j.F?i:j).i);}static int F(int a){int b=1;for(;a>1;)if(a%++b<1)while(a%b<1)a/=b;return b;}}

Ungolfed:

using System.Linq;

class P
{
  static void Main(string[]a)
  {
    System.Console.Write(
      Enumerable.Range(int.Parse(a[0]), int.Parse(a[1])) //create an enumerable of numbers containing our range (start, length)
        .Select(i => new { i, F = F(i) }) //make a sort of key value pair, with the key (i) being the number in question and the value (F) being the lowest prime factor
        .Aggregate((i, j) => i.F < j.F ? i : j).i); //somehow sort the array, I'm still not entirely sure how this works
  }
  static int F(int a)
  {
    int b=1;
    for(;a>1;)
      if(a%++b<1)
        while(a%b<1)
          a/=b;
    return b;
  }
}

ใช้เวลาในการเริ่มต้นและความยาวจากบรรทัดคำสั่งและจะส่งกลับจำนวนที่ราบรื่นที่สุด

ฉันใช้คำตอบจากที่นี่และที่นี่เพื่อให้คำตอบของฉัน

ขอบคุณ VisualMelon สำหรับการปรับแต่งและโกน 12 ไบต์! ฉันยังกำจัดวงเล็บปีกกาในถ้าประหยัด 2 ไบต์และ CodeInChaos ชี้ให้เห็นสิ่งที่ชัดเจนฉันพลาด (ขอบคุณอีกครั้ง)


สิ่งเล็ก ๆ สำหรับวัตถุประสงค์ทั่วไปคุณสามารถบันทึก 4 ไบต์Fโดยกำหนดint bถัดจาก m ในคู่ของสถานที่ที่คุณจะทำการเปรียบเทียบa%b==0และ aและbเป็นบวกเสมอคุณสามารถตัดไบต์สำหรับแต่ละโดยการตรวจสอบถ้ามันน้อยกว่า a%b<11 คุณยังสามารถบันทึก byte ได้โดยการเพิ่มขึ้นbในเงื่อนไข if a%++b<0แทนการกำหนดค่าเริ่มต้นเป็น 1 ฉันยังคิดว่าในกรณีนี้มันถูกกว่าที่จะมีคุณสมบัติครบถ้วนSystem.Console.WriteLineและหลีกเลี่ยงnamespaceข้อ
VisualMelon

@VisualMelon ขอบคุณการปรับปรุงด้วยความคิดของคุณ :)
ldam

สิ่งที่m=...:m;ตกนอกวงขณะที่ ดังนั้นคุณสามารถวางm=0,และแทนที่ด้วยreturn m; return m=b>m?b:m;จากนั้นคุณสามารถปล่อยm=...:m;ทั้งหมด
tomsmeding

มันอาจฟังดูแปลก แต่นี่คือ - สำหรับฉัน - สามารถ redable ได้น้อยกว่า CJam และ J. ฉันเดาว่า C # ได้รับการออกแบบให้มีความละเอียดมากและความพยายามในการทำให้น้อยลงทำให้อ่านไม่ได้? อืม ....
Kuba Ober

ไม่ฉันเห็นด้วย LINQ ดูเหมือนปีศาจเมื่อคุณเห็นที่นี่และที่นั่นและไม่เคยเล่นด้วยตัวคุณเอง เมื่อคุณเข้าใจแล้วมันเจ๋งจริง ๆ :) ด้วยที่กล่าวว่าฉันยังไม่เข้าใจวิธีการAggregateทำงานฉันลองหลังจากเห็นคำตอบอื่นเพื่อไปยังวัตถุใหม่ของฉันแทนที่จะเป็นหนึ่งในเขตข้อมูลและ มันเพิ่งเกิดขึ้นให้ทำงานอย่างสมบูรณ์ :)
ldam

2

R, 83

library(gmp)
n=a:b
n[which.min(lapply(lapply(lapply(n,factorize),max),as.numeric))]

ที่ด้านล่างของช่วงเข้าที่ได้รับมอบหมายให้aและด้านบน (รวม) bได้รับมอบหมายให้

gmpเป็นแพ็คเกจที่มีอยู่ใน CRAN มันรู้สึกสกปรกจนกระทั่งฉันเห็นmfฟังก์ชั่นที่ไร้สาระใน CJam ติดตั้งโดยพิมพ์install.packages("gmp")ในคอนโซล


1
หากคุณใช้lapply3 ครั้งคุณอาจต้องการนามแฝง (เช่นl=lapplyจากนั้นใช้l(...) ในทำนองเดียวกันตั้งแต่factorizeเป็นฟังก์ชั่นเดียวที่คุณใช้จากแพคเกจgmpที่คุณสามารถใช้แทนการโหลดห้องสมุดแล้วใช้gmp::factorize factorizeรหัสของคุณจะกลายl=lapply;n=a:b;n[which.min(l(l(l(n,gmp::factorize),max),as.numeric))]เป็น 69 ไบต์
plannapus

2

PowerShell - 85

($args[0]..$args[1]|sort{$d=2
while($_-gt1){while(!($_%$d)){$m=$d;$_/=$d}$d++}$m})[0]

สิ่งนี้จะจัดเรียงช่วงของตัวเลข (รวม) โดยพิจารณาจากปัจจัยหลักสูงสุดของแต่ละหมายเลข มันส่งกลับองค์ประกอบเรียงต่ำสุด

> smooth 5 10
8
> smooth 9 15
12
> smooth 9 16
16
> smooth 157 248
243
> smooth 2001 2013
2002

2

J - 16 ตัวอักษร

การใช้ ( เริ่มต้น , ความยาว ) รูปแบบของช่วงขณะที่ได้รับอนุญาตจากการแสดงความคิดเห็น

(0{+/:{:@q:@+)i.

เพื่อนำมาใช้เป็นคำกริยา dyadic: อาร์กิวเมนต์ซ้ายคือเริ่มต้นขวาเป็นระยะเวลา

   5 (+)i. 6              NB. range
5 6 7 8 9 10
   5 (q:@+)i. 6           NB. prime factorizations
5 0 0
2 3 0
7 0 0
2 2 2
3 3 0
2 5 0
   5 ({:@q:@+)i. 6        NB. largest prime factors
5 3 7 2 3 5
   5 (+/:{:@q:@+)i. 6     NB. sort range by smallest factors
8 6 9 5 10 7
   5 (0{+/:{:@q:@+)i. 6   NB. take first entry
8
   f=:(0{+/:{:@q:@+)i.    NB. can also be named
   2001 f 13
2002

A ( เริ่มต้น , ปลาย ) การแก้ปัญหาคือ 2 ตัวอักษรและไม่รวมปลาย; รวมทั้งท้ายคือ +2 เพิ่มเติม แต่ด้านสว่างมันดูค่อนข้างดีเนื่องจากเราจับคู่ {braces} ทั้งหมด

(0{}./:{:@q:@}.)i.    NB. excluding
(0{}./:{:@q:@}.)1+i.  NB. including

2

อย่างจริงจัง 8 * 14/7 = 16 (ไม่แข่งขัน)

,x;`yM`M;m@í@E

ถูกสร้างขึ้นอย่างจริงจังหลังจากความท้าทายนี้ แต่ฉันต้องการโพสต์คำตอบนี้เพราะมันเป็นตัวอย่างของประเภทของความท้าทายอย่างจริงจังเป็นสิ่งที่ดี

ลองออนไลน์!

คำอธิบาย:

,x;`yM`M;m@í@E
,x;             make two copies of range(a,b) (a,b = input())
   `  `M;       make two copies of the result of the map:
    yM            push maximum prime factor
         m@í    push index of minimum element from prime factors
            @E  push element from range with given index

2

Pyth , 7 ไบต์

.mePbrF

ลองที่นี่!

[a,b)[a,b]}r

.mePbrF – Full program with arguments a and b.
     rF – Fold by half-inclusive range. Yields the integers in [a, b).
.m      – Values b in that list which give minimal results when applied f.
  ePb   – function / block f. 
   Pb   – Prime factors of b.
  e     – Last element. This is guaranteed to yield the largest, as they're sorted.

1

งูเห่า - 150

def f(r as vari int)
    x,y=r
    c,o=y,0
    for n in x:y,for m in n:0:-1
        p=1
        for l in 2:m,if m%l<1,p=0
        if n%m<=0<p
            if m<c,c,o=m,n
            break
    print o

ไม่แน่ใจเหมือนกันว่าทำไมฉันถึงต้องสนใจงูเห่าก็ไม่สามารถแข่งขันได้ที่นี่


1
งูเห่าดูเหมือนกับงูหลาม ... อะไรคือความแตกต่าง?
สลายตัวเบต้า

@BetaDecay Cobra เป็นสิ่งที่เกิดขึ้นเมื่อคุณให้ C # กับไวยากรณ์ของ Python เว็บไซต์คอบร้า
2557

1

Ruby - 113 ตัวอักษร

ใช้ stdlib ส่งคืนผลลัพธ์เดียว ทดสอบกับทับทิม 2.1.2

require 'prime'
def smooth_range(a,b)
  (a...b).sort_by{|e|e.prime_division.flat_map{|f,p|[f]*p}.uniq.max}[0]
end

1
ยินดีต้อนรับสู่ Programing Puzzles และ Code Golf Stack Exchange ขอบคุณสำหรับการโพสต์ผลลัพธ์ของคุณ เนื่องจากนี่เป็นคำถามที่เกี่ยวกับกอล์ฟกรุณารวมจำนวนตัวละครของคุณในคำตอบของคุณ คุณสามารถใช้เครื่องมือเช่นนี้: javascriptkit.com/script/script2/charcount.shtml
isaacg

1

Perl (5.10+), 83

for(<>..<>){$n=$_;$p=2;$_%$p&&$p++or$_/=$p while$_>1;$m=$p,$r=$n if$p<$m||!$m}
say$r

(สามารถลบบรรทัดออกได้) ใช้จุดปลายสองจุดของช่วงที่ครอบคลุมบน stdin สองบรรทัด (เพราะ<>ราคาถูกกว่าการเข้าถึงARGV) และให้ผลลัพธ์ที่ราบรื่นที่สุดไปยัง stdout หากมีเน็คไทเพื่อความลื่นให้พิมพ์เล็กที่สุด สามารถพิมพ์ที่ยิ่งใหญ่ที่สุดด้วยราคาของตัวละครตัวหนึ่ง

อัลกอริทึมนั้นเป็นวิธีของการค้นหาปัจจัยสำคัญที่ยิ่งใหญ่ที่สุดแม้ว่าเราจะคิดขึ้นมาเอง ส่วนนั้นลงไปอย่างสวยงามเพื่อแถลงการณ์ครั้งเดียวใน Perl ส่วนที่เหลือมีค่าใช้จ่ายมากกว่าที่ฉันคิด

ควรวิ่งใต้perl -Eหรือนำขึ้นuse 5.012ปรบ ถ้าคุณไม่สามารถทำเช่นนั้นแทนที่ด้วยsay$rprint$r,$/


1

Python 2 (84)

f=lambda n,p=2:n>1and f(n/p**(n%p<1),p+(n%p>0))or p
print min(range(*input()),key=f)

วิธีแก้ปัญหาของ @ isaacgแต่ด้วยminปุ่มฟังก์ชั่นแทนการค้นหาขั้นต่ำอย่างชัดเจนและฟังก์ชั่นวนซ้ำเล่นบทบาทของการทำซ้ำ

เรียกใช้ในStackless Pythonเพื่อหลีกเลี่ยงข้อ จำกัด การเรียกซ้ำ

มันดูสิ้นเปลืองที่จะใช้เงื่อนไข paranthesized (n%p<1)แล้วทำซ้ำการปฏิเสธใน parantheses (n%p>0)แต่นั่นเป็นสิ่งที่ดีที่สุดที่ฉันได้รับ ฉันลองทำหลายสิ่งหลายอย่าง แต่มันกลับแย่ลงกว่าเดิม

f(n/p**(n%p<1),p+(n%p>0))     # Current for comparison
f(*[n/p,n,p,p+1][n%p>0::2])
n%p and f(n,p+1)or f(n/p,p)
f(*n%p and[n,p+1]or[n/p,p])

ฉันยินดีรับการปรับปรุงใด ๆ ที่คุณนึกออก


1

Java 8 - 422 454ตัวอักษร

ฉันกำลังเรียนรู้ Java 8 และต้องการให้ช็อตนี้เทียบกับ Java (หรือแม้แต่สตรีม Java 8)

เมื่อเปรียบเทียบกับภาษาอื่น ๆ แล้วนี่เป็นสิ่งที่โหดร้าย แต่เป็นการฝึกที่น่าสนใจ

แข็งแรงเล่นกอล์ฟ:

import java.util.stream.*;import java.math.*;
class F{int v;int i;public int getV() { return v; }
F(int i){this.i = i;v=IntStream.range(2,i+1).map(j->((i%j==0)&&new BigInteger(""+j).isProbablePrime(1))?j:0).max().getAsInt();}}
public class T{
int s(int a, int b){return IntStream.range(a,b+1).boxed().map(F::new).sorted(java.util.Comparator.comparingInt(F::getV)).collect(java.util.stream.Collectors.toList()).get(0).i;}}

Ungolfed:

import java.util.stream.*;
import java.math.*;

class F {
    int v;
    int i;
    public int getV() { return v; }
    F (int i) { 
        this.i = i;
        v = IntStream.range(2,i+1)
                     .map( j -> ((i%j==0) && 
                           new BigInteger(""+j).isProbablePrime(1))?j:0)
                     .max()
                     .getAsInt();
    }
}

public class T {
    int s(int a, int b) {
        return IntStream.range(a,b+1)
                    .boxed()
                    .map(F::new)
                    .sorted(java.util.Comparator.comparingInt(F::getV))
                    .collect(java.util.stream.Collectors.toList())
                    .get(0).i;
    }
}

ตัวอย่างการรันโดยใช้:

public static void main(String[] s) {
    System.out.println(new T().s(157,249));
}

192

1

MATL ( ไม่ใช่การแข่งขัน ), 20 ไบต์

ภาษานี้ได้รับการออกแบบหลังจากการท้าทาย

ช่วงรวมที่ปลายทั้งสอง ตัวเลขถูกใช้เป็นอินพุตแยกกันสองตัว

2$:t[]w"@YfX>v]4#X<)

ลองออนไลน์!

คำอธิบาย

2$:          % implicitly input two numbers. Inclusive range
t            % duplicate                      
[]           % empty array
w            % swap elements in stack         
"            % for each                  
  @          %   push loop variable
  Yf         %   prime factors                  
  X>         %   maximum value
  v          %   vertical concatenation         
]            % end for each                         
4#X<         % arg min 
)            % index with this arg min into initial range of numbers

ผมคิดว่าวันนี้นี้จะเป็น 17 ไบต์&:[]y"@YfX>h]&X<)หรือบางทีอาจจะ :[]y"@YfX>h]&X<)16 &จริงๆคือความคิดที่ดี (และฉันคาดเดาyก็ไม่สามารถใช้ได้กลับมาแล้ว?)
sundar

และดูเหมือนว่าการออกอากาศที่Yfมีคำนำหน้า 1 ก็มีประโยชน์เช่นกัน แต่ก็อาจไม่เพียงพอที่จะตัดสินว่าเป็นความคิดที่ดีโดยทั่วไป :)
sundar

ใช่นี้เป็นจุดเริ่มต้นมากจึงไม่มีหรือy &ให้เครดิตกับ Suever สำหรับซีแมนติกส์ที่เป็นประโยชน์อย่างมากของสิ่งหลัง ๆ (ความคิดเริ่มต้นของฉันคือทำให้มันหมายถึง "หนึ่งอินพุตมากกว่าค่าเริ่มต้น") หากเราเห็นอินสแตนซ์เพิ่มเติมที่Yfการเพิ่มรายการนั้นจะมีประโยชน์จริง ๆ แล้วมันอาจคุ้มค่าที่จะเพิ่มคุณสมบัตินั้น ปัญหาคือมีประมาณ 34 คำตอบที่ใช้Yf(ตามสคริปต์นี้ ) ดังนั้นจึงยากที่จะบอก
Luis Mendo

1

เยลลี่ , 7 ไบต์, คะแนน = 7 ÷ 7 × 8 = 8, ภาษา postdates ความท้าทาย

rÆfṀ$ÐṂ

ลองออนไลน์!

ใช้จุดสิ้นสุดช่วงล่างและช่วงบนเป็นอาร์กิวเมนต์สองตัวที่แยกกัน แสดงรายการตัวเลขที่ราบรื่นที่สุดทั้งหมดในช่วง (ซึ่งสามารถดูได้ในรูปแบบของฟังก์ชั่นในกรณีที่เอาต์พุตเป็นรายการ Jelly หรือเป็นโปรแกรมเต็มรูปแบบในกรณีที่เอาต์พุตเกิดขึ้นเพื่อใช้การแสดงรายการเดียวกับที่ JSON ทำ)

คำอธิบาย

ครั้งที่โปรแกรม Jelly ของคุณเป็นเพียงการแปลสเป็คตามตัวอักษร ...

rÆfṀ$ÐṂ
r        Range from {first argument} to {second argument}
     ÐṂ  Return the elements which have the minimum
   Ṁ$      largest
 Æf          prime factor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.