คำนวณฟังก์ชั่นของรถม้าสี่ล้อ


19

กุ๊บของฟังก์ชั่น g(n) ( OEIS A000793 ) ให้การสั่งซื้อสูงสุดขององค์ประกอบของกลุ่มได้ส่วนSn n ที่นี่คำสั่งของการเปลี่ยนลําดับπเป็นที่เล็กที่สุดจำนวนเต็มบวกkดังกล่าวว่าπkเป็นตัวตน - ซึ่งเท่ากับตัวคูณร่วมน้อยของความยาวของรอบในการสลายตัวของวงจรการเปลี่ยนแปลงของ ตัวอย่างเช่นg(14)=84ซึ่งทำได้โดย (1,2,3) (4,5,6,7) (8,9,10,11,12,13,14)

ดังนั้นg(n)นอกจากนี้ยังเท่ากับค่าสูงสุดของlcm(a1,,ak)ที่1 + + k = nกับ1 , ...a1++ak=na1,,akจำนวนเต็มบวก

ปัญหา

เขียนฟังก์ชั่นหรือโปรแกรมที่คำนวณฟังก์ชั่นของ Landau

อินพุต

จำนวนเต็มบวก nn

เอาท์พุต

ก.(n)ลำดับสูงสุดขององค์ประกอบของกลุ่มสมมาตรSn n

ตัวอย่าง

n    g(n)
1    1
2    2
3    3
4    4
5    6
6    6
7    12
8    15
9    20
10   30
11   30
12   60
13   60
14   84
15   105
16   140
17   210
18   210
19   420
20   420

คะแนน

นี่คือ : โปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ (อย่างไรก็ตามการใช้งานที่สั้นที่สุดในหลายภาษายินดีต้อนรับ)

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

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

คำตอบ:



10

ภาษา Wolfram (Mathematica)ขนาด 44 ไบต์

