เก็บ / วาง / เพิ่มลำดับ


20

นี่คือลำดับที่ฉันพูดถึง:

{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}

เริ่มต้นจาก 1 เก็บ 1 ลดลง 2 ถัดไปเก็บ 2 ถัดไปลดลง 3 เก็บ 3 และอื่น ๆ ใช่มันอยู่ในOEIS (A064801)ด้วย!

ความท้าทาย

รับจำนวนเต็มn>0หาคำที่ n ของลำดับข้างต้น

กรณีทดสอบ

Input -> Output       
1->1  
22->49  
333->683
4444->8908
12345->24747

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ! โชคดี!



3
เราสามารถเลือกการจัดทำดัชนีระหว่าง 0 ถึง 1 ได้ไหม
Mr. Xcoder

1
@ Mr.Xcoder ฉันไม่กลัว นี้เป็นเพียง 1 การจัดทำดัชนี

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

@Weateat ตัวช่วยสร้างนี้ไม่สามารถยอมรับได้ทั้งหมด ขออภัย

คำตอบ:


12

Java (OpenJDK 8) , 45 44 ไบต์

n->{int i=0;for(;++i<n;n-=i);return~-n+i*i;}

ลองออนไลน์!

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

หลังจากจ้องที่นี่สักพักฉันก็สังเกตเห็นลวดลาย ทุกครั้งที่เราวางnตัวเลขหมายเลขถัดไปในลำดับจะเป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ เมื่อเห็นอย่างนี้แล้วผมก็แยกลำดับออกเป็นชิ้น ๆ ที่สะดวกสบาย: [[1],[4,5],[9,10,11],...]โดยพื้นฐานแล้วiชิ้นที่สามเริ่มต้นด้วยi*iและวนขึ้นไปเรื่อย ๆ สำหรับiองค์ประกอบ

ในการค้นหาnหมายเลขลำดับที่หนึ่งในลำดับนี้เราต้องการค้นหาอันดับแรกที่จำนวนนั้นอยู่ในตำแหน่งนั้นจากนั้นตำแหน่งใดในกลุ่มที่ครอบครอง เราลบจำนวนที่เพิ่มขึ้นของเราiจากnจนกว่าnจะน้อยกว่าi(ซึ่งจะช่วยให้เราก้อนของเรา) และจากนั้นก็เพิ่มn-1เพื่อi*iที่จะได้รับที่ถูกต้องpositionในก้อน

ตัวอย่าง:

n = 8
n > 1? Yes, n = n - 1 = 7
n > 2? Yes, n = n - 2 = 5
n > 3? Yes, n = n - 3 = 2
n > 4? No, result is 4 * 4 + 2 - 1 = 17

1
คุณสามารถใช้return~-n+i*i;เพื่อบันทึก 1 ไบต์
Nevay

7

Haskell, 48 43 41 ไบต์

