Reto
Dada una representación ASCII de un número babilónico como entrada, genera el número en números arábigos occidentales.
Sistema de numeración babilónico
¿Cómo contaban los babilonios? Curiosamente, utilizaron un sistema Base 60 con un elemento de un sistema Base 10. Consideremos primero la columna de unidad del sistema:
Los babilonios tenían solo tres símbolos: T
(o, si puede representarlo:) 𒐕
que representaba 1, y <
(o, si puede representarlo:) 𒌋
que representaba 10, y \
(o, si 𒑊
lo representaba:) que representaba cero.
Nota: Técnicamente, \
(o 𒑊
) no es cero (porque los babilonios no tenían la noción de 'cero'). 'Cero' se inventó más tarde, por lo que \
se agregó un símbolo de marcador de posición más tarde para evitar la ambigüedad. Sin embargo, para los propósitos de este desafío, es suficiente considerar \
como cero
Entonces, en cada columna solo sumas el valor de los símbolos, por ejemplo:
<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0
Nunca habrá más de cinco <
o más de nueve T
en cada columna. \
siempre aparecerá solo en la columna.
Ahora, necesitamos extender esto para agregar más columnas. Esto funciona exactamente igual que cualquier otra base sesenta, donde multiplica el valor de la columna más a la derecha por , el de la izquierda por , el de la izquierda por y así sucesivamente. Luego sumas el valor de cada uno para obtener el valor del número.60 2
Las columnas estarán separadas por espacios para evitar la ambigüedad.
Algunos ejemplos:
<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204
Reglas
- Usted es libre de aceptar la entrada ASCII (
T<\
) o la entrada Unicode (𒐕𒌋𒑊
) - El número ingresado siempre será inferior a
- Los
<
s siempre estarán a la izquierda de losT
s en cada columna \
siempre aparecerá solo en una columna
Victorioso
El código más corto en bytes gana.
fuente
<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."
Que todavía está en uso hoy; El sistema de números babilónico es exactamente lo que usamos para los relojes. Dos dígitos decimales cada uno para segundos, minutos y horas, 60 segundos para el minuto, 60 minutos para la hora.Respuestas:
JavaScript (ES6), 44 bytes
Toma la entrada como una matriz de caracteres ASCII.
Pruébalo en línea!
¿Cómo?
El sistema de numeración babilónico se puede ver como un lenguaje de 4 instrucciones que funciona con un solo registro, llamémoslo acumulador.
Comenzando con , cada carácter en la matriz de entrada modifica el acumulador siguiente manera:c a kk = 0 do una k
space
: multiplique por (implementado como: agregue a )60 59 k k<
: sumar akT
: incremento\
: hacer nada; esta es laNOP
instrucción de este lenguaje (implementado como: agregar a )kfuente
C (gcc) ,
140138136 bytesPruébalo en línea!
fuente
Perl 6 , 39 bytes
-3 bytes gracias a nwellnhof
Pruébalo en línea!
Utiliza los caracteres cuneiformes.
Explicación:
fuente
{:60[.words>>.&{sum (.ords X%151)X%27}]}
(40 bytes)Jalea ,
1312 bytesUn enlace monádico que acepta una lista de caracteres que produce un número entero.
Pruébalo en línea!
¿Cómo?
Otro 12:
ḲO⁽¡€%:5§ḅ60
(⁽¡€
es1013
, así que esto modulos1013
por losO
valores rdinal conseguir53
,5
y1
para<
,T
,\
respectivamente realiza entonces número entero división,:
por5
conseguir10
,1
y0
)fuente
05AB1E , 13 bytes
Pruébalo en línea!
Para compensar lo flojo que he sido con mi respuesta de Jelly, aquí hay una presentación en 05AB1E xD.
fuente
8740
?•Yη•
(4 bytes)1|Ç7%-13%O60β
también es 13 - ¿es golfable?Python 2 ,
96938785 bytesPruébalo en línea!
Salvado:
fuente
(ord(c)%5/2or 11)-1
8740%ord(c)/4
Excel VBA, 121 bytes
Restringido a Office de 32 bits, ya que
^
sirve como elLongLong
tipo literal en las versiones de 64 bitsToma la entrada de la celda
A1
y las salidas a la ventana inmediata de vbe.No golfista y comentado
fuente
Dyalog APL ,
3330 bytesPruébalo en línea!
Editar: -3 bytes gracias a ngn
'\ T<'⍳
reemplaza los caracteres con números (su posición en la cadena constante) e⌽
invierte la entrada para que los "dígitos" más significativos sean los últimos. Esto permite+\2=
mantener una cuenta corriente de la potencia deseada de 60 (aplicada por60*
) contando la cantidad de veces que se encuentra un espacio (índice 2 en la cadena constante).⌊10*⍵-3
da el poder deseado de diez para cada personaje. El orden de los caracteres en la constante de cadena y el desplazamiento -3 hacen que '\' y el espacio pasen a números negativos, lo que resulta en fracciones cuando esos caracteres se elevan a la potencia de 10, lo que permite que sean eliminados por⌊
.Todo lo que tenemos que hacer ahora es multiplicar los dígitos de potencias de 10 por los valores de posición de potencias de 60 y sumar el lote
+/
.fuente
' '
:{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
Python 2 , 62 bytes
Pruébalo en línea!
Esto usa la técnica de la respuesta de Arnauld .
fuente
Lienzo ,
201716 bytesPruébalo aquí!
Explicación:
fuente
APL (NARS ⎕io ← 0), 28 caracteres, 56 bytes
alguna prueba con verificación de tipo:
Cada tipo de resultado es número.
fuente
JavaScript (Node.js) ,
12211410710683 bytesPruébalo en línea!
Estoy un poco obsesionado con las operaciones de matriz de "estilo funcional", utiliza la entrada ASCII, por lo que puedo decir, JS no es muy bueno para obtener charfildes golfily
Lo guardo por el bien de la posteridad, pero esta es una solución ingenua / tonta, le sugiero que consulte la respuesta de Arnauld, que es mucho más interesante una implementación del desafío
fuente
c<'T'
trabaja en lugar dec=='<'
&&
con|
.for...of
bucles: PRetina ,
292623 bytesPruébalo en línea! Utiliza separación de línea nueva, pero el enlace incluye encabezado para usar espacios en su lugar por conveniencia. Editar: Guardado 3 bytes con ayuda de @KevinCruijssen. Ahorró otros 3 bytes gracias a @FryAmTheEggman. Explicación:
Reemplace cada uno
<
con 10T
s.Tome la primera línea, multiplíquela por 60 y agregue la siguiente línea. Luego repita hasta que solo quede una línea.
Cuenta el
T
s.Versión más rápida de 51 bytes:
Pruébalo en línea! Utiliza separación de línea nueva, pero el enlace incluye encabezado para usar espacios en su lugar por conveniencia. Explicación:
Haga coincidir cada línea individualmente y cuente el número de
T
sy 10 veces el número de<
s. Esto convierte cada línea en su valor base de "dígitos" de 60.Conversión de base 60, ejecutando una línea a la vez. El cálculo se realiza en decimal para la velocidad.
fuente
<
sin ella+
, a menos que no esté viendo algún tipo de caso límite.$&
ahora es siempre un carácter, ¡puedo usar el carácter predeterminado, ahorrando otros dos bytes!_
tiempo$*
en versiones anteriores de Retina por defecto1
.<
como un solo partido y los repite 10 veces la longitud (la cantidad de<
en el partido), y mi cambio propuesto se repite cada<
10 veces por separado (que ha jugado 2 bytes más usando el 1 implícito con10*
) Ahora entiendo mejor por qué+
estaba allí inicialmente. No sé demasiado sobre las retinas incorporadas, solo expresiones regulares en general, de ahí mi cambio propuesto porque ya lo leí como repetir cada>
10 veces. ;)Bash (con sed y dc), 50 bytes
Toma entradas delimitadas por espacios desde
stdin
, salidas astdout
Pruébalo en línea!
Explicación
Utiliza sed para transformar la entrada con un montón de coincidencias de expresiones regulares hasta que, por ejemplo, la entrada
<<<TT \ TTTT
se haya transformado enA+A+A+1+1+60*60*1+1+1+1+
. Luego, esta entrada se alimenta a dc con el comando de ejecución de entrada explícito?
, precedido porz
(empuja la longitud de la pila (0) a la pila para que tengamos un lugar donde conectar la suma) y seguido porp
(print).fuente
J ,
3430 bytesPruébalo en línea!
fuente
Dyalog APL,
3532 bytesPruébalo en línea!
31 en dzaima / APL
fuente
Noether , 55 bytes
Pruébalo en línea!
El mismo enfoque que @Arnauld.
fuente
Carbón , 26 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Borrar el resultado.
Pase sobre los caracteres de entrada. El
≡
comando está envuelto en un bloque para evitar que encuentre un bloque "predeterminado".Cambia el carácter actual ...
si es un espacio, multiplica el resultado por 60 ...
si es un,
<
entonces agregue 10 al resultado ...si es un,
T
entonces incremente el resultado.Imprime el resultado.
fuente
R ,
9881 bytesPruébalo en línea!
Ridículamente largo debido al análisis de cadenas.Gracias Giusppe por reducir 16 bytes innecesarios.Defina
y
el valor de bytecode de la entrada unicode yR = y("T<\") = y("𒐕𒌋𒑊")
Observa eso
R%%3 = 1,2,0
yR%%6 = 1,5,0
... entoncesR%%3 * R%%6 = 1,10,0
!El resto es fácil: suma por columna, luego producto de puntos con potencias decrecientes de 60.
fuente
scan(,"")
divide en espacios automáticamente?/60
puedo reemplazarlo-1
en la expresión exponente para otro byte desactivado, además de que<-
puede reemplazarse=
ya que todo está entre paréntesis.Ruby ,
5046 bytesPruébalo en línea!
Un puerto básico de la respuesta de Arnauld mejorado por GB para -4 bytes.
fuente
C (gcc) ,
656463 bytesPruébalo en línea!
fuente
return o
cons=o
guarda otros 5 bytes.Java 8,
6460 bytes-4 bytes gracias a @ceilingcat .
Pruébalo en línea. Explicación:
fuente
Perl -F // -E, 39 bytes
Esto lee el número a convertir de STDIN.
Esta es la misma solución esencial dada por @Arnauld usando JavaScript.
fuente
F #, 128 bytes
Pruébalo en línea!
Ungolfed se vería así:
Seq.mapFoldBack
combinaSeq.map
ySeq.foldBack
.Seq.mapFoldBack
itera a través de la secuencia hacia atrás, y pasa un valor de acumulador a través de la secuencia (en este caso,i
).Para cada elemento de la secuencia, se calcula el número de Babilonia (por
Seq.sumBy
, que asigna cada carácter a un número y suma el resultado) y luego se multiplica pori
.i
luego se multiplica por 60, y este valor se pasa al siguiente elemento de la secuencia. El estado inicial para el acumulador es 1.Por ejemplo, el orden de las llamadas y los resultados
Seq.mapFoldBack
para la entrada<<<TT \ TTTT
sería:La función devolverá una tupla de
seq<int>, int
. Lafst
función devuelve el primer elemento de esa tupla ySeq.sum
realiza la suma real.¿Por qué no usar
Seq.mapi
o similar?Seq.mapi
asigna cada elemento en la secuencia y proporciona el índice a la función de asignación. A partir de ahí, podría hacer60 ** index
(dónde**
está el operador de energía en F #).Pero
**
requierefloats
, noints
, lo que significa que debe inicializar o convertir todos los valores en la función comofloat
. Toda la función devolverá unfloat
, que (en mi opinión) es un poco desordenado.Usarlo
Seq.mapi
se puede hacer así para 139 bytes :fuente
Tcl , 134 bytes
Pruébalo en línea!
En la lista invertida, realizo un bucle que incrementa el resultado en conteo
<
yT
(con la-all
opción regexp) e incrementa un natural como potencia de 60.Versión correcta (ver comentario)
fuente
regsub {\\} $l0 l
antes del bucle foreach ...APL (Dyalog Extended) , SBCS de 18 bytes
Función de prefijo tácito anónimo.
Pruébalo en línea!
fuente
05AB1E (heredado) , 10 bytes
Pruébalo en línea!
05AB1E , 11 bytes
Pruébalo en línea!
Mismo algoritmo, pero en el 05AB1E moderno
O
no funciona en listas de entradas y listas mixtas, por lo que necesitamos en su€O
lugar.fuente