一般化されたGematria計算機


11

Unicode文字の任意のシーケンスをアルファベットとして、双方向Gematria計算機を作成します。

Gematri-What?

Gematriaは、古代ギリシャ人によって開発され、古代ユダヤ人によって採用された、シンボルに数値を割り当てるシステムです。ASCIIやUnicodeのような方法で、単に非線形です...次の表をご覧ください(完全な表は上記のリンクから入手できます):

Index     Letter   Letter name  Value
--------------------------
  0         א         "Alef"     1
  1         ב         "Bet"      2

           ...

  8         ט         "Tet"      9
  9         י         "Yud"      10
 10         כ         "Kaf"      20

           ...

 17         צ        "Tsady"     90
 18         '        "Kuf"       100
 19         ר        "Resh"      200

           ...

文字の名前は重要ではなく、アルファベットの「配列」内のインデックスとそれぞれの数値のみが重要です。ヘブライ語のアルファベットの文字数は22文字(「最終」文字を除く)であるため、使用可能な最大値は400です。

このシステムを英語のアルファベット(AZ)に借用すると、A = 1、B = 2 ... L = 30 ... U = 300 ... Z = 800になります。

知っておくべき2つのこと。

  1. このシステムで最も重要な機能の1つは、文字の値を合計することにより、単語の「Gematria値」を計算することです。(単語またはフレーズ間に神秘的なつながりがあると言う人もいます(スペースの値がゼロの場合)-同じGematria値を共有します)。

  2. 負でない整数は、シンボルで表すことができます。たとえば(そして今のところ英語のアルファベットのままにしておきましょう)32の値はLB(L = 30 + B = 2)です。1024の値はZTKD(800 + 200 + 20 +4。ZSSKDも1024ですが、圧縮できるため、これは正当な表現ではないことに注意してください)。

チャレンジ

選択した言語でプログラム/関数/コードスニペットを記述します。最初にアルファベットでセットアップし(以下のAPIを参照)、引数を受け入れます。その引数は整数、または単語/フレーズです。整数の場合-プログラムはアルファベット記号で表現を出力/返す必要があります-最もコンパクトなものです(上記の(2)を参照)。単語またはフレーズの場合、プログラムはGematria値を出力/返す必要があります(空白をカウントせずにシンボルの値を合計することにより、上記(1)を参照)。

API

プログラム/関数は3つの引数を受け入れる必要があります。STDINから取得することも、関数の引数として取得することもできますが、関数呼び出しの前にプログラムで初期化される変数であると仮定することもできます。

  • 最初の引数-アルファベットの最初の文字(Unicode)。
  • 2番目の引数-アルファベットの最後の文字(Unicode)。
  • 3番目の引数-シンボルで表される整数、または指定されたアルファベットで作成されるフレーズ。

出力/戻り値:上記で説明したように、3番目の引数に依存します。

仮定

  • 最初の2つの引数は常に1文字ずつで、2番目の引数は常に最初の引数よりも大きいです。
  • シーケンス(最初から最後まで、包括的)には値30-39(数字0-9を表す)は含まれません。そうでない場合、3番目の引数があいまいになります。編集:フレーズではスペースはゼロとしてカウントされるため、スペースも含まれません。
  • 3番目の引数は、フレーズの場合、指定されたアルファベットのスペースと文字のみを含むことができます。空の文字列は有効な入力ではありません(空ではないと想定できます)。整数の場合、正の整数であると想定できます。

Input                Output

A Z CODE GOLF        175
a s 512              sssssjb
A B 7                BBBA
≐ ⊐ ≤≫ ≥            1700

得点

Score = upvotes - length/100.0

コードは短くする必要がありますが、より重要なものです。負のスコアも再生できます。勝者は、2014-11-29 19:20:00 UTCの今から1週間で最高得点を獲得します。


得点はコードゴルフや標準的な人気コンテストとは十分に異なると思うので、キャッチオールコードチャレンジにあなたの質問を書き直しました。
マーティンエンダー14年

OK。それはたくさんのタグです:)ありがとう。
ジェイコブ14年

最初の2文字で作成されたインクルードリストに含まれるスペース自体は何ですか?
オプティマイザー14年

また、2番目の仮定はどういう意味ですか?0のASCIIコードは30ではありません
オプティマイザ

1
@proudhaskellerこれは、tsadik kufのよう聞こえる幼稚園「peh tsady kuf resh」で学ぶため、よくある間違いです。これをアカデミーオブヘブライで歓迎します。
ジェイコブ14年

