A Bíblia é um dos livros mais influentes já escritos e comumente citado como o livro mais vendido de todos os tempos . Foi escrito por aproximadamente 40 autores diferentes ao longo de centenas de anos antes de ser compilado em sua forma atual. Mas o interessante da Bíblia é a maneira como ela é dividida. É dividido em 2 testamentos diferentes, divididos em 66 livros menores, divididos em capítulos menores, divididos em versos individuais.
Eu pensei que seria um desafio divertido tentar codificar o número de capítulos em cada livro no menor código possível. Portanto, para o desafio de hoje, você deve escrever um programa ou função que inclua um dos livros como entrada e produza o número de capítulos nesse livro, de acordo com a The King James Version .
Você pode fazer IO em qualquer formato razoável, por exemplo, ler / gravar STDIN / STDOUT ou um arquivo, argumentos de função / valores de retorno, solicitar ao usuário etc. são todos permitidos. A entrada será sempre um dos 66 livros da Bíblia, e apenas minúscula. Isso significa que, se você receber outra entrada, um comportamento indefinido será permitido. Como existem apenas 66 entradas e saídas possíveis, todas elas são fornecidas aqui, de acordo com a página da Wikipedia nos capítulos da Bíblia em 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
Como esse desafio é encontrar a maneira ideal de codificar todos os nomes de livros e contagens de capítulos, não é permitido o uso de quaisquer recursos internos que forneçam informações sobre a Bíblia. No entanto, como seria interessante ver quais idiomas possuem esses recursos, sinta-se à vontade para compartilhar uma segunda versão não concorrente junto com sua resposta. Buscar informações de fontes externas também não é permitido (nenhuma das brechas padrão é permitida, mas achei que seria útil mencionar explicitamente essa).
Como sempre, esse é um desafio de código-golfe , portanto, tente fazer o programa mais curto possível (medido em bytes) possível. Divirta-se jogando golfe!
fonte
enklact
sair deste desafio, mas eu não posso ...Respostas:
Geléia , 127 bytes
Experimente online!
Casos de teste
Como funciona
Essencialmente, isso tenta converter as ords dos caracteres inseridos em um valor binário, por exemplo
"joel"
->[106, 111, 101, 108]
->2^3*106 + 2^2*111 + 2^1*101 + 2^0*108
.Então, esse valor é obtido mod 407, mod 270, depois [mais alguns mods] e mod 160. Isso é útil porque mapeia todas as 66 entradas de string para números inteiros entre 0 e 158 (sorte no mod final).
O número inteiro é indexado na lista de números inteiros
“ọḷḊḲɦ...ƙḅyẉ’b158¤
para encontrar o valor den
tal forma que a entrada tenha on
menor número de capítulos. Por acaso, Joel tem o 7º número de capítulos.Esse valor de
n
é indexado ainda mais na lista“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘
para encontrar o número exato de capítulos.Possível melhoria: entradas com o mesmo número de capítulos podem ter o mesmo valor dos mods (a colisão de 0% não é necessária), mas não expliquei isso no meu programa para determinar a sequência dos mods.
fonte
@
(%/i@“...’b158¤ị¢
->%/“...’b158¤iị¢
). Salve outro byte usando um deslocamento de 160 em uma única lista de índice de página de código no início (OḄ;407;270;“ọḷḊḲɦ‘
->OḄ;“ẋn=:!ס‘+160¤
).Excel, 373 bytes
Reutilizando a abordagem de @ Misha da resposta do Mathematica (
6a+b+8c+5d+3e modulo 151
):Pesquisa retorna capítulos
-1
e, em seguida, adicione um. Isso muda10
para9
duas vezes e,1,
para,,
4 vezes.Atualizado para a abordagem antiga. Excel,
460401 bytesSalvar como CSV, nome do livro inserido no final da primeira linha (
C1
), resultado exibido emC2
:Para a tabela de pesquisa, podemos deixar de fora
et 10
el 24
porque eles correspondemer 10
ejs 24
respectivamente.fonte
JavaScript (ES6),
251197 bytesTeste
Mostrar snippet de código
Formatado e comentado
fonte
Mathematica:
323294 bytesComo funciona
Para um livro começando com códigos de caracteres
a
,b
,c
,d
,e
(envolvendo em torno se necessário) calcula6a+b+8c+5d+3e
módulo 151, que passa a ser único, e, em seguida, olha para cima o número de capítulos em uma lista comprimido de comprimento 151. (entradas não utilizadas na lista são preenchido com duplicatas da entrada anterior. Isso encoraja a codificação de execução, talvez? De qualquer forma, ajuda.)Obrigado a @numbermaniac pela idéia de compactação de lista, que é difícil de colocar um número, mas é uma grande parte da melhoria aqui.
Versão antiga: Mathematica,
548435407 bytesComo funciona
Convertemos cada nome
name
nos caracteres 1, 3 e 6 denamename
(por exemplo , torna-leviticus
selvi
,job
torna-sejbb
) antes de procurá-lo.A lista em que procuramos é um pouco compactada, juntando os números de capítulo de 1 e 2 dígitos em cadeias.
Mathematica: 40 bytes, não concorrente
Sim.
fonte
Compress
a lista, obtém uma string que pode ser retornada à listaUncompress
no seu programa; toda a função sai para 430 bytes, poupando 5 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, mas de alguma forma isso não parece exatamente a mesma coisa.Python 2 ,
244183 bytesExperimente online!
fonte
Geléia ,
117 115114 bytesExperimente online! ou veja a suíte de testes
Quão?
Hashes o produto dos ordinais dos caracteres da sequência de entrada, usando
trêsdoisrestos de três divisões, procura o resultado em uma lista de listas e usa o índice encontrado para procurar o resultado em uma lista de comprimentos de livros.Ao encontrar uma função de hash, considerei apenas aqueles que resultaram em no máximo um depósito com resultados acima de 255 para permitir a indexação da página de códigos e, em seguida, escolhi aqueles que minimizassem o número total de valores a serem codificados (após remover o depósito "ofensivo" ou se não existia o balde mais longo). De 66 com três módulos, encontrei um 59 (
%731%381%258
) a 58 (%731%399%239
) e um com 56 entradas (%1241%865%251
) [com 117 bytes] ... Encontrei um 58 usando apenas dois restos (%1987%251
) [com 115 bytes].. .Encontrei um 55 usando três remanescentes, que quando duas entradas fictícias são adicionadas permitem uma compressão ainda maior da lista de pesquisa ...
O código:
1
é uma lista de cinco listas de índices de página de código (
“...“...“...“...“...“...‘
):Isso é transposto usando o átomo
Z
para obter os baldes; chame isso de B:(as teclas dummy
0
e1
são, permitindo que elas[179,5,111]
sejam duas mais à direita - a transposição requer entradas mais longas à esquerda)2)
Chame isso de C (o capítulo conta) - é uma lista de números inteiros:
e é construído da seguinte maneira (as duas chaves fictícias acima, portanto, permitem
10,12,13
estar em ordem crescente):Agora a versão simplificada do código é:
fonte
Python 2 ,
438429416411409 bytesExperimente online!
Funciona alterando a entrada para Título e encontrando a última substring correspondente na lista.
Por exemplo.
'1 samuel' -> '1 Samuel'
qual combina('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24)
. A última partida é('2 S', 24)
, então a resposta é24
fonte
Código da máquina 6502 (C64), 204 bytes
Explicação :
A chave aqui é usar uma função de hash especial que mapeia sem colisões os valores
0
para125
*). Os números dos capítulos são então colocados em uma tabela de 126 bytes. O hash é feito em 8 bits completos, o valor final é ajustado observando as mordidelas altas em outra tabela, dessa maneira combinando diferentes mordidinhas altas nas quais as mordidinhas baixas não colidem.Aqui está uma lista de desmontagem comentada da parte do código:
depois disso segue uma tabela com os números dos capítulos e, finalmente, uma tabela com os mais altos petiscos para o valor do hash.
Demonstração online
Uso:,
sys49152,"name"
por exemplosys49152,"genesis"
(saída50
).Importante: Se o programa foi carregado a partir do disco (como na demonstração online), emita um
new
comando primeiro! Isso é necessário porque o carregamento de um programa de máquina elimina alguns ponteiros C64 BASIC.Dica sobre a caixa: No modo padrão do C64, a entrada aparecerá como maiúscula. Na verdade, isso está em minúsculas, mas o C64 possui dois modos e, no modo gráfico / superior, os caracteres minúsculos aparecem como maiúsculos e os maiúsculos, como símbolos gráficos.
*) é claro, isso não é tão denso quanto poderia ser ... oh bem, talvez eu encontre uma solução ainda melhor depois;)
fonte
Java 8,
623597590 bytes-7 bytes graças a @Nevay , alterando o loop for para um fluxo.
Definitivamente pode ser jogado mais. Só preciso fazer mais alguns testes.
Pode não ser a resposta mais curta a longo prazo, e pode ser jogada de golfe com alguma resposta existente, mas ainda estou orgulhoso de ter alguma coisa .. :)
Explicação:
Experimente aqui.
13595
divisão inteira (em Java, isso trunca / pisa automaticamente o resultado).habakkuk
ematthew
ambos têm um valor de674
)381
e382
ambos1
;425
e436
ambos4
;649
e663
ambos13
;952
e1018
ambos4
;1122
e1229
ambos5
)).fonte
int i=s.chars().map(c->c*c*c).sum()/13595;
vez deint i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
.