นับถอยหลังแล้วถอยกลับ


24

มานับ ...

นับได้ถึง 2 และกลับไปที่ 1
นับได้ถึง 4 และกลับไปที่ 1
นับได้ถึง 6 และกลับไปที่ 1
... ตกลงคุณได้รับแล้ว ...

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

 {1,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3...}

ความท้าทาย
กำหนดให้เป็นจำนวนเต็มn>0สำหรับดัชนี 1 (หรือn>=00 ดัชนี) ส่งออกคำที่ n ของลำดับนี้

กรณีทดสอบ

Input->Output  

1->1  
68->6  
668->20  
6667->63  
10000->84

กฎระเบียบ

โปรแกรมของคุณจะต้องสามารถคำนวณโซลูชันได้สูงสุด n = 10,000 ในไม่กี่นาที

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!


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

2
@ อาร์เธอร์ฉันคิดว่าคุณสามารถเข้าใจได้ว่าทำไมฉันถึงทำข้อ จำกัด นี้ ... ฉันไม่ต้องการให้อัลกอริทึมใช้ "ตลอดไป" เพื่อค้นหา n = 10,000 โดยสร้างรายการใหญ่ส่วนใหญ่ของคนที่นี่ให้คำตอบที่ยอดเยี่ยม ในไม่กี่วินาที

4
@BillSteihn ฉันคิดว่าข้อ จำกัด ไม่จำเป็น
Erik the Outgolfer

2
@EriktheOutgolfer คำตอบ gode golf สามารถหากิน ... โดยไม่มีข้อ จำกัด คำตอบที่สร้าง 10.000 tuples [1,2 ... 2n..2,1] จะใช้ได้ข้อ จำกัด สำหรับคำตอบเช่นนี้เท่านั้นฉันไม่ ' ไม่เห็นว่าปัญหาอยู่ที่ไหนฉันแค่ต้องการคำตอบของคุณเพื่อค้นหากรณีทดสอบทั้งหมดในระยะเวลาที่เหมาะสม

3
@StraklSeth ฉันทามติทั่วไปที่นี่คือมันควรจะทำงานในทฤษฎีไม่จำเป็นต้องปฏิบัติ
Erik the Outgolfer

คำตอบ:


16

JavaScript (ES7),  59 ... 44  43 ไบต์

บันทึก 1 ไบต์ขอบคุณ Titus

อินพุตที่คาดไว้: 1 ดัชนี

n=>(n-=(r=(~-n/2)**.5|0)*r*2)<++r*2?n:r*4-n

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

กรณีทดสอบ

อย่างไร?

ลำดับสามารถจัดเรียงเป็นรูปสามเหลี่ยมโดยส่วนด้านซ้ายในลำดับจากน้อยไปหามากและส่วนที่เหมาะสมในลำดับถัดลง

ด้านล่างเป็น 4 แถวแรกที่มีคำศัพท์ 32 คำแรก:

            1 | 2
        1 2 3 | 4 3 2
    1 2 3 4 5 | 6 5 4 3 2
1 2 3 4 5 6 7 | 8 7 6 5 4 3 2

ตอนนี้เรามาแนะนำตัวแปรบางตัว:

 row  | range   | ascending part              | descending part
 r    | x to y  | 1, 2, ..., i                | 4(r+1)-(i+1), 4(r+1)-(i+2), ...
------+---------+-----------------------------+-----------------------------------------
  0   |  1 -  2 |                           1 | 4-2
  1   |  3 -  8 |                   1   2   3 | 8-4  8-5  8-6
  2   |  9 - 18 |           1   2   3   4   5 | 12-6 12-7 12-8  12-9  12-10
  3   | 19 - 32 |   1   2   3   4   5   6   7 | 16-8 16-9 16-10 16-11 16-12 16-13 16-14

