Máy tính Gematria tổng quát


11

Tạo một máy tính Gematria hai chiều, cho bất kỳ chuỗi ký tự Unicode đã cho nào dưới dạng bảng chữ cái.

Gematri-Cái gì?

Gematria là một hệ thống gán các giá trị số cho các biểu tượng, được phát triển bởi người Hy Lạp cổ đại và được người Do Thái cổ đại chấp nhận. Theo cách tương tự như ASCII hoặc Unicode, nó chỉ là phi tuyến tính ... Xem bảng sau (bảng đầy đủ có sẵn trong liên kết ở trên):

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

           ...

Tên của các chữ cái không quan trọng, chỉ có chỉ mục của chúng trong "Mảng" của bảng chữ cái và giá trị số tương ứng. Bảng chữ cái tiếng Do Thái chỉ có 22 chữ cái (không bao gồm chữ cái "cuối cùng"), vì vậy giá trị tối đa có sẵn là 400.

Nếu chúng tôi mượn hệ thống này vào bảng chữ cái tiếng Anh (AZ), chúng tôi sẽ kết thúc với A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800.

Hai điều chúng ta cần biết.

  1. Một trong những tính năng quan trọng nhất trong hệ thống này là tính toán "Giá trị Gematria" của một từ , bằng cách tóm tắt các giá trị chữ cái của nó. (Một số người nói rằng có một mối liên hệ bí ẩn giữa các từ hoặc cụm từ (khi giá trị của không gian bằng 0) - có chung Giá trị Gematria).

  2. Bất kỳ số nguyên không âm có thể được biểu diễn trong các ký hiệu. Ví dụ: và bây giờ hãy ở lại với bảng chữ cái tiếng Anh), giá trị của 32 là LB (L = 30 + B = 2). Giá trị của 1024 là ZTKD (800 + 200 + 20 + 4. Lưu ý rằng ZSSKD cũng là 1024, nhưng đó không phải là đại diện hợp pháp, vì nó có thể được nén).

Các thách thức

Viết chương trình / chức năng / đoạn mã theo ngôn ngữ bạn chọn, lần đầu tiên được thiết lập với một bảng chữ cái (xem API bên dưới) và sau đó chấp nhận một đối số. Đối số đó có thể là một số nguyên hoặc một từ / cụm từ. Nếu đó là một số nguyên - chương trình của bạn sẽ xuất / trả lại biểu diễn của nó trong các ký hiệu bảng chữ cái - biểu tượng được nén nhất (xem (2) ở trên). Nếu đó là một từ hoặc cụm từ, chương trình của bạn sẽ xuất / trả về Giá trị Gematria (bằng cách tóm tắt các giá trị của biểu tượng, không tính khoảng trắng, xem (1) ở trên).

API

Chương trình / chức năng của bạn nên chấp nhận 3 đối số. Bạn có thể lấy chúng từ STDIN hoặc làm đối số hàm, thậm chí bạn có thể giả sử chúng là các biến được khởi tạo theo chương trình trước khi gọi hàm của bạn.

  • Đối số đầu tiên - ký tự đầu tiên (bằng Unicode) của bảng chữ cái.
  • Đối số thứ hai - ký tự cuối cùng (bằng Unicode) của bảng chữ cái.
  • Đối số thứ ba - Một số nguyên, được biểu thị bằng các ký hiệu, HOẶC một cụm từ được tạo bởi bảng chữ cái đã cho.

Giá trị đầu ra / trả về: Tùy thuộc vào đối số thứ ba, như đã giải thích ở trên.

Giả định

  • Hai đối số đầu tiên sẽ luôn là một ký tự dài, và đối số thứ hai sẽ luôn luôn hơn so với đối số thứ nhất.
  • Chuỗi (đầu tiên cho đến cuối cùng, bao gồm) sẽ không bao giờ bao gồm bất kỳ giá trị 30-39 nào (đại diện cho các chữ số 0-9), nếu không, nó sẽ làm cho đối số thứ ba trở nên mơ hồ. EDIT: Nó cũng sẽ không chứa không gian, vì trong cụm từ, không gian được tính là số không.
  • Đối số thứ ba, trong trường hợp đó là cụm từ, chỉ có thể chứa khoảng trắng và chữ cái của bảng chữ cái đã cho. Chuỗi rỗng không phải là đầu vào hợp lệ (bạn có thể cho rằng nó không trống). Trong trường hợp đó là một Số nguyên, bạn có thể cho rằng đó là một Số nguyên dương.

