Deux douzaines de nombres de baisers approximatifs

26

Étant donné un nombre de 1 à 24, sortez le nombre de baisers au meilleur de la connaissance actuelle (certains nombres auront plus d'une sortie acceptable). La connaissance de la géométrie n'est pas essentielle car les résultats sont tous répertoriés ci-dessous.

À partir de la page Wikipedia sur le problème du numéro de baiser :

un nombre de baisers est défini comme le nombre de sphères unitaires qui ne se chevauchent pas et qui peuvent être disposées de manière à ce qu'elles touchent chacune une autre sphère unitaire donnée

Autrement dit, étant donné une sphère d'unité, combien de sphères d'unité supplémentaires peuvent la toucher sans qu'aucune d'entre elles ne se chevauche? La question sera posée dans un espace à N dimensions, où une sphère est considérée comme une sphère à N-1 dimensions.

Par exemple:

  • dans un espace bidimensionnel, un cercle unitaire peut toucher 6 autres cercles unitaires.
  • dans un espace tridimensionnel, une sphère unitaire peut toucher 12 autres sphères unitaires.

La page Wikipedia répertorie les valeurs de 1 à 24 dimensions. Cependant, certains d'entre eux ne sont pas encore connus avec précision, de sorte que seules une limite inférieure et supérieure sont données. Le tableau est reproduit ici pour qu'il reste fixe, quel que soit le rétrécissement futur des gammes dû à de nouvelles épreuves. Les solutions sont jugées par rapport à ce tableau fixe, même si la page Wikipedia est modifiée à l'avenir.

Table des limites

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

Contribution

La dimension: un entier de 1 à 24 (inclus).

Ici, "entier" indique que l'entrée n'aura pas de partie fractionnaire - elle peut l'être 2ou 3jamais 2.5. Une solution peut toujours prendre l'entrée comme un flottant ou une chaîne, par exemple.

Sortie

Un nombre dans la plage appropriée, de la limite inférieure à la limite supérieure pour cette entrée (inclus).

La sortie doit être déterministe (toujours la même pour la même entrée).

La sortie doit être entière. Par exemple, pour l' entrée 5des sorties valides sont possibles 40, 41, 42, 43, 44. Notez qu'il s'agit d'une restriction sur la valeur, pas sur le type. Il est acceptable de renvoyer un flotteur, à condition qu'il ne contienne aucune partie fractionnaire. Par exemple, 41.5ne serait pas valide, mais 41.0serait valide.

Notation

C'est du . Votre score est le nombre d'octets dans votre code. Pour chaque langue, le gagnant est la solution avec le score le plus bas.

trichoplax
la source
6
Problème d'approximation vraiment cool.
qwr

Réponses:

11

Julia 0,6 , 52 octets

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

Essayez-le en ligne!

Comment?

Apprentissage automatique! (Un peu. Peut-être. Pas vraiment. )

aebK+cc

aebK+cceil

Sundar - Rétablir Monica
la source
6
Je ne considérerais pas une recherche de grille comme un apprentissage automatique. C'est de la force brute si quoi que ce soit.
qwr
5
Mais c'est dedans MLBase!!! J / k, les lignes sont floues autour de ML comme toujours, mais probablement est trop basique pour mériter l'apprentissage de la machine d'étiquettes. Là encore, il est toujours utile de saisir un mot à la mode!
sundar
quand nous disons apprentissage automatique, nous pensons principalement aux polynômes avec n = 2 ou regexps
aaaaa dit rétablir Monica
2
quand je dis l'apprentissage automatique, je pense aux réseaux de neurones, aux arbres de décision, aux HMM, au perceptron ...
qwr
@qwr Je suis très en retard, mais la régression est en effet considérée comme faisant partie de l'apprentissage automatique, en plus de toutes ces choses. (Et plus! SVM, etc.)
Quintec
7

x86, 62 59 53 50 octets

Ma solution utilise une table de recherche d'octets et un décalage de 2 (pas de calculs FP). Les dimensions 9 à 23 offrent une marge de manœuvre suffisante pour le déplacement. Entrée eaxet sortie ecx.

-3 en échangeant eaxet ecxdepuis cmp $imm, %alest plus court que cmp $imm, %cl.

-4 en ne traitant pas le cas N = 24 séparément mais en appliquant l'ajustement à tous les temps 1024 cas.

-2 en ne revenant pas tôt (stupide)

-3 en utilisant la table comme décalage et movzblau lieu de mettre à zéro avecxor

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 (table dedans au .textlieu de .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                                             |\.|
qwr
la source
1
Le tableau est en lecture seule, donc normalement vous le mettriez .rodata, pas de .datatoute façon. (Ou sous Windows, apparemment .rdata). La .rodatasection est liée dans le cadre d'un segment de texte.
Peter Cordes
1
Et BTW, les gens normaux écrivent shl, surtout lorsque votre numéro n'est pas signé (vous l'avez utilisé movzblpour le charger, pas movsbl). Bien sûr, salc'est juste un autre nom pour le même opcode. gcc émet sal, mais il est assez rare de le voir en code manuscrit.
Peter Cordes
7

JavaScript (ES6), 60 octets

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

Essayez-le en ligne!

Comment?

a24=196560

Tous les autres termes sont calculés récursivement, en utilisant:

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

qn

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

conduisant aux ratios suivants:

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

Le résultat final est finalement terrassé et rendu.

Résumé des résultats

Les résultats approximatifs sont donnés avec 2 décimales.

  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 
Arnauld
la source
1
La première chose que j'ai vue était des opérateurs au niveau du bit dans une fonction JavaScript récursive; la première chose que je pensais était "Qu'est-ce qu'Arnauld jusqu'à ..."
MattH
Table vraiment sympa. L'avez-vous fait manuellement?
qwr
1
@qwr Oui, c'est surtout une édition de Notepad ++. Je viens d'utiliser un script pour générer les valeurs dans les 4 premières colonnes.
Arnauld
4

Gelée , 29 26 octets

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

Essayez-le en ligne!

Comment ça marche

“~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.
Dennis
la source
1

JavaScript (Node.js) , 120 99 octets

Perte de 21 octets. Grande réduction grâce à la suggestion de tsh d'ajouter un trou au début du tableau (en sauvant deux octets de n-1à net en visant des nombres ronds dans les limites inférieure et supérieure, les réduisant ainsi de la notation à virgule fixe comme 1154à la notation exponentielle comme 2e3.

Encore une fois, mon objectif initial était de montrer à quel point la voie "stupide" serait légère (par exemple, sans utiliser de vrais calculs, comme la réponse d'Arnauld. Il est impressionnant qu'il y ait encore de la place pour la rétrécir sans aucune transformation ni calcul.

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]

Essayez-le en ligne!

Deux fois la longueur de la réponse d'Arnauld, 0 quantité de complexité.

JavaScript (Node.js) , 129 128 octets

(-1 octet grâce à la suggestion d'utiliser le décalage de bits)

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]

Essayez-le en ligne!

Pour répondre aux exigences d'être intéressant, j'ai volé la logique de la réponse x86 et construit le tableau à partir de cela. Ce qui en fait 9 octets de plus. Mais un peu plus intéressant.

Anthony
la source
bâille au moins essayer quelque chose d'intéressant
qwr
Je pensais que démontrer l'approche la plus simple (et donc techniquement la plus longue longueur raisonnable) était assez intéressant. Arnauld est probablement le plus court que vous pouvez obtenir dans JS, mais le plus long n'est que le double des octets.
Anthony
1
Le point de la table de recherche d'octets est peut-être d'utiliser une chaîne de bytest ou juste quelque chose comme "02060c1828487ef0" où chaque entrée est un octet ou 2 caractères en hexadécimal si vous préférez. Le stockage des nombres directement en décimal prend jusqu'à 3 caractères. Utilisez également le décalage de bits ...
qwr
2
Vous devez supprimer au moins f=, le changement (x)à x, ajouter un trou et le changement x-1à x. TIO ; et peut-être les rassembler TIO 99 octets
tsh
5
Bienvenue chez PPCG! :)
Shaggy
1

