คำที่ n ของลำดับการเพิ่มขึ้นและรีเซ็ต


37

(ความท้าทายนำมาจากเกมที่มีผู้เล่นหลายคน (การปะทะกันของรหัส) ที่codingame.com )

ความท้าทาย

ค้นหาคำที่nของลำดับต่อไปนี้: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4...หรือเพื่อทำให้ชัดเจนยิ่งขึ้น{1}, {1,2}, {1,2,3}, {1,2,3,4}...

ลำดับถูกสร้างขึ้นจากช่วงตัดแบ่งจาก1 ถึง xเริ่มต้นจาก 1 จนถึงจนถึงอินฟินิตี้

กฎ / IO

อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบใดก็ได้ตราบเท่าที่สามารถแยกแยะได้ อินพุตสามารถนำมาจากแหล่งที่เหมาะสม: STDIN, ไฟล์, ฯลฯ ...

อินพุตสามารถเป็น 0- หรือ 1-index และการทำดัชนีที่เลือกจะต้องกล่าวถึงในโพสต์

คุณจะต้องจัดการอย่างน้อยมากถึง255ผลรวม (หมายถึงการป้อนข้อมูลสูงสุด 0 ดัชนีคือ 32640) ทุกสิ่งที่จะต้องจัดการหากภาษาของคุณรองรับ

นี่คือcode-golfจำนวนไบต์ที่สั้นที่สุดที่ชนะ!

กรณีทดสอบ (การจัดทำดัชนีตาม 0)

0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12


4
คุณอาจจะเพิ่มมากขึ้นไม่กี่กรณีทดสอบขนาดใหญ่ ( 59, 100ฯลฯ )
FlipTack

ที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/103670/…
JAD

มันเป็นสิ่งที่ท้าทายในทางกลับกัน คำตอบที่ดีที่สุดจากความท้าทายนั้นทำงานในวิธีที่ไม่สามารถย้อนกลับได้ @JarkoDubbeldam
devRicher

@DevRicher ฉันรู้เพียงแค่วางมันไว้ที่นั่นและมันก็ไม่ได้มีความหมายในเชิงลบ คำตอบของฉันมีจริงก็ย้อนกลับได้ ที่เกี่ยวข้อง! = ซ้ำกัน
JAD

คำตอบ:


5

05AB1E , 5 ไบต์

โปรแกรมได้รับการจัดทำดัชนี 0 รหัส:

ÌLL¹è

คำอธิบาย:

Ì       # Double increment the input
 LL     # List of list on the input
   ¹è   # Get nth element

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


GNG¹¾¼QiNเป็นวิธีการวนซ้ำ แต่นั่นก็ฉลาดกว่า
Magic Octopus Urn

13

Haskell , 27 26 ไบต์

([z|k<-[1..],z<-[1..k]]!!)

ลองออนไลน์!

ขอบคุณ @DanD สำหรับ -1 ไบต์!

นี้เป็นฟังก์ชั่นที่ไม่ระบุชื่อสร้างลำดับอนันต์เพียงกลับมาnองค์ประกอบดังกล่าว -th: ผลิตรายการที่ไม่มีที่สิ้นสุดของรายการ:[[1..k]| k<-[1..]] [[1],[1,2],[1,2,3],[1,2,3,4],...]ในการต่อสิ่งเหล่านี้เราสามารถเขียน[z|k<-[1..],z<-[1..k]]ว่าผลลัพธ์ใด[1,1,2,1,2,3,1,2,3,4,...]และในที่สุดก็(...!!)ยอมรับอินพุตn(สัญกรณ์ไร้จุดหมาย) และส่งคืนnคำที่ -th (ตาม 0)


การเปลี่ยนconcatที่มีความเข้าใจมากขึ้นเพียงช่วยประหยัด 1 ([z|k<-[1..],z<-[1..k]]!!)ไบต์:
Dan D.

12

JavaScript, 29 28 ไบต์

-1 ไบต์ขอบคุณ Arnauld!

f=(n,m)=>n++<m?n:f(n+~m,-~m)

ใช้สูตรเรียกซ้ำ 0 ที่พบใน OEIS

