New Order # 6: ไข่อีสเตอร์


13

บทนำ(อาจถูกละเว้น)

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

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

ไข่ห่านตกแต่ง

มันทำให้ฉันนึกถึงเกลียว Ulamที่ซึ่งจำนวนเต็มบวกทั้งหมดวางอยู่ในเกลียวหมุนทวนเข็มนาฬิกา เกลียวนี้มีคุณสมบัติที่น่าสนใจที่เกี่ยวข้องกับจำนวนเฉพาะ แต่ไม่เกี่ยวข้องกับความท้าทายนี้

เกลียวอูลาม

เราได้การเปลี่ยนแปลงจำนวนเต็มบวกของความท้าทายนี้ถ้าเราหาจำนวนในเกลียว Ulam และติดตามจำนวนเต็มทั้งหมดในเกลียวหมุนตามเข็มนาฬิกาตามเข็มนาฬิกาเริ่มต้นที่ 1 ด้วยวิธีนี้เราจะได้รับ:

1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.

หากคุณวาดเกลียวทั้งสองคุณจะได้ตาข่ายจำนวนหนึ่งที่ไม่มีที่สิ้นสุดของวงรี (เปลือกไข่) ( สังเกตการอ้างอิงคำสั่งซื้อใหม่ที่นั่น )

ลำดับนี้อยู่ใน OEIS ภายใต้หมายเลขA090861 ตั้งแต่นี้เป็น "ลำดับบริสุทธิ์" ความท้าทายของงานคือการส่งออก( n )สำหรับให้nเป็น input ที่( n )เป็นA090861a(n)na(n)

งาน

ได้รับการป้อนข้อมูลจำนวนเต็มnผลผลิต( n )ในรูปแบบจำนวนเต็มที่( n )เป็นA090861a(n)a(n)

a(0)=1;a(1)=6

กรณีทดสอบ

Input | Output
---------------
1     |  1
5     |  3
20    |  10
50    |  72
78    |  76
123   |  155
1234  |  1324
3000  |  2996
9999  |  9903
29890 |  29796

กฎระเบียบ

  • อินพุตและเอาต์พุตเป็นจำนวนเต็ม
  • โปรแกรมของคุณควรสนับสนุนอินพุตอย่างน้อยในช่วง 1 ถึง 32767)
  • อินพุตไม่ถูกต้อง (0, ลอย, สตริง, ค่าลบ, ฯลฯ ) อาจนำไปสู่เอาต์พุตที่ไม่ได้คาดการณ์ไว้, ข้อผิดพลาดหรือ (un) พฤติกรรมที่กำหนดไว้
  • ใช้กฎ I / Oเริ่มต้น
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


12

เยลลี่ ,  16 14 11 10 9  8 ไบต์

-1 ขอบคุณที่ลินน์ (สมัยที่ 2; ตรรกะไม่ได้เพิ่มให้กับตัวเอง: Ḃ¬+-> บิตหรือ 1: |1)

|1×r)ẎQi

การเชื่อมโยงเอกยอมรับจำนวนเต็มซึ่งผลตอบแทนถัวเฉลี่ยจำนวนเต็มna(n)

n2

½‘|1×rƲ€ẎQin+12

อย่างไร?

การเปลี่ยนแปลงคือการใช้หมายเลขธรรมชาติในชิ้นตรงกันข้ามของความยาว[1,5,3,11,5,17,7,23,9,29,11,35,13,...]- [1, 2*3-1, 3, 4*3-1, 5, 6*3-1, 7, 8*3-1, 9, ...]จำนวนเต็มบวกคี่สลับกับจำนวนเต็มบวกสอดคล้องกันถึงห้าแบบโมดูโลหกคือ

นี่คือสิ่งที่เหมือนกับ concatenating และ deduplicating ย้อนกลับช่วง[1..x]ซึ่งxเป็นผลบวกสะสมของความยาวชิ้นเหล่านี้ (นั่นคือจำนวนสูงสุดของแต่ละชิ้น) - [1,6,9,20,25,42,49,72,81,110,121,156,169,...]ซึ่งเป็นจำนวนเต็มคี่สแควร์สแควร์[1*1, 2*3, 3*3, 4*5, 5*5, 6*7, 7*7,...]

เนื่องจากความแตกต่างทั้งหมดมากกว่า 1 เราจึงสามารถบันทึกไบต์ (การกลับรายการ) โดยการสร้างช่วง[x..k]โดยตรงโดยที่kดัชนีดัชนี 1 ของชิ้นเป็น

P(n)=vP(v)=nn|1×r)ẎQị@n|1×r)ẎQi

|1×r)ẎQi - Link: integer, n       e.g. 10
    )    - for each k in [1..n]:  vs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10]
|1       -   bitwise-OR (k) with 1     [ 1, 3, 3, 5, 5, 7, 7, 9, 9,11]
  ×      -   multiply (by k)           [ 1, 6, 9,20,25,42,49,72,81,110]
   r     -   inclusive range (to k)    [[1],[6..2],[9..3],[20..4],...,[110..10]]
     Ẏ   - tighten                     [1,6,5,4,3,2,9,8,7,6,5,4,3,20,...,4,......,110,...,10]
      Q  - de-duplicate                [1,6,5,4,3,2,9,8,7,20,...,10,......,110,...82]
       i - first index with value (n)  20

2
ดีมาก. และคุณเหนือกว่าคำตอบของ MATL!
ตลอด 24

1
ถูกผูกไว้ตอนนี้ ... :-)
Luis Mendo

@ LuisMendo ฉันเพิ่งรู้ว่าฉันสามารถทำอะไรบางอย่างที่ไม่น่าไว้
Jonathan Allan

