Conversión griega inversa Golf


8

Introducción

Debe crear una función para convertir números griegos en números arábigos. La entrada será un número griego menor que 1000y mayor que 0. Este es el reverso de mi desafío anterior .

Algoritmo

  1. De entrada dividida en letras (por ejemplo, ΡΚΓ-> Ρ, Κ, Γ)
  2. Tome cada letra, y el cambio de carácter encontró en la tabla a continuación, para el símbolo de letra, (por ejemplo, ΡΚΓ-> Ρ, Κ, Γ-> 100, 20, 3).
  3. Añadir (p ΡΚΓ-> Ρ, Κ, Γ-> 100, 20, 3-> 123)

Especificaciones

  • Sin conversión de sistema numérico incorporado
  • La entrada se capitalizará como en el ejemplo.
  • La salida debe estar en la base 10.
  • ΡΡΡΡnunca ocurrirá. Lo será Υ.

Casos de prueba

ΡΚΓ -> 123
Η -> 8
ΨΟΖ -> 777
Ρ -> 100
ΧϜ -> 606
ΡϘ -> 190
ΜΒ -> 42
Ν -> 50

Mesa

Α = 1 = Alpha = 913 UTF-8
Β = 2 = Beta = 914 UTF-8
Γ = 3 = Gamma = 915 UTF-8
Δ = 4 = Delta = 916 UTF-8
Ε = 5 = Epsilon = 917 UTF-8
Ϝ = 6 = DiGamma = 988 UTF-8
Ζ = 7 = Zeta = 918 UTF-8
Η = 8 = Eta = 919 UTF-8
Θ = 9 = Theta = 920 UTF-8

Ι = 10 = Iota = 921 UTF-8
Κ = 20 = Kappa = 922 UTF-8
Λ = 30 = Lambda = 923 UTF-8
Μ = 40 = Mu = 924 UTF-8
Ν = 50 = Nu = 925 UTF-8
Ξ = 60 = Xi = 926 UTF-8
Ο = 70 = Omicron = 927 UTF-8
Π = 80 = Pi = 928 UTF-8
Ϙ = 90 = Koppa = 984 UTF-8

Ρ = 100 = Rho = 929 UTF-8   
Σ = 200 = Sigma = 931 UTF-8
Τ = 300 = Tau = 932 UTF-8
Υ = 400 = Upsilon = 933 UTF-8
Φ = 500 = Phi = 934 UTF-8
Χ = 600 = Chi = 935 UTF-8
Ψ = 700 = Psi = 936 UTF-8
Ω = 800 = Omega = 937 UTF-8
Ϡ = 900 = SamPi = 992 UTF-8

¿Tendremos alguna entrada como ΡΡΡΡ? Si es así, ¿cuál sería el resultado?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ No. Eso sería Upsilon.
NoOneIsHere

Oh, no entendí la pregunta, jaja.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Edité esa especificación hace un momento. No te lo perdiste.
NoOneIsHere

1
Creo que los casos de prueba deben cubrir todos los posibles patrones de ceros, por lo que al menos algo como complemento 180, 42y 50.
Martin Ender

Respuestas:


2

Gelatina , 47 45 bytes

⁵*ב}
“#'nn(2jj33556;r”Or2/F+878Ọ
¢iЀ’d9ñ/€S

Pruébalo en línea! o verificar todos los casos de prueba .


¿Qué codificación estás usando? Pruébelo en línea dice que tiene 47 bytes. Parece que te falta un <newline>Ç€al final.
NoOneIsHere

3
Jelly tiene su propia codificación ( enlace de bytes en el encabezado). El enlace verificar todos los casos de prueba incluye un extra Ç€que aplica la función a todos los casos de prueba. El primer enlace muestra el programa real, que tiene una longitud de 44 bytes.
Dennis

Este parece ser el más corto hasta ahora ...
NoOneIsHere

4

Pitón 3, 112

