Hai chục xấp xỉ số hôn


26

Cho một số từ 1 đến 24, xuất số hôn theo kiến ​​thức tốt nhất hiện tại (một số số sẽ có nhiều hơn một đầu ra chấp nhận được). Kiến thức về hình học là không cần thiết vì tất cả các đầu ra được liệt kê dưới đây.

Từ trang Wikipedia về vấn đề số hôn :

một số hôn được định nghĩa là số các quả cầu đơn vị không chồng chéo có thể được sắp xếp sao cho chúng chạm vào một khối cầu đơn vị đã cho khác

Đó là, được đưa ra một quả cầu đơn vị, có bao nhiêu quả cầu đơn vị có thể chạm vào nó mà không có bất kỳ quả cầu nào trùng nhau? Câu hỏi sẽ được hỏi trong không gian N chiều, trong đó một hình cầu được hiểu là hình cầu N-1 chiều.

Ví dụ:

  • trong không gian 2 chiều, một vòng tròn đơn vị có thể chạm vào 6 vòng tròn đơn vị khác.
  • trong không gian 3 chiều, một quả cầu đơn vị có thể chạm vào 12 quả cầu đơn vị khác.

Trang Wikipedia liệt kê các giá trị cho không gian từ 1 đến 24 chiều. Tuy nhiên, một số trong số này chưa được biết chính xác, do đó chỉ đưa ra giới hạn dưới và trên. Bảng được sao chép ở đây để nó sẽ được cố định, bất kể thu hẹp phạm vi trong tương lai do bằng chứng mới. Các giải pháp được đánh giá theo bảng cố định này, ngay cả khi trang Wikipedia được sửa đổi trong tương lai.

Bảng giới hạn

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

Đầu vào

Kích thước: Một số nguyên từ 1 đến 24 (đã bao gồm).

Ở đây "số nguyên" chỉ ra rằng đầu vào sẽ không có phần phân số - nó có thể 2hoặc 3không bao giờ 2.5. Một giải pháp vẫn có thể lấy đầu vào dưới dạng float hoặc chuỗi chẳng hạn.

Đầu ra

Một số trong phạm vi có liên quan, từ giới hạn dưới đến giới hạn trên cho đầu vào đó (đã bao gồm).

Đầu ra phải có tính xác định (luôn giống nhau cho cùng một đầu vào).

Đầu ra phải là số nguyên. Ví dụ, đối đầu vào 5đầu ra hợp lệ có thể là 40, 41, 42, 43, 44. Lưu ý đây là một hạn chế về giá trị, không phải loại. Có thể chấp nhận trả lại một float, miễn là nó không có phần phân số. Ví dụ, 41.5sẽ không hợp lệ, nhưng 41.0sẽ hợp lệ.

Chấm điểm

Đây là . Điểm của bạn là số byte trong mã của bạn. Đối với mỗi ngôn ngữ, người chiến thắng là giải pháp có số điểm thấp nhất.


6
Vấn đề xấp xỉ thực sự mát mẻ.
qwr

Câu trả lời:


11

Julia 0,6 , 52 byte

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

Hãy thử trực tuyến!

Làm sao?

Học máy! (Kinda. Có lẽ. Không thực sự. )

một*ebK+cc

một*ebK+cceil


6
Tôi sẽ không coi việc tìm kiếm là học máy. Đó là lực lượng vũ phu nếu bất cứ điều gì.
qwr

5
Nhưng nó ở trong MLBase!!! J / k, các đường xung quanh ML là mờ như mọi khi, nhưng điều này có lẽ quá cơ bản để xứng đáng với học máy nhãn. Sau đó, một lần nữa, nó luôn hữu ích để có được một từ thông dụng!
- Phục hồi Monica

Khi chúng ta nói Machine Learning, chúng ta chủ yếu nghĩ về đa thức với n = 2 hoặc regexps
aaaaa nói phục hồi Monica

2
Khi tôi nói học máy, tôi nghĩ về mạng lưới thần kinh, cây quyết định, HMM, perceptron ...
qwr

