Узагальнений калькулятор гематрії


11

Створіть двонаправлений калькулятор Gematria для будь-якої заданої послідовності символів Unicode як алфавіту.

Гематрі-що?

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

           ...

Назви букв не важливі, лише їх індекс у "масиві" алфавіту та відповідне числове значення. Єврейський алфавіт містить лише 22 літери (не включаючи "заключні" літери), тому максимальне доступне значення - 400.

Якщо ми запозичимо цю систему в англійському алфавіті (AZ), ми отримаємо A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800.

Дві речі, які нам потрібно знати.

  1. Однією з найважливіших особливостей цієї системи є обчислення "значення гематрії" слова шляхом підсумовування значень його букв. (Деякі кажуть, що між словами або фразами міститься містичний зв’язок (коли значення простору дорівнює нулю) - вони мають одне і те саме значення Gematria).

  2. Будь-який невід'ємний цілий число може бути представлений символами. Наприклад (і давайте залишимося з англійським алфавітом зараз) значення 32 - LB (L = 30 + B = 2). Значення 1024 - ZTKD (800 + 200 + 20 + 4. Зауважте, що ZSSKD також 1024, але це не є законним представництвом, оскільки його можна ущільнити).

Змагання

Напишіть програму / функцію / фрагмент коду на обрану вами мову, яку спочатку налаштовуйте за алфавітом (див. API нижче), а потім прийміть аргумент. Цей аргумент може бути цілим числом або словом / фразою. Якщо це Integer - ваша програма повинна вивести / повернути своє представлення в алфавітних символах - найбільш ущільненому (див. (2) вище). Якщо це слово або фраза, ваша програма повинна вивести / повернути значення Gematria (шляхом підсумовування знаків символів, не рахуючи пробілів, див. (1) вище).

API

Ваша програма / функція повинна приймати 3 аргументи. Ви можете отримати їх з STDIN або як аргументи функції, ви навіть можете припустити, що вони є змінними, які ініціалізуються програмно перед викликом функції.

  • Перший аргумент - перший символ (в Unicode) алфавіту.
  • Другий аргумент - останній символ (в Unicode) алфавіту.
  • Третій аргумент - Ціле число, яке має бути представлене символами, АБО фраза, яка створюється заданим алфавітом.

Значення виходу / повернення: залежно від третього аргументу, як пояснено вище.

Припущення

  • Перші два аргументи завжди будуть по одному символу кожен, а другий завжди буде тертм, ніж перший.
  • Послідовність (перша до останньої, включно) ніколи не буде включати жодне зі значень 30-39 (які представляють цифри 0-9), інакше вона зробить третій аргумент неоднозначним. EDIT: Він також не буде містити місця, оскільки у фразах пробіли зараховуються як нулі.
  • Третій аргумент, якщо це словосполучення, може містити лише пробіли та літери даного алфавіту. Порожній рядок не є дійсним введенням (ви можете припустити, що він не порожній). У випадку, якщо це ціле число, ви можете припустити, що це ціле число.

Приклади

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.


Я переназначив ваше запитання на виклик коду, котрий є загальним, оскільки я вважаю, що бал достатньо відрізняється від гольф-коду чи стандартного конкурсу на популярність.
Мартін Ендер

Гаразд. Це багато тегів :) дякую.
Яків

Що таке простір, включений у список включення, створений першими двома символами?
Оптимізатор

Також, що ви маєте на увазі під другим припущенням? Код ASCII для 0 не є 30.
Оптимізатор

1
@proudhaskeller - це звичайна помилка, оскільки ви вивчаєте в дитячому садку "пе-цаді куф реш", який звучить як tadik kuf ... Ви можете підтвердити це в Академії івриту.
Яків

Відповіді:


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.

Я не дуже впевнений, як я повинен стріляти на популярність тут, тому я просто гольфую це, сподіваючись натомість отримати досить вражаючий розмір коду. ;)

Я вважаю, що перетворення in-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

Java 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

Haskell, 188 байт; Оновлення - 1,88

Це повномасштабна програма STDIN-STDOUT, з великою гольфу. РЕДАКТИРУЙТЕ: Зараз вже менше 200 байт! EDIT2: збережено один байт із пропозицією @ ponoshaskeller.

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,..]на першому рядку, а чи введення / вивід у третьому рядку. Значення письма c, враховуючи діапазон [a..b], тоді значення в положенні length [a..c] - 1від x. У другому рядку ми розгалужуємо першу букву uтретього аргументу і або підсумовуємо її значення гематрії (якщо 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."
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.