เมื่อเรียกว่ามีอาร์กิวเมนต์ 1 คาดว่าจะเป็นค่าเริ่มต้นของสองจะเป็นm undefinedอย่างไรก็ตาม-~undefinedส่งคืน 1 ซึ่งช่วยให้เราสามารถเรียกใช้การเรียกซ้ำโดยไม่มีความชัดเจนm = 1ในรายการอาร์กิวเมนต์ (ขอบคุณ @Arnauld!)

ตัวอย่างข้อมูลทดสอบ:

f=(n,m)=>n++<m?n:f(n+~m,-~m)

let examples = [0, 1, 5, 10, 15, 1000];

examples.forEach(function log(x) {
    console.log(x, " => ", f(x))
});


อีกทางเลือกหนึ่งสำหรับการนับไบต์เดียวกันเราสามารถมีฟังก์ชั่น curried ดังนี้:

f=n=>m=>n++<m?n:f(n+~m)(-~m)

คุณสามารถเรียกสิ่งนี้ได้ด้วยf(5)()- มันจะคืนค่าฟังก์ชั่นซึ่งเมื่อถูกเรียกแล้วจะส่งคืนผลลัพธ์ตามที่อธิบายไว้ในเมตาโพสต์นี้


9

เยลลี่ , 5 ไบต์, 1 ดัชนี

RRF³ị

ลองออนไลน์!

คำอธิบาย:

                                      (Assume N = 4 for the examples)
R      Generate a list of 1 to N      [1, 2, 3, 4]
 R     Generate new lists for each item on the previous list, with that item as N
                                      [[1], [1,2], ...]
  F    Flatten that list              [1, 1, 2, 1, 2, 3 ...]
   ³ị  Use the input number (³) as index (ị) on the list. 
       This is one-based:             [1, 1, 2, 1, 2, 3 ...] 
                                                ^

8

อ็อกเทฟ 39 ไบต์

@(z)z-(n=ceil((8*z+1)^.5/2-.5))*(n-1)/2

ดัชนี 1

คำอธิบาย:

พิจารณาลำดับนี้:

1   1   2   1   2   3   1   2   3   4   1   2   3   4   5

ถ้าเรานับจำนวนองค์ประกอบขององค์ประกอบที่เรามี

1   2        3          4               5         

ดังนั้นการใช้สูตรเกาส์สำหรับหมายเลขสามเหลี่ยม เราสามารถสร้างสูตรสำหรับซี:

z=n*(n+1)/2

นั่นคือสมการกำลังสองถ้าเราแก้มันสำหรับ n เรา

n=(sqrt(8*z+1)-1)/2

ลองออนไลน์!


7

Haskell, 25 24 ไบต์

(!!)$[1..]>>= \x->[1..x]

ตัวอย่างการใช้งาน: ->((!!)$[1..]>>= \x->[1..x]) 10 ลองออนไลน์! .1

แผนที่ฟังก์ชั่น make-a-list-from-1-to-x แบบไม่ระบุชื่อ\x->[1..x](บิวด์อินenumFromTo 1มีความยาวหนึ่งไบต์) กับรายการที่ไม่มีที่สิ้นสุด[1..]และเชื่อมต่อรายการผลลัพธ์ในรายการเดียว !!เลือกองค์ประกอบที่ n

ขอบคุณ @flawr สำหรับหนึ่งไบต์


(!!)$[1..]>>= \x->[1..x]ฉันคิดว่าคุณอาจจะสั้นลงโดยใช้ บางครั้งผมก็หวังว่ามันมีวิธีที่ไม่มีจุดหมายสั้นของการเขียน\x->[1..x]:)
flawr

PS: ทำไมคุณไม่เพิ่มลองออนไลน์! link?
ข้อผิดพลาด

@ flawr: เห็นดีขอบคุณ! ลองใช้ออนไลน์ใช้ ghc รุ่นเก่า (หรือโหมโรง) และคำตอบส่วนใหญ่ใช้<$>ซึ่งไม่อยู่ในขอบเขต คุณรู้จักคอมไพเลอร์ / ล่ามออนไลน์ที่ใช้เวอร์ชั่นใหม่ล่าสุดหรือไม่? haskell.org อนุญาตเฉพาะการแสดงออกและคุณไม่สามารถสร้างลิงก์ไปยังรหัสที่คุณป้อน
nimi

