Crie uma calculadora Gematria bidirecional, para qualquer sequência de caracteres Unicode, como o alfabeto.
Gematri-O que?
Gematria é um sistema de atribuição de valores numéricos a símbolos, desenvolvido por gregos antigos e adotado por judeus antigos. É semelhante ao ASCII ou Unicode, é apenas não linear ... Consulte a tabela a seguir (a tabela completa está disponível no link acima):
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
...
Os nomes das letras não são importantes, apenas seu índice na "Matriz" do alfabeto e o respectivo valor numérico. O alfabeto hebraico possui apenas 22 letras (não incluindo as letras "finais"), portanto, o valor máximo disponível é 400.
Se emprestarmos esse sistema para o alfabeto inglês (AZ), terminaremos com A = 1, B = 2 ... L = 30 ... U = 300 ... Z = 800.
Duas coisas que precisamos saber.
Uma das características mais importantes desse sistema é calcular o "valor da gematria" de uma palavra , resumindo os valores de suas letras. (Alguns dizem que há uma conexão mística entre palavras ou frases (quando o valor do espaço é zero) - que compartilham o mesmo valor da Gematria).
Qualquer número inteiro não negativo pode ser representado em símbolos. Por exemplo (e vamos ficar com o alfabeto inglês por enquanto) o valor de 32 é LB (L = 30 + B = 2). O valor de 1024 é ZTKD (800 + 200 + 20 + 4. Observe que ZSSKD também é 1024, mas isso não é uma representação legal, pois pode ser compactado).
O desafio
Escreva um trecho de programa / função / código no idioma de sua escolha, primeiro configurado com um alfabeto (consulte API abaixo) e, em seguida, aceite um argumento. Esse argumento pode ser um número inteiro ou uma palavra / frase. Se for um número inteiro - seu programa deve gerar / retornar sua representação nos símbolos do alfabeto - o mais compactado (veja (2) acima). Se for uma palavra ou frase, seu programa deve gerar / retornar o valor da Gematria (somando os valores dos símbolos, sem contar os espaços em branco, consulte (1) acima).
API
Seu programa / função deve aceitar 3 argumentos. Você pode obtê-los no STDIN ou, como argumentos da função, pode até assumir que são variáveis que foram inicializadas programaticamente antes da chamada da função.
- Primeiro argumento - o primeiro caractere (em Unicode) do alfabeto.
- Segundo argumento - o último caractere (em Unicode) do alfabeto.
- Terceiro argumento - Um número inteiro, a ser representado em símbolos, OU uma frase que é criada pelo alfabeto fornecido.
Valor de saída / retorno: dependendo do terceiro argumento, conforme explicado acima.
Premissas
- Os dois primeiros argumentos sempre terão um caractere cada, e o segundo sempre será maior do que o primeiro.
- A sequência (do primeiro ao último, inclusive) nunca incluirá nenhum dos valores 30-39 (que representam os dígitos 0-9); caso contrário, o terceiro argumento será ambíguo. EDIT: também não conterá espaço, pois nas frases os espaços são contados como zeros.
- O terceiro argumento, caso seja uma frase, pode conter apenas espaços e letras do alfabeto especificado. String vazia não é uma entrada válida (você pode assumir que não está vazia). Caso seja um número inteiro, você pode assumir que é um número inteiro positivo.
Exemplos
Input Output
A Z CODE GOLF 175
a s 512 sssssjb
A B 7 BBBA
≐ ⊐ ≤≫ ≥ 1700
Pontuação
Score = upvotes - length/100.0
Seu código deve ser curto, mas o mais importante é popular. Pontuações negativas também podem ser reproduzidas. O vencedor será a resposta com a pontuação mais alta em uma semana a partir de agora, 2014-11-29 19:20:00 UTC.
Respostas:
CJam,
807570 bytes, Upvotes - 0,7Teste aqui.
Este é um programa completo, que recebe a entrada de STDIN e imprime o resultado em STDOUT.
Não tenho muita certeza de como devo buscar popularidade aqui, então estou simplesmente jogando golfe, na esperança de obter um tamanho de código razoavelmente impressionante. ;)
Acredito que a conversão int-to-string ainda pode ser melhorada, mas não a vejo no momento.
Obrigado ao Optimizer por me lembrar sobre a interseção de conjuntos e que matrizes vazias são falsas.
No segundo caso, o resultado é deixado na pilha, que é impressa automaticamente no final do programa.
fonte
Java 7, Pontuação = Upvotes - 3.97
Yay!!! Java!!! O idioma de golfe favorito do mundo. O que, você pode realmente jogar golfe em java ??? Bem, é como usar um trator para arremessar.
a
é esperado que contenha o primeiro caractere.b
é esperado que contenha o último caractere.c
é esperado que tenha a sequência de entrada.Aqui está a função golfed:
Aqui está recuado com o código de estrutura:
Aqui está completamente expandido:
fonte
APL (votações positivas - 1.05)
Esta é uma função que leva os dois caracteres à esquerda e o argumento a ser convertido à direita:
Versão não destruída:
fonte
Haskell, 188 bytes; Upvotes - 1,88
Este é um programa completo de STDIN para STDOUT, muito jogado. EDIT: Agora em menos de 200 bytes! EDIT2: salvou um byte com a sugestão do @ proudhaskeller.
Ele constrói a lista infinita de valores
x = [1,2,3,4,5,6,7,8,9,10,20,30,..]
na primeira linha e executa E / S na terceira linha. O valor de uma letrac
, dado o intervalo[a..b]
, é então o valor na posiçãolength [a..c] - 1
dex
. Na segunda linha, ramificamos a primeira letrau
do terceiro argumento e somamos seus valores de gematria (seu
não for um dígito) ou construímos avidamente uma palavra com o valor fornecido (seu
for um dígito).Versão ungolfed com nomes de variáveis mais legíveis:
fonte
{}
partir da cláusula WHERE para um ganho de um byteCJam, 70 bytes, #Upvotes - 0,7
Isso pressupõe que uma entrada válida será passada. Recebe a entrada de STDIN como a especificação da API diz e imprime o resultado em STDOUT.
Exemplos:
Experimente online aqui
Bloquear explicação sábia :
fonte