Todos nós já fizemos isso, bem, talvez não, mas criar sua própria linguagem alienígena e sistema de numeração é um grampo especialmente da escrita de fantasia, mas é principalmente uma atividade divertida.
A tarefa é simples, use duas entradas:
Uma entrada de lista ordenada de 10 [dez] 'numerais' exclusivos (qualquer caractere ASCII imprimível) e os interpreta, em ordem, como os valores 0, 1, 2, 3, ..., 9
+ Há exceções no que pode ser um numeral aqui. Operadores aritméticos (+, -, *, /), parênteses e espaços não podem ser usados como um dos números.
Um problema aritmético usando apenas os 'numerais'
E imprima o resultado inteiro equivalente no formulário fornecido.
Aqui está um exemplo:
INPUT
abcdefghij
bcd + efg + hij
OUTPUT
bdgi
No exemplo, a lista de entrada (você pode escolher em qual formulário a lista entra) de 'abcdefghij' corresponde a '0123456789', assim como 'hjkloiwdfp' também corresponderia 1 a 1 a '0123456789' onde, em vez de 'a' associado a zero, 'h' faz. O seguinte aritmético 'se traduz' em 123 + 456 + 789, o que equivale a 1368. Isso deve ser gerado na forma que fornecemos, então b (que representa 1) d (para 2) g (para 6) e i (para 8)
CASOS DE TESTE
abcdefghij
abc + def - ghij
-gedc
qwertyuiop
qwerty / uiop
e
%y83l;[=9|
(83l * 9) + 8%
y9|8
MAIS REGRAS
- As brechas padrão são proibidas!
- Isso é código de golfe, então respostas mais curtas em bytes ganham.
- Deve ser um programa ou função completo, com entradas e saídas no formato que for melhor para você. (Apenas não é possível adicionar informações adicionais nas entradas, apenas 'numerais' e a expressão.
- Use qualquer idioma que desejar (desde que esteja em conformidade com outras regras)
fonte
q.ioiopewioyetqorw...
. Em caso afirmativo, que tipo de arredondamento deve ser aplicado?1
para5/3
, não2
devido à divisão inteira (sem arredondamento). Isso não invalida o desafio, mas pode ser necessário permitir respostas aceitáveis diferentes para o mesmo caso de teste (veja minha resposta T-SQL abaixo).Respostas:
05AB1E ,
109 bytes(Agora) gera como uma lista de caracteres.
Experimente online ou verifique todos os casos de teste .
Explicação:
A nova versão do 05AB1E é build é build no Elixir . A
.E
função chamarácall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)
, ondeCode.eval_string
está um Elixir embutido .Observe que a versão herdada do 05AB1E não funcionará para isso, porque é compilada no Python. Os números com 0 iniciais não serão avaliados:
veja todos os casos de teste na versão herdada (que usa a versão de 10 bytes porque o
Åв
builtin é novo).fonte
R , 58 bytes
Experimente online!
Tradução personagem usa
chartr
para trocar os dígitos,parse
S eeval
é a expressão, e depoischartr
está de volta aos dígitos originais.Se for necessário arredondar para o número inteiro mais próximo, isso é
R , 65 bytes
Experimente online!
fonte
[
como um nome mais curto para uma função com 3 parâmetros é muito inteligente. Bem feito.T-SQL, 117 bytes
Quebras de linha são apenas para legibilidade.
A entrada é feita através de uma tabela preexistente t com as colunas de texto c (caracteres) ee (equação), de acordo com nossas regras de IO .
Usa a função SQL 2017
TRANSLATE
para alternar entre caracteres e gerar uma sequência que não contém apenas a equação, mas o código para converter novamente nos caracteres originais:Essa sequência é avaliada usando
EXEC()
.Pode haver alguns caracteres (como aspas simples
'
) que quebrariam esse código; Não testei todos os caracteres ASCII possíveis.De acordo com o desafio, estou avaliando a expressão como dada, sujeita à maneira como meu idioma interpreta esses operadores. Como tal, o segundo caso de teste retorna 1 (
w
) e não 2 (e
), devido à divisão inteira.fonte
Perl 6 , 38 bytes
Experimente online!
Não tenho certeza de como o arredondamento deve funcionar. Se arredonda no final, então eu posso adicionar
.round
para +6 bytes . Se o comportamento de/
deve ser diferente, pode ser mais longo. Leva a entrada como curryf(arithmetic)(numerals)(arithmetic)
.Explicação:
fonte
Stax ,
746665 bytesExecute e depure
Stax não se sai bem aqui, sem uma verdadeira instrução "eval". Ele tem um chamado "eval" nos documentos, mas funciona apenas em valores literais, não em expressões completas.
fonte
Bash, 97 bytes
Poderia ser menor se pudéssemos truncar, em vez de arredondar. Também é complicado lidar com zeros à esquerda (como no caso de teste nº 2), pois o Bash interpreta números começando com 0 como octal.
fonte
tr
faz parte dos coreutils, enquantobc
não é. No entanto,bc
é uma ferramenta muito comum. Todos os outros comandos nesta resposta são bash.$T
é apenas um byte menor que0-9
, você o usa apenas duas vezes e gasta 8 bytes para defini-lo.Bean ,
9490 bytesHexdump
Javascript
Explicação
Este programa designa implicitamente a primeira e a segunda linhas de entrada como seqüências de caracteres para as variáveis
a
eb
respectivamente.Cada caractere
c
on-lineb
é substituído pelo respectivo índicei
do caractere encontrado on-linea
ou ele próprio, se não for encontrado.Em seguida, remove cada sequência de um ou mais
0
s precedidos por um limite da sequência resultante. Isso evita aeval()
avaliação de qualquer sequência de dígitos que comece com0
um literal octal.Após
eval()
eMath.round()
, o resultado é coagido novamente em uma sequência e cada caractere de dígitoi
é substituído pelo caractere correspondente da linhaa
no índicei
.Casos de teste
Demo
Demo
Demo
Demo
fonte
Perl 5
-p
, 63 bytesExperimente online!
Pega a expressão na primeira linha de entrada e a lista de tradução na segunda.
fonte
Perl 5 , 130 bytes
Experimente online!
Talvez essa avaliação dupla possa ser transformada
s/.../.../geer
.fonte
Carvão , 14 bytes
Experimente online! Link é a versão detalhada do código. Nota: A expressão é avaliada de acordo com a semântica do Python 3; portanto, por exemplo, zeros à esquerda em números diferentes de zero são ilegais. Explicação:
fonte
0
s não funcionam no Python, que está presente nos casos de teste.Python 3 , 137 bytes
Uma abordagem sem regex usando
str.translate
estr.maketrans
para substituir os caracteres. Perdi muitos caracteres ao aparar os zeros principais ...Experimente online!
fonte
Python 3 , 167 bytes
Experimente online!
Espaço para melhorias ...
fonte
Wolfram Language (Mathematica) , 121 bytes
Eu defino uma função pura com dois argumentos. Como algumas funções são repetidas, eu as salvo em uma variável para salvar alguns caracteres. Esse código simplesmente substitui algumas strings e depois usa
ToExpression
para avaliar a expressão com o kernel Wolfram.Experimente online!
fonte
Lua ,
162151150 bytesload
vez defunction(...) end
Experimente online!
Não é a coisa mais curta do mundo (Lua obriga você a gostar bastante, principalmente por palavras-chave enormes), mas foi muito divertido de criar. Programa completo, tendo como argumento argumentos e resultado de impressão.
Explicação
Introdução
Atribua valores de argumentos a variáveis. Nosso dicionário é
l
e expressão ép
.A expressão a seguir é bastante difícil de entender porque ela tem uma ordem estranha de execução, então eu explicarei passo a passo:
Convertendo para números normais
Execute a substituição na cadeia de expressão: pegue cada símbolo e passe-o para a função (
load
provou ser menor que a declaração normal aqui).A função localiza a posição de ocorrência na sequência de caracteres para o símbolo passado usando
find
....
é o primeiro (e único) argumento aqui, pois estamos na função vaarg (qualquerload
um deles é) que é o nosso símbolo atual. Os seguintes argumentos são necessários para fazerfind
ignorar símbolos especiais (1
é apenas um valor curto que é avaliado comotrue
quando convertido em booleano): posição inicial (um é o padrão aqui) eplain
, que na verdade desabilita o tratamento de padrões. Sem esses programas falha no terceiro caso de teste devido a%
ser especial.Se a correspondência for encontrada, subtraia uma como as seqüências de caracteres Lua (e as matrizes btw) são baseadas em 1. Se nenhuma correspondência for encontrada, ela não retornará nada, resultando em nenhuma substituição sendo feita.
Resolução
Faça um prefixo
return
à nossa expressão para que ela retorne resultado, calcule-o compilando como função Lua e chamando-a, execute o arredondamento ( isto foi inverso para torná-lo mais curto).No final, obtemos uma solução numérica para o nosso problema, permanecendo apenas a conversão novamente.
Tornando louco de novo
A primeira linha é uma maneira curta de converter número em string, então agora podemos chamar métodos de string rapidamente. Vamos fazer isso!
Agora
gsub
é chamado novamente para substituir tudo de volta à loucura. Esse tempo%d
é usado em vez de.
um padrão de substituição, pois nossa função pode e deve processar apenas números (.
resultaria em erro em números negativos). Esta função de tempo (load
ed novamente para salvar bytes) adiciona primeiro1
ao seu primeiro (e único) vaargument, convertendo-o para a posição em dict string e, em seguida, retorna o caractere nessa posição.Viva, quase lá!
Final dramático ou por que os colchetes são importantes
Bem ... por que dois pares de suportes de qualquer maneira? É hora de falar sobre paralelo ... eh, retorno múltiplo em Lua. O problema é que uma função pode retornar poucos valores de uma chamada (veja esta meta questão para obter mais exemplos).
Aqui,
gsub
retornamos dois valores pela última vez : string de resposta que precisamos e quantidade de substituições realizadas (contagem de dígitos, na verdade, mas quem se importa). Se não fosse pelo par interno, tanto a string quanto o número seriam impressos, nos ferrando. Então aqui sacrificamos dois bytes para omitir o segundo resultado e finalmente imprimir o produto dessa fábrica de insanidades.Bem, eu gostei de explicar quase tanto quanto jogar golfe, espero que você entenda o que está acontecendo aqui.
fonte