ค้นหาจำนวนเต็มที่แตกต่างกันจำนวนมากที่สุดซึ่งรวมถึง n


18

งาน

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

กรณีทดสอบ

อนุญาตให้fกำหนดฟังก์ชั่นที่ถูกต้องตามงาน:

ลำดับสำหรับfเริ่มต้นที่ 1:

1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, ...

ในฐานะที่เป็นกรณีทดสอบขนาดใหญ่:

>>> f(1000000000) // Might not be feasible with brute-forcers
44720

รหัสทดสอบ

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        System.out.println((int) Math.floor(Math.sqrt(2*x + 1./4) - 1./2));
    }
}

ลองออนไลน์!


สามารถทำดัชนี 0 รายการได้หรือไม่
มนุษย์โดยรวม

1
@totallyhuman "มัน" เป็นคำตอบใช่มั้ย เพราะนี่ไม่เกี่ยวกับรายการ ...
Addison Crump

3
@tallyallyhuman ไม่นี่เป็นเรื่องเกี่ยวกับพาร์ทิชันที่แตกต่างกันของตัวเลขเฉพาะ
Addison Crump

5
นี่คือOEIS A003056
Jeppe Stig Nielsen

4
ฉันรู้สึกไม่มีนัยสำคัญมากที่สุดทุกครั้งที่ฉันสะดุดเข้ากอง codegolf คำตอบและความคิดเห็นมีมากกว่าความอ่อนน้อมถ่อมตน คำถามมักจะน่าสนใจเช่นกัน แต่ด้วยความเห็นของเขา @JeppeStigNielsen เพียงแค่พิมพ์เขียวที่เสร็จสมบูรณ์เมื่อเรายังคงใคร่ครวญบริเวณพื้น
KalleMP

คำตอบ:


9

05AB1E , 4 ไบต์

ÅTg<

ลองออนไลน์!

เครื่องมือที่สมบูรณ์แบบสำหรับงาน

ÅTอัตราผลตอบแทนรายชื่อของÅจะTหมายเลข riangular และรวมถึงN (ขออภัยมี 0 เกินไปมิฉะนั้นมันจะเป็น 3 ไบต์) g<ได้รับ len กรัม TH และ decrements มัน


8

เยลลี่ , 6 5 ไบต์

R+\»ċ

ลองออนไลน์!

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

คำอธิบาย:

        # Main link
R       # Range, generate [1..n]
 +\     # Cumulative sum (returns the first n triangular numbers)
   »    # For each element, return the maximum of that element and 'n'
    ċ   # How many elements are 'n'? (implicit right argument is n)

ในคำอธิบายคุณแน่นอนหมายถึง "จำนวนน้อยกว่าหรือเท่ากับ n "
Luis Mendo

@LuisMendo ดูคำอธิบายใหม่
DJMcMayhem

6

Haskell , 26 ไบต์

-2 ไบต์ต้องขอบคุณ H.PWiz

(!!)$do x<-[0..];x<$[0..x]

ลองออนไลน์!

นี่จะคืนค่าองค์ประกอบที่nของตัวเลขทั้งหมดที่แต่ละiถูกจำลองแบบi + 1ครั้ง


3
ฉันอดไม่ได้ที่จะถามว่า "succ" คืออะไร
Addison Crump

ใช่ฉันรู้แล้วฮ่า ๆ ย่อมาจากsucc successor
มนุษย์โดยรวม

5

Brain-Flakขนาด 36 ไบต์

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

ลองออนไลน์!

สิ่งนี้ใช้โครงสร้างเดียวกันกับอัลกอริธึมการแบ่งมาตรฐานยกเว้นว่า "ตัวหาร" จะเพิ่มขึ้นทุกครั้งที่อ่าน



3

Brain-Flak , 82 ไบต์

เพิ่มช่องว่างสำหรับ "ความสามารถในการอ่าน"

(())

{
    {}

    ((({})[[]]))

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

}{}{}{}

([]<>)

ลองออนไลน์!



1
ใครที่เคยคิดว่าการรวมสองภาษาที่ไม่สามารถอ่านได้ Whitespace และ Brain-Flak อาจถือได้ว่า "อ่านได้"!
caird coinheringaahing