1
@JonathanAllan Aww นั่นสมควรได้รับการโหวต :-)
Luis Mendo

1
@ ลินน์ฉันแค่อัปเดตเป็น 9 byter คนอื่น คุณจะพิสูจน์ให้ 8!
Jonathan Allan

6

JavaScript (ES7),  46 45  41 ไบต์

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

n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n

ลองออนไลน์!

อย่างไร?

นี้เป็นไปตามสูตรที่ 1 การจัดทำดัชนีที่ใช้ในโปรแกรมตัวอย่างของA090861

xn0

xn=n1+12

ลองออนไลน์!

kn62

kn={2if n4xn2+2xn6otherwise

ลองออนไลน์!

an

an=8xn2+knxn+2n

ลองออนไลน์!

ซึ่งสามารถแปลเป็น:

n=>8*(x=(n-1)**.5+1>>1)*x+(n<=4*x*x+2*x?-2:6)*x+2-n

ทำให้การจัดทำดัชนี 0 บันทึก 5 ไบต์ทันที:

n=>8*(x=n**.5+1>>1)*x+(n<4*x*x+2*x?-2:6)*x+1-n

สูตรนี้สามารถทำให้ง่ายขึ้นโดยใช้:

xn=2×n+12

ซึ่งสามารถแสดงเป็น:

x=n**.5+1&~1

นำไปสู่:

n=>2*(x=n**.5+1&~1)*x+(n<x*x+x?-1:3)*x+1-n

และในที่สุดก็:

n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n




3

Python 3.8, 104 74 65 60 57 ไบต์

lambda n:(-2,6)[n>4*(x:=(n**.5+1)//2)*x+2*x]*x+2+~n+8*x*x

แก้ไข: ขอบคุณ Johnathan Allan ที่รับจาก 74 ถึง 57 ไบต์!

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


1
บันทึก 39 หลีกเลี่ยงการนำเข้าลบวงเล็บที่ซ้ำซ้อนและใช้>แทน<=และx*xแทนที่x**2... ชอบ: def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n... TIO
Jonathan Allan

! น่ากลัว ฉันจะรวมการแก้ไข ทำการเปลี่ยนแปลงก่อนที่ฉันจะเห็นความคิดเห็นของคุณและทำให้ได้ถึง 74 ไบต์ มันขึ้นอยู่กับว่าคุณกลับมาลอยตัวหรือไม่? ฉันถือว่าไม่ใช่ ...
Kapocsi

การเป็นตัวแทนของจำนวนเต็มลอยควรจะดี ประหยัดมากขึ้นโดยใช้การกำหนด Python 3.8 ... แก้ไข: ทำให้ไม่มีการทำดัชนี
Jonathan Allan

เด็ดมาก อย่าลังเลที่จะทำการแก้ไขเพิ่มเติมโดยตรง!
Kapocsi

3

Python 3.8 (เผยแพร่ล่วงหน้า) , 53 ไบต์

พอร์ตโดยตรงของคำตอบ JavaScript ของ Arnauldไปขึ้นคะแนนนั้นและ / หรือคำตอบ Mathematica ของ J42161217และ / หรือคำตอบ Python ของ Kapocsi :)

lambda n:((x:=int(n**.5+1)&-2)*2-(n<x*x+x)*4+3)*x+1-n

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

ลองออนไลน์!


2

Befunge, 67 57 ไบต์

วิธีการแก้ปัญหานี้ถือว่าการจัดทำดัชนี 0-based สำหรับค่าอินพุต

p&v-*8p00:+1g00:<
0:<@.-\+1*g00+*<|`
0g6*\`!8*2+00g4^>$:0

ลองออนไลน์!

คำอธิบาย

เราเริ่มต้นด้วยการคำนวณ "รัศมี" ซึ่งพบอินพุตnด้วยลูป:

radius = 0
while n > 0
  radius += 1
  n -= radius*8

ในตอนท้ายของลูปค่าก่อนหน้าของnคือการชดเชยลงในเกลียวที่รัศมีนั้น:

offset = n + radius*8

จากนั้นเราสามารถตรวจสอบว่าเราอยู่ในส่วนบนหรือด้านล่างของเกลียวดังนี้:

bottom = offset >= radius*6

และเมื่อเรามีรายละเอียดทั้งหมดเหล่านี้ค่าเกลียวจะถูกคำนวณด้วย:

value = ((bottom?10:2) + 4*radius)*radius + 1 - offset

รัศมีเป็นค่าเดียวที่เราต้องจัดเก็บเป็น "ตัวแปร" ซึ่ง จำกัด ไว้ที่ค่าสูงสุดที่ 127 ใน Befunge-93 ดังนั้นอัลกอริทึมนี้สามารถจัดการอินพุตได้สูงสุด 65024


1

Japt 15 ไบต์

ท่าเรือโซลูชันของ Jelly ของ Jonathan 1 การจัดทำดัชนี

gUòȲ+X*v)õÃcÔâ

ลองมัน

gUòȲ+X*v)õÃcÔâ     :Implicit input of integer U
g                   :Index into
 Uò                 :  Range [0,U]
   È                :  Map each X
    ²               :    Square X
     +X*            :    Add X multiplied by
        v           :    1 if X is divisible by 2, 0 otherwise
         )          :    Group result
          õ         :    Range [1,result]
           Ã        :  End map
            c       :  Flatten
             Ô      :    After reversing each
              â     :  Deduplicate

ผมแค่บอกว่าโจนาธานว่าx+(1-x%2)เป็นx|1(ประหยัดไบต์ในเจลลี่) ซึ่งคำตอบนี้ยังสามารถได้รับประโยชน์จากฉันเดิมพัน
ลินน์

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