1
อ่าให้ฉันบอก @Dennisที่จะปรับปรุงมันเขาเป็นผู้สร้างของ TIO :)
flawr

6

อ็อกเทฟ 39 ไบต์

@(n){v=1:n,A=triu(v'+0*v),A(A>0)(n)}{3}

ลองออนไลน์!

วิธีนี้ใช้แนวทางอื่น

สำหรับเช่นn=1นี้A=triu(v'+0*v)จะสร้างเมทริกซ์

1   1   1   1
0   2   2   2
0   0   3   3
0   0   0   4

เมื่อลบองค์ประกอบศูนย์ทั้งหมดและต่อท้ายคอลัมน์โดยA(A>0)เราจะได้รับลำดับ:

1   1  2  1  2  3  1  2  3  4

จากนั้นมันก็เป็นเพียงเรื่องของการลบnเทอมที่ -th ของลำดับนั้น


5

Pythonขนาด39 36 ไบต์

-3 ไบต์ขอบคุณเดนนิส!

แลมบ์ซ้ำซึ่งใช้การจัดทำดัชนีแบบ 1 ฐาน

f=lambda n,m=1:n*(n<=m)or f(n-m,m+1)

ลองออนไลน์!

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


5

R, 25 ไบต์

i=scan();sequence(1:i)[i]

ดัชนีเป็นแบบ 1


ฉันเห็นสิ่งนี้ชนกับหน้าแรกของวันนี้สงสัยว่ามีใครส่งsequenceคำตอบมาหรือไม่และมีความสุขที่ได้เห็นสิ่งนี้
Giuseppe

4

Pyth , 6 5 ไบต์

บันทึก 1 ไบต์ขอบคุณ@TheBikingviking!

@s._S

สิ่งนี้ใช้การจัดทำดัชนีแบบ 0

ลองออนไลน์!

คำอธิบาย

@          Index with implicit input into
   ._      all prefixes of
     S     1-based range of implicit input
 s         concatenated into an un-nested list

ดี! คุณสามารถแทนที่ด้วย.n s
TheBikingViking

@TheBikingViking ขอบคุณ!
Luis Mendo

4

Mathematica, 27 24 ไบต์

ขอบคุณ @MartinEnder 3 ไบต์!

((r=Range)@r@#<>1)[[#]]&

1 การจัดทำดัชนี สิ่งนี้จะโยนข้อผิดพลาดที่ปลอดภัยที่จะเพิกเฉย

คำอธิบาย

((r=Range)@r@#<>1)[[#]]&
  r=Range                 (* Store Range function in r *)
           r@#            (* Create list {1..n} *)
 (r      )@               (* For each element, generate {1..n} *)
              <>1         (* Join the lists and append a 1; throws errors *)
(                )[[#]]&  (* Take the nth element *)

2
Join@@แพงเกินไป;)((r=Range)@r@#<>1)[[#]]&
Martin Ender

@MartinEnder Woah, เหยียดหยามความจริงที่StringJoinไม่ได้รับการประเมิน ... ฉันชอบมัน
JungHwan Min

4

brainf * ck, 78 ไบต์

,>+<[>[->>+>+<<<]>>>[-<<<+>>>]<<+[->->+<<]>[<<->>>[-<<+>>]<[-]]>[-]<<<+<-]>>+.

รับอินพุต (อิงตาม 0) และเอาต์พุตเป็นค่าไบต์

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

อินพุตต้องใช้\ตัวเลขทศนิยมก่อนหน้า (เช่น\10สำหรับ 10) หากเอาต์พุตเป็นอักขระ ASCII ที่พิมพ์ได้คุณควรเห็นมัน มิฉะนั้นให้กดดูหน่วยความจำ -> การถ่ายโอนข้อมูลสุดท้าย ค่าที่พิมพ์อยู่ในเซลล์ที่ 3 (หมายเลขเซลล์ 2)

คำอธิบาย:

เซลล์ 0 (INPUT): เป็นอินพุตและลดค่า 1 ของฉันทุกครั้งผ่านลูป

เซลล์ 1 (รีเซ็ต): เพิ่มขึ้น 1 ครั้งทุกครั้งที่เท่ากับระยะ ในการทำเช่นนี้ทุกครั้งที่เราเพิ่ม 1 และถ้าไม่เท่ากันเราจะลบ 1

เซลล์ 2 (TERM): เพิ่มทีละ 1 ทุกลูปและตั้งค่าเป็น 0 หากตรงกับ RESET หากต้องการทำสิ่งนี้ฉันเพียงคัดลอกค่ากลับจาก HOLD หากเซลล์นี้ไม่เท่ากับ RESET

เซลล์ 3 (เท่ากับ): ใช้เพื่อตรวจสอบว่า RESET และ TERM เท่ากัน

เซลล์ 4 (HOLD): ใช้เพื่อคัดลอกค่า RESET และ TERM กลับหลังการตรวจสอบเท่ากับ

,>+<              # get input and put a 1 in RESET
[                 # for INPUT to 0
  >[->>+>+<<<]    # copy RESET to EQUAL and HOLD
  >>>[-<<<+>>>]   # copy HOLD back into RESET
  <<+             # add 1 to TERM
  [->->+<<]       # subtract TERM from EQUAL and copy it to HOLD
  >[              # if RESET and TERM were not equal
    <<-           # subtract 1 from RESET
    >>>[-<<+>>]   # copy HOLD back to TERM
    <[-]          # zero out EQUAL
  ]               # end if
  >[-]            # zero out HOLD
  <<<+            # add 1 to RESET (this cancels out the subtraction if
                  #     RESET did not equal TERM)
  <-              # subtract 1 from INPUT
]>>+.             # end for and add 1 because the sequence resets to 1 not 0

เยี่ยมมาก! ฉันจะทดสอบสิ่งนี้และให้รางวัลแก่คุณทันที ต้องการเพิ่มคำอธิบายหรือไม่ :)
Yytsi

@ TuukkaX ฉันกำลังทำอยู่ :) ฉันจะพยายามเพิ่มอีกเมื่อฉันมีเวลาคืนนี้
Riley

ดูเหมือนว่าจะทำงาน :) เงินรางวัลใช้ได้ใน 20 ชั่วโมง
Yytsi

@TuukkaX โปรดจำไว้ว่าเงินรางวัลควรจะมีให้ตลอด 7 วันเพื่อดึงดูดความสนใจจากนั้นจะมอบรางวัลให้ในวันสุดท้าย
mbomb007

@ mbomb007 อืม ฉันประกาศว่าฉันจะมอบรางวัลให้กับคนแรกที่ส่งโซลูชัน brainf * ck ซึ่งหมายถึงการแข่งขันสำหรับรางวัลนั้นจบลงแล้ว อย่างไรก็ตามคนอื่นกำลังทำแบบเดียวกันกับที่คุณพูดถึงและมันเป็นวิธีที่ดีในการชดเชยคะแนนที่ฉันแพ้ ขอบคุณ :)
Yytsi


3

R, 43 41 ไบต์

แก้ไข: พบวิธีแบบเรียกซ้ำโดยย่อโดยใช้A002262 + 1 (ดัชนี 0):

f=function(n,m=1)`if`(n<m,n+1,f(n-m,m+1))

เวอร์ชั่นเก่า:

n=scan();n-choose(floor((1+sqrt(8*n))/2),2)

สูตร 1 ดัชนีจาก OEIS


ลองออนไลน์! ดูเหมือนว่าจะทำงานได้ดี :)
R. Kap

ฉันจัดการเพื่อประหยัดไม่กี่ไบต์เมื่อเทียบกับโซลูชั่นของคุณ ดูคำตอบของฉัน
JAD

3

Perl 6 , 21 ไบต์

{map(|^*,^∞)[$_]+1}

0 การจัดทำดัชนี ลองออนไลน์!

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

{                 }  # A lambda.
         ^∞          # Range from 0 to Inf-1. (Same byte count as 0..*, but cooler.)
 map( ^*,  )         # Map each number n to the range 0..(n-1),
     |               # And slip each range into the outer list.
            [$_]     # Index the sequence with the lambda argument.
                +1   # Add 1.

Perl 6 , 21 ไบต์

{[\,](1..*).flat[$_]}

0 การจัดทำดัชนี ลองออนไลน์!

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

{                   }  # A lambda.
      1..*             # Range from 1 to infinity.
 [ ,](    )            # Fold it with the comma operator,
  \                    # and return all intermediate results, e.g. (1), (1,2), (1,2,3)...
           .flat       # Flatten the sequence.
                [$_]   # Index it with the lambda argument.

2

วิธีแก้ปัญหาทั้งสองนี้สั้นพอ ๆ กับของJungHawn Minแต่มันเป็นแนวทางสำรองซึ่งเป็นสิ่งที่ฉันเดา ทั้งสองเป็นฟังก์ชั่นที่ไม่มีชื่อการป้อนข้อมูลจำนวนเต็มบวก (1 ดัชนี) และส่งกลับจำนวนเต็มบวก

Mathematica ขนาด 30 ไบต์

-#^2-#&@⌈√(2#)-3/2⌉/2+#&

สูตรทางคณิตศาสตร์จริงสำหรับฟังก์ชั่นนี้! ทำให้อ่านได้มากขึ้น (ในส่วนของการแปลตัวอักษร 3 ไบต์, และ):

# - ((#^2 + #) / 2 &)[Ceiling[Sqrt[2 * #] - 3/2]] &

Ceiling[Sqrt[2 * #] - 1/2]บอกเราว่ารายการย่อยใดที่อินพุตอ้างอิงถึงซึ่งเราจะลบรายการใดรายการหนึ่งเพื่อบอกให้เราทราบว่ารายการย่อยใดจะจบลงก่อนที่เราจะได้รับข้อมูลนั้น จากนั้น((#^2 + #) / 2 &)คำนวณจำนวนองค์ประกอบที่เกิดขึ้นในรายการย่อยทั้งหมดก่อนที่เราจะสนใจซึ่งเราลบออกจากอินพุต#เพื่อรับคำตอบของเรา (บางคนจะสังเกตเห็นสูตรที่คุ้นเคย(#^2 + #) / 2สำหรับ#หมายเลขสามเหลี่ยมที่สามนั้นCeiling[Sqrt[2 * #] - 1/2]เป็นฟังก์ชันผกผัน)

Mathematica ขนาด 32 ไบต์

If[#2<=#,#2,#0[#+1,#2-#]]&[1,#]&

โซลูชันแบบเรียกซ้ำโดยทั่วไปเหมือนกับคำตอบของ Billywobและอื่น ๆ


2

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

จัดทำดัชนีเป็นศูนย์

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

ลองออนไลน์!

สแต็กคลีน, 48 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

รหัสข้อเขียน

(<>())       # Switch to the opposite stack and push 1 (the initial divisor)
{            # (outside loop) While top of stack is not 0...
  (          # Push...
    ({}())   # Push the divisor plus 1
  [()])      # ...minus one (ie push a copy of the original divisor
  {          # (inner loop) While the top of stack does not equal zero
    ({}[()]) # Decrement the top of the active stack
    <>       # Switch stacks
  }{}        # (inside loop) End loop and pop zero off the top of stack)
}            # (outside loop) End loop
<>           # Switch stacks (to the one with the divisor)
([{}()]{})   # Calculate the result

2

Java 8, 85 73 55 ไบต์

n->f(n,1)+1int f(int n,int m){return n<m?n:f(n-m,m+1);}

วิธีแบบเรียกซ้ำแบบดัชนี 0 พร้อมสูตรที่ระบุในOEIS :

a(n) = 1 + A002262(n).
A002262 : กับa(n)=f(n,1)f(n,m) = if n<m then n else f(n-m,m+1)

ลองที่นี่


คำตอบเก่า ( 85 56 ไบต์):

n->{int m=~-(int)Math.sqrt(8*n+1)/2;return n-m*-~m/2+1;}

ใช้สูตร 0 อื่น ๆ ที่จัดทำไว้ในOEIS :

n-TH ระยะที่n - m*(m+1)/2 + 1m = floor((sqrt(8*n+1) - 1) / 2)

ลองที่นี่



1

MATL, 8 ไบต์

:"@:]vG)

วิธีนี้ใช้การจัดทำดัชนีแบบ 1

ลองใช้ที่MATL Online

คำอธิบาย

        Implicitly grab input (N)
:       Create an array from [1...N]
"       For each element (A) in this array...
  @:    Create an array from [1....A]
]       End for loop
v       Vertically concatenate everything on the stack
G       Explicitly grab the input again
)       And use it to index into the vertically concatenated array
        Implicitly display the result

1
ไม่ว่าจะเรื่องมาก แต่รหัสจะเร็วถ้าคุณย้ายvหลังจาก]
หลุยส์ Mendo

1
@ LuisMendo อาจุดดี! ฉันชอบสั้นและเร็ว!
Suever

แต่นั่นเป็นการลัดวงจรและแน่นอน! :-)
Luis Mendo

1

QBIC , 21 ไบต์, 1 ดัชนี

:[a|[b|~q=a|_Xc\q=q+1

คำอธิบาย:

:      Get 'a' from the cmd line
[a|    FOR (b = 1; b <= a; b++) This creates an outer loop from 1 to N
[b|    FOR (c = 1; c <= b; c++) This creates an iteration, yielding the 1, 12, 123 pattern
       'q' stores how many terms we've seen. It starts at 1 b default.
~q=a   if we are at the desired term (q == a)
|_Xc   Then quit, and print 'c' (the current number in the sequence)
\q=q+1 Else, increase 'q' and run again.

แนวทางที่น่าสนใจยิ่งขึ้นเล็กน้อย แต่นานกว่า 10 ไบต์:

:{~b+q>=a|_xa-b|\b=b+q┘q=q+1

โปรแกรมนี้จะคำนวณจำนวนทั้งหมดอย่างต่อเนื่องในวงเล็บนี้และก่อนหน้านี้ทั้งหมด ( 1 at loop 1, 3 at loop 2, 6 at loop 3 ...) เมื่อตัวนับนั้นเกินดัชนี N ที่ค้นหาแล้วให้ส่งคืน X จากวงเล็บปัจจุบันโดยที่ X คือ N ลบจำนวนก่อนหน้าของตัวนับ



1

R, 37 ไบต์

n=scan();for(i in 2:n)T=c(T,1:i);T[n]

รับอินพุตจากnและสร้างลำดับสำหรับnลำดับแรก นี่ทำให้ค่อนข้างไม่มีประสิทธิภาพที่อินพุตสูงกว่า แต่มันควรจะดี จากนั้นส่งคืนnรายการ -th, 1-indexed

ใช้เคล็ดลับเล็ก ๆ น้อย ๆ ที่ดีโดยเริ่มต้นการเรียงลำดับด้วยTซึ่งเป็นTRUEหรือ1โดยค่าเริ่มต้น


1

C11, 48 ไบต์

int f(int x){int q=1;while(x>q)x-=q++;return x;}

ลองออนไลน์!

สามารถใช้งานได้ใน C ++ และ Java


ทางเลือกสำหรับจำนวนไบต์เดียวกัน:

int f(int x){int q=0;while(x>++q)x-=q;return x;}

อืม .. ดูเหมือนว่าจะไม่ได้ผลสำหรับกรณีทดสอบส่วนใหญ่ .. ลองใช้ที่นี่
Kevin Cruijssen

1

brainfuck, 141 ไบต์

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

โปรแกรมนี้ไม่มีการทำดัชนี

,>+<[[->>+>+<<<]>>[-<<+>>]<[->+>>+<<<]>[-<+>]>>+[[-<->>+<]>[-<+>]<<<<]>>[>>>]>[.[<<<]]<<<<<<<[[-]>>>[-<+<<+>>>]<[->+<]<<<<<]>>>[>>>]<<<]>[.>]

ลองออนไลน์

  • เลือกหน่วยความจำแบบไดนามิก (ไม่มีที่สิ้นสุด) ไม่เช่นนั้นจะไม่ทำงาน
  • ในการทดสอบค่าการป้อนข้อมูล> 255การเปลี่ยนแปลงขนาดของเซลล์ (บิต)จะ16หรือ32
  • ล่ามอธิบายวิธีการป้อนข้อมูล สำหรับการป้อนข้อมูลทศนิยมใช้สำหรับการป้อนข้อมูลของ \55
    • ค่าทศนิยมสูงสุดที่คุณสามารถทดสอบอินพุตได้คือ \999
    • การป้อน Hex สามารถไปที่ขนาดเซลล์สูง

คำอธิบาย:

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

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

,>+<                       (5) 1
[[->>+>+<<<]>>[-<<+>>]       5 1 (0) 5
<[->+>>+<<<]>[-<+>]>>+       5 1 0 5 (2)
[[-<->>+<]>[-<+>]<<<<] (0) 0 4 1 0 3 2 0 0
>>[>>>]                      4 1 0 3 2 0 (0) 0
                             1 1 0 (0) 2 0
>[.#[<<<]]<<<<                4 1 0 (3) 2 0 0 0
<<<[[-]>>>[-<+<<+>>>]<[->+<]<<<<<]>>> (3) 1 0 3 2 0 0 0
[>>>]<<<]>[.#>]

Tape structure:
    (cell_1 cell_2 temp), (cell_1 cell_2 temp), ...

Take Input;
If not zero:
  copy last pair to the right and add one to its cell_2
  subtract each cell_2 from each cell_1 (leaving each cell_2 intact)
  move checking from left to right: 
    If cell_1 is zero and cell_2 isn't:
      print cell_2
    Else:
      copy last cell_1 back, overwriting each previous cell_1
Else:
  right one and print result

ลองออนไลน์

  • เลือกหน่วยความจำแบบไดนามิก (ไม่มีที่สิ้นสุด) ไม่เช่นนั้นจะไม่ทำงาน
  • หน่วยความจำการถ่ายโอนข้อมูลที่ถ่าน: #

หมายเหตุ:

  • ในการเรียกใช้ตัวแปลภาษาอื่นที่ไม่อนุญาตให้ย้ายไปทางซ้ายของเซลล์เริ่มต้น (นั่นคือสาเหตุที่ฉันใช้ Dynamic Memory) ให้ใส่>จุดเริ่มต้น จำนวนที่ต้องการอาจแตกต่างกันไปขึ้นอยู่กับค่าอินพุต แต่เป็น O (1)

1

tinylisp (repl), 90 ไบต์ (ดัชนี 0)

(d r(q((n j x)(i n(i(e j x)(r(s n 1)1(s x(s 0 1)))(r(s n 1)(s j(s 0 1))x))j
(q((n)(r n 1 1

หรือไม่ใช่การแข่งขัน (โดยใช้คุณสมบัติที่ทำหลังจากโพสต์ความท้าทายนี้), 80 ไบต์ :

(d r(q((n j x)(i n(i(e j x)(r(s n 1)1(a x 1))(r(s n 1)(a j 1)x))j
(q((n)(r n 1 1

บรรทัดแรกกำหนดฟังก์ชันตัวช่วยrและบรรทัดที่สองเป็นฟังก์ชันที่ไม่มีชื่อที่รับnและส่งคืนคำที่ n ของลำดับ ฉันได้ระบุสิ่งนี้เป็นการส่งข้อความแทนที่เนื่องจากการเติมข้อความอัตโนมัติจะแทนที่วงเล็บที่จุดสิ้นสุดของทุกบรรทัดไม่ใช่เฉพาะตอนท้ายของโปรแกรม ด้วยข้อแม้เหล่านี้นี่เป็นเวอร์ชันที่ปรับเปลี่ยนให้ใช้งานได้ที่Try it onlineและนี่เป็นเวอร์ชันที่ไม่อัปโหลดซึ่งทำงานกับอินพุต 0 ถึง 54

คำอธิบาย

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

(d r           Define r to be:
 (q(           A lambda function (= a list of two elements, quoted to prevent evaluation):
  (n j x)       Arguments n, j (the range counter), and x (the range limit)
  (i n          If n is truthy, i.e. nonzero:
   (i(e j x)     If counter equals limit:
    (r            Call r recursively on:
     (s n 1)       n-1
     1             counter reset to 1
     (a x 1))      limit increased by 1
    (r           Else, call r recursively on:
     (s n 1)       n-1
     (a j 1)       counter increased by 1
     x))           same limit
   j))))        Else, we're done; return the counter value

(q(            Lambda function:
 (n)            Argument n
 (r n 1 1)))    Call r with n, counter = 1, range limit = 1

1

C, 54 ไบต์

ไม่ใช่โซลูชัน C ที่สั้นที่สุด แต่มีข้อดีของการรันในเวลาคงที่ (ไม่มีลูปเพียงแค่คณิตศาสตร์) ใช้การทำดัชนีแบบ zero-based:

x;f(n){x=floor(sqrt(8*n+1)-1)/2;return 1+n-x*(x+1)/2;}

Ungolfed:

int f(int n) {
    int x = floor(sqrt(8*n+1)-1)/2; //calculate the number of the current subsequence (zero based)
    return 1+n-x*(x+1)/2;   //x*(x+1)/2 is the zero based index of the `1` starting the subsequence
}

ทดสอบกับ:

#include <math.h>
#include <assert.h>
#include <stdio.h>

x;f(n){x=floor(sqrt(8*n+1)-1)/2;return 1+n-x*(x+1)/2;}

int main(){
    int i;
    for(i = 0; i < 10; i++) printf("%d ", f(i));
    printf("\n");

    assert(f(0) == 1);
    assert(f(1) == 1);
    assert(f(5) == 3);
    assert(f(10) == 1);
    assert(f(59) == 5);
    assert(f(100) == 10);
    assert(f(1001) == 12);
}

1

C, 103 ไบต์

สำหรับ begginer ไม่เป็นไรฉันคิดว่า :)

int main(){int n,c,i,j;scanf("%d",&n);while(c<n){for(i=1;i<=j;i++){c++;if(c==n)printf("%d",i);}j++;}}

หรือวิธีการจัดรูปแบบ

#include <stdio.h>

int main() {
    int n,c,i,j;
    scanf("%d",&n);
    while(c<n) 
    {
        for(i=1;i<=j;i++)
        {
            c++;
            if(c==n) printf("%d",i);
        }
        j++;
    }
}

1
หากคุณประกาศn,c,i,jเป็นกลมรับประกันว่าจะถูกเตรียมใช้งานเป็น 0 ซึ่งไม่เป็นความจริงของคนในท้องถิ่น
feersum

ฉันรู้ว่ามันมีข้อผิดพลาดที่ไม่มีประสบการณ์เช่นนั้น nคืออินพุตหรือหมายเลข n-th ในลำดับcเป็นตัวนับiและjเป็นองค์ประกอบของลูป jจะเป็น 1 จาก 2 และ 3 ในขณะที่iจะเป็น 1 จาก 1,2 แล้ว 1,2,3 และต่อไป @ Qwerp-Derp
Mohammad Madkhanah

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึงอย่างแน่นอน แต่ค่าเริ่มต้นจะเป็น 0 ในรหัสนี้ไม่ว่าฉันจะประกาศให้พวกเขาเป็นกลมหรือคนในท้องถิ่น โปรดแก้ไขฉันด้วยถ้าฉันผิด 0 =) @feersum
Mohammad Madkhanah

ไม่ตัวแปรท้องถิ่นที่ไม่ได้กำหนดค่าเป็น 0. stackoverflow.com/questions/15268799/…
feersum

1

dc , 21 ไบต์, การสร้างดัชนีแบบ 0

?d8*1+v1-2/d1+*2/-1+p

ลองใช้โปรแกรม dc ออนไลน์!

คำอธิบาย:

?      Push input number n.
d      Duplicate n at the top of the stack.
8*1+   Replace n at the top of the stack with 8n+1.
v      Replace 8n+1 at the top of the stack with the floor of its square root.
1-2/   Subtract 1, and divide by 2 (ignoring any fractional part).

ตอนนี้ส่วนบนสุดของสแต็คจะเก็บดัชนี k ของจำนวนรูปสามเหลี่ยมที่มากที่สุดนั่นคือ <= n

d1+*2/ Compute k(k+1)/2, which is the greatest triangular number <= n.
-      Subtract n-(the greatest triangular number <= n). The first n is on the stack in position 2, because the input number n was duplicated at the top of the stack at the very beginning of the program, and only one of the values was popped and used (until now).
1+     Add 1 because the desired sequence starts over again at 1 (not 0) at every triangular number.
p      Print the answer.

โปรแกรม dc นี้สามารถแปลงเป็นสคริปต์ทุบตีที่แข่งขันได้ขนาด:

ยูทิลิตี้Bash + Unix, 28 ไบต์, การจัดทำดัชนีแบบ 0

dc -e"?d8*1+v1-2/d1+*2/-1+p"

ลองใช้โปรแกรมทุบตีออนไลน์!


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