回答:


4

CJam、80 75 70バイト、Upvotes-0.7

Arc:Irc\-):N,f#{9,:)f*~}%N<lS-_A,s&{i{1${1$)<},)\,I+o-}h;;}{If-\f=:+}?

ここでテストしてください。

これは完全なプログラムであり、STDINから入力を受け取り、結果をSTDOUTに出力します。

ここで人気を得るためにどのように撮影するのか本当によく分からないので、これを単純にゴルフして、代わりにかなり印象的なコードサイズを取得することを望んでいます。;)

intから文字列への変換はまだ改善できると思いますが、現時点ではわかりません。

セットの交差点と空の配列は偽物であることを思い出させてくれたオプティマイザーに感謝します。

A                                   "Push integer 10.";
 rc:I                               "Read token, convert to character, save in I.";
     rc                             "Read token, convert to character.";
       \-)                          "Swap, subtract, increment.";
          :N                        "Store number of characters in N.";
            ,                       "Turn into range [0 1 2 ... N-1].";
             f#                     "Map 10^i onto that range.";
               {       }%           "Map this block onto the powers of 10.";
                9,                  "Create range [0 1 2 ... 8].";
                  :)                "Increment each element.";
                    f*              "Multiply each by the current power of 10.";
                      ~             "Unwrap/dump the resulting array.";
                                    "Now we've got the values of the first 9N digits.";
                         N<         "That's too much, so truncate to the first N.";
                           l        "Read the rest of the line.";
                            S-      "Remove spaces.";
                              _     "Duplicate string and get first character.";
                               A,   "Create range [0 1 2 ... 9].";
                                 s  "Turn into string '0123456789'.";
                                  & "Intersection of characters.";

{                      }{        }? "If/else depending on whether the result is empty.";
                                    "If it was a digit...";
 i                                  "Convert string to integer.";
  {                }h               "While that integer isn't zero...";
   1$                               "Copy digit values.";
     {    },                        "Filter digit values.";
      1$                            "Copy remaining integer.";
        )<                          "Increment, compare.";
                                    "This discards values greater than the integer.";
            )\                      "Slice off last digit value, and swap with list.";
              ,I+                   "Get length of list and add to I.";
                 o                  "Print character.";
                  -                 "Subtract digit value from integer.";
                     ;;             "Empty stack.";
                                    "If the string was not a number...";
                         I          "Push initial character.";
                          f-        "Subtract it from each character in string.";
                            \       "Swap differences and digit values.";
                             f=     "Use differences to index into the values.";
                               :+   "Sum up all the values.";

2番目の場合、結果はスタックに残され、プログラムの最後に自動的に印刷されます。


5

Java 7、スコア=賛成票-3.97

わーい!!!Java !!! 世界で最も人気のあるゴルフ言語。何、あなたは実際にJavaでゴルフできますか???まあ、それはパットにブルドーザーを使用するようなものです。

aは最初の文字を含むことが期待されています。bは最後の文字を含むことが期待されています。c入力文字列があることが期待されます。

以下は関数golfedです。

int d=0;try{d=Integer.parseInt(c);}catch(Exception e){}int l=b-a+1;char[]f=new char[l];int[]g=new int[l];int h=1;int i=1;g[0]=1;f[0]=a;int j;for(j=1;j<b-a+1;){g[j]=(h+=i);f[j]=(char)(f[j++-1]+1);i*=h==10*i?10:1;}if(d==0){h=0;for(char k:c.toCharArray()){for(j=0;j<l;j++){if(f[j]==k){h+=g[j];}}}System.out.println(h);}else{c="";for(j=l;j>0;){if(g[--j]<=d){c+=f[j];d-=g[j++];}}System.out.println(c);}

ここでは、構造コードでインデントされています。

public class G{

    public static void main(String[] args){
        new G(args);
    }

    public G(String[] args){
        a = args[0].charAt(0);
        b = args[1].charAt(0);
        for (int i = 2; i < args.length; i++){
            c += args[i];
        }
        function();
    }

    char a;

    char b;

    String c = "";

