Membalikkan Golf Konversi Yunani

8

pengantar

Anda harus membuat fungsi untuk mengubah angka Yunani menjadi angka Arab. Masukan akan berupa angka Yunani kurang dari 1000dan lebih dari 0. Ini kebalikan dari tantangan saya sebelumnya .

Algoritma

  1. Berpisah masukan ke dalam huruf (misalnya ΡΚΓ-> Ρ, Κ, Γ)
  2. Ambil setiap huruf, dan perubahan karakter yang ditemukan di tabel di bawah ini, untuk surat simbol, (misalnya ΡΚΓ-> Ρ, Κ, Γ-> 100, 20, 3).
  3. Tambah (misalnya ΡΚΓ-> Ρ, Κ, Γ-> 100, 20, 3-> 123)

Spesifikasi

  • Tidak ada konversi sistem angka bawaan
  • Input akan dikapitalisasi seperti dalam contoh.
  • Keluaran harus dalam basis 10.
  • ΡΡΡΡtidak akan pernah terjadi. Itu akan terjadi Υ.

Uji Kasus

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

Meja

Α = 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
Tidak Ada Di Sini
sumber
Akankah kita memiliki input seperti ΡΡΡΡ? Jika demikian, apa hasilnya?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tidak. Itu akan menjadi Upsilon.
NoOneIsHere
Oh, saya salah paham pertanyaannya, haha.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya baru saja mengedit spec itu. Anda tidak melewatkannya.
NoOneIsHere
1
Saya pikir kasus pengujian Anda harus mencakup semua pola nol yang mungkin, jadi setidaknya tambahkan sesuatu seperti 180, 42dan 50.
Martin Ender

Jawaban:

2

Jelly , 47 45 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Dennis
sumber
Pengkodean apa yang Anda gunakan? Try It Online mengatakan ukurannya 47 byte. Sepertinya Anda melewatkan satu <newline>Ç€di akhir.
NoOneIsHere
3
Jelly memiliki penyandian sendiri ( tautan byte di header). The memverifikasi semua kasus uji Link termasuk tambahan ǀyang berlaku fungsi untuk semua kasus uji. Tautan pertama menunjukkan ke program aktual, yang panjangnya 44 byte.
Dennis
Ini tampaknya yang terpendek sejauh ini ...
NoOneIsHere
4

Python 3, 112

Disimpan 4 byte berkat vaultah.

Booyah, mengalahkan JS!

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

Dengan uji kasus:

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

Loop melalui string dan menggunakan indeksnya dalam daftar karakter potensial untuk menghitung berapa nilainya.

Morgan Thrapp
sumber
3

JavaScript (ES7), 115 byte

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

Haskell, 116 113 byte

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

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

Cari nilai huruf yunani dari daftar pasangan (letter, value)dan jumlah. Daftar nilai dibangun oleh (*)<$>[1,10,100]<*>[1..9], di mana (*)<$>[1,10,100]membangun daftar fungsi [(*1),(*10),(*100)](dikalikan dengan 1, 10 dan 100) yang diterapkan secara terpisah ke elemen[1..9] dan digabungkan menjadi satu daftar.

Sunting: 3 byte dengan terima kasih kepada @xnor.

nimi
sumber
Lebih singkat untuk menganggap produk sebagai (*)<$>[1,10,100]<*>[1..9].
xnor
@ xnor: <*>dalam konteks daftar, lagi. Saya tidak pernah memikirkannya sendiri. Terima kasih!
nimi
Saya tidak akan memikirkannya, saya mendapatkannya dari sini .
xnor
3

Julia, 82 70 byte

x->10.^((t=findin([1:5;76;6:16;72;17;19:25;80]+912,x)-1)÷9)⋅(t%9+1)

Cobalah online!

Dennis
sumber
2

JavaScript (ES6), 116 byte

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

Hanya 1 byte lebih lama dari ES7!

Neil
sumber
Saya tidak terbiasa dengan JavaScript, apa fungsinya +"e"?
Morgan Thrapp
Rangkaian string @MorganThrapp. Misalnya, dengan Ϡ Anda akan mendapatkan 9+"e"+2dan kemudian +("9e2")menjadi 900.
Neil
1
Ah, itu aneh sekali. Javascript selalu berhasil --- menakutkan --- mengejutkan saya.
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

Cobalah! (Termasuk test case)

MrPublic
sumber
Anda dapat menyimpan 25 byte dengan memadatkannya menjadi 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 byte

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

Cobalah online.

Penjelasan

Pada dasarnya - ganti setiap simbol Yunani dengan angka yang diwakilinya, lalu kembalikan jumlah semua angka yang dihasilkan:

10Digit transliterate ke Arab dan 100digit ke alfabet Latin ( 0- 9=> a- j):

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

Tambahkan "aa" ke 100digit apa saja :

[a-j]
$0aa 

Tambahkan "0" ke 10angka apa saja :

\d
$&0 

1Digit Transliterate dan alfabet Latin ke Bahasa Arab:

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

Ubah semua angka desimal yang dipisahkan oleh ruang menjadi unary:

\d+
$*

Hitung jumlah total unary 1s:

1
Trauma Digital
sumber