การประมาณจำนวนจูบสองโหล


26

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

จากหน้า Wikipedia เกี่ยวกับปัญหา Kissing Number :

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

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

ตัวอย่างเช่น:

  • ในพื้นที่ 2 มิติวงกลมหน่วยสามารถสัมผัสวงกลมวงอื่น ๆ ได้ 6 วง
  • ในพื้นที่ 3 มิติทรงกลมของหน่วยสามารถสัมผัสกับทรงกลมอีก 12 หน่วย

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

ตารางขอบเขต

Dimension   Lower bound     Upper bound
1           2               2
2           6               6
3           12              12
4           24              24
5           40              44
6           72              78
7           126             134
8           240             240
9           306             364
10          500             554
11          582             870
12          840             1357
13          1154            2069
14          1606            3183
15          2564            4866
16          4320            7355
17          5346            11072
18          7398            16572
19          10668           24812
20          17400           36764
21          27720           54584
22          49896           82340
23          93150           124416
24          196560          196560

อินพุต

มิติข้อมูล: จำนวนเต็มตั้งแต่ 1 ถึง 24 (รวม)

ที่นี่ "จำนวนเต็ม" แสดงให้เห็นว่าการป้อนข้อมูลจะไม่มีส่วนที่เป็นเศษส่วน - มันอาจจะเป็น2หรือแต่ไม่เคย3 2.5วิธีแก้ปัญหาอาจยังคงใช้อินพุตเป็นทุ่นหรือสตริงตัวอย่างเช่น

เอาท์พุต

ตัวเลขในช่วงที่เกี่ยวข้องจากขีด จำกัด ล่างถึงขีด จำกัด สูงสุดของอินพุตนั้น (รวมอยู่ด้วย)

เอาต์พุตต้องถูกกำหนดไว้ (เหมือนกันสำหรับอินพุตเดียวกันเสมอ)

ผลลัพธ์จะต้องเป็นจำนวนเต็ม ตัวอย่างเช่นสำหรับใส่5ผลที่ถูกต้องที่เป็นไปได้40, 41, 42, ,43 44หมายเหตุนี่เป็นข้อ จำกัด ของค่าไม่ใช่ประเภท เป็นที่ยอมรับได้ในการคืนทุ่นหากมันมีส่วนที่เป็นศูนย์ ตัวอย่างเช่น41.5จะไม่ถูกต้อง แต่41.0จะถูกต้อง

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟคะแนนของคุณคือจำนวนไบต์ในรหัสของคุณ สำหรับแต่ละภาษาผู้ชนะคือทางออกด้วยคะแนนต่ำสุด


6
ปัญหาการประมาณยอดเยี่ยมจริงๆ
qwr

คำตอบ:


11

Julia 0.6 , 52 bytes

n->ceil(n<8?3.7exp(.51n)-5.1:n<24?9exp(.41n):196560)

ลองออนไลน์!

อย่างไร?

การเรียนรู้ของเครื่อง! (ครับอาจจะไม่จริง ๆ )

aebK+cc

aebK+cceil


6
ฉันจะไม่พิจารณาการค้นหากริดเพื่อเรียนรู้ของเครื่อง มันเป็นกำลังดุร้ายถ้ามีอะไร
qwr

5
แต่มันอยู่ในMLBase!!! J / k เส้นรอบ ๆ ML นั้นพร่ามัวเช่นเคย แต่นี่อาจจะพื้นฐานเกินไปที่จะได้รับการเรียนรู้ของเครื่องฉลาก จากนั้นอีกครั้งมันเป็นประโยชน์เสมอที่จะได้รับ buzzword ใน!
sundar - Reinstate Monica

เมื่อเราบอกว่าการเรียนรู้ของเครื่องจักรส่วนใหญ่เราคิดถึงพหุนามกับ n = 2 หรือ regexps
aaaaa พูดว่าคืนสถานะโมนิก้า