3

เยลลี่ขนาด 7 ไบต์

×8‘½’:2

ลองออนไลน์!

เยลลี่ขนาด 9 ไบต์

Ḥ+4ݤ½_.Ḟ

ลองออนไลน์!

นี้มีความยาวมากกว่าเดนนิสและดีเจ แต่เวลานี้กับวัตถุประสงค์ มากอย่างมีประสิทธิภาพ



@totallyhuman Mใช้
user202729

3

R , 28 ไบต์

function(n)rep(1:n,1:n+1)[n]

ลองออนไลน์!

สร้างเวกเตอร์ของเวลาที่เกิด1ซ้ำ2, เวลาที่2ทำซ้ำ3, ... , เวลาที่nทำซ้ำn+1และใช้nthองค์ประกอบ นี่จะเป็นข้อผิดพลาดของหน่วยความจำเนื่องจาก1:nมีขนาดใหญ่เกินไปหรือเนื่องจากรายการที่มีn*(n+1)/2 - 1องค์ประกอบที่ซ้ำกันมีขนาดใหญ่เกินไป

R , 29 ไบต์

function(n)((8*n+1)^.5-1)%/%2

ลองออนไลน์!

คำนวณค่าโดยตรงโดยใช้สูตรที่พบ คำตอบของ alephalpha สิ่งนี้ควรทำงานโดยไม่มีปัญหานอกเหนือจากความแม่นยำเชิงตัวเลข

R , 30 ไบต์

function(n)sum(cumsum(1:n)<=n)

ลองออนไลน์!

nนับตัวเลขสามเหลี่ยมน้อยกว่าหรือเท่ากับ ข้อผิดพลาดนี้หน่วยความจำที่จะเป็นไปได้ถ้า1:nเป็นมากพอ - เช่นที่มันจะพ่น1e9Error: cannot allocate vector of size 3.7 Gb




2

JavaScript (Node.js)ขนาด 18 ไบต์

x=>(x-~x)**.5-.5|0

ลองออนไลน์!


สิ่งนี้ถูกต้องเสมอหรือไม่ ฉันไม่แน่ใจfloor((sqrt(8x+4)-1)/2)(สูตรของคุณ) และfloor((sqrt(8x+1)-1)/2)(สูตรที่ถูกต้อง) xให้ผลเหมือนกันสำหรับทุกคน
ETHproductions

@ ETHproductions ฉันสามารถป้านและพูดว่า "ใช่" แต่ฉันคิดว่าคำตอบที่ซื่อสัตย์มากขึ้นคือคุณควรพยายามที่จะพัฒนาสมมติฐานของคุณเองและคิดออกว่าทำไมมันสะท้อนสูตรเดียวกัน ฉันไม่ได้มากับวิธีนี้ด้วยตัวเอง (ฉันเรียนรู้จากเว็บไซต์อื่น) แต่ฉันเล่นกับมันเล็กน้อย มันเป็นวิธีการที่น่าสนใจมากและฉันไม่ต้องการแยกกบให้เร็ว
Unihedron

อืมมม ฉันไม่แน่ใจว่าจะพิสูจน์ได้อย่างไร แต่ฉันเขียนนักสืบที่ไม่พบความล้มเหลวต่ำกว่า 100 ล้าน
ETHproductions

2

Japtet , 8 ไบต์

สารละลายสูตรปิด

*8Ä ¬É z

ลองมัน


คำอธิบาย

คูณด้วย 8, เพิ่ม 1 ( Ä), รับสแควร์รูท ( ¬), ลบ 1 ( É) และแบ่งพื้นผลลัพธ์เป็น 2 ( z)


ทางเลือก 8 ไบต์

ท่าเรือDJMcMayhem วิธีแก้ปัญหาวุ้น

õ å+ è§U

ลองมัน

สร้างอาร์เรย์ของจำนวนเต็ม ( õ) จาก 1 ถึงอินพุตลดจำนวนสะสม ( å) โดยการเพิ่ม ( +) และนับ ( è) องค์ประกอบที่น้อยกว่าหรือเท่ากับ ( §) อินพุต ( U)



