Genelleştirilmiş Gematria Hesap Makinesi


11

Alfabe olarak herhangi bir Unicode karakter dizisi için çift yönlü bir Gematria hesap makinesi oluşturun.

Gematri-Ne?

Gematria , eski Yunanlılar tarafından geliştirilen ve eski Yahudiler tarafından benimsenen sembollere sayısal değerler atama sistemidir. ASCII veya Unicode gibi bir şekilde, sadece doğrusal değil ... Aşağıdaki tabloya bakın (yukarıdaki tabloda tam tablo mevcuttur):

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

           ...

Harflerin adları önemli değildir, sadece alfabenin "Dizisi" ndeki dizini ve ilgili sayısal değerdir. İbrani alfabesinde sadece 22 harf vardır ("son" harfler dahil değildir), bu nedenle mevcut maksimum değer 400'dür.

Bu sistemi İngiliz alfabesine (AZ) ödünç alırsak A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800 ile sonuçlanırız.

Bilmemiz gereken iki şey var.

  1. Bu sistemde en önemli özelliklerinden biri de bir "Gematria Değerini" hesaplarken kelimesi ile, özetliyor onun harfleri değerleri. (Bazıları, kelimeler veya kelime öbekleri arasında (uzayın değeri sıfır olduğunda) - aynı Gematria Değerini paylaşan mistik bir bağlantı olduğunu söylüyor.

  2. Negatif olmayan herhangi bir Tamsayı sembollerle gösterilebilir. Örneğin (şimdilik İngiliz alfabesi ile kalalım) 32 değeri LB'dir (L = 30 + B = 2). 1024 değeri ZTKD'dir (800 + 200 + 20 + 4. ZSSKD'nin de 1024 olduğunu unutmayın, ancak sıkıştırılabileceğinden bu yasal bir temsil değildir).

Meydan okuma

Tercih ettiğiniz dilde bir program / işlev / kod snippet'i yazın; bu kod ilk önce bir alfabe ile ayarlanır (aşağıdaki API'ya bakın) ve daha sonra bir argümanı kabul eder. Bu argüman bir Tamsayı veya bir kelime / cümle olabilir. Eğer bir Tamsayı ise - programınız alfabetik sembollerde gösterimini çıkarmalı / döndürmelidir - en sıkıştırılmış olanı (bkz. Yukarıdaki (2)). Bir kelime veya kelime öbeği ise, programınızın Gematria Değerini vermesi / döndürmesi gerekir (beyaz boşlukları sayarak sembollerin değerlerini toplayarak, yukarıdaki (1) 'e bakınız).

API

Programınız / işleviniz 3 bağımsız değişkeni kabul etmelidir. Bunları STDIN'den alabilir veya işlev bağımsız değişkenleri olarak, bunların işlev çağrılmadan önce programsal olarak başlatılan değişkenler olduğunu varsayabilirsiniz.

  • İlk argüman - alfabenin ilk karakteri (Unicode'da).
  • İkinci argüman - alfabenin son karakteri (Unicode'da).
  • Üçüncü argüman - Sembollerde temsil edilecek bir Tamsayı, VEYA verilen alfabe tarafından oluşturulan bir ifade.

Çıktı / Dönüş Değeri: Yukarıda açıklandığı gibi üçüncü argümana bağlı olarak.

Varsayımlar

  • İlk iki argüman her biri birer karakter uzunluğunda, ikincisi her zaman birinciden daha büyük olacaktır.
  • Dizi (ilkten sonuncuya kadar dahil) hiçbir zaman 30-39 (0-9 arasındaki rakamları temsil eden) değerlerden hiçbirini içermeyecektir, aksi takdirde üçüncü argümanı belirsizleştirecektir. EDIT: Cümlelerde boşluklar sıfır olarak sayıldığından boşluk da içermez.
  • Üçüncü argüman, bir ifade olması durumunda, sadece verilen alfabenin boşluklarını ve harflerini içerebilir. Boş dize geçerli bir giriş değil (boş olmadığını varsayabilirsiniz). Bir Tamsayı olması durumunda, bunun pozitif bir Tamsayı olduğunu varsayabilirsiniz.

Örnekler

Input                Output

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

puanlama

Score = upvotes - length/100.0

Kodunuz kısa olmalı, ancak daha da önemlisi popüler olmalıdır. Olumsuz puanlar da oynayabilir. Kazanan, şu andan itibaren bir hafta içinde en yüksek puanı alan cevap olacak, 2014-11-29 19:20:00 UTC.


Puanlama kod golf ya da standart popülerlik yarışmasından yeterince farklı olduğunu düşünüyorum gibi tüm catch-tüm kod meydan okuma sorunuzu yeniden etiketlenmiş .
Martin Ender

Tamam. Bu çok fazla etiket :) teşekkürler.
Jacob

İlk iki karakter tarafından oluşturulan dahil etme listesinde alanın kendisi nedir?
Doktor

Ayrıca, ikinci varsayımla ne demek istiyorsun? 0 için ASCII kodu 30 değil.
Doktor

1
@proudhaskeller tsadik kuf gibi kulağa "peh tsady kuf resh" anaokulunda öğrendiğiniz için bu yaygın bir hatadır ... İbranice Akademisi ile bunu onaylayabilirsiniz.
Jacob

Yanıtlar:


4

CJam, 80 75 70 bytes, Olumlu oylar - 0.7

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

Burada test edin.

Bu, STDIN'den girdi alan ve sonucu STDOUT'a yazdıran tam bir programdır.

Burada popülerlik için nasıl çekileceğimi gerçekten bilmiyorum, bu yüzden bunun yerine makul bir şekilde etkileyici bir kod boyutu almayı umarak golf oynuyorum. ;)

Int-to-string dönüşüm hala geliştirilebilir inanıyorum, ama şu anda görmüyorum.

Set kesişimini hatırlattığı için Optimizer'a ve boş dizilerin yanlış olduğunu hatırlattı.

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

İkinci durumda sonuç, programın sonunda otomatik olarak yazdırılan yığın üzerinde bırakılır.


5

Java 7, Score = Olumlu oy - 3.97

Yaşasın!!! Java !!! Dünyanın en gözde golf dili. Ne, aslında java golf olabilir ??? Yani, vurmak için bir buldozer kullanmak gibi.

ailk karakteri içermesi bekleniyor. bson karakteri içermesi bekleniyor. c, girdi dizesine sahip olması bekleniyor.

İşte golf işlevi:

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

Burada yapı kodu ile girintilidir:

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

Burada tamamen genişletilmiş:

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

Bu, soldaki iki karakteri ve sağa dönüştürülecek bağımsız değişkeni alan bir işlevdir:

      '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

Ungolfed sürümü:

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 bayt; Olumlu oy - 1.88

Bu, yoğun bir şekilde golf oynayan, tam gelişmiş bir STDIN-STDOUT programıdır. EDIT: Şimdi 200 baytın altında! EDIT2: @ proudhaskeller'ın önerisiyle bir bayt kaydedildi.

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,..]İlk satırda sonsuz değer listesi oluşturur ve üçüncü satırda G / Ç yapar. Bir harf değeri caralığı göz önüne alındığında, [a..b]daha sonra konumunda bir değerdir length [a..c] - 1arasında x. İkinci satırda, uüçüncü argümanın ilk harfinde dallanır ve gematria değerlerini ( ubir rakam değilse) toplar ya da verilen değerle ( ubir rakam ise) bir kelimeyi açgözlülükle oluştururuz .

Daha okunabilir değişken adlarına sahip hareketsiz sürüm:

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

{}bir bayt kazancı için nereye ait maddeyi kaldırabilirsiniz
gururlu haskeller

1

CJam, 70 bayt, #Videolar - 0.7

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

Bu, geçerli bir girişin geçirileceğini varsayar. API spesifikasyonunun söylediği gibi STDIN'den girdi alır ve sonucu STDOUT'a yazdırır.

Örnekler:

Input                Output

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

Buradan çevrimiçi deneyin

Blok akıllıca açıklama :

{{_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."
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.