เราเริ่มต้นด้วย 2 องค์ประกอบที่ด้านบนและเพิ่ม 4 องค์ประกอบในแต่ละแถวใหม่ ดังนั้นจำนวนองค์ประกอบในแถว 0 ดัชนีrสามารถแสดงเป็น:

a(r) = 4r + 2

ตำแหน่งเริ่มต้น 1 ที่จัดทำดัชนีxของแถวrจะได้รับจากผลรวมของคำก่อนหน้าทั้งหมดในชุดเลขคณิตนี้บวกอีกหนึ่งตำแหน่งซึ่งนำไปสู่:

x(r) = r * (2 + a(r - 1)) / 2 + 1
     = r * (2 + 4(r - 1) + 2) / 2 + 1
     = 2r² + 1

ซึ่งกันและกันซึ่งได้รับ 1 ตำแหน่งดัชนีnในลำดับแถวที่สอดคล้องกันสามารถพบได้ด้วย:

r(n) = floor(sqrt((n - 1) / 2))

หรือเป็นรหัส JS:

r = (~-n / 2) ** 0.5 | 0

เมื่อเรารู้ว่าr (n)เราจะลบตำแหน่งเริ่มต้นx (r)ลบหนึ่งจากn :

n -= r * r * 2

เราเปรียบเทียบnกับa (r) / 2 + 1 = 2r + 2เพื่อหาว่าเราอยู่ในส่วนที่มากไปหาน้อยหรือในส่วนถัดลงมา:

n < ++r * 2 ?

หากการแสดงออกนี้เป็นจริงเรากลับn มิฉะนั้นเราจะกลับ4 (R + 1) - n แต่เนื่องจากrถูกเพิ่มขึ้นแล้วในคำสั่งสุดท้ายสิ่งนี้จึงง่ายขึ้นเป็น:

n : r * 4 - n

1
ตกลงฉันคิดว่าฉันเข้าใจ ความยาวของแต่ละส่วนขึ้นลงคือ 2,6,10,14 ... ดังนั้นผลรวมจะเติบโตขึ้นด้วยกำลังสองของจำนวนแถวดังนั้นจำนวน sqrt ดีมาก!
JollyJoker

7

Haskell , 37 ไบต์

(!!)$do k<-[1,3..];[1..k]++[k+1,k..2]

ลองออนไลน์!

ศูนย์การจัดทำดัชนี สร้างรายการและดัชนีลงไป ขอบคุณØrjan Johansen สำหรับการบันทึก 2 ไบต์!


Haskell , 38 ไบต์

(!!)[min(k-r)r|k<-[0,4..],r<-[1..k-2]]

ลองออนไลน์!

ศูนย์การจัดทำดัชนี สร้างรายการและดัชนีลงไป


Haskell , 39 ไบต์

n%k|n<k=1+min(k-n)n|j<-k+4=(n-k)%j
(%2)

ลองออนไลน์!

ศูนย์การจัดทำดัชนี วิธีการเรียกซ้ำ



5

Husk , 8 ไบต์

!…ṁoe1DN

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

คำอธิบาย

