La Bible est l'un des livres les plus influents jamais écrits et couramment cité comme le livre le plus vendu de tous les temps . Il a été écrit par environ 40 auteurs différents sur des centaines d'années avant d'être compilé dans sa forme actuelle. Mais ce qui est intéressant dans La Bible, c'est la façon dont elle est divisée. Il est divisé en 2 testaments différents, qui sont divisés en 66 livres plus petits, qui sont chacun divisés en chapitres plus petits, qui sont chacun divisés en versets individuels.
J'ai pensé que ce serait un défi amusant d'essayer de coder le nombre de chapitres de chaque livre dans le code le plus court possible. Donc, pour le défi d'aujourd'hui, vous devez écrire un programme ou une fonction qui prend l'un des livres en entrée et génère le nombre de chapitres de ce livre selon The King James Version .
Vous pouvez prendre IO dans n'importe quel format raisonnable, par exemple lire / écrire STDIN / STDOUT ou un fichier, les arguments de fonction / valeurs de retour, inviter l'utilisateur, etc. sont tous autorisés. L'entrée sera toujours l'un des 66 livres de la Bible, et seulement en minuscules. Cela signifie que si vous disposez d'une autre entrée, un comportement non défini est autorisé. Puisqu'il n'y a que 66 entrées et sorties possibles, elles sont toutes fournies ici, selon la page de Wikipedia sur les chapitres de la Bible dans The King James Version :
genesis 50
exodus 40
leviticus 27
numbers 36
deuteronomy 34
joshua 24
judges 21
ruth 4
1 samuel 31
2 samuel 24
1 kings 22
2 kings 25
1 chronicles 29
2 chronicles 36
ezra 10
nehemiah 13
esther 10
job 42
psalms 150
proverbs 31
ecclesiastes 12
song of solomon 8
isaiah 66
jeremiah 52
lamentations 5
ezekiel 48
daniel 12
hosea 14
joel 3
amos 9
obadiah 1
jonah 4
micah 7
nahum 3
habakkuk 3
zephaniah 3
haggai 2
zechariah 14
malachi 4
matthew 28
mark 16
luke 24
john 21
acts 28
romans 16
1 corinthians 16
2 corinthians 13
galatians 6
ephesians 6
philippians 4
colossians 4
1 thessalonians 5
2 thessalonians 3
1 timothy 6
2 timothy 4
titus 3
philemon 1
hebrews 13
james 5
1 peter 5
2 peter 3
1 john 5
2 john 1
3 john 1
jude 1
revelation 22
Étant donné que ce défi consiste à trouver le moyen optimal d'encoder chaque nom de livre et nombre de chapitres, il n'est pas autorisé d'utiliser des éléments intégrés qui fournissent des informations sur la Bible. Cependant, comme il serait intéressant de voir quelles langues ont de telles fonctionnalités, n'hésitez pas à partager une deuxième version non concurrente avec votre réponse. La récupération d'informations à partir de sources externes n'est pas non plus autorisée (aucune des failles standard n'est autorisée, mais j'ai pensé qu'il serait utile de mentionner explicitement celle-ci).
Comme d'habitude, c'est un défi de code-golf , alors essayez de faire le programme le plus court possible (mesuré en octets) comme vous le pouvez. Amusez-vous au golf!
la source
enklact
me sortir de ce défi mais je ne peux pas ...Réponses:
Gelée , 127 octets
Essayez-le en ligne!
Cas de test
Comment ça fonctionne
Essentiellement, cela essaie de convertir les ords des caractères saisis en une valeur binaire, par exemple
"joel"
->[106, 111, 101, 108]
->2^3*106 + 2^2*111 + 2^1*101 + 2^0*108
.Ensuite, cette valeur est prise mod 407, puis mod 270, puis [quelques mods de plus], puis mod 160. Ceci est utile car il mappe les 66 entrées de chaîne à des entiers compris entre 0 et 158 (chanceux sur le dernier mod).
L'entier est indexé à partir de la liste des entiers
“ọḷḊḲɦ...ƙḅyẉ’b158¤
pour trouver la valeur den
telle que l'entrée ait le-n
moins de chapitres. Il se trouve que Joel possède le 7e moins de chapitres.Cette valeur de
n
est davantage indexée dans la liste“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘
pour trouver le nombre exact de chapitres.Amélioration possible: les entrées avec le même nombre de chapitres peuvent hacher à la même valeur à partir des mods (0% de collision n'est pas nécessaire), mais je n'en ai pas tenu compte dans mon programme pour déterminer la séquence des mods.
la source
@
(%/i@“...’b158¤ị¢
->%/“...’b158¤iị¢
). Enregistrez un autre octet en utilisant un décalage de 160 dans une liste d'index de page de code unique au début (OḄ;407;270;“ọḷḊḲɦ‘
->OḄ;“ẋn=:!ס‘+160¤
).Excel, 373 octets
Réutilisation de l'approche de @ Misha à partir de la réponse Mathematica (
6a+b+8c+5d+3e modulo 151
):La recherche renvoie des chapitres
-1
, puis ajoutez celui-ci. Cela se transforme10
en9
deux fois et,1,
en,,
4 fois.Mise à jour à l'ancienne approche. Excel,
460401 octetsEnregistrer au format CSV, nom du livre entré à la fin de la première ligne (
C1
), résultat affiché dansC2
:Pour la table de recherche, nous pouvons laisser de côté
et 10
etl 24
car ils correspondent respectivementer 10
etjs 24
.la source
JavaScript (ES6),
251197 octetsTester
Afficher l'extrait de code
Formaté et commenté
la source
Mathematica:
323294 octetsComment ça fonctionne
Pour un livre en commençant par les codes de caractère
a
,b
,c
,d
,e
(enroulant autour si nécessaire) calcule6a+b+8c+5d+3e
modulo 151, qui se trouve être unique, et examine ensuite le nombre de chapitres dans une liste compressée de longueur 151. ( Les entrées non utilisées dans la liste sont rempli avec des doublons de l'entrée précédente. Cela encourage peut-être l'encodage de la longueur d'exécution? Quoi qu'il en soit, cela aide.)Merci à @numbermaniac pour l'idée de compression de liste, qui est difficile à chiffrer mais qui représente une grande partie de l'amélioration ici.
Ancienne version: Mathematica,
548435407 octetsComment ça fonctionne
Nous convertissons chaque nom
name
en caractères 1, 3 et 6 denamename
(par exempleleviticus
devientlvi
,job
devientjbb
) avant de le rechercher.La liste dans laquelle nous regardons les choses est légèrement compressée en rassemblant les numéros de chapitre à 1 et 2 chiffres dans des chaînes.
Mathematica: 40 octets, sans compétition
Ouais.
la source
Compress
sur la liste, vous obtenez une chaîne qui peut être retournée dans la liste avecUncompress
dans votre programme; toute la fonction sort à 430 octets, vous faisant économiser 5 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, mais d'une certaine manière, cela ne ressemble pas à la même chose.Python 2 ,
244183 octetsEssayez-le en ligne!
la source
Gelée ,
117 115114 octetsEssayez-le en ligne! ou voir la suite de tests
Comment?
Hache le produit des ordinaux des caractères de la chaîne d'entrée en prenant
troisdeuxtrois divisions, recherche le résultat dans une liste de listes et utilise l'index trouvé pour rechercher le résultat dans une liste de longueurs de livre.Lors de la recherche d'une fonction de hachage, je n'ai pris en compte que celles qui ont abouti à au plus un compartiment avec des résultats supérieurs à 255 pour permettre l'indexation de la page de codes, puis j'ai choisi celles qui minimisaient le nombre total de valeurs à coder (après avoir supprimé le compartiment "incriminé" ou si aucun n'existait le plus long seau). De 66 avec trois modules, j'ai trouvé un 59 (
%731%381%258
) un 58 (%731%399%239
) puis un avec 56 entrées (%1241%865%251
) [pour 117 octets] ... J'ai ensuite trouvé un 58 en utilisant seulement deux restes (%1987%251
) [pour 115 octets].. .puis j'ai trouvé un 55 en utilisant trois restes, qui lorsque deux entrées factices sont ajoutées permet une compression supplémentaire de la liste de recherche ...
Le code:
1.
est une liste de cinq listes d'index de pages de codes (
“...“...“...“...“...“...‘
):Ceci est transposé en utilisant l'atome
Z
pour obtenir les seaux; appelons ce B:(le
0
et1
sont les touches factices, permettant[179,5,111]
à deux d'être plus à droite - la transposition nécessite des entrées plus longues à gauche)2.
Appelez ce C (le chapitre compte) - c'est une liste d'entiers:
et est construit comme suit (les deux clés factices ci-dessus permettent donc
10,12,13
d'être dans l'ordre croissant):Maintenant, la version simplifiée du code est:
la source
Python 2 ,
438429416411409 octetsEssayez-le en ligne!
Fonctionne en changeant l'entrée en Titre et en trouvant la dernière sous-chaîne correspondante dans la liste.
Par exemple.
'1 samuel' -> '1 Samuel'
qui correspond('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24)
. Le dernier match est('2 S', 24)
, donc la réponse est24
la source
6502 code machine (C64), 204 octets
Explication :
La clé ici est d'utiliser une fonction de hachage spéciale qui mappe sans collision avec des valeurs
0
à125
*). Les numéros de chapitre sont ensuite placés dans une table de 126 octets. Le hachage est effectué en 8 bits complets, la valeur finale est ajustée en recherchant les grignotages élevés dans une autre table, de cette façon, en combinant différents grignotages élevés où les grignotements bas ne se heurtent pas.Voici une liste commentée de démontage de la partie de code:
après cela suit un tableau des numéros de chapitre et enfin un tableau des grignotages élevés pour la valeur de hachage.
Démo en ligne
Utilisation:,
sys49152,"name"
par exemplesys49152,"genesis"
(sortie50
).Important: Si le programme a été chargé à partir du disque (comme dans la démo en ligne), émettez un
new
commande! Cela est nécessaire car le chargement d'un programme machine met à la corbeille certains pointeurs C64 BASIC.Astuce sur le boîtier: dans le mode par défaut du C64, l'entrée apparaîtra en majuscules. Il s'agit en fait de minuscules, mais le C64 a deux modes et dans le mode supérieur / graphique par défaut, les caractères minuscules apparaissent en majuscules et les caractères majuscules apparaissent en tant que symboles graphiques.
*) bien sûr, ce n'est pas aussi dense qu'il pourrait l'être ... eh bien, peut-être que je trouverai une solution encore meilleure plus tard;)
la source
Java 8,
623597590 octets-7 octets grâce à @Nevay en changeant la boucle for en un flux.
Peut certainement être joué plus. Il suffit de faire plus de tests.
Ce n'est peut-être pas la réponse la plus courte à long terme, et pourrait être joué en portant une réponse existante, mais je suis toujours fier de trouver quelque chose moi-même .. :)
Explication:
Essayez-le ici.
13595
division entière (en Java, cela tronque / étage automatiquement le résultat).habakkuk
et lesmatthew
deux ont une valeur de674
)381
et les382
deux1
;425
et les436
deux4
;649
et les663
deux13
;952
et les1018
deux4
;1122
et les1229
deux5
).la source
int i=s.chars().map(c->c*c*c).sum()/13595;
place deint i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
.