Ví dụ

Input                Output

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

Chấm điểm

Score = upvotes - length/100.0

Mã của bạn nên ngắn, nhưng quan trọng hơn là phổ biến. Điểm số âm cũng có thể chơi cùng. Người chiến thắng sẽ là câu trả lời với số điểm cao nhất trong một tuần kể từ bây giờ, 2014-11-29 19:20:00 UTC.


Tôi đã đặt lại câu hỏi của bạn cho thử thách bắt tất cả vì tôi nghĩ rằng điểm số đủ khác biệt so với môn đánh gôn hoặc cuộc thi phổ biến tiêu chuẩn.
Martin Ender

Đồng ý. Đó là rất nhiều thẻ :) cảm ơn.
Jacob

Không gian chính nó được bao gồm trong danh sách bao gồm được tạo bởi hai ký tự đầu tiên là gì?
Trình tối ưu hóa

Ngoài ra, bạn có ý nghĩa gì với giả định thứ hai? Mã ASCII cho 0 không phải là 30.
Trình tối ưu hóa

1
@proudhaskeller đây là một lỗi phổ biến vì bạn học ở trường mẫu giáo "peh tsady kuf resh" nghe có vẻ như tsadik kuf ... Bạn có thể xác nhận điều này với Học viện Do Thái.
Jacob

Câu trả lời:


4

CJam, 80 75 70 byte, Upvote - 0,7

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

Kiểm tra nó ở đây.

Đây là một chương trình đầy đủ, lấy đầu vào từ STDIN và in kết quả sang STDOUT.

Tôi không thực sự chắc chắn làm thế nào tôi nên bắn để nổi tiếng ở đây, vì vậy tôi chỉ đơn giản là chơi golf này, hy vọng sẽ có được kích thước mã hợp lý ấn tượng thay thế. ;)

Tôi tin rằng chuyển đổi int-to-string vẫn có thể được cải thiện, nhưng tôi không thấy nó ngay bây giờ.

Cảm ơn Trình tối ưu hóa đã nhắc nhở tôi về giao lộ đã đặt và các mảng trống bị sai lệch.

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

Trong trường hợp thứ hai, kết quả được để lại trên ngăn xếp, được in tự động vào cuối chương trình.


5

Java 7, Điểm = Upvotes - 3,97

Yay !!! Java !!! Ngôn ngữ chơi gôn yêu thích của thế giới trên thế giới. Cái gì, bạn thực sự có thể chơi golf trong java ??? Chà, giống như sử dụng máy ủi để putt.

adự kiến ​​sẽ chứa ký tự đầu tiên. bdự kiến ​​sẽ chứa ký tự cuối cùng. cdự kiến ​​sẽ có chuỗi đầu vào.

Đây là chức năng chơi gôn:

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);}

Ở đây nó được thụt lề với mã cấu trú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);
        }
    }
}

Ở đây nó được mở rộng hoàn toàn:

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

Đây là một hàm có hai ký tự bên trái và đối số được chuyển đổi ở bên phải:

      '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

Phiên bản bị đánh cắp:

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 byte; Upvote - 1,88

Đây là một chương trình STDIN-to-STDOUT toàn diện, được chơi rất nhiều. EDIT: Bây giờ dưới 200 byte! EDIT2: Đã lưu một byte với đề xuất @ tự hào.

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

Nó xây dựng danh sách vô hạn các giá trị x = [1,2,3,4,5,6,7,8,9,10,20,30,..]trên dòng đầu tiên và thực hiện I / O trên dòng thứ ba. Giá trị của một chữ cái c, cho phạm vi [a..b], sau đó là giá trị tại vị trí length [a..c] - 1của x. Trên dòng thứ hai, chúng tôi phân nhánh trên chữ cái đầu tiên ucủa đối số thứ ba và tính tổng các giá trị gematria của nó (nếu ukhông phải là một chữ số) hoặc tham lam xây dựng một từ có giá trị đã cho (nếu ulà một chữ số).

Phiên bản Ungolfed với tên biến dễ đọc hơn:

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

bạn có thể xóa {}mệnh đề where cho mức tăng một byte
tự hào

1

CJam, 70 byte, #Upvotes - 0,7

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

Điều này giả định rằng một đầu vào hợp lệ sẽ được thông qua. Lấy đầu vào từ STDIN như thông số API nói và in kết quả sang STDOUT.

Ví dụ:

Input                Output

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

Dùng thử trực tuyến tại đây

Chặn giải thích khôn ngoan :

{{_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."
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.