    void function(){
        int d=0;
        try{
            d=Integer.parseInt(c);
        }catch(Exception e){}
        int l=b-a+1;
        char[]f=new char[l];
        int[]g=new int[l];
        int h=1;
        int i=1;
        g[0]=1;
        f[0]=a;
        int j;
        for(j=1;j<b-a+1;){
            g[j]=(h+=i);
            f[j]=(char)(f[j++-1]+1);
            i*=h==10*i?10:1;
        }
        if(d==0){
            h=0;
            for(char k:c.toCharArray()){
                for(j=0;j<l;j++){
                    if(f[j]==k){
                        h+=g[j];
                    }
                }
            }
            System.out.println(h);
        }else{
            c="";
            for(j=l;j>0;){
                if(g[--j]<=d){
                    c+=f[j];
                    d-=g[j++];
                }
            }
            System.out.println(c);
        }
    }
}

ここでは完全に展開されています:

public class Generator{

    public static void main(String[] args){
        beginning = args[0].charAt(0);
        end = args[1].charAt(0);
        for (int i = 2; i < args.length; i++){
            phrase += args[i];
        }
        function();
    }

    static char beginning;

    static char end;

    static String phrase = "";

    static void function(){
        int convertTo = 0;
        try{
             convertTo = Integer.parseInt(phrase);
        } catch (Exception e){}
        char[] alphabet = new char[end - beginning + 1];
        int[] values = new int[alphabet.length];
        int value = 1;
        int base = 1;
        values[0] = 1;
        alphabet[0] = beginning;
        int i;
        for (i = 1; i < values.length;){
            values[i] = (value += base);
            alphabet[i] = (char)(alphabet[i++-1]+1);
            base*=value==10*base?10:1;
        }
        if(convertTo==0){
            value = 0;
            for (char character : phrase.toCharArray()){
                for (i = 0; i < alphabet.length;i++){
                    if (alphabet[i] == character){
                        value += values[i];
                    }
                }
            }
            System.out.println(value);


        } else {
            phrase = "";
            for (i = values.length;i > 0;){
                if (values[--i] <= convertTo){
                    phrase += alphabet[i];
                    convertTo -= values[i++];
                }
            }
            System.out.println(phrase);

        }
    }
}

2

APL(賛成票-1.05)

{U←⎕UCS⋄A←V↑∊(10*0,⍳⌊9÷⍨V←1+|-/U⍺)∘.×⍳9⋄⍬≢0↑⍵:+/A[1+(U⍵~' ')-U⊃⍺]⋄U(U⊃⍺)+{⍵≤0:⍬⋄(¯1+A⍳T),∇⍵-T←⊃⌽A/⍨⍵≥A}⍵}

これは、左側で2文字を受け取り、右側で変換される引数を受け取る関数です。

      'A' 'Z'{U←⎕UCS⋄A←V↑∊(10*0,⍳⌊9÷⍨V←1+|-/U⍺)∘.×⍳9⋄⍬≢0↑⍵:+/A[1+(U⍵~' ')-U⊃⍺]⋄U(U⊃⍺)+{⍵≤0:⍬⋄(¯1+A⍳T),∇⍵-T←⊃⌽A/⍨⍵≥A}⍵}'CODE GOLF'
175
      gematria←{U←⎕UCS⋄A←V↑∊(10*0,⍳⌊9÷⍨V←1+|-/U⍺)∘.×⍳9⋄⍬≢0↑⍵:+/A[1+(U⍵~' ')-U⊃⍺]⋄U(U⊃⍺)+{⍵≤0:⍬⋄(¯1+A⍳T),∇⍵-T←⊃⌽A/⍨⍵≥A}⍵}
      'A' 'Z' gematria 'CODE GOLF'
175
      'a' 's' gematria 512
sssssjb
      'A' 'B' gematria 7
BBBA
      '≐' '⊐' gematria '≤≫ ≥'
1700

ゴルフされていないバージョン:

gematria←{
   ⍝ get Unicode values for characters
   first last←⎕UCS¨⍺
   amount←1+last-first
   ⍝ find the value for each character in the alphabet
   alphabet←amount↑∊(10*0,⍳⌊amount÷9)∘.×⍳9

   ⍝ right arg is string: calculate number
   ⍬≢0↑⍵: +/ alphabet[1+(⎕UCS ⍵~' ')-first]

   ⍝ otherwise, right arg is number: find string
   ⎕UCS first+{
      ⍝ number ≤ 0? empty string
      ⍵≤0:⍬

      ⍝ find highest value we can subtract
      val←⊃⌽(⍵≥alphabet)/alphabet

      ⍝ return it, followed by the conversion of the rest of the number
      (¯1+alphabet⍳val), ∇⍵-val
   }⍵
}

2

Haskell、188バイト。賛成票-1.88

