Kalkulator Gematria Umum

11

Buat kalkulator Gematria dua arah, untuk setiap urutan karakter Unicode yang diberikan sebagai alfabet.

Gematri-Apa?

Gematria adalah sistem yang menetapkan nilai numerik pada simbol, yang dikembangkan oleh orang Yunani kuno dan diadopsi oleh orang Yahudi kuno. Ini dengan cara seperti ASCII atau Unicode, itu hanya non-linear ... Lihat tabel berikut (tabel lengkap tersedia di tautan di atas):

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

           ...

Nama-nama huruf tidak penting, hanya indeks mereka di "Array" dari alfabet dan nilai numerik masing-masing. Alfabet Ibrani hanya memiliki 22 huruf (tidak termasuk huruf "akhir"), sehingga nilai maksimum yang tersedia adalah 400.

Jika kita meminjam sistem ini ke alfabet Inggris (AZ) kita akan berakhir dengan A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800.

Dua hal yang perlu kita ketahui.

  1. Salah satu fitur terpenting dalam sistem ini adalah menghitung "Nilai Gematria" suatu kata , dengan merangkum nilai hurufnya. (Beberapa mengatakan ada hubungan mistik antara kata, atau frasa (ketika nilai ruang adalah nol) - yang memiliki Nilai Gematria yang sama).

  2. Setiap Integer non-negatif dapat direpresentasikan dalam simbol. Misalnya (dan mari kita tetap menggunakan alfabet bahasa Inggris untuk saat ini) nilai 32 adalah LB (L = 30 + B = 2). Nilai 1024 adalah ZTKD (800 + 200 + 20 + 4. Perhatikan bahwa ZSSKD juga 1024, tetapi itu bukan representasi hukum, karena dapat dipadatkan).

Tantangan

Tulis program / fungsi / potongan kode dalam bahasa pilihan Anda, yang pertama-tama diatur dengan alfabet (lihat API di bawah) dan kemudian terima argumen. Argumen itu bisa berupa Integer, atau kata / frasa. Jika itu adalah Integer - program Anda harus menampilkan / mengembalikan representasinya dalam simbol alfabet - yang paling padat (lihat (2) di atas). Jika itu kata atau frasa, program Anda harus menampilkan / mengembalikan Nilai Gematria (dengan merangkum nilai simbol, tidak menghitung spasi putih, lihat (1) di atas).

API

Program / fungsi Anda harus menerima 3 argumen. Anda bisa mendapatkannya dari STDIN, atau sebagai argumen fungsi, Anda bahkan dapat menganggap mereka adalah variabel yang diinisialisasi secara terprogram sebelum pemanggilan fungsi Anda.

  • Argumen pertama - karakter pertama (dalam Unicode) dari alfabet.
  • Argumen kedua - karakter terakhir (dalam Unicode) dari alfabet.
  • Argumen ketiga - Integer, untuk diwakili dalam simbol, ATAU frase yang dibuat oleh alfabet yang diberikan.

Nilai Output / Pengembalian: Tergantung pada argumen ketiga, seperti yang dijelaskan di atas.

Asumsi

  • Dua argumen pertama akan selalu panjang masing-masing satu karakter, dan yang kedua akan selalu lebih besar dari yang pertama.
  • Urutan (pertama sampai terakhir, inklusif) tidak akan pernah menyertakan nilai 30-39 (yang mewakili angka 0-9), jika tidak maka akan membuat argumen ketiga menjadi ambigu. EDIT: Ini tidak akan mengandung spasi juga, karena dalam frasa spasi dihitung sebagai nol.
  • Argumen ketiga, jika itu adalah frasa, hanya boleh berisi spasi dan huruf dari alfabet yang diberikan. String kosong bukan input yang valid (Anda dapat menganggap itu tidak kosong). Jika itu adalah Integer, Anda dapat menganggap itu adalah Integer positif.

Contohnya

Input                Output

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

Mencetak gol

Score = upvotes - length/100.0