@qwr Tôi rất muộn, nhưng hồi quy thực sự được coi là một phần của học máy, bên cạnh tất cả những điều đó. (Và hơn thế nữa! SVM, v.v.)
Quintec

7

x86, 62 59 53 50 byte

Giải pháp của tôi sử dụng bảng tra cứu byte và dịch chuyển 2 (không tính toán FP). Kích thước 9 đến 23 cung cấp đủ độ trễ cho việc dịch chuyển. Đầu vào eaxvà đầu ra trong ecx.

-3 bằng cách hoán đổi eaxecxcmp $imm, %alnó ngắn hơn cmp $imm, %cl.

-4 bằng cách không xử lý riêng trường hợp N = 24 mà áp dụng điều chỉnh cho tất cả 1024 trường hợp.

-2 bằng cách không trở về sớm (ngu ngốc)

-3 bằng cách sử dụng bảng làm offset và movzblthay vì zeroing vớixor

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 (bảng .textthay vì .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
Bảng chỉ đọc, do đó, thông thường bạn sẽ đặt nó vào .rodata, không phải .data. (Hoặc trên Windows, rõ ràng .rdata). Phần .rodatanày được liên kết như là một phần của phân đoạn văn bản.
Peter Cordes

1
Và BTW, người bình thường viết shl, đặc biệt là khi số của bạn không được ký (bạn đã từng movzbltải nó chứ không phải movsbl). Tất nhiên salchỉ là một tên khác cho cùng một opcode. gcc phát ra sal, nhưng thật hiếm khi thấy nó trong mã viết tay.
Peter Cordes

7

JavaScript (ES6), 60 byte

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

Hãy thử trực tuyến!

Làm sao?

một24= =Năm 196560

Tất cả các thuật ngữ khác được tính toán đệ quy, sử dụng:

{một1= =2mộtn+1= =mộtn×24qn

qn

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

dẫn đến các tỷ lệ sau:

3,2,2,2413,127,127,2413,32,32,Giáo dục,32

Kết quả cuối cùng cuối cùng được thả nổi và trả lại.

Tóm tắt kết quả

Kết quả gần đúng được đưa ra với 2 chữ số thập phân.

  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
Điều đầu tiên tôi thấy là các toán tử bitwise bên trong hàm JavaScript đệ quy; điều đầu tiên tôi nghĩ là "Arnauld là gì ..."
MattH

Bàn thật đẹp. Bạn đã làm nó bằng tay?
qwr

1
@qwr Có, đó chủ yếu là một số chỉnh sửa Notepad ++. Tôi chỉ sử dụng một tập lệnh để tạo các giá trị trong 4 cột đầu tiên.
Arnauld

4

Thạch , 29 26 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

“~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 byte

Giảm 21 byte. Giảm mạnh nhờ đề xuất của tsh để thêm một lỗ vào đầu mảng (tiết kiệm hai byte đi từ n-1đến nvà nhắm vào các số tròn trong giới hạn dưới và trên, do đó thu nhỏ chúng từ ký hiệu điểm cố định như 1154ký hiệu theo cấp số nhân như 2e3.

Một lần nữa, mục tiêu ban đầu của tôi là chỉ ra cách thức "ngu ngốc" sẽ nhẹ đến mức nào (ví dụ như không sử dụng bất kỳ phép toán thực tế nào, như câu trả lời của Arnauld. Thật ấn tượng rằng vẫn còn chỗ để thu nhỏ nó mà không có bất kỳ biến đổi hay tính toán nào.

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]

Hãy thử trực tuyến!

Hai lần độ dài câu trả lời của Arnauld, 0 mức độ phức tạp.

JavaScript (Node.js) , 129 128 byte

(-1 byte nhờ đề xuất sử dụng bẻ khóa)

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]

Hãy thử trực tuyến!

Để đáp ứng nhu cầu thú vị, tôi đã đánh cắp logic từ câu trả lời x86 và xây dựng mảng từ đó. Làm cho nó dài hơn 9 byte. Nhưng thú vị hơn một chút.


ngáp ít nhất hãy thử một cái gì đó thú vị
qwr

Tôi nghĩ rằng việc chứng minh cách tiếp cận đơn giản nhất (và về mặt kỹ thuật là độ dài hợp lý dài nhất) là khá thú vị. Arnauld hoàn toàn có thể là ngắn nhất bạn có thể nhận được trong JS, nhưng dài nhất chỉ là hai lần byte.
Anthony

1
Điểm của bảng tra cứu byte là có thể sử dụng một phép ẩn hoặc chỉ một cái gì đó như "02060c1828487ef0" trong đó mỗi mục nhập là một byte hoặc 2 ký tự trong hex nếu bạn thích. Lưu trữ các số trực tiếp trong thập phân mất tối đa 3 ký tự. Đồng thời sử dụng
bẻ khóa

2
Bạn nên ít nhất loại bỏ f=, thay đổi (x)đến x, thêm một lỗ và thay đổi x-1để x. TIO ; và có thể làm tròn chúng lên TIO 99 byte
tsh

5
Chào mừng đến với PPCG! :)
Shaggy

1

Runic, 173 byte

>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

(Lưu ý rằng góc dưới bên phải phải được tính cho byte: chúng được lấp đầy bằng khoảng trắng.)

Exe của TIO cần một bản cập nhật mà câu trả lời này dựa vào (và tôi đang vá một số lỗ hổng khác trước khi yêu cầu Dennis xây dựng lại). Nhưng cắm một giá trị vào (hãy chắc chắn thêm khoảng trắng trên dòng 2 và 3 nếu sử dụng nhiều hơn một ký tự cho giá trị trên dòng đầu tiên). Đây là cách dễ nhất để viết các giá trị cần thiết:

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

Hãy thử trực tuyến!

Về mặt chức năng, đây là một cổng của câu trả lời Julia của sundar (nhưng Runic không có lệnh đẩy evào ngăn xếp (hoặc thực sự, bất kỳ giá trị thập phân nào), vì vậy cần có xấp xỉ). Giá trị gần đúng cho ecác đầu vào nhỏ hơn 8 là chính xác hơn, vì mất độ chính xác dẫn đến các giá trị nằm ngoài phạm vi đầu ra cho phép (ví dụ: 7sẽ tạo ra 125).Ceil()đã được thực hiện bằng cách chuyển đổi thành một ký tự và sau đó trở lại một số (điều này không thành công với các giá trị đặc biệt lớn, vì vậy với 40k tôi đã chia nó cho 100, thực hiện chuyển đổi thành và quay lại, sau đó nhân 100 lần nữa).

Có lẽ có một số chỗ để đơn giản hóa việc sắp xếp (ví dụ: chạy điểm vào theo chiều dọc, bên dưới hoặc tìm cách nén các xấp xỉ cho e), nhưng tôi rất vui khi chỉ có thể thực hiện phép tính.

/?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 byte.

Thông dịch viên cập nhật:

Với việc đọc đầu vào sửa lỗi đẩy , Runic hiện có một số hàm toán học và khả năng phân tích các chuỗi như gấp đôi. Điều đó sẽ đơn giản hóa rất nhiều câu trả lời này, nhưng tôi sẽ để nó như thể hiện nỗ lực mà tôi đã bỏ ra (Tôi đã thêm các hàm Toán học một đối số và phân tích chuỗi ngay sau khi đăng: Tôi đã có Sin / Cos / Tan danh sách việc cần làm của tôi, nhưng chưa xem xét Exp, abs, Log, v.v. và sắp hết ký tự). TIO sẽ cập nhật trong 24-48 giờ tới, tùy thuộc vào thời điểm Dennis nhìn thấy nó.

212,+16,+1c2*,+1cX,+sẽ giảm xuống -> 1'eAvới bản cập nhật thông dịch viên này. Abật một ký tự và một giá trị và thực hiện một phép toán trên giá trị đó dựa trên ký tự được bật ( etrong trường hợp này là Exp()Exp(1)trả về e ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.