Guardado 4 bytes gracias a vaultah.

Booyah, superando a JS!

lambda x,z="ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ".find:sum((z(c)%9+1)*10**(z(c)//9)for c in x)

Con casos de prueba:

assert(f("ΡΚΓ")==123)
assert(f("Η")==8)
assert(f("ΨΟΖ")==777)
assert(f("Ρ")==100)
assert(f("ΧϜ")==606)

Recorre la cadena y usa su índice en la lista de caracteres potenciales para calcular cuánto vale.


3

JavaScript (ES7), 115 bytes

s=>[...s].map(c=>n+=((i="ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ".search(c))%9+1)*10**(i/9|0),n=0)|n

3

Haskell, 116 113 bytes

f x=sum[v|d<-x,(l,v)<-zip"ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ"$(*)<$>[1,10,100]<*>[1..9],d==l]

Ejemplo de uso: map f ["ΡΚΓ","Η","ΨΟΖ","Ρ","ΧϜ","ΡϘ","ΜΒ","Ν"]-> [123,8,777,100,606,190,42,50].

Busque el valor de la letra griega en una lista de pares (letter, value)y suma. La lista de valores está construida por (*)<$>[1,10,100]<*>[1..9], donde (*)<$>[1,10,100]construye una lista de funciones [(*1),(*10),(*100)](multiplicar por 1, 10 y 100) que se aplican por separado a los elementos [1..9]y se concatenan en una sola lista.

Editar: 3 bytes con agradecimiento a @xnor.


Es más corto tomar el producto como (*)<$>[1,10,100]<*>[1..9].
xnor

@xnor: <*>en el contexto de la lista, nuevamente. Yo nunca pienso en eso. ¡Gracias!
nimi

Yo tampoco lo pensaría, lo obtuve de aquí .
xnor


2

JavaScript (ES6), 116 bytes

s=>[...s].map(c=>n+=+((i="ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ".search(c))%9+1+"e"+(i/9|0)),n=0)|n

¡Solo 1 byte más que ES7!


No estoy familiarizado con JavaScript, ¿qué hace +"e"?
Morgan Thrapp

@MorganThrapp Concatenación de cadenas. Por ejemplo, con Ϡ obtendría 9+"e"+2y luego se +("9e2")convierte en 900.
Neil

1
Ah, eso es realmente raro. Javascript siempre logra --- aterrorizar --- sorprenderme.
Morgan Thrapp

1

Python 3, 188 bytes

def f(x,l=list,z=0):
 r=l(range(1,10));R=[a*10for a in r]
 for a,b in l(zip(l("ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ"),r+R+[a*10for a in R])):
  z+=(0,b)[a in x]
 return z

¡Pruébalo!(Casos de prueba incluidos)


Puede guardar 25 bytes condensándolo en def f(x):r=list(range(1,10));R=[a*10for a in r];return sum(b*(a in x)for a,b in zip("ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ",r+R+[a*10for a in R])).
Morgan Thrapp

1

Retina , 72 bytes

T`_Ι-ΠϘ0ΡΣ-ΩϠ`dl
[a-j]
$0aa 
\d
$&0 
T`_Α-ΕϜΖ-Θl`dd
\d+
$*
1

Pruébalo en línea.

Explicación

Básicamente: reemplace cada símbolo griego con el número que representa, luego devuelva la suma de todos los números resultantes:

Translitere 10los dígitos s al árabe y 100los dígitos s al alfabeto latino ( 0- 9=> a- j):

T`_Ι-ΠϘ0ΡΣ-ΩϠ`dl

Agregue "aa" a 100los dígitos de s:

[a-j]
$0aa 

Agregue "0" a 10los dígitos de s:

\d
$&0 

Transliterar 1los dígitos y el alfabeto latino al árabe:

T`_Α-ΕϜΖ-Θl`dd

Convierta todos los números decimales separados por espacios a unario:

\d+
$*

Cuente el número total de 1s unarios :

1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.