일반화 된 Gematria 계산기


11

주어진 유니 코드 문자 시퀀스를 알파벳으로 양방향 Gematria 계산기를 만듭니다.

게 마트 리 무엇?

Gematria 는 고대 그리스인이 개발하고 고대 유대인이 채택한 기호에 숫자 값을 할당하는 시스템입니다. ASCII 또는 유니 코드와 같은 방식으로 비선형입니다 ... 다음 표를 참조하십시오 (전체 표는 위의 링크에서 사용 가능합니다).

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 Value"를 계산하는 것 입니다. (어떤 단어 나 구 (공간의 값이 0 일 때) 사이에 동일한 Gematria 값을 공유하는 신비로운 연결이 있다고 말하는 사람들도 있습니다).

  2. 음이 아닌 정수는 기호로 표시 할 수 있습니다. 예를 들어 (지금은 영어 알파벳을 유지하자) 32의 값은 LB입니다 (L = 30 + B = 2). 1024 값은 ZTKD (800 + 200 + 20 + 4입니다. ZSSKD도 1024이지만 압축 할 수 있기 때문에 합법적 인 표현은 아닙니다.)

도전

선택 언어로 프로그램 / 함수 / 코드 스 니펫을 작성하십시오. 먼저 알파벳으로 설정 한 다음 (아래 API 참조) 인수를 수락하십시오. 이 인수는 정수 또는 단어 / 구문 일 수 있습니다. 정수인 경우-프로그램은 알파벳 기호로 표현을 출력 / 반환해야합니다-가장 압축 된 것입니다 (위의 (2) 참조). 단어 또는 문구 인 경우 프로그램은 Gematria 값을 출력 / 반환해야합니다 (공백을 계산하지 않고 기호 값을 합산하여 위의 (1) 참조).

API

프로그램 / 기능은 3 개의 인수를 허용해야합니다. STDIN에서 가져 오거나 함수 인수로 함수 호출 전에 프로그래밍 방식으로 초기화 된 변수라고 가정 할 수도 있습니다.

  • 첫 번째 인수-알파벳의 첫 문자 (유니 코드)
  • 두 번째 인수-알파벳의 마지막 문자 (유니 코드).
  • 세 번째 인수-기호로 표시되는 정수 또는 주어진 알파벳으로 작성된 문구입니다.

출력 / 반환 값 : 위에서 설명한대로 세 번째 인수에 따라.

가정

  • 처음 두 인수는 항상 각각 한 문자 길이이며 두 번째 인수는 항상 첫 번째 문자보다 강합니다.
  • 시퀀스 (첫 번째에서 마지막까지 포함)에는 30-39 (0-9를 나타내는 숫자) 값이 포함되지 않으며, 그렇지 않으면 세 번째 인수가 모호해집니다. 편집 : 문구에는 공백이 0으로 계산되므로 공백도 포함하지 않습니다.
  • 세 번째 인수는 구인 경우 주어진 알파벳의 공백과 문자 만 포함 할 수 있습니다. 빈 문자열은 유효한 입력이 아닙니다 (비어 있지 않다고 가정 할 수 있습니다). 정수인 경우 긍정적 인 정수라고 가정 할 수 있습니다.

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부터 일주일 동안 가장 높은 점수를 얻은 답변이됩니다.


점수가 코드 골프 또는 표준 인기 경연 대회와 충분히 다르다고 생각하기 때문에 모든 코드 도전에 대한 귀하의 질문에 대해 다시 설명 했습니다 .
Martin Ender

확인. 그것은 많은 태그입니다 :) 감사합니다.
Jacob

공백 자체는 처음 두 문자로 작성된 포함 목록에 포함되어 있습니까?
Optimizer

또한 두 번째 가정은 무엇을 의미합니까? 0의 ASCII 코드는 30이 아닙니다.
Optimizer

1
@proudhaskeller 이것은 tsadik kuf 처럼 들리는 유치원 "peh tsady kuf resh"에서 배우기 때문에 흔한 실수입니다 ... 히브리어 아카데미에서이를 확인하실 수 있습니다.
Jacob

답변:


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-to-string 변환은 여전히 ​​향상 될 수 있다고 생각하지만 지금은 볼 수 없습니다.

교차점을 설정하고 빈 배열이 잘못되었음을 알려주는 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

자바 7, 점수 = 공감 비-3.97

예 !!! 자바!!! 세계에서 가장 좋아하는 골프 언어. 실제로 자바로 골프를 할 수 있습니까 ??? 글쎄, 그것은 불도저를 사용하여 퍼팅하는 것과 같습니다.

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

하스켈, 188 바이트; 공감 비-1.88

본격적인 STDIN-to-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,..]첫 번째 줄 에는 무한한 값 목록을 구성하고 세 번째 줄에는 I / O를 수행합니다. c범위 [a..b]가 주어진 문자 의 값은 위치의 값입니다.length [a..c] - 1 에 입니다 x. 두 번째 줄에서 우리 u는 세 번째 인수 의 첫 번째 문자 를 분기하고 그 gematria 값을 합산하거나 ( u숫자가 아닌 경우 ) 주어진 값으로 단어를 탐욕스럽게 만듭니다 (u 숫자 인 경우).

더 읽기 쉬운 변수 이름을 가진 Ungolfed 버전 :

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 절에서
자랑 haskeller

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.