逆ギリシャ変換ゴルフ


8

前書き

ギリシャ数字をアラビア数字に変換する関数を作成する必要があります。入力は、より小さい1000およびより大きいギリシャ数字になり0ます。これは私の以前の課題の逆です。

アルゴリズム

  1. 手紙に分割入力(例:ΡΚΓ- > ΡΚΓ
  2. (例えば、各文字を取り、文字への変更は、文字記号のために、下の表で見つかりましたΡΚΓ- > ΡΚΓ- > 100203)。
  3. 追加(例えばΡΚΓ- > ΡΚΓ- > 100203- > 123

仕様書

  • 組み込みの数体系変換なし
  • 入力は例のように大文字になります。
  • 出力はベース10でなければなりません。
  • ΡΡΡΡ決して起こりません。になりますΥ

テストケース

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

テーブル

Α = 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

次のような入力はありΡΡΡΡますか?もしそうなら、結果はどうなりますか?
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴいいえ、それはウプシロンでしょう。
NoOneIsHere

ああ、私は質問を誤解した、ハハ。
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴそのスペックをたった今編集しました。お見逃しなく。
NoOneIsHere

1
私は、少なくとものようなものを追加し、あなたのテストケースはゼロの可能な全てのパターンを網羅すべきだと思う1804250
マーティンエンダー

回答:


2

ゼリー47 45 バイト

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

オンラインでお試しください!またはすべてのテストケースを確認します


どのエンコーディングを使用していますか?オンラインで試してみると47バイトだそうです。<newline>Ç€最後にaが欠落しているようです。
NoOneIsHere

3
Jellyには独自のエンコーディングがあります(ヘッダー内のバイトリンク)。すべてのテストケース確認リンクには、Ç€すべてのテストケースに機能を適用する追加機能が含まれています。最初のリンクは、実際のプログラムの長さ44バイトです。
デニス

これは今のところ最短のようです...
NoOneIsHere

4

Python 3、112

vaultahのおかげで4バイトを節約できました。

ブイヤ、JSを倒した!

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

テストケースで:

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

文字列をループし、潜在的な文字のリストのインデックスを使用して、どれだけの価値があるかを計算します。


3

JavaScript(ES7)、115バイト

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

3

Haskell、116113バイト

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

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

ペア(letter, value)と合計のリストからギリシャ文字の値を検索します。値のリストはによって作成され(*)<$>[1,10,100]<*>[1..9]、の要素に個別に適用され、単一のリストに連結される(*)<$>[1,10,100]関数のリスト[(*1),(*10),(*100)](1、10、100で乗算)を[1..9]作成します。

編集:@xnorのおかげで3バイト。


製品をとする方が短い(*)<$>[1,10,100]<*>[1..9]です。
xnor

@xnor:<*>リストのコンテキストでも。自分では考えません。ありがとう!
nimi

思いもしませんが、ここから入手しまし
xnor


2

JavaScript(ES6)、116バイト

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

ES7よりも1バイトだけ長い!


JavaScriptに詳しくないのですが、何をするの+"e"ですか?
Morgan Thrapp

@MorganThrapp文字列の連結。例えば、Ϡであなたはなるだろう9+"e"+2し、その後+("9e2")900となり
ニール・

1
ああ、それは本当に変だ。Javascriptは常になんとか---恐ろしい-私を驚かせます。
Morgan Thrapp

1

Python 3、188バイト

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

やってみて!(テストケースを含む)


に圧縮することで、25バイトを節約できます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

網膜、72バイト

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

オンラインでお試しください。

説明

基本的に-すべてのギリシャ記号をそれが表す数字で置き換え、結果のすべての数字の合計を返します。

10s桁をアラビア語に変換し、100s桁をラテンアルファベットに変換します(0- 9=> a- j):

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

「aa」を任意100のs桁に追加します。

[a-j]
$0aa 

10sの数字に「0」を追加します。

\d
$&0 

翻字1の数字とアラビア語のラテンアルファベット:

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

スペースで区切られたすべての10進数を単項に変換します。

\d+
$*

単項1sの総数を数えます:

1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.