Um dos muitos recursos exclusivos da linguagem de programação Malbolge é seu OP
operador altamente intuitivo , referido apenas como "op" na documentação e no código-fonte, mas conhecido popularmente como operador "louco". Conforme descrito por Ben Olmstead, o criador da linguagem, em sua documentação: " não procure por padrão, ele não está lá ".
op é um operador "tritwise" - opera nos dígitos ternários correspondentes de seus dois argumentos. Para cada trit (bit ternário), o resultado de op é fornecido pela seguinte tabela de pesquisa:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Por exemplo, para calcular op(12345, 54321)
, primeiro escreva os dois números no ternário e, em seguida, procure cada par de trits na tabela:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
O último ponto importante é que todos os valores em Malbolge têm 10 trits de largura; portanto, os valores de entrada devem ser preenchidos com zeros até uma largura de 10. (Por exemplo, op(0, 0)
é1111111111
ternário).
Sua tarefa é pegar dois números inteiros 0 ≤ a
, b
<59049 como entrada e gerar o valor inteiro deop(a,b)
.
Casos de teste (no formato a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Aqui está uma implementação de referência (copiada diretamente do código fonte do Malbolge).
54616_3
não significa "essa outra coisa é o número decimal 54616, mas representado como base três". Significa "Leia54616
como base 3". O que, é claro, você não pode fazer (existem dígitos que a Valve não pode contar lá). Provavelmente ainda seria tão claro se você se livrasse do_3
todo, e mais preciso.Respostas:
C (gcc) ,
999896 bytes19683
paraL'䳣'
.108609
paraL''
.Experimente online!
fonte
JavaScript (ES7), 56 bytes
Experimente online!
Quão?
Dada e em , calculamos:b [ 0..2 ]uma b [ 0..2 ]
Levando a:
Escolha da função
Existem várias outras possíveis funções candidatas do formulário:
Um dos mais curtos sendo:
Mas o bom de é que ele pode ser executado com operadores bit a bit, descartando implicitamente as partes decimais de e . É por isso que podemos simplesmente dividi-los pora b 3( a + 512 b + 8 ) uma b 3 sem arredondar entre cada iteração.
Comentado
fonte
(1581093>>b%3*2+a%3*8&3)
economiza um byte inteiro!a/3
eb/3
sem arredondamentos. Isso falharia por causa disso.k = 9 ... => ~k && ...
ak = 10 ... => k && ...
?for(k=9;k>=0;k--)
quefor(k=10;k>=1;k--)
.05AB1E , 18 bytes
Código:
Usa a codificação 05AB1E . Experimente online!
Explicação do algoritmo
Para obter o número preenchido com zeros, precisamos adicionar 59049 a ambos os números (porque 59049 no ternário é 10000000000 ). Não precisamos deixar de fora o primeiro 1 como . Convertemos os números de decimal em ternário e juntamos cada par como cada número.( 1 , 1 ) → 0
Por exemplo, para as entradas 12345 e 54321 , elas são mapeadas para:
O que fornece a seguinte lista de números inteiros unidos:
Esses números inteiros precisam ser mapeados pela tabela de pesquisa fornecida no OP. Atualmente, a fórmula que mapeia esses números para seus trits correspondentes ( ) é:0→1,10→0,…
Enquanto denota o xor bit a bit⊕ função .
Eventualmente, depois de mapear esta função na lista de números inteiros unidos, tratamos essa lista resultante como um número representado na base 3 e a convertemos da base 3 em decimal.
Código Explicação
fonte
3Tm+3Bø19sm74%3%3β
ser jogado golfe?R ,
64bytes 62Experimente online!
Obrigado ao JAD por alguns truques de golfe com
magia negrae -2 bytes!30801
, quando convertido em um número inteiro ternário de 10 trit, é o1120020210
que apenas adiciona um zero à direita na tabela de operações ao ler as colunas. Em seguida, convertemos os dígitos ternáriosa
eb
elementares em um número inteiro e usamos isso como índice nos dígitos ternários de30801
.fonte
x
usando[.*]
. Então todas as%any%
operações acontecem. A parte divertida é que se você ver30801%/%x%%3
comof=function(x)30801%/%x%%3
quef(x[index]) == (f(x))[index]
. Guardar as chaves :)C (gcc) ,
747271 bytesExperimente online!
Demolir
A tabela da verdade
Pode ser pensado como uma matriz 3x3, onde a é a coluna eb é a linha. Transformar isso em uma lista unidimensional nos dá 100102221. Para economizar espaço, evitamos listas e seqüências de caracteres e transformamos em um número. Para fazer isso, alteramos a ordem e transformamos cada trit em um número de 2 bits. Cole-os juntos e temos um número binário no qual podemos "indexar", mudando para a direita
2 * (b * 3 + a)
e mascarando:Em seguida, massageamos a expressão usando o poder da precedência de operação para nos tornar a abominação acima.
3 ^ 9 = 19683, portanto esse é um bom limite de loop. Como multiplicamos o contador por 3 a cada vez, podemos escrever o limite como2e4
alternativa. Também nos salvamos do incômodopow()
ou similar.Pensando bem, vamos começar com 3 ^ 10 e trabalhar para baixo com um teste e divisão pré-loop.
fonte
Haskell , 108 bytes
Experimente online!
fonte
APL (Dyalog) ,
4125 bytes9 bytes salvos graças a @ Adám
Experimente online!
fonte
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Geléia ,
2318 bytes-1 graças a Erik the Outgolfer (reorganizar
3*⁵¤
para⁵3*
)Um link monádico que aceita uma lista de dois números inteiros.
Experimente online! Ou veja uma suíte de testes .
⁹*%733%3
é um byte maior queị⁽½Ṡb3¤
:(Quão?
Também 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(usa uma fórmula mágica após obter os trits em pares da conversão da base dez e depois levar 19 para esse poder, módulo 74, módulo 3 para obter os trits necessários da saída - encontrado usando uma pesquisa em Python)fonte
y
0
s" built-in)Python 2 ,
79656361 bytesgraças a Arnauld por sua fórmula (-2 bytes).
Experimente online!
fonte
J , 37 bytes
Explicação:
Acabou sendo relativamente legível, tbh.
fonte
Python 2 ,
9087 bytesExperimente online!
fonte
Carvão , 31 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Solução alternativa, também 31 bytes:
Experimente online! Link é a versão detalhada do código.
fonte
Ruby , 70 bytes
Experimente online!
Decompõe-se
a
eb
recursivamente até obtermos 10 dígitos de cada.6883
fornece a tabela ternária achatada (invertida). Reconstrói de ternário para decimal multiplicando por3**(10-l)
.fonte
Cjam, 31 bytes
Experimente online!
fonte
J , 43 bytes
Certamente pode ser ainda mais jogado.
Explicação:
Experimente online!
fonte
Stax , 22 bytes
Execute e depure
fonte
Pitão
26 2524 bytesGuardado 1 byte, graças a @ErikTheOutgolfer
Salvar outro byte, inspirado na resposta de @ JonathanAllan
Entrada é uma lista de 2 elementos
[a,b]
. Experimente online aqui ou verifique todos os casos de teste aqui .fonte
.T
pode serC
.K (ngn / k) ,
2522 bytesExperimente online!
fonte
Japt ,
2423 bytesFazendo a bola rolar na corrida de Japt como língua do mês - espero ser superado por isso!
Toma a entrada na ordem inversa como uma matriz inteira (ou seja,
[b,a]
).Tente
fonte
Perl 5
-p
, 102 bytesExperimente online!
fonte
Wolfram Language (Mathematica) ,
757260 bytesExperimente online!
versão sem golfe:
Ambos
a
eb
são convertidos em listas de dez trit, usados em pares como um índice 2D em uma tabela de números de pesquisa{1, 0, 0, 1, 0, 2, 2, 2, 1}
. O resultado é novamente interpretado como uma lista de dez tritões e convertido novamente em forma de número inteiro.A tabela de pesquisa é codificada como
IntegerDigits[6883,3]
, que é curta, porque estamos reciclando oIntegerDigits
símbolo.fonte