!…ṁoe1DN  Implicit input (an integer).
       N  Positive integers: [1,2,3,4,...
  ṁo      Map and concatenate
      D   double: [2,4,6,8,...
    e1    then pair with 1: [1,2,1,4,1,6,1,8,...
 …        Fill gaps with ranges: [1,2,1,2,3,4,3,2,1,2,3,4,5,6,...
!         Index with input.

3

Perl 6 , 29 ไบต์

{({|(1...$+=2...2)}...*)[$_]}

ลองออนไลน์

0-based

ขยาย:

{  # bare block lambda with implicit parameter 「$_」

  (
    # generate an outer sequence

    {           # bare block lambda

      |(        # flatten into outer sequence

        # generate an inner sequence

        1       # start at 1

        ...     # go (upward) towards:

        $       # an anonymous state variable (new one for each outer sequence)
          += 2  # increment by 2

        ...     # go (downward) towards:

        2       # stop at 2 (1 will come from the next inner sequence)

      )
    }

    ...         # keep generating the outer sequence until:
    *           # never stop

  )[ $_ ]       # index into outer sequence
}

ลำดับภายใน1...$+=2...2ผลิต

(1, 2).Seq
(1, 2, 3, 4, 3, 2).Seq
(1, 2, 3, 4, 5, 6, 5, 4, 3, 2).Seq
(1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2).Seq
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2).Seq
...

หากต้องการให้เป็นแบบเบสให้เพิ่ม0,ก่อนวินาที{หรือเพิ่ม-1หลังจากนั้น$_


3

R, 64 ไบต์

function(n)unlist(sapply(seq(2,n,2),function(x)c(2:x-1,x:2)))[n]

nฟังก์ชั่นที่ใช้เวลาการโต้แย้ง มันสร้างเวกเตอร์ที่2:nมีค่าเพิ่มขึ้น 2 สำหรับแต่ละเหล่านี้เวกเตอร์1:(x-1)และx:2ถูกสร้างขึ้น nนี้ทั้งหมดจะนานกว่า เราunlistต้องการรับเวกเตอร์และnป้อน -th


คุณสามารถทำ1:n*2แทนseq(2,n,2)? มันจะใหญ่กว่าที่คุณต้องการ แต่ควรจะดี! ฉันก็ไม่คิดว่ามันจะใช้งานได้ดีseq(2,n,2)สำหรับn=1ต่อไป!
Giuseppe

2

Python 2 , 56 ไบต์

def f(x):n=int((x/2)**.5);print 2*n-abs(2*n*n+2*n+1-x)+2

ลองออนไลน์!

นี่คือดัชนี 0

-1 ไบต์ขอบคุณ @JustinMariner

วิธีนี้ใช้ได้ผล

เราทราบว่า 1 การจัดทำดัชนีnกลุ่ม -th ( 1, 2, ... 2n ..., 2, 1) เกิดขึ้นจากองค์ประกอบเลข 0 การจัดทำดัชนีเพื่อ2(n-1)^22n^2

ในการค้นหาองค์ประกอบที่ดัชนีxเราสามารถค้นหาหมายเลขกลุ่มnที่xมีอยู่ในนั้นจากนั้นเราคำนวณระยะทางจากศูนย์กลางของกลุ่มที่xเป็น (ระยะนี้คือabs(2*n**2+2*n+2-x))

อย่างไรก็ตามเนื่องจากองค์ประกอบลดลงห่างจากจุดศูนย์กลางของกลุ่มเราจึงลบระยะทางจากค่าสูงสุดของกลุ่ม


ฉันเล่นกอล์ฟในส่วนนี้: print 2*n-abs(2*n*n+2*n+1-x)+2- 2*n*n+2*nสามารถ2*n*-~nและ+2+2*nสามารถเปลี่ยนเป็น-~n*2ซึ่งช่วยให้เราสามารถย้ายไปยังจุดเริ่มต้นซึ่งช่วยประหยัดไบต์ ( 53 ไบต์ )
นาย Xcoder

2

05AB1E , 8 ไบต์

รหัส:

ÅÈ€1Ÿ¦¹è

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

ÅÈ           # Get all even numbers until input (0, 2, ..., input)
  €1         # Insert 1 after each element
    Ÿ        # Inclusive range (e.g. [1, 4, 1] -> [1, 2, 3, 4, 3, 2, 1])
     ¦       # Remove the first element
      ¹è     # Retrieve the element at the input index

5
ทำงานไม่ถูกต้องจนกว่าคุณจะลบ |ซึ่งยังช่วยประหยัดไบต์ Ofc :)
Emigna

€1มันแปลก ...
Magic Octopus Urn


2

เยลลี่ , 10 , 9 ไบต์

ḤŒḄṖµ€Fị@

ลองออนไลน์!

นอกจากนี้ยังมีการจัดทำดัชนี 1 รายการและเสร็จสิ้นอย่างรวดเร็ว

บันทึกหนึ่งไบต์ด้วย @ErikTheOutgolfer!

คำอธิบาย:

สมมุติว่าอินพุต ( a) คือ 3

    µ€      # (Implicit) On each number in range(a):
            #
Ḥ           # Double
            #   [2, 4, 6]
            #
 ŒḄ         # Convert to a range, and Bounce
            #   [[1, 2, 1], [1, 2, 3, 4, 3, 2, 1], [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]]
            #
   Ṗ        # Pop
            #   [[1, 2], [1, 2, 3, 4, 3, 2], [1, 2, 3, 4, 5, 6, 5, 4, 3, 2]]
            #
     F      # Flatten
            #   [1, 2, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2]
            #
      ị@    # Grab the item[a]
            #   1
            #

รหัสของคุณเทียบเท่ากับḤ€ŒḄ€Ṗ€Fị@ดังนั้นคุณสามารถใช้µ€สำหรับ -1 (สามหรือมากกว่าพระในตอนเริ่มต้น):ḤŒḄṖµ€Fị@
Erik the Outgolfer

นี้จริงๆควรจะḤŒḄṖ<newline> ½ĊÇ€Fị@12 เพื่อให้สอดคล้องกับความต้องการ 10,000 (ทำงานรหัส 9 ไบต์ในประเทศจะใช้เวลาประมาณ 02:20 ใน i7 ของฉันและใช้ 7GB)
โจนาธานอัลลัน

1

MATL , 15 ไบต์

li:"@EZv4L)]vG)

1-based

ลองออนไลน์!

กรณีนี้หมดไปสำหรับกรณีทดสอบที่ใหญ่ที่สุดใน TIO แต่จะเสร็จในเวลาบนคอมพิวเตอร์เดสก์ท็อปของฉัน (คอมไพเลอร์ทำงานบน MATLAB R2017a) หากต้องการแสดงเวลาที่ผ่านไปให้เพิ่มZ`ที่ส่วนท้ายของรหัส

>> matl 'li:"@EZv4L)]vG)Z`'
> 10000
84
15.8235379852476

คำอธิบาย

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

l       % Push 1
i       % Push input, n
:       % Range [1 2 ...n]
"       % For each k in that range
  @E    %   Push 2*k
  Zv    %   Symmetric range: [1 2 ... 2*k-1 2*k 2*k-1 ... 2 1]
  4L)   %   Remove last entry: [1 2 ... 2*k-1 2*k 2*k-1 ... 2]
]       % End
v       % Concatenate all stack contents into a column vector
G)      % Get n-th entry. Implicitly display