2
เมื่อฉันพูดถึงการเรียนรู้ของเครื่องจักรฉันคิดถึงโครงข่ายประสาทต้นไม้ตัดสินใจ HMMs perceptron ...
qwr

@Qwr ฉันช้ามาก แต่การถดถอยถือเป็นส่วนหนึ่งของการเรียนรู้ของเครื่องนอกเหนือไปจากสิ่งเหล่านั้นทั้งหมด (และอื่น ๆ ! SVM ฯลฯ )
Quintec

7

x86, 62 59 53 50 ไบต์

โซลูชันของฉันใช้ตารางการค้นหาแบบไบต์และเลื่อนเป็น 2 (ไม่มีการคำนวณ FP) ขนาด 9 ถึง 23 ให้ระยะทางเพียงพอสำหรับการเลื่อน ป้อนข้อมูลในและผลผลิตในeaxecx

-3 ด้วยการแลกเปลี่ยนeaxและecxตั้งแต่สั้นกว่าcmp $imm, %alcmp $imm, %cl

-4 โดยไม่ดำเนินการกับเคส N = 24 แยกต่างหาก แต่ใช้การปรับเปลี่ยนกับทุกครั้งที่ 1024 กรณี

-2 โดยไม่กลับมาเร็ว (โง่)

-3 โดยใช้ตารางเป็นออฟเซ็ตและmovzblแทนที่จะเป็นศูนย์ด้วยxor

start:
        dec     %eax                # 1-indexed table

        movzbl  table(%eax), %ecx   # return byte directly
        cmp     $8, %al
        jl      exit

        sal     $6, %ecx            # * 64 
        cmp     $19, %al
        jl      exit

        sal     $4, %ecx            # * 16
        sub     $48, %ecx

exit:   
        ret

#.data
table:  .byte   2, 6, 12, 24, 40, 72, 126, 240              # * 1
        .byte   5, 8, 10, 14, 19, 26, 41, 68, 84, 116, 167  # * 64  
        .byte   18, 28, 49, 92, 192                         # * 1024 - 48

Hexdump ( .textแทนตาราง.data)

00000502  48 0f b6 88 1c 05 00 00  3c 08 7c 0d c1 e1 06 3c  |H.......<.|....<|
00000512  13 7c 06 c1 e1 04 83 e9  30 c3 02 06 0c 18 28 48  |.|......0.....(H|
00000522  7e f0 05 08 0a 0e 13 1a  29 44 54 74 a7 12 1c 31  |~.......)DTt...1|
00000532  5c c0                                             |\.|

1
ตารางอ่านอย่างเดียวดังนั้นโดยปกติคุณจะวางไว้ใน.rodataที่ไม่ได้.dataอยู่แล้ว (หรือบน Windows .rdata) .rodataส่วนได้รับการเชื่อมโยงเป็นส่วนหนึ่งของกลุ่มข้อความ
Peter Cordes

1
และ BTW คนทั่วไปเขียนshlโดยเฉพาะอย่างยิ่งเมื่อหมายเลขของคุณไม่ได้ลงชื่อ (คุณเคยmovzblโหลดไม่ใช่movsbl) แน่นอนว่าsalเป็นชื่ออื่นสำหรับ opcode เดียวกัน gcc ปล่อยออกsalมา แต่มันค่อนข้างหายากที่จะเห็นมันในรหัสที่เขียนด้วยมือ
Peter Cordes

7

JavaScript (ES6), 60 ไบต์

f=(n,k=2)=>n<24?--n?f(n,k*24/(17+~'_8443223'[n])):~~k:196560

ลองออนไลน์!

อย่างไร?

a24=196560

คำศัพท์อื่น ๆ ทั้งหมดคำนวณซ้ำโดยใช้:

