2ダースのキス数近似


26

1から24までの数字が与えられた場合、キスの数字を最新の知識で出力します(一部の数字は複数の許容可能な出力を持ちます)。出力はすべて以下にリストされているため、ジオメトリの知識は必須ではありません。

キス番号問題に関するウィキペディアのページから:

キス数は、それぞれが特定の単位球に触れるように配置できる、重なり合わない単位球の数として定義されます

つまり、1つの単位球が与えられた場合、どれだけ多くの単位球が重なることなく、それに触れることができますか?質問は、球がN-1次元の球体であると理解されるN次元空間で行われます。

例えば:

  • 2次元空間では、単位円は6つの他の単位円に触れることができます。
  • 3次元空間では、単位球は他の12個の単位球に触れることができます。

ウィキペディアのページには、1〜24次元空間の値がリストされています。ただし、これらの一部はまだ正確にわかっていないため、下限と上限のみが指定されています。この表は、新しい証明による将来の範囲の狭小化に関係なく、固定されたままになるようにここに再現されています。将来的にウィキペディアのページが変更された場合でも、ソリューションはこの固定テーブルに対して判断されます。

境界の表

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の整数(両端を含む)。

それはかもしれ-ここで「整数」の入力は、小数部分のないことを示している23が、決して2.5。ソリューションは、たとえば、フロートまたは文字列として入力を受け取る場合があります。

出力

その入力の下限から上限までの、関連する範囲内の数値(両端を含む)。

出力は決定的でなければなりません(同じ入力に対して常に同じです)。

出力は整数でなければなりません。例えば、入力のため5の可能な有効な出力があり4041424344。これは値の制限であり、タイプの制限ではないことに注意してください。小数部分がゼロの場合、フロートを返すことは許容されます。たとえば、41.5有効ではありませんが、41.0有効です。

得点

これはです。スコアは、コードのバイト数です。言語ごとに、勝者は最低スコアのソリューションです。


6
本当にクールな近似問題。
qwr

回答:


11

ジュリア0.6、52バイト

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

オンラインでお試しください!

どうやって?

機械学習!(Kinda。たぶん。そうでもない。

aebK+cc

aebK+cceil


6
グリッドサーチは機械学習とは思わないでしょう。どちらかといえばブルートフォースです。
qwr

5
しかし、それはMLBase!!! J / K、MLの周りの線はいつものようにぼやけているが、これはおそらく、あるラベル機械学習に値するにはあまりにも基本的な。繰り返しになりますが、流行語を入力することは常に役に立ちます!
スンダ

我々は機械学習を言うとき、私たちは主に= 2または正規表現nの多項式を考える
AAAAAはモニカ回復言う

2
機械学習と言うとき、ニューラルネット、決定木、HMM、パーセプトロンを
思い浮かべ

@qwr私は非常に遅れていますが、回帰はそれらすべてに加えて、機械学習の一部と実際に考えられています。(その他!SVMなど)
Quintec

7

x86の、62の 59 53 50バイト

私のソリューションでは、バイトルックアップテーブルを使用し、2シフトします(FP計算なし)。寸法9〜23は、シフトに十分な余裕を提供します。入力eaxおよび出力ecx

-3スワッピングによってeax及びecxのでcmp $imm, %alより短いですcmp $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セクションは、テキストセグメントの一部としてリンクされます。
ピーター

1
ところで、普通の人はshl、特にあなたの番号が署名されmovzblていないとき(あなたはそれをロードするために使用しましたが、ではありませんmovsbl)に書き込みます。もちろんsal、同じオペコードの別の名前です。gccが発行salしますが、手書きのコードでそれを見るのは非常にまれです。
ピーター

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関数内のビット演算子です。私が最初に考えたのは、「
アーナルド

本当に素敵なテーブル。手動で作成しましたか?
-qwr

1
@qwrはい、それはほとんどがNotepad ++の編集です。スクリプトを使用して、最初の4列の値を生成しました。
アーナウルド

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に行く2バイトを節約nし、下限と上限内の丸め数を目指して、固定小数点表記1154から指数表記に縮小します)のような2e3

繰り返しになりますが、私の最初の目標は、「愚かな」方法がどれほど軽いかを示すことでした(たとえば、Arnouldの答えのように実際の数学を使用しません。

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の答えの長さの2倍、複雑さの量は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バイト長くします。しかし、もう少し興味深い。


あくびは、少なくとも何か面白いものを試してください
-qwr

私は、最も簡単なアプローチ(したがって、技術的に最も長い妥当な長さ)を示すことは非常に興味深いと思いました。Arnauld'sはおそらくJSで取得できる最短ですが、最長は2倍のバイトです。
アンソニー

1
バイトルックアップテーブルのポイントは、バイト文字列または "02060c1828487ef0"のようなものを使用することです。各エントリは1バイトまたは16進数の2文字です。数値を10進数で直接格納するには、最大3文字かかります。ビットシフトも使用します
...-qwr

2
あなたは、少なくとも削除にする必要がありf=、変更(x)x、穴や変更を追加x-1しますxTIO ; そして、それらをTIO 99バイトに
切り上げる

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には、この回答に依存する更新必要です(そして、デニスに再構築を依頼する前に、他のいくつかのホールにパッチを当てています)。ただし、値をプラグインします(最初の行の値に複数の文字を使用する場合は、行2と3に必ず空白を追加してください)。必要な値を書き込む最も簡単な方法は次のとおりです。

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

オンラインでお試しください!

機能的には、これはスンダーのジュリアの答えのポートです(ただし、Runicにはeスタック(または実際には10進数値)にプッシュするコマンドがないため、近似が必要でした)。e8未満の入力の近似はより正確です。これは、精度が失われると、値が出力の許容範囲外に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にはいくつかの数学関数と文字列をdoubleとして解析する機能が追加されました。それはこの答えを非常に簡単にしますが、私はそれをそのままにしておきます(投稿した直後に単一引数の数学関数と文字列解析を追加しました:私はすでにSin / Cos / Tanをオンにしました私の予定リストですが、Exp、Abs、Logなどを考慮しておらず、キャラクターが不足していました)。TIOは、デニスがいつ見るかによって、24〜48時間以内に更新されるはずです。

212,+16,+1c2*,+1cX,+1'eAこのインタープリターの更新により->に減少します。A文字と値をポップし、ポップした文字に基づいてその値に対してMath演算を実行します(eこの場合はisでExp()eExp(1)返します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.