Kode Anda harus pendek, tetapi yang lebih penting populer. Skor negatif juga dapat dimainkan. Pemenang akan menjadi jawaban dengan skor tertinggi dalam seminggu dari sekarang, 2014-11-29 19:20:00 UTC.

Yakub
sumber
Saya mengajukan kembali pertanyaan Anda ke tantangan semua kode karena saya pikir skor cukup berbeda dari golf kode atau kontes popularitas standar.
Martin Ender
Baik. Itu banyak tag :) terima kasih.
Yakub
Apakah ruang itu sendiri termasuk dalam daftar sertakan yang dibuat oleh dua karakter pertama?
Pengoptimal
Juga, apa yang Anda maksud dengan asumsi kedua? Kode ASCII untuk 0 bukan 30.
Pengoptimal
1
@proudhaskeller, ini adalah kesalahan umum karena Anda belajar di TK "peh tsady kuf resh" yang terdengar seperti tsadik kuf ... Anda dipersilakan untuk mengonfirmasi ini dengan Academy for Hebrew.
Yakub

Jawaban:

4

CJam, 80 75 70 byte, Suara positif - 0.7

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

Uji di sini.

Ini adalah program lengkap, yang mengambil input dari STDIN dan mencetak hasilnya ke STDOUT.

Saya tidak begitu yakin bagaimana saya harus menembak untuk popularitas di sini, jadi saya hanya bermain golf ini, berharap mendapatkan ukuran kode yang cukup mengesankan sebagai gantinya. ;)

Saya percaya konversi int-to-string masih dapat ditingkatkan, tetapi saya tidak melihatnya sekarang.

Terima kasih kepada Pengoptimal untuk mengingatkan saya tentang mengatur persimpangan dan bahwa array kosong adalah palsu.

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

Dalam kasus kedua, hasilnya dibiarkan di tumpukan, yang dicetak secara otomatis di akhir program.

Martin Ender
sumber
5

Java 7, Score = Suara positif - 3.97

Yay !!! Jawa!!! Bahasa golf favorit dunia di dunia. Apa, Anda sebenarnya bisa bermain golf di java ??? Yah, itu seperti menggunakan buldoser untuk putt.

adiharapkan mengandung karakter pertama. bdiharapkan berisi karakter terakhir. cdiharapkan memiliki string input.

Berikut adalah fungsi golf:

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

Ini lekukan dengan kode struktur:

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

Ini sepenuhnya diperluas:

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

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

Ini adalah fungsi yang mengambil dua karakter di sebelah kiri, dan argumen yang akan dikonversi di sebelah kanan:

      '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

Versi tidak disatukan:

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
   }⍵
}
marinus
sumber
2

Haskell, 188 byte; Suara positif - 1,88

Ini adalah program STDIN-to-STDOUT yang lengkap, golf lengkap. EDIT: Sekarang di bawah 200 byte! EDIT2: Disimpan satu byte dengan saran @ 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

Itu membangun daftar nilai yang tak terbatas x = [1,2,3,4,5,6,7,8,9,10,20,30,..]pada baris pertama, dan apakah I / O pada baris ketiga. Nilai surat c, mengingat rentang [a..b], kemudian nilai pada posisi length [a..c] - 1dari x. Pada baris kedua, kita bercabang pada huruf pertama udari argumen ketiga, dan menjumlahkan nilai gematria-nya (jika ubukan angka), atau dengan rakus membangun sebuah kata dengan nilai yang diberikan (jikau digit).

Versi tidak dikolomisasi dengan nama variabel yang lebih mudah dibaca:

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
Zgarb
sumber
Anda bisa menghapus {}dari mana klausa untuk keuntungan satu byte
bangga haskeller
1

CJam, 70 bytes, #Upvotes - 0.7

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

Ini mengasumsikan bahwa input yang valid akan dikirimkan. Mengambil input dari STDIN seperti yang dikatakan spesifikasi API dan mencetak hasilnya ke STDOUT.

Contoh:

Input                Output

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

Cobalah online di sini

Blokir penjelasan bijak :

{{_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."
Pengoptimal
sumber