ดี! TIO ช้าบางครั้ง ...

1
สาเหตุหลักของความช้านี่คืออัลกอริทึม (ซึ่งสร้างคำศัพท์ได้มากกว่าที่จำเป็น) นอกจากนี้คอมไพเลอร์ MATL ไม่ได้รวดเร็วโดยเฉพาะ
Luis Mendo

1

แกลบ , 12 10 ไบต์

!ṁ§¤+hḣṫİ0

ลองออนไลน์!

ดัชนี 1 ครั้งทำงานค่อนข้างเร็ว

คำอธิบาย

!ṁ§¤+hḣṫİ0
 ṁ      İ0    Map the following function over the even numbers and concatenate the results together
  §   ḣṫ      Get the ranges 1-n and n-1, then... 
   ¤+h         remove the last element from both of them and concatenate them together
!             Return the element of the resulting list at the given index

8 bytesใช้
Zgarb

@Zgarb ว่าเป็นความคิดที่ดีและคุณอาจจะโพสต์เป็นคำตอบของคุณ :)
สิงห์



1

เรติน่า 62 ไบต์

.+
$*
^((^.|\2..)*)\1.
6$*1$2$2;1
(?=.+;(.+))\1(.+).*;\2.*
$.2

ลองออนไลน์! ลิงค์มีกรณีทดสอบ อินพุตถูกสร้างดัชนี 1 ขั้นตอนแรกเป็นเพียงทศนิยมเพื่อการแปลงเอก ขั้นตอนที่สองค้นหาจำนวนสแควร์สูงสุดsอย่างเคร่งครัดน้อยกว่าครึ่งหนึ่งของn; $1คือในขณะที่เป็น$2 2s-1มันจะคำนวณค่าสองค่าเป็นครั้งแรกจำนวนตัวเลขในการวิ่งขึ้น / ลงในปัจจุบันซึ่งก็คือ4(s+1) = 4s+4 = 2$2+6และอันดับที่สองภายในการวิ่งนั้นซึ่งก็คือn-2s² = n-(2$1+1)+1 = n-$&+1ซึ่งต้องการเพียงการ1ชดเชยสำหรับผู้ที่1ใช้ในการบังคับใช้ความไม่เท่าเทียมกันอย่างเข้มงวด จากนั้นสเตจสุดท้ายจะนับจากตำแหน่งนั้นถึงทั้งจุดเริ่มต้นและจุดสิ้นสุดของการวิ่งและรับผลลัพธ์ที่ต่ำกว่าและแปลงเป็นทศนิยม



