ギリシャ変換ゴルフ


8

前書き

アラビア数字をギリシャ数字に変換する関数を作成する必要があります。入力はより小さい1000およびより大きい整数になり0ます。

アルゴリズム

  1. 桁に分割数(例えば123- > 123
  2. 各桁を取り、文字に変更し、文字記号や文字の名前のために、下の表で見られる(例えば123- > 123- > ΡΚΓまたはRhoKappaGamma)。

仕様書

  • 組み込みの数体系変換なし
  • 例のように、結果は大文字にする必要があります。
  • 入力はベース10になります。

テストケース

123 -> RhoKappaGamma or ΡΚΓ
8 -> Eta or Η
777 -> PsiOmicronZeta or ΨΟΖ
100 -> Rho or Ρ
606 -> ChiDiGamma or ΧϜ

テーブル

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

10進数の変換は含まれますか?
ニール、

2
私は誤解しているかもしれませんが、123「PKΓ」であってはなりません
Maltysen

3
700and などのテストケースを追加できます803(数字としてゼロを使用)。
ドアノブ

1
ギリシャ文字にはどのエンコーディングが許可されていますか?UTF 8?(コードポイントを指定してください。)en.wikipedia.org/wiki/Code_page_737などのコードページは許可されますか?古くなっている可能性がありますが、ギリシャ文字は1バイトでレンダリングされます。
Level River St

2
文字コードがチェックアウトされません。930はtoのようです。931はΣです。
デニス

回答:



11

Pyth、49 48 46 44バイト

_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_

ここで試してください。

アルファベットを生成する関数の短縮に取り組んでいます...はい、ジェネレーターはアルファベットを4文字ハードコードするよりも長くなりますが、バイト単位ではありません。

_s.b@+kNsYc3[...]_
                 _  get input (implicit) and reverse
            [...]   generate "ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ" (see below)
          c3        split into 3 equal chunks
  .b                map over each input digit (as Y) and chunk (as N)...
     +kN            prepend empty string to N (to support digits of 0)
    @   sY          get the Yth element of the empty-string-plus-digits array
 s                  concatenate all the digits
_                   reverse again to put digits back in the right order

アルファベットを生成する関数の動作は次のとおりです。すべてのコードポイントを取り、913(最小値)を引きます。

0 1 2 3 4 75 5 6 7 8 9 10 11 12 13 14 15 71 16 18 19 20 21 22 23 24 79

次に、パターンに適合しないものを引き出します。

0 1 2 3 4    5 6 7 8 9 10 11 12 13 14 15    16 18 19 20 21 22 23 24
          75                             71                         79

さて、戦略が形成されています:0から24の範囲を生成し(不足している17は後で扱います)、75、71、79を正しい場所に挿入します。

外れ値を挿入するにはどうすればよいですか?Pythには.iexを取るnterleave関数があります。[1,2,3]そして[4,5,6]結果は[1,4,2,5,3,6]です。ただし、明らかに外れ値が離れているため、いくつかのプレースホルダーを追加する必要があります。Xでプレースホルダーを表現しましょう:

0 1 2 3  4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
X X X X 75 X X X X X  X  X  X  X  X 71  X  X  X  X  X  X  X 79

右、したがって、下の外れ値配列は4つので始まりXます。それぞれの外れ値の前に4 Xs をグループ化して、残っているものを確認できますか?

0 1 2 3  4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75 X X X X X  X [  four X  ]71  X  X  X [  four X  ]79

今、私たちは別のキーの観測を行います。79で来ているので非常に終わりがありうる任意のX、それに先立つS、および任意のXだけでなく、それを次の!これは、インタリーブされているため、[1,2,3][4,5,6,7,8,9]の結果で[1,4,2,5,3,6,7,8,9] -NOTEという二番目の配列の終わりまでに余分な要素が終わり、彼らはとにかく削除することになるだろうから、私たちは安全にそれを許可することができます。

つまり、すべての外れ値が4 X秒先行し、6秒成功するようにこれを正規化できます。

0 1 2 3  4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75[   six X   ] [  four X  ]71[     six X      ] [four X]79[six X]

すごい!これで、配列を取得し、[75, 71, 79]各要素の前に4つのプレースホルダー値を挿入し、その後に6つのプレースホルダー値を挿入して、それを範囲でインターリーブできます。0..24

しかし、待ってください、何が起こりました17か?これらすべての例の一番上の行には17がありません。インターリーブ後に17を削除するだけです。しかし、これは別の楽しい悪の可能性を開いたままにします。お察しの通り、私たちが参照してきたプレースホルダーの値X 17になります。これにより、無関係な17とすべてのプレースホルダー値の両方を一度に削除できます。

最終的に!これを実装するために使用されるコードは次のとおりです。

mC+913d-.iU25smXm17hT4Cd"KGO"17
              m         "KGO"    for each char in the string "KGO"...
                      Cd         take its ASCII value ("KGO" -> 75,71,79)
                m17hT            generate an 11-element array filled with 17
               X     4           replace the 5th element with the ASCII value ^^
             s                   concatenate all of these together
        .iU25                    interleave with range(25)
       -                     17  remove all the 17s
m     d                          for each value in the resulting array...
  +913                           add 913 (to get the real character value)
 C                               convert to character

2

JavaScript(ES6)、120 115バイト

n=>(s=n+"").replace(/./g,(d,i)=>d--?"ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ"[d+9*(s.length+~i)]:"")

バイト数はUTF-8を使用しています。長さは88文字です。入力は数値です。

テスト

var solution = n=>(s=n+"").replace(/./g,(d,i)=>d--?"ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ"[d+9*(s.length+~i)]:"")
var testCases = [ 123, 8, 777, 100, 606, 700, 803 ];
document.write("<pre>"+testCases.map(c=>c+": "+solution(c)).join("\n"));


2

Python 3、118バイト

f=lambda n,i=3:i*"_"and f(n//10,i-1)+"   ΡΙΑΣΚΒΤΛΓΥΜΔΦΝΕΧΞϜΨΟΖΩΠΗϠϘΘ"[i-1::3][n%10].strip()

i*"_"andスペースを避けるために、オペランドの順序を入れ替えてうまくいきました。私はそれを見つけられなかっただろう。
Cyoce

2

網膜、57バイト

  • @MartinBüttnerのおかげで11バイト節約されました。

適切な文字範囲と0各桁の削除を含む単純な音訳。

T`d`_ΡΣ-ΩϠ`.(?=..)
T`d`_Ι-ΠϘ`.\B
T`d`_Α-ΕϜΖ-Θ

オンラインでお試しください。(最初の行は、すべてのテストケースを一緒に実行できるようにするために追加されました。)


マーティンも同じスコアに対してこれを提案しました:

T`d`_J-R`.(?=..)
T`d`_L`.\B
T`dL`_Α-ΕϜΖ-ΠϘΡΣ-ΩϠ

2
これが57です(実際のコードを変更する必要がない、もう少し便利なテストフレームワークです)。
マーティンエンダー


2

ジュリア、138バイト

f(x,d=digits(x))=reverse(join([d[i]>0?[["ΑΒΓΔΕϜΖΗΘ","ΙΚΛΜΝΞΟΠϘ","ΡΣΤΥΦΧΨΩϠ"][i]...][d[i]]:""for i=1:endof(d)]))

これは、整数を受け入れ、文字列を返す関数です。

入力の各数字を逆の順序で、適切な文字列からその数字に対応する文字を取得し、文字を組み合わせて結果を逆にします。数字が0の場合は、空の文字列を使用します。



1

JavaScript(ES6)、83文字、110バイト

n=>`${1e3+n}`.replace(/./g,(d,i)=>i--&&d--?"ΡΣΤΥΦΧΨΩϠΙΚΛΜΝΞΟΠϘΑΒΓΔΕϜΖΗΘ"[d+9*i]:"")

ああ、私はこのアプローチをほとんど試しましたが、どういうわけか0sが何にも置き換えられないことを忘れて、それが壊れると思っていました!
user81655

@ user81655私が使用するコマンドラインインタープリターは、改行文字の長さにバイトを追加します(ラムダがブロックでない場合)が、今日はブラウザーコンソールを使用していましたが、そうではありません。おっとっと。
Neil、


0

Ruby、134バイト

モジュラスを使用した基本的なルックアップ取引。おそらくどこかで最適化できますが、RubyはJavascriptのように文字列を整数に強制変換しません。

->n{((0<d=n/100)?"ΡΣΤΥΦΧΨΩϠ"[d-1]:"")+((0<d=n%100/10)?"ΙΚΛΜΝΞΟΠϘ"[d-1]:"")+((0<n%=10)?"ΑΒΓΔΕϜΖΗΘ"[n-1]:"")}

編集をご覧ください-コッパのキャラクターを変更しました。
NoOneIsHere

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