2

Brain-Flak , 70 56 48 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ส่วนหลักของสิ่งนี้คือตัวอย่างต่อไปนี้ที่ฉันเขียน:

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

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

({}[({}())()])

เราสามารถวางสิ่งนั้นไว้ในตัวอย่างด้านบน

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

นั่นคือการวนซ้ำดังนั้นมันจะดำเนินการจนกว่าเราจะสลับกอง เมื่อลูปเสร็จสิ้นเราจะเรียกแอคคิวมูเลเตอร์โดยการสลับกองและลบขยะ



2

Pyth , 7 ไบต์

lh{I#./

ลองออนไลน์!

ตัวกรองเก็บพาร์ติชั่นเลขจำนวนเต็มซึ่งInvariant มากกว่าการขจัดข้อมูลซ้ำซ้อน, คว้าhอี๊ดและรับมันl ength

พิสูจน์ความถูกต้อง

ไม่เข้มงวดมากหรือพูดได้ดี

ให้A = a 1 + a 2 + ... + a nและB = b 1 + b 2 + ... + b mเป็นสองพาร์ติชันที่แตกต่างกันของจำนวนเต็มN ตัวเดียวกัน เราจะสมมติว่าAเป็นพาร์ติชั่นที่ยาวที่สุด หลังจากเรา deduplicate Bนั่นคือแทนที่หลายเหตุการณ์ที่เกิดขึ้นของจำนวนเต็มเดียวกันกับหนึ่งในนั้นเรารู้ว่าผลรวมของBน้อยกว่าN Nแต่เราก็รู้ว่าผลลัพธ์ของฟังก์ชั่นนั้นเพิ่มขึ้น (ไม่เคร่งครัด) ดังนั้นเราจึงสามารถสรุปได้ว่าพาร์ติชั่นA ที่ไม่ซ้ำกันที่ยาวที่สุด มักจะมีองค์ประกอบจำนวนเดียวกันอย่างน้อยเป็นจำนวนการนับรายการที่ไม่ซ้ำกันในพาร์ทิชันอื่น ๆ .


2

รูปสามเหลี่ยมขนาด 49 ไบต์

....)....
...2)2...
..)1/)8..
.)1/)IE/.
@^)1_+/i.

ลองออนไลน์!

มันทำงานอย่างไร

ความเป็นรูปสามเหลี่ยมต้องการรหัสเพื่อให้การกระจายจุดเป็นรูปสามเหลี่ยม นั่นคือความยาวของแต่ละแถวจะต้องเท่ากับจำนวนแถวคูณด้วย 2 และลดลงและแต่ละแถวจะต้องมีจำนวนจุด (เท่ากับแต่ละด้าน) ในแต่ละตำแหน่ง (ในแต่ละด้าน) ในโปรแกรม (แถวด้านล่างคือแถว 0, ด้านบนเป็นแถวที่ 1 เป็นต้นไป) มีคำสั่งเพียงไม่กี่คำเท่านั้นและอักขระอื่น ๆ นอกเหนือจากที่ระบุไว้ในหน้า 'Wiki / Commands' จะถือว่าเป็นแบบไม่ใช้งาน (จุดที่ไม่เกี่ยวข้องจะไม่ส่งผลกระทบต่อโปรแกรม แต่อย่างใดตราบใดที่รูปร่างโดยรวม ของโปรแกรมยังคงเป็นรูปสี่เหลี่ยมผืนผ้า)

