Il s'agit d'un type différent de défi de compression. Dans un défi de complexité kolmogorov normal , vous devez recréer une liste exactement. Ici, vous êtes autorisé à arrondir les valeurs comme vous le souhaitez. Quel est le piège? Votre score est pénalisé en fonction de la façon dont votre sortie est erronée.
Au bas de cette question se trouve une liste des premières énergies d'ionisation pour les 108 premiers éléments. Votre programme, lors de son exécution, devrait produire une copie raisonnablement précise de cette liste. Il n'y aura ni entrée ni argument. À des fins de notation, votre sortie doit être déterministe (même sortie à chaque fois).
Format de sortie
Votre programme / fonction doit produire une liste de 108 nombres, triés par ordre croissant de nombre atomique. Cette liste peut être dans n'importe quel format approprié. Les données source ci-dessous sont fournies dans le bon ordre, de l'hydrogène au hassium.
Notation
Votre score sera la longueur de votre programme en octets plus une pénalité d'arrondi. Une pénalité d'arrondi est calculée pour chaque élément et additionnée pour donner la pénalité totale.
À titre d'exemple, prenons le nombre 11.81381
. Supposons que votre programme génère une valeur incorrecte de 11.81299999
.
Tout d' abord, les deux chiffres sont multipliés par la même puissance de 10 telle qu'il n'y a plus un point décimal dans la valeur réelle:
1181381, 1181299.999
. Les zéros de fin dans la valeur réelle sont considérés comme significatifs.Ensuite, on prend la différence absolue pour déterminer l'erreur absolue:
81.001
.Enfin, nous calculons la pénalité de cet élément comme
max(0, log10(err * 4 - 1)) -> 2.50921
. Cette formule a été choisie de telle sorte qu'une erreur <0,5 ne donne aucune pénalité (puisque la réponse est correcte dans l'arrondi), tout en donnant également une chance asymptotique de 50% que l'arrondi du nombre à une décimale particulière fournirait un avantage net dans le score (en supposant que non autre compression).
Voici une implémentation Try-It-Online d'un programme de calcul des pénalités. L'entrée de ce programme est fournie sous la forme d'une liste de nombres, un par ligne. Le résultat de ce programme est la pénalité totale et une ventilation par élément de la notation.
Les données
La liste des nombres ci-dessous est les données cibles, dans l'ordre correct du numéro atomique 1 à 108.
13.598434005136
24.587387936
5.391714761
9.322699
8.2980190
11.260296
14.53413
13.618054
17.42282
21.564540
5.1390767
7.646235
5.985768
8.151683
10.486686
10.36001
12.96763
15.7596112
4.34066354
6.11315520
6.56149
6.82812
6.746187
6.76651
7.434018
7.9024678
7.88101
7.639877
7.726380
9.3941990
5.9993018
7.899435
9.7886
9.752392
11.81381
13.9996049
4.177128
5.69486720
6.21726
6.63390
6.75885
7.09243
7.11938
7.36050
7.45890
8.33686
7.576234
8.993822
5.7863552
7.343917
8.608389
9.00966
10.45126
12.1298431
3.893905548
5.211664
5.5769
5.5386
5.473
5.5250
5.582
5.64371
5.670385
6.14980
5.8638
5.93905
6.0215
6.1077
6.18431
6.254159
5.425871
6.825069
7.549571
7.86403
7.83352
8.43823
8.96702
8.95883
9.225553
10.437504
6.1082871
7.4166796
7.285516
8.414
9.31751
10.7485
4.0727409
5.278424
5.380226
6.3067
5.89
6.19405
6.2655
6.0258
5.9738
5.9914
6.1978
6.2817
6.3676
6.50
6.58
6.65
4.90
6.01
6.8
7.8
7.7
7.6
Baselines & Tips
Les données source ci-dessus sont de 906 octets, avec certains outils de compression capables de les obtenir à moins de 500 octets. Les solutions intéressantes sont celles qui tentent d'effectuer un arrondi intelligent, utilisent des formules algébriques ou d'autres techniques pour produire des valeurs approximatives en moins d'octets que la compression seule. Il est cependant difficile de juger de ces compromis entre les langues: pour certaines langues, la compression seule peut être optimale, tandis que de nombreuses autres langues peuvent ne pas disposer d'outils de compression, donc je m'attends à une grande variation du score entre les langues. C'est très bien, car je me fonde sur la philosophie de la «concurrence entre les langues, pas entre elles».
Je pense qu'il pourrait être utile de tenter de tirer parti des tendances du tableau périodique. Vous trouverez ci-dessous un graphique des énergies d'ionisation, afin que vous puissiez voir certaines de ces tendances.
la source
Réponses:
Nettoyer , 540 octets + 64,396 Pénalité = 604,396
Remarque: pour des raisons de lisibilité, j'ai échappé à chaque octet dans le
[Char]
littéral car la plupart d'entre eux ne sont pas imprimables. Cependant, ils sont comptés comme un seul octet par échappement (à l'exception des valeurs null, quote et newlines) car Clean prend naturellement les fichiers source indépendamment du codage (à l'exception des valeurs null).Essayez-le en ligne!
C'est le premier défi où j'ai pu utiliser la capacité de compression générique de Clean (techniquement pas réellement la compression, c'est la sérialisation binaire) pour obtenir un avantage réel.
J'ai commencé avec une
[Real]
- une liste de nombres à virgule flottante 64 bits, ceux de la question. Après avoir sérialisé cette liste, j'ai simplifié les 10 premiers bits (qui étaient les mêmes pour chaque numéro) et la configuration optimale des 32 derniers bits dans la constante7<<29+2^62
. Les 22 bits restants par numéro ont été traduits en 2,75 caractères chacun, et codés dans une chaîne.Cela laisse la constante compressée entière à seulement 302 octets , y compris chaque échappement!
la source
Python 3 ,
355 + 202353 octets + 198 pénalité = 551Essayez-le en ligne!
J'ai utilisé
0xffff (65535)
comme limite supérieure car c'est la valeur maximale qui peut être stockée dans un seul caractère unicode de 3 octets.Étant donné que l'énergie d'ionisation la plus élevée est ~ 24,587, cela donne un rapport de
2665
.Pour générer la chaîne elle-même, j'ai utilisé l'extrait
''.join([chr(int(round(n*2665)))for n in ionization_energies])
(sur python2, vous devez utiliserunichr
), votre console peut ou non être capable d'imprimer les caractères.Caractères de 4 octets, 462 octets + 99 pénalité = 561
Essayez-le en ligne!
Même idée, mais la valeur maximale est
0x110000
la source
0x100**2
valeurs et non0x100**3
?C, 49 octets + 626.048 pénalité = 675.048
Essayez-le en ligne!
la source
f(i){for(i=0;i++<108;)printf("6\n");}
; pénalité: 625.173330827107; total = 662,173330827f(i){for(i=0;i<108;)puts("6");}
fait la même chose en 31 octets.i++
aussi (dans le "31"), mais en af(i){for(i=108;i;i--)puts("6");}
32.f(i){for(i=108;i--;)puts("6");}
le ramène à 31.CJam (389 octets + 33,09 pénalité => 422,09)
codé xxd:
Fondamentalement, c'est
Celui-ci utilise un format à virgule flottante à largeur variable personnalisé pour stocker les nombres. Deux bits suffisent pour l'exposant; la mantisse va de 5 bits à 47 bits, par multiples de 7. Le bit restant par octet sert de séparateur.
Il semble y avoir une corruption lorsque je copie la chaîne magique pour faire une démo en ligne , ce qui fait gagner environ 2 points de pénalité de plus. Je vais devoir trouver comment construire l'URL directement ...
Programme de génération:
Démo en ligne
la source
"
augmente trop l'erreur pour en valoir la peine?Gelée ,
379 361360 octets + 0 Pénalité = 360-18 en utilisant une observation de Peter Taylor (les valeurs d'ordre 10 ont 1 ou 2 en tête, tandis que les valeurs d'ordre 1 n'en ont pas).
Essayez-le en ligne!
Comment?
Crée ces deux constantes (nilades AKA):
Les utilise ensuite pour reconstruire des représentations en virgule flottante des nombres.
Le programme complet est de cette forme:
(où
...
sont les nombres codés pour construire B et A)et fonctionne comme ceci:
la source
Gelée , 116 octets + 429,796016684433 Pénalité = 545,796016684433
Essayez-le en ligne!
Rien de particulièrement spectaculaire, une liste d'index de code page
“...‘
(nombres compris entre 0 et 249), à chacun desquels on ajoute 47 ,+47
et puis diviser par 12 ,÷12
.la source
Gelée , 164 octets + 409,846 = 573,846
Essayez-le en ligne!
Il y a un nombre compressé là-dedans qui est la concaténation des trois premiers chiffres de chaque énergie (y compris les zéros de fin). Je reçois une liste de ces nombres à trois chiffres avec
Ds3Ḍ
puis divise chacun par 100 avec÷³
. Certains des nombres ne doivent être divisés que par 10, donc j'en multiplie certains par 10 pour améliorer légèrement le score (×⁵$2R;6r⁵¤¤;15r18¤¤¦
).Version précédente :
Gelée , 50 octets + 571,482 pénalité = 621,482
Essayez-le en ligne!
Arrondi chaque énergie au nombre entier le plus proche. Concaténé ensemble, cela donne
995989999958689999467777788889689999466777777889679999456656666666666657888899996778994556666666666677567888
.“¡9;ẋkñ¬nƑḳ_gÐ.RḊụʠṁṬl⁾l>ɼXZĖSṠƈ;cḶ=ß³ṾAiʠʠɼZÞ⁹’
est un nombre de base 250 qui donne cela.DY
joint les chiffres de ce numéro avec des retours à la ligne.la source
Java 8, 48 octets + 625.173330827107 pénalité = 673,173330827107
Essayez-le en ligne.
Version initiale imprimée 108 fois
6
. J'essaierai d'améliorer d'ici.la source
J , 390 octets + 183,319 Pénalité = 573,319
Essayez-le en ligne!
J'ai arrondi les nombres à quatre chiffres décimaux et les ai divisés en une liste pour les parties entières, une liste pour les 2 premiers chiffres de fraction et une pour les deuxièmes 2 chiffres de fraction. J'ai encodé chaque numéro avec un caractère imprimable. Pour le décodage, j'extraye simplement les parties ingerer et fraction d'un nombre des listes de caractères associées et les rassemble pour flotter.
J , 602 octets + 0 pénalité = 602
Essayez-le en ligne!
Cette fois, j'ai opté pour une approche légèrement différente. J'ai divisé les nombres en 2 flux - le premier contient les parties entières qui sont simplement encodées avec un seul caractère imprimable. Le deuxième flux contient les parties fractionnaires entières. J'ai supprimé tous les intervalles entre les chiffres et ajouté chaque sous-chaîne avec sa longueur 1-9 (j'ai modifié la première fraction, qui est de 13 chiffres). Ensuite, j'ai codé cette liste comme un nombre de base 94, je l'ai présentée comme une liste de caractères.
Environ 20 octets peuvent être enregistrés si le verbe est réécrit comme tacite.
la source
Bubblegum , 403 + 9.12 = 412.12
Essayez-le en ligne!
la source