Runique, 173 octets

>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

(Notez que le coin inférieur droit doit être compté pour les octets: ils sont implicitement remplis d'espaces.)

L'exe de TIO a besoin d'une mise à jour sur laquelle cette réponse s'appuie (et je corrige quelques autres trous avant de demander à Dennis de reconstruire). Mais en branchant une valeur (assurez-vous d'ajouter des espaces sur les lignes 2 et 3 si vous utilisez plusieurs caractères pour la valeur sur la première ligne). Voici la manière la plus simple d'écrire les valeurs nécessaires:

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

Essayez-le en ligne!

Fonctionnellement, c'est un port de la réponse Julia de sundar (mais Runic n'a pas de commande pour pousser evers la pile (ou vraiment, aucune valeur décimale), donc une approximation était nécessaire). L'approximation pour les eentrées inférieures à 8 est plus précise, car la perte de précision a entraîné des valeurs situées en dehors de la plage autorisée de sorties (par exemple 7, produirait 125). Ceil()a été accompli en convertissant en un caractère, puis en revenant à un nombre (cela a échoué pour des valeurs exceptionnellement grandes, donc à 40k je l'ai fait diviser par 100, faire la conversion vers et en arrière, puis multiplier par 100 à nouveau).

Il y a probablement de la place pour simplifier l'arrangement (par exemple, exécuter le point d'entrée verticalement, ci-dessous, ou trouver un moyen de compresser les approximations pour e), mais je suis content de pouvoir simplement faire le calcul.

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

Mise à jour de l'interprète:

Avec la lecture d'entrée de fixation par poussée , Runic a maintenant plusieurs fonctions mathématiques et la capacité d'analyser les chaînes en double. Cela simplifiera considérablement cette réponse, mais je la laisserai telle quelle pour montrer l'effort que j'y ai mis (j'ai ajouté les fonctions mathématiques à argument unique et l'analyse de chaîne peu de temps après la publication: j'avais déjà eu Sin / Cos / Tan sur ma liste de tâches, mais n'avait pas pris en compte Exp, Abs, Log, etc. et manquait de caractères). TIO devrait se mettre à jour dans les prochaines 24 à 48 heures, selon le moment où Dennis le verra.

212,+16,+1c2*,+1cX,+serait réduit à -> 1'eAavec cette mise à jour de l'interpréteur. Asaute un caractère et une valeur et effectue une opération mathématique sur cette valeur en fonction du caractère sauté ( edans ce cas, est Exp()et Exp(1)renvoie e ).

Draco18s
la source