다스 키스 수 근사


26

1에서 24까지의 숫자가 주어지면 키스 번호를 현재의 지식으로 최대한 출력하십시오 (일부 숫자는 허용 가능한 출력이 두 개 이상입니다). 출력이 모두 아래에 나열되어 있으므로 지오메트리 지식이 반드시 필요한 것은 아닙니다.

Kissing Number ProblemWikipedia 페이지에서 :

키스 번호는 서로 겹치지 않는 단위 구체의 수로 정의됩니다.

즉, 하나의 단위 구가 주어지면 중첩되지 않고 더 많은 단위 구가 접촉 할 수 있습니까? 구체는 N-1 차원 구체로 이해되는 N 차원 공간에서 질문 될 것이다.

예를 들면 다음과 같습니다.

  • 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. 이는 유형이 아니라 값에 대한 제한 사항입니다. 소수 부분이 0이 아닌 경우 float를 반환하는 것이 좋습니다. 예를 들어, 41.5유효하지 않지만 41.0유효합니다.

채점

이것은 입니다. 점수는 코드의 바이트 수입니다. 각 언어마다 승자가 가장 낮은 점수의 솔루션입니다.


6
근사치 근사 문제입니다.
qwr

답변:


11

줄리아 0.6 , 52 바이트

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

온라인으로 사용해보십시오!

방법?

기계 학습! (킨다. 아마 . )

첫째, N에 대한 하한 및 상한 데이터와 일부 수동 시행 착오를 플로팅하여 지수 함수가 N> = 8에 잘 맞는 것처럼 보였습니다.이 함수를 수동으로 찾으려고 시도한 후 매개 변수 를 사용했습니다. a, b 및 c를 찾기 위해 (여기서 K = 8-24)를 조정 하는 조정 함수 는식이 각 K에 대해 올바른 범위 내에있는 값을 제공하도록 (가능한 값의 범위가 연속적으로 작음) 함수의 다른 실행에서 a, b, c에 해당하는 더 높은 정밀도). N = 24의 경우를 정확히 맞출 수는 없지만 몇 가지 값 세트가 있었으므로 0이 있는 값으로 가서 N = 24의 값을 하드 코딩했습니다.에이이자형케이+기음c

1에서 7까지의 더 낮은 N의 경우, 나는 더 간단한 표현이나 다항식을 찾고 있었지만 그에 맞는 것을 찾을 수 없었습니다. 따라서 피팅 으로 돌아가서 이번에는 K = 1 ~ 7입니다 (실제로 플롯 플롯 추세에 따라 지수 가이 경우에 적합하다고 생각하지는 않았지만). 다행히,이 있었다 파라미터 A, B, (적어도 여기 이내의 범위에 걸쳐 정확한 값을 줄 수 C 호).에이이자형케이+기음ceil


6
그리드 검색을 기계 학습이라고 생각하지 않습니다. 그것은 무엇이든 무차별적인 힘입니다.
qwr

5
하지만 MLBase!!! J / K는 ML 주변의 선은 언제나처럼 흐릿하지만, 이것은 아마도 입니다 라벨 기계 학습을받을 자격이 너무 기본. 그리고 다시, 유행어를 얻는 것이 항상 유용합니다!
sundar-복원 모니카

우리는 기계 학습, 우리는 주로 n 인 다항식의 생각 말할 때 = 2 또는 regexps '에이
AAAAA는 분석 재개 모니카 말한다

2
기계 학습을 말할 때 신경망, 의사 결정 트리, HMM, 퍼셉트론을 생각합니다.
qwr

@qwr 매우 늦었지만 회귀는 실제로 이러한 모든 것 외에도 기계 학습의 일부로 간주됩니다. (그리고 더! SVM 등)
Quintec

7

x86, 62 59 53 50 바이트

내 솔루션은 바이트 조회 테이블을 사용하고 2만큼 이동합니다 (FP 계산 없음). 치수 9 ~ 23은 변속에 충분한 여유를 제공합니다. 입력 eax및 출력ecx .

-3 스와핑 eaxecx이후는 cmp $imm, %al보다 짧다cmp $imm, %cl .