n#l=[l..l+n]++(n+1)#(l+2*n+3)
((0:0#1)!!)

4 ไบต์พิเศษสำหรับการจัดทำดัชนีแบบ 1 แทนการใช้แบบ 0 ข้อ จำกัด ที่ไม่จำเป็น IMHO

ลองออนไลน์!

n#l             -- n is one less than the number of element to keep/drop and
                -- l the next number where the keep starts
   [l..l+n]     -- keep (n+1) numbers starting at l
   ++           -- and append a recursive call
   (n+1)#       -- where n is incremented by 1 and
      (l+2*n+3) -- l skips the elements to keep & drop

0#1             -- start with n=1 and l=0 and
 0:             -- prepend a dummy value to shift from 0 to 1-based index
    !!          -- pick the i-th element from the list 

6

Python 3 , 47 46 bytes

1 ไบต์ขอบคุณ Mr. Xcoder

def f(n):a=round((2*n)**.5);return~-n+a*-~a//2

ลองออนไลน์!

เร็วมากสำหรับตัวเลขที่สูงขึ้น


46 def f(n):a=round((2*n)**.5);return~-n+a*-~a//2ไบต์: ไม่แน่ใจว่า ... วิธีการที่ฉลาด!
Mr. Xcoder

อ๊ะ, lambdas สองเท่าเป็นหนึ่งไบต์พิเศษ, ฉันหวังว่าจะประหยัดไบต์ ...
สตีเฟ่น

ทำไมหนึ่งลงคะแนนนี้ มีปัญหากับวิธีการที่เราไม่ได้สังเกตหรือไม่?
Mr. Xcoder

@ Mr.Xcoder อาจเป็นเพราะคำพูดที่ไม่ดี
Leun Nun

a*(a+1)แม้กระทั่งสำหรับจำนวนเต็มทุกตัว Python บ่นเรื่องการแบ่งทศนิยมในจำนวนเต็มหรือไม่? มันบ่นเกี่ยวกับการดำเนินการระดับบิตในลอย? (2*n)**.5+.5|0ถ้าไม่ได้:
ติตัส


3

Haskell , 33 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อ ใช้เป็น((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1

(!!)$0:do n<-[1..];[n^2..n^2+n-1]

ลองออนไลน์!

  • !!โครงสร้างลำดับเป็นรายการที่ไม่มีที่สิ้นสุดแล้วดัชนีลงไปด้วย องค์ประกอบ0:นี้เป็นองค์ประกอบจำลองเพื่อปรับเปลี่ยนการจัดทำดัชนีจาก 0 ถึง 1
  • ช่วงที่[n^2..n^2+n-1]สร้าง subsequence โดยไม่มีช่องว่างที่เริ่มต้นด้วยตารางของnและมีnหมายเลข
  • สัญกรณ์เชื่อมช่วงสร้างทั้งหมดdon>=1


2

Perl 6 , 43 ไบต์

{(1..*).rotor({++$=>++$+1}...*).flat[$_-1]}

ทดสอบมัน

ขยาย:

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

  ( 1 .. * )                  # range starting from 1

  .rotor(                     # break it into chunks

    { ++$  =>  ++$ + 1} ... * # infinite Seq of increasing pairs
    #   1  =>    1 + 1    ==>   1 => 2 ( grab 1 skip 2 )
    #   2  =>    2 + 1    ==>   2 => 3
    #   3  =>    3 + 1    ==>   3 => 4
    # ...  =>  ... + 1

  ).flat\                     # reduce the sequence of lists to a flat sequence
  [ $_ - 1 ]                  # index into the sequence
                              # (adjusting to 0-based index)
}

(1..*).rotor({++$=>++$+1}...*) ผลิต:

(
 (1,),
 (4, 5),
 (9, 10, 11),
 (16, 17, 18, 19),
 (25, 26, 27, 28, 29),
 ...
).Seq

2

TeX, 166 ไบต์

\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

การใช้

\documentclass[12pt,a4paper]{article}
\begin{document}
\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

\f{1}

\f{22}

\f{333}

\f{4444}

\f{12345}
\end{document}

enter image description here


2

Javascript, 43 38 ไบต์

n=>eval("for(r=1;n>r;)n-=r++;r*r+n-1")

ลองออนไลน์!

ฉันใช้ความจริง, สำหรับตัวเลขสามเหลี่ยมแต่ละตัวบวกหนึ่ง, ผลลัพธ์คือเลขยกกำลังสอง

ดังตัวอย่าง: ตัวเลขสามเหลี่ยมคือ 0, 1, 3, 6, 10 ... ดังนั้นสำหรับ 1, 2, 4, 7, 11 ... เราสังเกต 1, 4, 9, 16, 25 ... ในลำดับของเรา .

หากดัชนีอยู่ระหว่างตัวเลขที่รู้จักเหล่านี้องค์ประกอบของลำดับของเราจะเลื่อนไปทีละเลขเท่านั้น ตัวอย่างเช่นในการคำนวณผลลัพธ์สำหรับ 10 เราใช้ 7 (เป็นตัวเลขสามเหลี่ยมบวกหนึ่ง) นำผลลัพธ์ (16) และเพิ่ม 10-7 = 3 ดังนั้น 16 + 3 = 19






1

Mathematica ขนาด 37 ไบต์

Flatten[Range@#+#^2-1&~Array~#][[#]]&

คำอธิบาย

Range@#+#^2-1&

Functionซึ่งใช้จำนวนเต็มบวก#และส่งกลับการทำงานของ#ตัวเลขที่ต่อเนื่องกันในลำดับ

...~Array~#

สร้างรายการของการรันทั้งหมดดังกล่าวจนถึงอินพุต #

Flatten[...][[#]]

Flattensรายการผลลัพธ์และส่งคืน#องค์ประกอบที่



1

Tampio , 310 308 bytes

n:n uni on n unena 1:lle
a unena k:lle on a vuona k:lla vähennettynä a:sta ja k
a vuona nollalla ja k on a
a vuona k:lla vähennettynä nollasta ja k on a
a vuona b:n seuraajalla ja k on yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla ja k:n vähennettynä a:sta arvolla unena k:n seuraajalle seuraaja

การใช้งาน: ประเมิน4:n uni9

คำอธิบาย:

n:n uni on n unena 1:lle
uni(n)  =  n `uni` 1

a unena k:lle on  a vuona  k:lla vähennettynä a:sta ja k
a `uni` k     =  (a `vuo` (k     `vähennetty` a)    )  k

 a vuona nollalla ja k on a
(a `vuo` 0        )  k =  a

 a vuona  k:lla vähennettynä nollasta ja k on a
(a `vuo` (k     `vähennetty` 0)       )  k =  a

 a vuona  b:n seuraajalla ja k on
(a `vuo` (b   + 1)        )  k =

 yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla
(yhteenlasku            (k   *          2     )

 ja k:n vähennettynä a:sta arvolla unena  k:n seuraajalle seuraaja
((  k   `vähennetty` a     )       `uni` (k   + 1)   )  ) + 1

จากห้องสมุดมาตรฐาน:

a `vähennetty` b = b - a
yhteenlasku a b  = a + b

1

JavaScript (ES6), 33 ไบต์

วิธีการแก้ปัญหาซ้ำแรงบันดาลใจจากการสังเกตของ Xanderhall

f=(n,x=1)=>n<x?n+x*x-1:f(n-x,++x)

ลองมัน

o.innerText=(
f=(n,x=1)=>n<x?n+x*x-1:f(n-x,++x)
)(i.value=12345);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>





0

Javascript (ES6) 100 98 Bytes

var k=n=>{var s=[],i=1,c=1,j;while(s.length<n){for(j=i;j<i+c;j++){s.push(j)}i+=c*2+1;c++}return s}

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


0

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

.+
$*
((^1|1\2)+)1
$1$2$&
1

ลองออนไลน์! คำตอบของ Python ของ @PeakyNun พอร์ต ขั้นตอนแรกและครั้งสุดท้ายเป็นเพียงการแปลงทศนิยม⇔ unary ที่น่าเบื่อ ขั้นตอนที่สองทำงานดังนี้: ((^1|1\2)+)เป็นตัวจับคู่รูปสามเหลี่ยม $1คือตัวเลขสามเหลี่ยมที่ตรงกันในขณะที่$2เป็นดัชนี ต่อท้าย1หมายความว่ามันตรงกับจำนวนรูปสามเหลี่ยมที่ใหญ่ที่สุดอย่างเคร่งครัดน้อยกว่าการป้อนข้อมูลจึงทำให้เกิดการซ้ำว่าหนึ่งน้อยกว่าห่วงหลามหมายความว่า$1เทียบเท่ากับa-iและ$2การi-1และผลรวมของพวกเขาคือa-1หรือ~-aตามความจำเป็น ( เพื่อให้ตรงกับในกรณีนั้นด้วย$&เพียงป้องกันไม่ให้ลบการแข่งขันออกจากผลลัพธ์) โปรดทราบว่าสำหรับอินพุตที่1ไม่มีการจับคู่เกิดขึ้นและเอาต์พุตนั้นก็เหมือนกับอินพุต หากคุณผิดปกติคุณสามารถใช้^((^1|1\2)*)1




0

PHP, 48 42 37 + 1 ไบต์

รังเพลิงจากคำตอบของ Leaky Nun

while($argn>$a+=$i++);echo$a+~-$argn;

ทำงานเป็นท่อที่มี-Fหรือลองออนไลน์

วิธีการโดยตรง 42 + 1 ไบต์ ( ตอบจากคำตอบอื่นของ Leaky Nun )

<?=($a=(2*$argn)**.5+.5|0)*-~$a/2+~-$argn;

เรียกใช้เป็น-nRไพพ์ด้วยหรือไม่แสดงข้อคิดเห็นใน TiO ด้านบน

โซลูชันแบบวนซ้ำรุ่นเก่า 48 + 1 ไบต์

for(;$argn--;$n++)$c++>$z&&$n+=++$z+$c=1;echo$n;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.