广义Gematria计算器


11

为任何给定的Unicode字符序列(如字母)创建一个双向Gematria计算器。

Gematri-什么?

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。

我们需要知道两件事。

  1. 该系统最重要的功能之一是通过单词的字母值求和来计算单词的“ Gematria值” 。(有人说单词或短语(当空间的值为零时)之间存在神秘的联系-它们共享相同的Gematria值)。

  2. 任何非负整数都可以用符号表示。例如(现在让我们继续使用英语字母),值32是LB(L = 30 + B = 2)。1024的值为ZTKD(800 + 200 + 20 + 4。请注意,ZSSKD也是1024,但这不是合法的表示形式,因为可以压缩)。

挑战

用您选择的语言编写一个程序/函数/代码段,首先用一个字母(参见下面的API)进行设置,然后接受一个参数。该自变量可以是整数,也可以是单词/短语。如果是Integer,则您的程序应输出/返回以字母符号表示的形式-最紧凑的形式(请参见上面的(2))。如果是单词或短语,则程序应输出/返回Gematria值(通过累加符号的值,不计算空格,请参见上面的(1))。

API

您的程序/函数应接受3个参数。您可以从STDIN中获取它们,或者作为函数参数,甚至可以假设它们是在函数调用之前以编程方式初始化的变量。

  • 第一个参数-字母的第一个字符(Unicode中)。
  • 第二个参数-字母的最后一个字符(Unicode中)。
  • 第三个参数-一个整数,用符号表示,或者由给定字母创建的短语。

输出/返回值:取决于第三个参数,如上所述。

假设条件

  • 前两个自变量始终每个字符长,第二个自变量始终比第一个长。
  • 该序列(从头到尾,包括两端)将永远不会包含任何值30-39(代表数字0-9),否则它将使第三个参数不明确。编辑:它也不会包含空格,因为在短语中空格被视为零。
  • 如果是短语,则第三个参数只能包含空格和给定字母的字母。空字符串不是有效的输入(您可以假定它不为空)。如果它是整数,则可以假定它是正整数。

例子

Input                Output

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

计分

Score = upvotes - length/100.0

您的代码应该简短,但更受欢迎。负分数也可以发挥作用。从现在开始,即2014年11月29日UTC,获胜者将是一周内得分最高的答案。


我对所有代码挑战重新提出了您的问题,因为我认为评分与代码高尔夫或标准人气竞赛有很大不同。
Martin Ender 2014年

好。这是很多标签:)谢谢。
2014年

前两个字符创建的包含列表中包含的空间本身是什么?
Optimizer

另外,第二个假设是什么意思?为0 ASCII代码不是30
优化程序

1
@proudhaskeller,这是一个常见的错误,因为您在幼儿园学习“ peh tsady kuf resh”,听起来像 tsadik kuf。欢迎您与希伯来语学院确认这一点。
2014年

Answers:


4

CJam,80 75 70字节,支持-0.7

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

在这里测试。

这是一个完整的程序,它接收来自STDIN的输入并将结果打印到STDOUT。

我不太确定该如何在这里流行,所以我只是打高尔夫,希望能得到相当不错的代码大小。;)

我相信int到字符串的转换仍然可以改善,但是我现在看不到。

感谢Optimizer提醒我有关集合交集的问题,并且空数组是虚假的。

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.";

在第二种情况下,结果留在堆栈上,并在程序末尾自动打印。


5

Java 7,得分=认可-3.97

好极了!!!Java的!世界上最喜欢的高尔夫语言。什么,您实际上可以在Java中打高尔夫???好吧,这有点像用推土机推杆。

a预期包含第一个字符。b预期包含最后一个字符。c预期具有输入字符串。

这是打高尔夫球的功能:

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}⍵}

这个函数的左边是两个字符,右边是要转换的参数:

      '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-to-STDOUT计划,备受关注。编辑:现在不到200字节!EDIT2:使用@proudhaskeller的建议保存了一个字节。

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,..]在第一行上构造值的无限列表,并在第三行上进行I / O。一个字母的值c,给出的范围[a..b],是则在位置的值length [a..c] - 1x。在第二行上,我们分支u到第三个参数的第一个字母,然后求和其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

您可以{}从where子句中删除1个字节的收益
骄傲的haskeller 2014年

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."
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.