Создайте двунаправленный калькулятор Gematria для любой заданной последовательности символов Юникода в качестве алфавита.
Gematri-Что?
Гематрия - это система присвоения числовых значений символам, разработанная древними греками и принятая древними евреями. Это похоже на 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.
Две вещи, которые мы должны знать.
Одной из наиболее важных функций в этой системе является вычисление «значения гематрии» слова путем суммирования значений его букв. (Некоторые говорят, что между словами или фразами существует мистическая связь (когда значение пробела равно нулю), которые имеют одинаковое значение Гематрии).
Любое неотрицательное целое число может быть представлено в символах. Например (и давайте пока остановимся на английском алфавите), значение 32 - это LB (L = 30 + B = 2). Значение 1024 - это ZTKD (800 + 200 + 20 + 4. Обратите внимание, что ZSSKD также является 1024, но это не является юридическим представлением, поскольку оно может быть сжато).
Соревнование
Напишите программу / функцию / фрагмент кода на выбранном вами языке, который сначала настраивается с помощью алфавита (см. API ниже), а затем принимает аргумент. Этим аргументом может быть целое число или слово / фраза. Если это целое число - ваша программа должна вывести / вернуть свое представление в символах алфавита - наиболее компактное (см. (2) выше). Если это слово или фраза, ваша программа должна вывести / вернуть значение Gematria (суммируя значения символов, не считая пробелы, см. (1) выше).
API
Ваша программа / функция должна принимать 3 аргумента. Вы можете получить их из STDIN или в качестве аргументов функции, вы даже можете предположить, что они являются переменными, которые программно инициализируются до вызова вашей функции.
- Первый аргумент - первый символ (в 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.
Ответы:
CJam,
807570 байт, Upvotes - 0,7Проверьте это здесь.
Это полная программа, которая принимает входные данные из STDIN и печатает результат в STDOUT.
Я не совсем уверен, как я должен стремиться к популярности здесь, поэтому я просто играю в гольф, надеясь получить вместо этого достаточно внушительный размер кода. ;)
Я верю, что преобразование между строками все еще можно улучшить, но сейчас я этого не вижу.
Спасибо оптимизатору за напоминание о пересечении множества и о том, что пустые массивы ложные.
Во втором случае результат остается в стеке, который автоматически печатается в конце программы.
источник
Java 7, Оценка = Upvotes - 3,97
Ура!!! Ява!!! Самый любимый в мире язык игры в гольф. Что, вы можете играть в гольф в Java ??? Ну, это похоже на использование бульдозера для удара.
a
как ожидается, будет содержать первый символ.b
как ожидается, будет содержать последний символ.c
как ожидается, будет иметь входную строку.Вот функция гольфа:
Здесь он имеет структурный код:
Здесь это полностью расширено:
источник
APL (upvotes - 1.05)
Это функция, которая принимает два символа слева и аргумент для преобразования справа:
Безголовая версия:
источник
Haskell, 188 байт; Upvotes - 1,88
Это полномасштабная программа STDIN-to-STDOUT, в значительной степени играющая в гольф. РЕДАКТИРОВАТЬ: Теперь менее 200 байтов! РЕДАКТИРОВАТЬ 2: Сохраненный один байт с предложением @roudhaskeller.
Он
x = [1,2,3,4,5,6,7,8,9,10,20,30,..]
создает бесконечный список значений в первой строке и ввод / вывод в третьей строке. Значение письмаc
, учитывая диапазон[a..b]
, тогда значение в положенииlength [a..c] - 1
отx
. Во второй строке мы разветвляемся на первую буквуu
третьего аргумента и либо суммируем его значения гематрии (еслиu
это не цифра), либо жадно строим слово с заданным значением (еслиu
это цифра).Неуправляемая версия с более читаемыми именами переменных:
источник
{}
предложение where для однобайтового усиленияCJam, 70 байтов, #Upvotes - 0,7
Это предполагает, что допустимый ввод будет передан. Принимает ввод из STDIN, как сказано в спецификации API, и выводит результат в STDOUT.
Примеры:
Попробуйте онлайн здесь
Блок мудрое объяснение :
источник