これは本格的なSTDINからSTDOUTへのプログラムで、非常にゴルフが盛んです。編集:200バイト未満になりました!EDIT2:@proudhaskellerの提案で1バイトを保存しました。

x=[1..9]++map(*10)x
f(a:_:b:_:z@(u:_))|u>'/'&&u<':'=w$read z|1<2=show.sum$map v z where v ' '=0;v c=x!!(length[a..c]-1);w 0="";w n=(\c->c:w(n-v c))$last[d|d<-[a..b],v d<=n]
main=interact$f

x = [1,2,3,4,5,6,7,8,9,10,20,30,..]最初の行で値の無限リストを構築し、3行目でI / Oを実行します。c範囲を指定すると、文字[a..b]の値はの位置length [a..c] - 1の値になりますx。2行u目では、3番目の引数の最初の文字で分岐し、そのgematria値を合計する(u数字でない場合)か、指定された値で単語を貪欲に構成します(u数字の場合)。

より読みやすい変数名のゴルフバージョン

values = [1..9] ++ map (*10) values
f (low:_:high:_:rest@(first:_))
  | first > '/' && first < ':' = construct $ read rest
  | otherwise                  = show . sum $ map value rest
  where value ' '   = 0
        value c     = values !! (length [low..c] - 1)
        construct 0 = ""
        construct n = (\c -> c : construct (n - value c)) $
                      last [d | d <- [low..high], value d <= n]
main = interact $ f

{}1バイトのゲインのためにwhere句から削除できます
誇りに思ってhaskeller 14

1

CJam、70バイト、#Upvotes-0.7

{{_9%)A@9/#*}%}:M;rcrc),\i>:QlS-_@&{Qf#M:+}{i{Q,,M{1$)<},)Q@,=@@-}h;}?

これは、有効な入力が渡​​されることを前提としています。API仕様に記載されているようにSTDINから入力を取得し、結果をSTDOUTに出力します。

例:

Input                Output

A Z CODE GOLF        175
a s 512              sssssjb
A B 7                BBBA
≐ ⊐ ≤≫ ≥            1700

こちらからオンラインでお試しください

ブロックごとの説明

{{_9%)A@9/#*}%}:M;
{             }:M;              "Define a function M which takes an input array of"
                                "indeces and calculates the Gematri number for them";
 {          }%                  "Run this code block for each element of the array";
  _9%)                          "Copy the number, take modulus by 9 and increment it";
      A@                        "Put 10 on stack, and rotate to get the number on top";
        9/                      "Integer divide the number by 9";
          #                     "Calculate 10 to the power the above quotient";
           *                    "Multiply the above result by modulus 9";

rcrc),\i>:QlS-_@&
rcrc                            "Read the first two characters, representing the lower"
                                "and upper end of the character list";
    ),                          "Increment the upper end and get a list of U to ASCII 0"
                                "characters where U is the upper limit";
      \i                        "Swap and convert the lower limit to its ASCII number";
        >:Q                     "Slice the character list to get our desired character"
                                "list range and store it in Q";
           lS-                  "Read the rest of the line as string and remove spaces";
              _@&               "Take a copy, get Q on top of stack and take"
                                "intersection with the input string. If the resulting"
                                "string is empty, then the third input was a number";
                 {...}{...}?    "First code block is for string input and second for"
                                "number input based on the above intersected string";

{Qf#M:+}
 Qf#                            "For each character of input string, calculate its"
                                "position in Q";
    M                           "Get the Gematri numbers for these inceces";
     :+                         "Sum them all to get the final Gematri number for the"
                                "input string"

{i{Q,,M{1$)<},)Q@,=@@-}h;}
 i                              "Convert the input number string to integer";
  {                   }h        "Run the code block till we get 0 on top of stack";
   Q,,M                         "Get the first length(Q) Gematri numbers";
       {1$)<},                  "Filter and take only which are less than input number";
              )                 "Pop the last number from the filtered array. This is"
                                "The maximum Gematri number that can be deducted";
               Q@               "Put Q on stack and rotate the remaining filtered array"
                                "to top of stack";
                 ,              "Calculate the length of that array, which is also the"
                                "index of the Gematri number used.";
                  =             "Get the corresponding character to that Gematri number";
                   @@-          "Put the number and Gematri number on top and subtract."
                                "The next loop runs on the above result now";
                        ;       "Pop the resedual 0 from stack. The remaining stack now"
                                "contains just the Gematri characters."
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.