{a1=2an+1=an×24qn

qn

{q1=8q2=12q3=12q4=13q5=14q6=14q7=13qn=16,for n>7

นำไปสู่อัตราส่วนต่อไปนี้:

3,2,2,2413,127,127,2413,32,32,,32

ผลลัพธ์สุดท้ายจะถูกปูพื้นและส่งคืนในที่สุด

สรุปผลลัพธ์

ผลลัพธ์โดยประมาณจะได้รับด้วยทศนิยม 2 ตำแหน่ง

  n |   a(n-1) | multiplier |      a(n) | output |          expected
----+----------+------------+-----------+--------+-------------------
  1 |      n/a |        n/a |         2 |      2 |                2
----+----------+------------+-----------+--------+-------------------
  2 |        2 |          3 |         6 |      6 |                6
  3 |        6 |          2 |        12 |     12 |               12
  4 |       12 |          2 |        24 |     24 |               24
  5 |       24 |      24/13 |     44.31 |     44 |        [40,..,44]
  6 |    44.31 |       12/7 |     75.96 |     75 |        [72,..,78]
  7 |    75.96 |       12/7 |    130.21 |    130 |      [126,..,134]
  8 |   130.21 |      24/13 |    240.39 |    240 |              240
  9 |   240.39 |        3/2 |    360.58 |    360 |      [306,..,364]
 10 |   360.58 |        3/2 |    540.87 |    540 |      [500,..,554]
 11 |   540.87 |        3/2 |    811.31 |    811 |      [582,..,870]
 12 |   811.31 |        3/2 |   1216.97 |   1216 |     [840,..,1357]
 13 |  1216.97 |        3/2 |   1825.45 |   1825 |    [1154,..,2069]
 14 |  1825.45 |        3/2 |   2738.17 |   2738 |    [1606,..,3183]
 15 |  2738.17 |        3/2 |   4107.26 |   4107 |    [2564,..,4866]
 16 |  4107.26 |        3/2 |   6160.89 |   6160 |    [4320,..,7355]
 17 |  6160.89 |        3/2 |   9241.34 |   9241 |   [5346,..,11072]
 18 |  9241.34 |        3/2 |  13862.00 |  13862 |   [7398,..,16572]
 19 | 13862.00 |        3/2 |  20793.01 |  20793 |  [10668,..,24812]
 20 | 20793.01 |        3/2 |  31189.51 |  31189 |  [17400,..,36764]
 21 | 31189.51 |        3/2 |  46784.26 |  46784 |  [27720,..,54584]
 22 | 46784.26 |        3/2 |  70176.40 |  70176 |  [49896,..,82340]
 23 | 70176.40 |        3/2 | 105264.59 | 105264 | [93150,..,124416]
----+----------+------------+-----------+--------+-------------------
 24 |           (hard-coded)            | 196560 |           196560 

1
สิ่งแรกที่ฉันเห็นคือตัวดำเนินการระดับบิตภายในฟังก์ชัน JavaScript แบบเรียกซ้ำ สิ่งแรกที่ฉันคิดคือ "Arnauld คืออะไรถึง ... "
MattH

โต๊ะสวยมาก คุณทำเองไหม
qwr

1
@qwr ใช่นั่นคือการแก้ไข Notepad ++ เป็นส่วนใหญ่ ฉันเพิ่งใช้สคริปต์เพื่อสร้างค่าในคอลัมน์ 4 คอลัมน์แรก
Arnauld

4

เยลลี่ , 29 26 ไบต์

“~D=ⱮziEc+y’Dḣ+⁵÷7PĊ«“£#;’

ลองออนไลน์!

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

“~D=ⱮziEc+y’Dḣ+⁵÷7PĊ«“£#;’  Main link. Argument: n

“~D=ⱮziEc+y’                Set the return value to 485523230101001100011122.
            D               Decimal; convert the return value to base 10.
             ḣ              Head; take the first n elements of the digit list.
              +⁵            Add 10 to each element.
                ÷7          Divide the sums by 7.
                  P         Take the product.
                   Ċ        Ceil; round up to the nearest integer.
                     “£#;’  Yield 196560.
                    «       Take the minimum.

1

JavaScript (Node.js) , 120 99 ไบต์

ลดลง 21 ไบต์ การลดขนาดใหญ่ต้องขอบคุณข้อเสนอแนะของ tsh เพื่อเพิ่มช่องลงไปที่จุดเริ่มต้นของอาร์เรย์ (บันทึกสองไบต์จากn-1ไปยังnและเล็งไปที่หมายเลขกลมภายในขอบเขตล่างและบนดังนั้นลดขนาดลงจากสัญกรณ์คงที่เช่น1154สัญกรณ์ชี้แจง 2e3เช่น

เป้าหมายเดิมของฉันคือการแสดงให้เห็นว่า "โง่" แบบไหน (เช่นไม่ใช้คณิตศาสตร์จริง ๆ เหมือนคำตอบของ Arnauld) มันน่าประทับใจที่มีห้องพักที่จะย่อเล็กลงโดยไม่มีการแปลงหรือการคำนวณ

n=>[,2,6,12,24,40,72,126,240,306,500,582,840,2e3,2e3,3e3,5e3,6e3,8e3,2e4,2e4,3e4,5e4,1e6,196560][n]

ลองออนไลน์!

ความยาวของคำตอบของ Arnauld เป็นสองเท่าของจำนวนความซับซ้อน 0

JavaScript (Node.js) , 129 128 ไบต์

(-1 ไบต์ขอบคุณที่แนะนำให้ใช้การเปลี่ยนบิต)

f=(n)=>[2,6,12,24,40,72,126,240].concat([5,8,10,14,19,26,41,68,84,116,167].map(x=>x<<6),[17,28,49,91].map(x=>x<<10),196560)[n-1]

ลองออนไลน์!

เพื่อตอบสนองความต้องการของการเป็นที่น่าสนใจฉันขโมยตรรกะจากคำตอบ x86 และสร้างอาร์เรย์จากนั้น ทำให้ยาวขึ้น 9 ไบต์ แต่น่าสนใจกว่าเล็กน้อย


yawnsอย่างน้อยลองสิ่งที่น่าสนใจ
qwr

ฉันคิดว่าการสาธิตให้เห็นถึงวิธีการที่ตรงไปตรงมาที่สุด (และในทางเทคนิคแล้วความยาวที่เหมาะสมที่สุด) น่าสนใจมาก ของ Arnauld นั้นค่อนข้างสั้นที่สุดที่คุณจะได้รับใน JS แต่ที่ยาวที่สุดคือไบต์ที่สองเท่านั้น
แอนโทนี่

1
จุดของตารางการค้นหาไบต์คือบางทีใช้การทดสอบหรือสิ่งที่คล้าย "02060c1828487ef0" โดยที่แต่ละรายการนั้นมีหนึ่งไบต์หรือ 2 ตัวอักษรในฐานสิบหกหากคุณต้องการ การจัดเก็บตัวเลขในรูปทศนิยมโดยตรงมีความยาวสูงสุด 3 อักขระ นอกจากนี้ยังใช้ bitshifting ...
qwr

2
คุณควรที่ลบน้อยf=การเปลี่ยนแปลง(x)ที่จะxเพิ่มหลุมและการเปลี่ยนแปลงไปx-1 TIO ; และอาจจะรวมเป็นTIO 99 ไบต์x
tsh

5
ยินดีต้อนรับสู่ PPCG! :)
Shaggy

1

รูน, 173 ไบต์

>i:8(?D5X1+1C,*212,+16,+1c2*,+1cX,+Sp3X7+a,*5X1+a,-1+kn$;
      R:c2*(?D4X1+1C,*212,+16,+1c2*,+Sp9*1+:4XY(?Dkn$;
             R`196560`r@;              ;$*C1nk,C1L

(โปรดทราบว่าควรนับมุมขวาล่างเป็นไบต์: ส่วนนั้นเต็มไปด้วยช่องว่าง)

TIO ของ exe ต้องการการอัปเดตที่คำตอบนี้อาศัย (และฉันกำลังปรับปรุงช่องโหว่อื่น ๆ ก่อนที่จะขอให้ Dennis สร้างใหม่) แต่เสียบค่าใน (ให้แน่ใจว่าได้เพิ่มช่องว่างในบรรทัดที่ 2 และ 3 หากใช้มากกว่าหนึ่งตัวอักษรสำหรับค่าในบรรทัดแรก) นี่คือวิธีที่ง่ายที่สุดในการเขียนค่าที่ต้องการ:

0-9,a-f  ->  1-15
2Xn+     ->  20+n

ลองออนไลน์!

ฟังก์ชั่นนี้เป็นพอร์ตของคำตอบ Julia ของ sundar (แต่ Runic ไม่มีคำสั่งสำหรับการผลักeไปที่ stack (หรือจริง ๆ , ค่าทศนิยมใด ๆ ), ดังนั้นจึงจำเป็นต้องใช้การประมาณ) การประมาณสำหรับeอินพุตที่น้อยกว่า 8 นั้นแม่นยำยิ่งขึ้นเนื่องจากการสูญเสียความแม่นยำส่งผลให้ค่าอยู่นอกช่วงเอาต์พุตที่อนุญาต (เช่น7จะสร้าง 125) Ceil()ทำได้โดยการแปลงเป็นอักขระจากนั้นกลับไปที่ตัวเลข (ซึ่งล้มเหลวสำหรับค่าที่มีขนาดใหญ่เป็นพิเศษดังนั้นที่ 40k ฉันได้หารด้วย 100 ทำการแปลงไปและกลับแล้วคูณด้วย 100 อีกครั้ง)

อาจมีห้องพักบางส่วนเพื่อลดความซับซ้อนของการจัดการ (เช่นการทำงานจุดเริ่มต้นในแนวตั้งด้านล่างหรือหาวิธีที่จะบีบอัดประมาณสำหรับe) แต่ฉันมีความสุขที่มีเพียงความสามารถในการทำการคำนวณ

/?D5X1+1C,*212,+16,+1c2*,+1cX,+Sp3X7+a,*5X1+a,-1+kn$;
  R:c2*(?D4X1+1C,*212,+16,+1c2*,+Sp9*1+:4XY(?Dkn$;
\(8:i<   R`196560`r@;              ;$*C1nk,C1L

161 ไบต์

การปรับปรุงล่าม:

ด้วยการอ่านอินพุตการตรึงแบบพุชตอนนี้ Runic มีฟังก์ชันคณิตศาสตร์มากมายและความสามารถในการแยกสตริงเป็นสองเท่า นั่นจะทำให้คำตอบนี้ง่ายขึ้นอย่างมาก แต่ฉันจะปล่อยให้มันเป็นไปเพื่อแสดงความพยายามที่ฉันใส่เข้าไป (ฉันได้เพิ่มฟังก์ชั่นคณิตศาสตร์อาร์กิวเมนต์เดียวและการวิเคราะห์สตริงในไม่ช้าหลังจากโพสต์: ฉันมี Sin / Cos / Tan รายการที่ต้องทำของฉัน แต่ไม่ได้พิจารณาว่า Exp, Abs, Log ฯลฯ และมีจำนวนอักขระหมด) TIO ควรอัปเดตใน 24-48 ชั่วโมงข้างหน้าขึ้นอยู่กับว่าเดนนิสเห็นเมื่อใด

212,+16,+1c2*,+1cX,+จะลดเป็น -> 1'eAด้วยการอัพเดทล่ามนี้ Apops อักขระและค่าและดำเนินการทางคณิตศาสตร์กับค่านั้นตามอักขระที่ popped ( eในกรณีนี้คือExp()และExp(1)ส่งคืนe )

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