Reverse Greek Conversion Golf


8

Introdução

Você deve criar uma função para converter números gregos em números arábicos. A entrada será um numeral grego menor que 1000e maior que 0. Este é o inverso do meu desafio anterior .

Algoritmo

  1. Entrada dividida em letras (por exemplo, ΡΚΓ-> Ρ, Κ, Γ)
  2. Tome cada letra, e mudança de caráter encontrados na tabela abaixo, para o símbolo carta, (por exemplo, ΡΚΓ-> Ρ, Κ, Γ-> 100, 20, 3).
  3. Adicionar (por exemplo, ΡΚΓ-> Ρ, Κ, Γ-> 100, 20, 3-> 123)

Especificações

  • Nenhuma conversão interna do sistema numérico
  • A entrada será maiúscula como no exemplo.
  • A saída deve estar na base 10.
  • ΡΡΡΡnunca vai acontecer. Será Υ.

Casos de teste

ΡΚΓ -> 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

Será que alguma vez teremos sugestões como ΡΡΡΡ? Se sim, qual seria o resultado?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Não. Seria Upsilon.
NoOneIsHere

Oh, eu não entendi a pergunta, haha.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Eu editei essa especificação agora. Você não perdeu.
NoOneIsHere

1
Acho que seus casos de teste devem abranger todos os padrões possíveis de zeros, portanto, pelo menos, adicione algo como 180, 42e 50.
22416 Martin Ender

Respostas:


2

Geléia , 47 45 bytes

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

Experimente online! ou verifique todos os casos de teste .


Qual codificação você está usando? O Try It Online diz que tem 47 bytes. Parece que você está perdendo um <newline>Ç€no final.
NoOneIsHere

3
A geléia tem sua própria codificação ( link de bytes no cabeçalho). O link verificar todos os casos de teste inclui um extra Ç€que aplica a função a todos os casos de teste. O primeiro link mostra o programa real, que tem 44 bytes.
21416 Dennis

Este parece ser o mais curto até agora ...
NoOneIsHere

4

Python 3, 112

Guardado 4 bytes graças a vaultah.

Booyah, batendo JS!

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

Com casos de teste:

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

Faz um loop na string e usa seu índice na lista de caracteres de potenciais para calcular quanto 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]

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

Pesquise o valor da letra grega em uma lista de pares (letter, value)e soma. A lista de valores é criada por (*)<$>[1,10,100]<*>[1..9], onde (*)<$>[1,10,100]cria uma lista de funções [(*1),(*10),(*100)](multiplicadas por 1, 10 e 100) que são aplicadas separadamente aos elementos [1..9]e concatenadas em uma única lista.

Edit: 3 bytes com agradecimentos a @xnor.


É mais curto levar o produto como (*)<$>[1,10,100]<*>[1..9].
Xnor

@ xnor: <*>no contexto da lista, novamente. Eu nunca penso nisso. Obrigado!
N /

Eu também não pensaria nisso, entendi daqui .
Xnor


2

JavaScript (ES6), 116 bytes

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

Apenas 1 byte a mais que ES7!


Não estou familiarizado com JavaScript, o que +"e"faz?
Morgan Thrapp

@MorganThrapp Concatenação de strings. Por exemplo, com Ϡ você deseja obter 9+"e"+2e, em seguida, o +("9e2")torna-se 900.
Neil

1
Ah, isso é realmente estranho. Javascript sempre consegue --- aterrorizar --- me surpreende.
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

Experimente! (Casos de teste incluídos)


Você pode salvar 25 bytes, condensando-o em 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

Experimente online.

Explicação

Basicamente - substitua cada símbolo grego pelo número que ele representa e, em seguida, retorne a soma de todos os números resultantes:

Transliterar os 10dígitos s para o árabe e 100dígitos s para o alfabeto latino ( 0- 9=> a- j):

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

Anexe "aa" a qualquer 100dígito s:

[a-j]
$0aa 

Acrescente "0" a qualquer 10dígito s:

\d
$&0 

1Dígitos do transliterado e alfabeto latino para árabe:

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

Converta todos os números decimais separados por espaço em unários:

\d+
$*

Conte o número total de 1s unários :

1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.