1

Perl 5 , 43 + 1 (-p) = 44 ไบต์

$_=($n=2*int sqrt$_/2)+2-abs$n/2*$n+$n+1-$_

ลองออนไลน์!

ฉันกำลังทำงานกับสูตรเพื่อคำนวณองค์ประกอบที่ n โดยตรง จากนั้นฉันเห็นว่า @ fireflame241 ทำงานนั้นเสร็จแล้วและฉันเล่นกอล์ฟเป็นภาษาเพิร์ล

# Perl 5 , 50 + 1 (-n) = 51 ไบต์

push@r,1..++$",reverse 2..++$"while@r<$_;say$r[$_]

ลองออนไลน์!

ผลลัพธ์ถูกจัดทำดัชนี 0


1

Haskell , 115 81 ไบต์

y%x=snd(span(<x)$scanl(+)y[y+1,y+3..])!!0
g 1=1
g x|1%x>2%x=1+g(x-1)|1>0=g(x-1)-1

ลองออนไลน์!

มีเวทมนตร์บางอย่างเกิดขึ้นที่นี่ อาจจะสั้นกว่านี้หากฉันใช้วิธีการปกติ

คำอธิบาย

%ครั้งแรกที่เรากำหนด %เป็นฟังก์ชันที่ใช้เวลาสองตัวแปรและx yมันสร้างรายการและพบว่าองค์ประกอบแรกของรายการที่ยิ่งใหญ่กว่า scanl(+)y[y+1,y+3..] เพียงแค่ทำการเงินก้อนซ้ำเพื่อให้ได้ตัวเลขเป็นรูปสามเหลี่ยมที่เราจะทำเพื่อให้ได้ตัวเลขตารางที่เราจะทำ โดยเฉพาะสองรายการที่เราจะสร้างคือและxscanl(+)scanl(+)0[1..]scanl(+)0[1,3..]scanl(+)2[3,5..]scanl(+)1[2,4..]นี่คือจุดเปลี่ยนของรูปแบบ

ตอนนี้เรากำหนดฟังก์ชั่นหลักซึ่งจะนำg xหากxเป็นสิ่งที่เรากลับมา1เพราะนั่นคือค่าแรก ไม่เช่นนั้นเราจะตรวจสอบจุดเปลี่ยนผันถัดไปสองจุดหากการลดลงมีขนาดใหญ่กว่า1%x>2xเราจะคืนผู้สืบทอดตำแหน่งg$x-1มิฉะนั้นเราจะคืนค่าบรรพบุรุษของg$x-1มิฉะนั้นเรากลับบรรพบุรุษของ