Max[PermutationOrder/@Permutations@Range@#]&

ลองออนไลน์!

ภาษา Wolfram (Mathematica) , 31 ไบต์

@DanielSchepler มีทางออกที่ดีกว่า:

Max[LCM@@@IntegerPartitions@#]&

ลองออนไลน์!


ไม่คุ้นเคยกับภาษา - แต่Max[Apply@LCM/@IntegerPartitions@#]&ดูเหมือนว่าจะเหมาะกับฉันและจะให้ 36 ไบต์ถ้าถูกต้อง
Daniel Schepler

2
@DanielSchepler ใช่สุด ๆ ! ทำไมคุณไม่เสนอเป็นโซลูชันแยกต่างหาก คุณยังสามารถทำMax[LCM@@@IntegerPartitions@#]&สำหรับ31 ไบต์เพราะ@@@ไม่Applyอยู่ในระดับที่ 1
โรมัน

4

Pythonขนาด 87 ไบต์

f=lambda n,d=1:max([f(m,min(range(d,d<<n,d),key=(n-m).__rmod__))for m in range(n)]+[d])

ลองออนไลน์!

ฟังก์ชั่น recursive ที่ติดตามที่เหลือnพาร์ทิชันและ dLCM โปรดทราบว่านี่หมายความว่าเราไม่จำเป็นต้องติดตามตัวเลขจริงในพาร์ติชันหรือจำนวนที่เราใช้ เราพยายามที่แต่ละส่วนถัดไปได้n-mแทนที่nด้วยสิ่งที่เหลือmและมีd lcm(d,n-m)เรารับประโยชน์สูงสุดจากผลลัพธ์แบบเรียกซ้ำเหล่านั้นและdตัวมันเอง เมื่อไม่มีสิ่งใดเหลืออยู่n=0ผลลัพธ์ก็จะเป็นเช่นdนั้น

สิ่งที่ยุ่งยากคือ Python ไม่มีบิวด์อินสำหรับ LCM, GCD หรือการแยกตัวประกอบเฉพาะ ที่จะทำlcm(d,m-n)เราสร้างรายการหลายรายการของdและใช้ค่าโมดูโลบรรลุขั้นต่ำn-m, key=(n-m).__rmod__ที่อยู่กับ เนื่องจากminจะให้ค่าก่อนหน้านี้ในกรณีที่เสมอกันนี่เป็นผลคูณที่ไม่ใช่ศูนย์แรกdที่หารด้วยn-mดังนั้น LCM ของพวกเขา เราทวีคูณdมากถึงd*(n-m)จะได้รับการรับรองในการเข้าสู่ LCM แต่มันสั้นกว่าที่จะเขียนd<<n(ซึ่งก็คือd*2**n) ซึ่งพอเพียงกับขอบเขตบนของไพ ธ อน

mathไลบรารีของ Python 3 มีgcd(แต่ไม่ใช่lcm) หลังจาก 3.5 ซึ่งสั้นกว่าไม่กี่ไบต์ ขอบคุณ @Joel ที่ทำให้การนำเข้าสั้นลง

Python 3.5+ , 84 ไบต์

import math
f=lambda n,d=1:max([f(m,d*(n-m)//math.gcd(n-m,d))for m in range(n)]+[d])

ลองออนไลน์!

ใช้numpy's lcmยังสั้น

งูหลามกับnumpy 77 ไบต์

from numpy import*
f=lambda n,d=1:max([f(m,lcm(d,n-m))for m in range(n)]+[d])

ลองออนไลน์!


การใช้from math import*คือ 85 ไบต์และการใช้import math+ math.gcd(...)คือ 84 ไบต์ numpyเช่นเดียวกับ
โจเอล

@ Joel ขอบคุณฉันลืมไปแล้ว
xnor

@Joel ขอบคุณฉันได้ลืมที่จะปรับปรุงการนับไบต์ที่พวกเขากำลังทั้ง 77 numpyของความยาวของ 5 คือทำลายแม้กระทั่งจุดimport*สำหรับ
xnor

ขวา. ในกรณีนี้ฉันชอบที่จะใช้import numpyเพราะnumpy.maxจะแทนที่ Python ในตัวmax(เหมือนกันmin) ถ้าfrom numpy import*ใช้ มันไม่ได้ทำให้เกิดปัญหาที่นี่ แต่เราทุกคนรู้ว่าimport*มันไม่ใช่วิธีการเขียนโปรแกรมที่ดีโดยทั่วไป
โจเอล

@Joel import*ไม่ต้องสงสัยเลยว่าการปฏิบัติที่ไม่ดีฉันไม่คิดว่าจริง ๆ แล้วมันเขียนทับ Python minและmaxดังนั้นความสับสนจะมีคนคาดหวังฟังก์ชั่นของ numpy และรับฐานหนึ่ง
xnor



3

JavaScript (ES6), 92 ไบต์

คำนวณค่าสูงสุดของ LCM(a1,...,ak) ที่ไหน a1+...+ak เป็นพาร์ติชันของ n.

f=(n,i=1,l=m=0)=>n?i>n?m:f(n-i,i,l*i/(G=(a,b)=>b?G(b,a%b):a)(l,i)||i)&f(n,i+1,l)|m:m=l>m?l:m

ลองออนไลน์!


JavaScript (ES6), 95 ไบต์

f=(n,i=1,m)=>i>>n?m:f(n,i+1,i<m|(g=(n,k=2,p=0)=>k>n?p:n%k?p+g(n,k+1):g(n/k,k,p*k||k))(i)>n?m:i)

ลองออนไลน์!

อย่างไร?

เรากำหนด:

{ก.(1)=0ก.(n)=ΣJ=1ยังไม่มีข้อความพีJkJสำหรับn>1และn=ΠJ=1ยังไม่มีข้อความพีJkJ

(นี่คือA008475 )

จากนั้นเราใช้สูตร (จากA000793 ):

(n)=สูงสุดก.(k)nk


3

Perl 6 , 50 ไบต์

{max .map:{+(.[$_],{.[@^a]}...$_,)}}o&permutations

ลองออนไลน์!

ตรวจสอบวิธีเรียงสับเปลี่ยนทั้งหมดโดยตรงเช่นโซลูชัน Ruby ของฮิสโทแคต

คำอธิบาย

                                     &permutations  # Permutations of [0;n)
{                                  }o  # Feed into block
     .map:{                       }  # Map permutations
                           ...  # Construct sequence
             .[$_]  # Start with permutation applied to itself [1]
                  ,{.[@^a]}  # Generate next item by applying permutation again
                              $_,  # Until it matches original permutation [2]
           +(                    )  # Length of sequence
 max  # Find maximum

1เราสามารถใช้ลำดับของรายการที่แตกต่างกัน n สำหรับการตรวจสอบดังนั้นเราก็ใช้การเปลี่ยนแปลง

2หากจุดปลายเป็นคอนเทนเนอร์ตัว...ดำเนินการลำดับจะจับคู่กับรายการแรก ดังนั้นเราต้องผ่านรายการองค์ประกอบเดียว


2

Ruby , 77 ไบต์

f=->n{a=*0...n;a.permutation.map{|p|(1..).find{a.map!{|i|p[i]}==a.sort}}.max}

ลองออนไลน์!

(1..) ไวยากรณ์ช่วงไม่ จำกัด นั้นใหม่เกินไปสำหรับ TIO ดังนั้นลิงก์จะตั้งค่าขอบเขตบนโดยพลการ

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


2

Gaia , 25 23 22 ไบต์

,:Π¤d¦&⊢⌉/
1w&ḍΣ¦¦⇈⊢¦⌉

ลองออนไลน์!

การไม่มี LCM หรือพาร์ติชันจำนวนเต็มทำให้วิธีนี้ค่อนข้างยาว

,:Π¤d¦&⊢⌉/		;* helper function: LCM of 2 inputs


1w&ḍΣ¦¦			;* push integer partitions
         ¦		;* for each
       ⇈⊢		;* Reduce by helper function
	  ⌉		;* and take the max

2

Haskell, 70 67 ไบต์

f n=maximum[foldl1 lcm a|k<-[1..n],a<-mapM id$[1..n]<$[1..k],sum a==n]

ลองออนไลน์!

แก้ไข: -3 ไบต์ขอบคุณ @xnor


ฉันคิดว่ามันควรจะทำmapM(:[1..n])เพราะองค์ประกอบพิเศษนั้นไม่เป็นอันตราย
xnor

1

Python 3 + จำนวน, 115 102 99 ไบต์

-13 ไบต์ขอบคุณ @Daniel Shepler

-3 ไบต์เพิ่มเติมจาก @Daniel Shepler

import numpy
c=lambda n:[n]+[numpy.lcm(i,j)for i in range(1,n)for j in c(n-i)]
l=lambda n:max(c(n))

ลองออนไลน์!

วิธีกำลังดุร้าย: ค้นหาลำดับที่เป็นไปได้ทั้งหมด a, b, c, ... โดยที่ a + b + c + ... = n จากนั้นเลือกอันที่มี lcm สูงสุด


บังเอิญฉันมี Python 3 + numpy solution ที่ทำงาน 87 bytes
Daniel Schepler

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

ฉันวางแผนที่จะรอสักครู่เพื่อโพสต์
Daniel Schepler

ฉันเพิ่งรู้ว่าคุณโพสต์ความท้าทายนี้ ขอโทษฉันจะทำให้ดีที่สุด
Hiatsu

1
หากคุณเปลี่ยนcเพื่อส่งคืนชุดและบันทึกความจำมันก็ไม่ได้ทำอะไรไม่ดีเลย (แม้ว่าจะยอมรับว่ามันไม่ดีสักหน่อย): tio.run/##RY1BCsIwEEX3PUWWM1CLoiuhV/AKEsfUTkkmIU3AWnr2Ggqq7vM@//…
Daniel Schepler

0

Pyth , 24 15 ไบต์

eSm.U/*bZibZd./

ลองออนไลน์!

             ./Q  # List of partitions of the input
  m               # map that over lambda d:
   .U       d     # reduce d (with starting value first element of the list) on lambda b,Z:
     /*bZgbZ      # (b * Z) / GCD(b, Z)
 S                # this gives the list of lcms of all partitions. Sort this
e                 # and take the last element (maximum)

-9 ไบต์: ให้ความสนใจและสังเกตว่า Pyth มี GCD ในตัว ( i)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.