โปรดทราบว่าสำหรับคำสั่งสองข้อโต้แย้งฉันใช้aและbตลอดทั้งคำอธิบาย พึงระลึกไว้เสมอว่ามาดูกันว่าโปรแกรมจริงทำอะไรหลังจากลบตัวละครที่ไม่เกี่ยวข้องทั้งหมดที่ประกอบขึ้นมาสำหรับช่องว่างภายใน:

)2)2)1/)8)1/)IE/@^)1_+/i | Input from STDIN and output to STDOUT.

)                        | Push a 0 onto the stack. Must precede integer literals.
 2                       | Push ToS * 10 + 2 (the literal 2, basically).
  )2                     | Again, push a 2 onto the stack. This can be replaced by D
                         | (duplicate), but then the padding would discard the saving.
    )1                   | Literal 1.
      /                  | Division. Push b / a (1 / 2).
       )8)1              | The literal 8 and the literal 1 (lots of these!).
           /             | Division. Push b / a (1 / 8).
            )IE          | Get the 0th input from STDIN and evaluate it.
               /         | Divide it by 1 / 8 (multiply by 8, but there isn't any
                         | operand for multiplication, and I'm not willing to add one).
                @        | Add 1 to the result.
                 ^       | Exponentiation. Here, it serves as a square too.
                  )1_+   | Decrement (add literal -1).
                      /  | Divide (by 2).
                       i | Cast to an integer.

ทางเลือกอื่นและสั้นกว่าหากไม่จำเป็นต้องใช้ช่องว่างภายใน:

....)....
...2)1...
../DD)I..
.E/)4)1/.
+^s_+i...

ลองออนไลน์!


2

PowerShell 3.0, 45 ไบต์

[math]::Sqrt(2*$args[0]+.25)-.5-replace'\..*'

การเรียกเลขหมายเจ็บและการปัดเศษของนายธนาคารคือปีศาจที่แท้จริง (ดังนั้นจึงต้องการให้ regex ตัดทอนเพื่อบันทึกไบต์) แต่ดูเหมือนว่าจะไม่เป็นไร


2

Java (JDK)ขนาด 28 ไบต์

n->~-(int)Math.sqrt(8*n+1)/2

ลองออนไลน์!

เนื่องจากตัวอย่างไม่สามารถเล่นกอล์ฟได้ดี: p

เครดิต


1
28 ไบต์ " เพราะรหัสของคุณเล่นกอล์ฟไม่เก่ง "; p
Kevin Cruijssen

@KevinCruijssen ดีตอนนี้มันเป็น! : o
Olivier Grégoire

1

เยลลี่ขนาด 7 ไบต์

ŒPfŒṗṪL

วิ่งประมาณในO (2 n )เวลา

ลองออนไลน์!

มันทำงานอย่างไร

ŒPfŒṗṪL  Main link. Argument: n

ŒP       Powerset; yield all subarrays of [1, ..., n], sorted by length.
   Œṗ    Yield all integer partitions of n.
  f      Filter; keep subarrays that are partitions.
     Ṫ   Tail; extract the last result.
      L  Compute its length.

1

JavaScript (ES7), 22 19 ไบต์

n=>(8*n+1)**.5-1>>1

-3 ไบต์ขอบคุณ ETHproductions


ลองมัน

o.innerText=(f=
n=>(8*n+1)**.5-1>>1
)(i.value=1000000000);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


คำอธิบาย

ทวีคูณอินพุต 8 และเพิ่ม 1 ยกมันขึ้นไปสู่พลังของ. 5 ทำให้เราได้สแควร์รูท, ลบ 1 และ bithift ผลลัพธ์ได้ 1


คุณสามารถใส่คำอธิบายได้ไหม? ฉันยังไม่ได้ใช้ Javascript ในขณะนี้
FantaC

วิธีการแข่งขันn=>(8*n+1)**.5-1>>1เพื่อบันทึก 3 ไบต์? (ยังไม่ได้ทดสอบ)
ETHproductions

ฉันชนะได้ใน JS: codegolf.stackexchange.com/a/152558/21830
Unihedron

@ETHproductions - ดูเหมือนว่าใช้งานได้ดีขอบคุณ
Shaggy

@tfbninja ฉันคิดว่าฉันอธิบายตนเองได้ดี แต่มีคำอธิบายเพิ่มเติม
Shaggy

1

Python 2/3, 32 ไบต์

การใช้ Python ของสูตรฟอร์มปิด