โอเค แต่ทำไมมันถึงใช้ได้

ก่อนอื่น "มีอะไรบ้างกับวิธีที่เราหาจุดยอด" มันสำคัญที่จะต้องทราบระยะห่างระหว่างจุดยอดต่อเนื่องของประเภทเดียวกัน คุณจะสังเกตเห็นว่าความแตกต่างเพิ่มขึ้น 2 ในแต่ละครั้ง เรื่องนี้ทำให้รู้สึกเพราะฐานสามเหลี่ยมเป็นวงกว้างขึ้น 2 ในแต่ละครั้ง เราสามารถสร้างรายการที่แตกต่างกันอย่างคงที่โดยใช้ลิสต์แบบตัวอักษร[2,4..]และเราใช้scanl(+)เพื่อเปลี่ยนรายการเหล่านี้ให้เป็นรายการจุดยอดของเราตามตำแหน่งของจุดสุดยอดแรกและความแตกต่างแรก

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

Haskell , 56 51 46 ไบต์

นี่คือทางออกที่ดีกว่าของฉันที่มีคณิตศาสตร์น้อยลงและน้อยกว่าไบต์

d x|e<-[1..x-1]=e++map(x+1-)e
(([1..]>>=d)!!0)

ลองออนไลน์!



1

C # (. NET Core) , 120 ไบต์

คำอธิบาย: ง่าย ๆ , วงซ้อนกันแรกปีนขึ้นไปสูงสุดของเรา, วินาทีที่สองปีนกลับลงไปที่ 2 ซ้ำสำหรับแต่ละหลาย ๆ 2

x=>{var a=0;for(int i=2,j=0;j<x;i+=2){for(var b=1;b<=i&j<x;b++,j++){a=b;}for(var c=i-1;c>1&j<x;c--,j++){a=c;}}return a;}

ลองออนไลน์!


1

Ruby , 78 75 ไบต์

บันทึก 1 ไบต์ขอบคุณ Step Step

บันทึก 1 ไบต์ต้องขอบคุณ Mr. Xcoder

->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a<2;a+=c<1?-1:1};a}

ลองออนไลน์!

หวังว่าฉันจะได้รับคำแนะนำในการดึงจำนวนเงินที่เพิ่มขึ้น ฉันพยายามใช้วิธีง่าย ๆ


ยินดีต้อนรับสู่ PPCG! c=1 ifสามารถเล่นกอล์ฟถึงc=1if
สตีเฟ่น

76 bytes:->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a==1;a+=c<1?-1:1};a}
Mr. Xcoder

1

Java (OpenJDK 8) , 53 ไบต์

n->{int i=2;for(;n>i;i+=4)n-=i;return n>i/2?i-n+2:n;}

ลองออนไลน์!

-2 ไบต์ต้องขอบคุณ Nevay

1 การจัดทำดัชนี

TL; DRเราแบ่งลำดับออกเป็นส่วน ๆ สะดวกค้นหากลุ่มที่nมีอยู่แล้วค้นหาnthตำแหน่งในกลุ่ม

ที่นี่เราสามารถแบ่งลำดับดังนี้ [[1,2],[1,2,3,4,3,2],[1,2,3,4,5,6,5,4,3,2],...]4i-2ซึ่งจะช่วยให้เราขนาดก้อน เริ่มต้นด้วยi=2เราลบiจากnหลักย้ายขึ้นไปก้อนในเวลา เมื่อเราพอใจn<=iเราก็รู้แล้วว่าnตอนนี้ตำแหน่งของค่าที่ถูกต้องในก้อนปัจจุบัน