-4 는 N = 24의 경우를 개별적으로 취급 하지 않고 1024 건의 모든 시간에 조정을 적용함으로써.

-2 일찍 돌아 오지 않음 (멍청한)

오프셋을 movzbl사용하고 0을 사용하는 대신 테이블을 사용하여 -3xor

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

16 진 덤프 ( .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

자바 스크립트 (ES6), 60 바이트

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

온라인으로 사용해보십시오!

방법?

에이24=196560 하드 코딩된다.

다른 모든 용어는 다음을 사용하여 재귀 적으로 계산됩니다.

{에이1=2에이+1=에이×24

{1=82=12=124=135=146=147=13=16,...에 대한 >7

다음과 같은 비율로 이어집니다.

,2,2,2413,127,127,2413,2,2,,2

최종 결과는 결국 바닥이되어 반환됩니다.

결과 요약

대략적인 결과는 소수점 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 예, 대부분 메모장 + + 편집입니다. 방금 스크립트를 사용하여 처음 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

자바 스크립트 (Node.js) , 120 99 바이트

21 바이트를 삭제했습니다. TSH의 제안에 큰 감소 덕분에 배열의 시작 (2 바이트에서가는 절약에 구멍을 추가하는 방법 n-1n따라서 같은 고정 소수점 표기법에서 그들을 축소, 그리고 낮은 - 및 상단 범위 내에서 라운드 숫자를 목표 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입니다.

자바 스크립트 (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 바이트 더 길게 만듭니다. 그러나 약간 더 흥미 롭습니다.


하품 은 적어도 흥미로운 무언가를 시도
qwr

나는 가장 간단한 접근법 (그리고 기술적으로 가장 긴 합당한 길이)을 보여주는 것이 매우 흥미 로웠다고 생각했습니다. Arnauld는 JS에서 얻을 수있는 가장 짧은 것이지만 가장 긴 바이트는 두 배입니다.
Anthony

1
바이트 룩업 테이블의 요점은 바이트 스트링 또는 "02060c1828487ef0"과 같은 것을 사용하는 것입니다. 여기서 각 항목은 원하는 경우 16 진수로 1 바이트 또는 2 자입니다. 숫자를 10 진수로 직접 저장하는 데 최대 3자가 걸립니다. 비트 시프 팅도 사용하십시오.
qwr

2
당신은 적어도 제거에한다 f=, 변화 (x)x, 구멍 및 변경, 추가 x-1로를 x. TIO ; TIO 99 바이트를
tsh

5
PPCG에 오신 것을 환영합니다! :)
얽히고 설킨

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

온라인으로 사용해보십시오!

기능적으로 이것은 sundar의 Julia 응답 포트입니다 (그러나 Runic에는 e스택 (또는 실제로 10 진수 값)으로 푸시하는 명령이 없으므로 근사가 필요했습니다). e정밀도 손실로 인해 허용 가능한 출력 범위를 벗어난 값 (예 : 7125)이 발생 하므로 8 미만의 입력 에 대한 근사값 이 더 정확 합니다. 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 바이트

통역사 업데이트 :

으로 밀어 고정 입력 독서 , 룬 문자는 이제 여러 가지 수학 함수 및 복식 등의 구문 분석 문자열 할 수있는 권한을 갖고 있습니다. 그것은이 답변을 크게 단순화 할 것이지만, 내가 넣은 노력을 과시하기 위해 그대로 두겠습니다 (포스팅 직후에 단일 인수 Math 함수와 문자열 구문 분석을 추가했습니다 : 이미 Sin / Cos / Tan을 사용했습니다 내 할 일 목록이지만 Exp, Abs, Log 등을 고려하지 않았으며 문자가 부족했습니다). Dennis가 보는 시점에 따라 24 시간에서 48 시간 내에 TIO가 업데이트되어야합니다.

212,+16,+1c2*,+1cX,+1'eA이 인터프리터 업데이트 를 통해-> 로 줄 입니다. A팝 문자와 문자에 기초하여, 그 값에 대한 연산 동작이 튀어 값 수행하고 ( e이 경우는 Exp()Exp(1)반환 E ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.