เครื่องคำนวณ Gematria ทั่วไป


11

สร้างเครื่องคิดเลข Gematria แบบสองทิศทางสำหรับลำดับของอักขระ Unicode ที่กำหนดเป็นตัวอักษร

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

           ...

ชื่อของตัวอักษรไม่สำคัญเฉพาะดัชนีของพวกเขาใน "Array" ของตัวอักษรและค่าตัวเลขที่เกี่ยวข้อง ตัวอักษรฮิบรูมีเพียง 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 ด้านล่าง) จากนั้นยอมรับการโต้แย้ง อาร์กิวเมนต์นั้นอาจเป็นจำนวนเต็มหรือคำ / วลี ถ้ามันเป็นจำนวนเต็ม - โปรแกรมของคุณควรส่งออก / คืนค่าการเป็นตัวแทนในสัญลักษณ์ตัวอักษร - ตัวที่ถูกบีบอัดมากที่สุด (ดู (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 19:20:00 UTC


ฉัน retagged คำถามของคุณไปที่ catch-all -challenge codeเนื่องจากฉันคิดว่าการให้คะแนนนั้นแตกต่างจากการเล่นรหัสหรือการแข่งขันความนิยมทั่วไป
Martin Ender

ตกลง. มีแท็กมากมาย :) ขอบคุณ
จาค็อบ

ช่องว่างนั้นรวมอยู่ในรายการรวมที่สร้างโดยอักขระสองตัวแรกคืออะไร
เครื่องมือเพิ่มประสิทธิภาพ

นอกจากนี้คุณหมายถึงอะไรโดยสมมติฐานที่สอง? รหัส ASCII สำหรับ 0 ไม่ใช่ 30
เครื่องมือเพิ่มประสิทธิภาพ

1
@proudhaskeller นี่เป็นข้อผิดพลาดทั่วไปเนื่องจากคุณได้เรียนรู้ในโรงเรียนอนุบาล "peh tsady kuf resh" ซึ่งฟังดูเหมือน tsadik kuf ... คุณสามารถยืนยันได้ด้วย Academy for Hebrew
จาค็อบ

คำตอบ:


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-to-string ยังคงสามารถปรับปรุงได้ แต่ฉันไม่เห็นในตอนนี้

ขอบคุณเครื่องมือเพิ่มประสิทธิภาพสำหรับเตือนฉันเกี่ยวกับการตั้งค่าการตัดกันและอาร์เรย์ที่ว่างเปล่านั้นเป็นเท็จ

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, Score = Upvotes - 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 (upvotes - 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 ไบต์; Upvotes - 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] - 1 xในบรรทัดที่สองเราแยกตัวอักษรตัวแรก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

คุณสามารถลบ{}คำสั่งที่ได้รับหนึ่งไบต์
ภูมิใจ Haskeller

1

CJam, 70 ไบต์, #Upvotes - 0.7

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

สมมติว่าอินพุตที่ถูกต้องจะถูกส่งผ่าน รับอินพุตจาก STDIN เหมือนกับ API ที่ระบุว่าและพิมพ์ผลลัพธ์ไปที่ 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.