จากนั้นเราจะได้รับค่าโดยการเปรียบเทียบ nกับiขนาดของก้อน จุดกึ่งกลางของแต่ละอันเท่ากับi/2+1; ถ้าน้อยกว่านี้เราก็กลับn nถ้าเป็นมากขึ้นเรากลับni-n+2

ตัวอย่าง

n = 16, i = 2

Is n > i? Yes, n = n - 2 = 14, i = i + 4 = 6
Is n > i? Yes, n = n - 6 = 8, i = i + 4 = 10
Is n > i? No, stop looping.
10 / 2 + 1 = 6
Is n > 6? Yes, return i - n + 2 = 8 - 6 + 2 = 4

คุณไม่จำเป็นต้อง+1, return n>i/2?i-n+2:nจะเพียงพอ
Nevay

ฮะ. ขอบคุณการแบ่งจำนวนเต็ม
Xanderhall

1

Python 2 , 5! ไบต์ (120 ไบต์: P)

r=range
a=[]
for i in r(2,998,2): 
	for j in r(1,i+1): a.append(j)
	for j in r(i-1,1,-1): a.append(j)
print a[input()-1]

ลองออนไลน์!

ตรงไปตรงมาทำให้รายการแล้วองค์ประกอบที่นำเข้า '


ขอบคุณทุกคนที่ลงคะแนน! ตอนนี้ฉันมี 50 ตัวแทนแล้วฉันสามารถแสดงความคิดเห็น dabs อย่างหนาแน่น
Husnain Raza


0

QBIC , 47 ไบต์

g=q{p=p+1~p=:|_Xg\g=g+q~g=1or g>=r|r=r+1┘q=q*-1

คำอธิบาย

g=q         var g is the current value of the sequence; set to 1 at the start
{           DO infinitely
p=p+1       raise the step counter (var p)
~p=:|_Xg    IF p equals the input term a (read from cmd line) THEN QUIT, printing g
\           ELSE
g=g+q       raise (or decrement) g by q (q is 1 at the start of QBIC)
~g=1        IF g is at the lower bound of a subsequence
    or g>=r OR g is at the upper bound (r start as 2 in QBIC)
|r=r+1      THEN increment r (this happens once on lower bound, and once on upper, 
            total of 2 raise per subsequence)
┘q=q*-1     and switch q from 1 to -1

0

Röda , 54 ไบต์

f n{seq 1,n|{|i|seq 1,2*i;seq 2*i-1,2}_|head n+2|tail}

ลองออนไลน์!

โทรด้วย: try f(n)

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

เนื่องจากฟังก์ชั่นคืนคำตอบจริงหลังจากที่เรียกใช้ (อย่างชัดเจนภายในไม่กี่นาที) ฉันคิดว่าคำตอบนี้ใช้ได้

(ในฟังก์ชั่นRödaสามารถคืนค่าก่อนที่พวกเขาจะออกเนื่องจากความขนาน)



0

PHP, 65 + 1 ไบต์

for($x=$d=$z=1;--$argn;)$d=($x+=$d)>1?$x>$z?-1:$d:!!$z+=2;echo$x;

เรียกใช้เป็นไพพ์ด้วย-Rหรือลองออนไลน์ (หรือยกเลิกการใส่เครื่องหมายข้อคิดเห็นในเวอร์ชันอื่น)

JavaScript ที่เรียกซ้ำโดยใช้พอร์ต66 ไบต์:

function f($n,$t=2){return$t<2*$n?$t<$n?f($n-$t,$t+4):$t-$n+2:$n;}

พอร์ตของโซลูชัน Arnauldใช้เวลา 62 + 1:

$n=$argn;echo($n-=($r=(~-$n/2)**.5|0)*$r*2)<++$r*2?$n:$r*4-$n;

พอร์ตgolfedของXanderhall Javaมีรหัสที่สั้นที่สุด (55 + 1 ไบต์):

for($n=$argn;$n+2>$i+=4;)$n-=$i-2;echo$n*2>$i?$i-$n:$n;

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