lambda n:int((sqrt(1+8*n)-1)//2)

การหารจำนวนเต็ม//2ปัดเศษเป็นศูนย์จึงไม่floor( )จำเป็น


1
ยินดีต้อนรับสู่ PPCG! จำเป็นต้องfrom math import sqrtใช้งานหรือไม่ ถ้าเป็นเช่นนั้นควรรวมอยู่ใน bytecount (ในกรณีนี้lambda n:int((math.sqrt(1+8*n)-1)//2) import math จะสั้นกว่านี้เล็กน้อย )
Steadybox


ใช่จำเป็นต้องมีการนำเข้าเพื่อทำงานดังนั้นควรรวมไว้ในจำนวนไบต์
mbomb007

1

Haskell , 28 ไบต์

ค่อนข้างน่าเบื่อ แต่ค่อนข้างสั้นกว่าโซลูชัน Haskell อื่น ๆ และมีการแสดงออกที่ไร้จุดประสงค์ดีมาก น่าเสียดายที่ฉันไม่สามารถทำให้สั้นลงได้หากระบบประเภทไม่ได้รับ:

g x=floor$sqrt(2*x+0.25)-0.5

ลองออนไลน์!

Pointfree, 33 ไบต์

ceiling.(-0.5+).sqrt.(0.25+).(2*)

หรืออีก 33 ไบต์

ความยาวเท่ากับรุ่นที่ไม่มีจุดหมาย แต่น่าสนใจกว่ามาก

g n=sum[1|x<-scanl1(+)[1..n],n>x]

ฉันพยายามผูกสูตรด้วยการแก้ไขข้อผิดพลาดบางอย่าง!
มนุษย์โดยรวม

@tallyallyhuman: ดี, ตอนนี้คุณก็มีมากขึ้นด้วย :)
51118


1

Pyt , 7 5 ไบต์

Đř△>Ʃ

คำอธิบาย:

                      Implicit input
Đř△                   Gets a list of the first N triangle numbers
   >                  Is N greater than each element in the list? (returns an array of True/False)
    Ʃ                 Sums the list (autoconverts booleans to ints)



เร็วกว่า แต่ไกลกว่า

Pyt , 11 9 ไบต์

Đ2*√⌈ř△>Ʃ

คำอธิบาย:

Đ2*√⌈ř△           Gets a list of triangle numbers up to the ceiling(sqrt(2*N))-th
       >          Is N greater than each element of the list? (returns an array of True/False)
        Ʃ         Sums the array



ทางเลือก - คำตอบของ Shaggy

Pyt , 8 7 bytes

8*⁺√⁻2÷


1

ช่องว่าง 111 ไบต์

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_integer_from_STDIN][T T   T   _Retrieve_input][S S S T    S S S N
_Push_8][T  S S N
_Multiply][S S S T  N
_Push_1][T  S S S _Add][S S T   T   N
_Push_n=-1][N
S S N
_Create_Label_SQRT_LOOP][S S S T    N
_Push_1][T  S S S _Add][S N
S _Duplicate_n][S N
S _Duplicate_n][T   S S N
Multiply][S T   S S T   S N
_Copy_0-based_2nd_(the_input)][S S S T  N
_Push_1][T  S S S _Add][T   S S T   _Subtract][N
T   T   N
_If_negative_jump_to_Label_SQRT_LOOP][S S S T   S N
_Push_2][T  S S T   _Subtract][S S S T  S N
_Push_2][T  S T S _Integer_divide][T    N
S T _Print_integer]

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

คำอธิบายในรหัสเทียม:

ใช้สูตร:

n=8n+1-12

หมายเหตุ: พื้นที่ว่างไม่มีบิวด์รูทในตัวเราจึงต้องดำเนินการด้วยตนเอง

Integer i = read STDIN as integer
i = i * 8 + 1
Integer n = -1
Start SQRT_LOOP:
  n = n + 1
  If(n*n < i+1):
    Go to next iteration of SQRT_LOOP
n = (n - 2) integer-divided by 2
Print n as integer to STDOUT


0

Oasis, 14 bytes

n8*1+1tm1%_b+0

Try it online!

How?

n8*1+           8n + 1
     1tm        sqrt
        1%_     integer?
           b+   add f(n-1)

             0  f(0) is 0

This is a recursive solution that increments the result when it encounters a triangular index, starting with 0 for the input 0.



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