La Biblia es uno de los libros más influyentes jamás escritos, y comúnmente citado como el libro más vendido de todos los tiempos . Fue escrito por aproximadamente 40 autores diferentes durante cientos de años antes de compilarse en su forma actual. Pero lo interesante de La Biblia es la forma en que está dividida. Se divide en 2 testamentos diferentes, que se dividen en 66 libros más pequeños, que se dividen en capítulos más pequeños, que se dividen en versos individuales.
Pensé que sería un desafío divertido tratar de codificar el número de capítulos de cada libro en el código más corto posible. Entonces, para el desafío de hoy, debe escribir un programa o función que tome uno de los libros como entrada y genere el número de capítulos en ese libro de acuerdo con la versión King James .
Puede tomar IO en cualquier formato razonable, por ejemplo, leer / escribir STDIN / STDOUT o un archivo, argumentos de función / valores de retorno, preguntar al usuario, etc. están permitidos. La entrada siempre será uno de los 66 libros de La Biblia, y solo en minúsculas. Esto significa que si recibe cualquier otra entrada, se permite un comportamiento indefinido. Dado que solo hay 66 posibles entradas y salidas, todas se proporcionan aquí, de acuerdo con la página de Wikipedia en los capítulos de la Biblia en 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
Dado que este desafío se trata de encontrar la manera óptima de codificar el nombre de cada libro y el recuento de capítulos, no se permite el uso de ningún componente integrado que brinde información sobre la Biblia. Sin embargo, dado que sería interesante ver qué idiomas tienen tales incorporados, no dude en compartir una segunda versión no competitiva junto con su respuesta. Tampoco está permitido obtener información de fuentes externas (ninguna de las lagunas estándar está permitida, pero pensé que sería útil mencionarla explícitamente).
Como de costumbre, este es un desafío de código de golf , así que trate de hacer el programa más corto posible (medido en bytes) como pueda. Diviértete jugando al golf!
fuente
enklact
mi manera de salir de este desafío, pero no puedo ...Respuestas:
Jalea , 127 bytes
Pruébalo en línea!
Casos de prueba
Cómo funciona
Básicamente, esto intenta convertir los ords de los caracteres ingresados en un valor binario, por ejemplo
"joel"
->[106, 111, 101, 108]
->2^3*106 + 2^2*111 + 2^1*101 + 2^0*108
.Luego, este valor se toma mod 407, luego mod 270, luego [algunas modificaciones más], luego mod 160. Esto es útil porque asigna las 66 entradas de cadena a enteros entre 0 y 158 (afortunado en el mod final).
El entero se indexa desde la lista de enteros
“ọḷḊḲɦ...ƙḅyẉ’b158¤
para encontrar el valor den
tal manera que la entrada tenga eln
menor número de capítulos. Joel tiene el séptimo número mínimo de capítulos.Este valor de
n
se indexa más en la lista“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘
para encontrar el número exacto de capítulos.Posible mejora: las entradas con el mismo número de capítulos pueden hacer hash con el mismo valor de los mods (no es necesaria una colisión del 0%), pero no lo tomé en cuenta en mi programa para determinar la secuencia de los mods.
fuente
@
(%/i@“...’b158¤ị¢
->%/“...’b158¤iị¢
). Guarde otro byte utilizando un desplazamiento de 160 en una sola lista de índice de página de códigos al inicio (OḄ;407;270;“ọḷḊḲɦ‘
->OḄ;“ẋn=:!ס‘+160¤
).Excel, 373 bytes
Reutilizando el enfoque de @ Misha de la respuesta de Mathematica (
6a+b+8c+5d+3e modulo 151
):La búsqueda devuelve capítulos
-1
y luego agrega el uno. Esto cambia10
en9
dos veces y,1,
en,,
4 veces.Actualizado al antiguo enfoque. Excel,
460401 bytesGuardar como CSV, Nombre del libro ingresado al final de la primera línea (
C1
), el resultado se muestra enC2
:Para la tabla de búsqueda, podemos omitir
et 10
yl 24
porque estos coinciden ener 10
yjs 24
respectivamente.fuente
JavaScript (ES6),
251197 bytesPrueba
Mostrar fragmento de código
Formateado y comentado
fuente
Mathematica:
323294 bytesCómo funciona
Para un libro que comienza con códigos de caracteres
a
,b
,c
,d
,e
(envolver en torno a si es necesario) computa6a+b+8c+5d+3e
modulo 151, que pasa a ser único, y luego mira hacia arriba el número de capítulos en una lista comprimida de longitud 151. (entradas no utilizadas en la lista están completado con duplicados de la entrada anterior. Esto fomenta la codificación de longitud de ejecución, tal vez? De todos modos, ayuda.)Gracias a @numbermaniac por la idea de compresión de la lista, que es difícil asignar un número pero es una gran parte de la mejora aquí.
Versión anterior: Mathematica,
548435407 bytesCómo funciona
Convertimos cada nombre
name
a los caracteres 1, 3 y 6 denamename
(por ejemplo , seleviticus
conviertelvi
, sejob
conviertejbb
) antes de buscarlo.La lista en la que buscamos está ligeramente comprimida al unir los números de capítulo de 1 y 2 dígitos en cadenas.
Mathematica: 40 bytes, no competitivos
Si.
fuente
Compress
en la lista, obtendrá una cadena que puede volver a la lista conUncompress
en su programa; toda la función sale a 430 bytes, ahorrándote 5 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, pero de alguna manera eso no se siente exactamente lo mismo.Python 2 ,
244183bytesPruébalo en línea!
fuente
Gelatina ,
117115114 bytesPruébalo en línea! o ver el conjunto de pruebas
¿Cómo?
Comprime el producto de los ordinales de los caracteres de la cadena de entrada tomando
tresdostres restos de división, busca el resultado en una lista de listas y usa el índice encontrado para buscar el resultado en una lista de longitudes de libros.Al encontrar una función hash, solo consideré aquellos que dieron como resultado un grupo con resultados superiores a 255 para permitir la indexación de la página de códigos y luego elegí los que minimizaran el número total de valores para codificar (después de eliminar el grupo "ofensivo" o si ninguno existió el cubo más largo). De 66 con tres módulos encontré un 59 (
%731%381%258
) a 58 (%731%399%239
) y luego uno con 56 entradas (%1241%865%251
) [haciendo 117 bytes] ... Luego encontré un 58 usando solo dos restos (%1987%251
) [haciendo 115 bytes].. .entonces encontré un 55 usando tres restos, que cuando se agregan dos entradas ficticias permite una mayor compresión de la lista de búsqueda ...
El código:
1)
es una lista de cinco listas de índices de página de códigos (
“...“...“...“...“...“...‘
):Esto se transpone usando el átomo
Z
para obtener los cubos; llama a esto B:(el
0
y1
son las teclas ficticias, que permiten[179,5,111]
que estén dos más a la derecha; la transposición requiere entradas más largas a la izquierda)2)
Llame a esto C (el capítulo cuenta): es una lista de enteros:
y se construye de la siguiente manera (las dos teclas ficticias anteriores permiten, por lo tanto,
10,12,13
estar en orden ascendente):Ahora la versión simplificada del código es:
fuente
Python 2 ,
438429416411409 bytesPruébalo en línea!
Funciona cambiando la entrada a Título de caso y buscando la última subcadena coincidente en la lista.
P.ej.
'1 samuel' -> '1 Samuel'
el cual partidos('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24)
. El último partido es('2 S', 24)
, entonces la respuesta es24
fuente
6502 código máquina (C64), 204 bytes
Explicacion :
La clave aquí es utilizar una función de hashing especial que asigne sin colisiones a valores
0
para125
*). Los números de los capítulos se colocan en una tabla de 126 bytes. El hash se realiza en 8 bits completos, el valor final se ajusta buscando los nibbles altos en otra tabla, combinando así diferentes nibbles altos donde los nibbles bajos no chocan.Aquí hay una lista de desmontaje comentada de la parte del código:
después de eso sigue una tabla de los números de los capítulos y, finalmente, una tabla de los nibbles altos para el valor hash.
Demostración en línea
Uso:
sys49152,"name"
por ejemplosys49152,"genesis"
(salida50
).Importante: si el programa se cargó desde el disco (como en la demostración en línea), ¡emita
new
primero un comando! Esto es necesario porque cargar un programa de máquina destruye algunos punteros BÁSICOS C64.Sugerencia sobre la carcasa: en el modo predeterminado del C64, la entrada aparecerá en mayúscula. De hecho, esto es minúscula, pero el C64 tiene dos modos y en el modo predeterminado superior / gráfico, los caracteres en minúscula aparecen como mayúsculas y los mayúsculas como símbolos gráficos.
*) por supuesto, esto no es tan denso como podría ser ... bueno, tal vez encuentre una solución aún mejor más tarde;)
fuente
Java 8,
623597590 bytes-7 bytes gracias a @Nevay cambiando el ciclo for a una secuencia.
Definitivamente se puede jugar más golf. Solo necesito hacer más pruebas.
Puede que no sea la respuesta más corta por una posibilidad remota, y podría jugarse al portar alguna respuesta existente, pero todavía estoy orgulloso de encontrar algo yo mismo ... :)
Explicación:
Pruébalo aquí
13595
división entera (en Java, esto trunca / coloca automáticamente el resultado).habakkuk
ymatthew
ambos tienen un valor de674
)381
y382
ambos1
;425
y436
ambos4
;649
y663
ambos13
;952
y1018
ambos4
;1122
y1229
ambos5
).fuente
int i=s.chars().map(c->c*c*c).sum()/13595;
lugar deint i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
.