Dado um número inteiro n ≥ 0, imprima-o em uma notação de base 3 não posicional, usando dígitos 139ABCDE…
e um separador de 1 caractere. Cada dígito é uma potência consecutiva de 3 e os dígitos no lado esquerdo do separador são negados, por exemplo, A931 | B → 81− (1 + 3 + 9 + 27) → 41 . Um dígito pode aparecer apenas uma vez.
Rigorosamente, permita que o valor de um dígito seja:
- seu valor se o dígito for 1, 3 ou 9
- 27 se o dígito for
A
- 3 vezes o valor do dígito logo antes dele para
B
..Z
Sua saída deve satisfazer a soma (valor dos dígitos à direita da |
) - soma (valor dos dígitos à esquerda da |
) == entrada .
Exemplos
input output
----------------
0 |
1 |1
7 3|91
730 |D1
9999 FEDC|GA9
Você pode usar um caractere diferente do espaço como separador. Também é permitido que você não tenha separador; nesse caso, o dígito maior inicia a sequência positiva. Você não precisa lidar com nada maior que 2 32 −1 ( PMIGDCBA9|RQNLH3
).
Você pode escrever um programa ou função completo, e entrada e saída podem ser fornecidas em qualquer um dos canais habituais.
Isso é código-golfe , portanto, quanto menor a sua resposta, melhor!
fonte
|
e os positivos à direita.Respostas:
Java 10,
120113112109107102 bytes-3 bytes usando parte do truque da resposta JavaScript (ES6) do @Arnauld ,
alterando
i=0
ei++<1?49:i<3?51:i<4?57:i+61
parai=4
e++i>9?i+55:i>8?57:++i+43
.-6 bytes graças a @Arnauld diretamente, livrando-se de
i
.Ordem de saída: maior para o menor,
|
-delimitador, do menor para o maior.Explicação:
Experimente online.
fonte
r
o corpo do loop. Obrigado!i
e quando reutilizac
)?p=1
e não incluem*1
no código, se é -. Mesmo que ele não leva a uma melhor fórmula, nesse caso)Python 3 ,
1039991 bytes4 bytes graças a Lynn.
8 bytes graças a ovs.
Experimente online!
Créditos ao xnor pela lógica.
fonte
JavaScript (ES6),
828079 bytesSaídas em minúsculas, o que deve ser bom.
Experimente online!
Semelhante à resposta da freira "Mestre Ninja" da Leaky e também com base na resposta do xnor .
Conversão de dígitos
Começamos com k = 4 . Enquanto k é menor que 9 , nós o incrementamos duas vezes a cada iteração e subtraímos 5 . Depois disso, o incrementamos apenas uma vez e o convertemos em base-36.
fonte
Geléia , 26 bytes
Experimente online!
Use uma nova linha como separador.
fonte
Perl 6 , 80 bytes
Experimente online!
Sem separador. Com base na resposta do xnor .
fonte
Stax ,
3029 bytesExecute e depure
Porta da minha resposta Stax no Balanced Ternary Converter .
Explicação
Usa a versão descompactada para explicar.
fonte
C # .NET, 103 bytes
Porta da minha resposta do Java 10 . Se uma porta direta (exceto
n->
an=>
) teria sido possível, gostaria de ter editado a minha resposta Java com este poliglota. Infelizmente,c+=
no entanto, em caracteres ou terc=49
não é possível em C #, portanto, esta resposta portada frouxa.Experimente online.
fonte
Perl 5
-p
,7169 bytesnão usa separador. As partes negativa e positiva estão em "ordem romana" (primeiro dígito maior)
Experimente online!
fonte
Ruby ,
878482 bytesEconomizou 2 bytes graças a @ benj2240.
Experimente online!
fonte
redo
truque: Experimente online!J , 129 bytes
Experimente online!
Muito longo, especialmente para um programa J ...
Explicação:
fonte
C,
int
:138123 bytes,long
:152131 bytesEu criei duas versões disso, pois o limite dos desafios de uma entrada máxima de trabalho
0x100000000
parecia um pouco estranho. Uma versão trabalha com números inteiros de 32 bits (que falham no limite por razões óbvias), a outra versão trabalha com 64 bits (que vai muito além do limite especificado, ao custo de148 bytes extras).Versão de 32 bits:
Versão de 64 bits:
Isso é idêntico, exceto que declara que a variável inteira é
long
(que é de 64 bits no linux).A
long
versão não destruída :Como você pode ver, isso funciona de forma recursiva decente: se o restante for 1, o respectivo caractere será anexado à sequência de saída após a chamada recursiva. Se o restante for 2, a saída é executada antes da recorrência. Nesse caso, eu também incremento o valor em um para manipular o dígito negativo corretamente. Isso tem o benefício adicional de alterar o restante para zero, permitindo que eu use
value%3
como condição para a pós-recursão se.O resultado da conversão é colocado no buffer global. O
g()
wrapper tem o trabalho de zero, finalizando a sequência resultante corretamente e redefinindo oresult
ponteiro para o início (que também é comog()
"retorna" o resultado).Teste a
long
versão com este código:Possível ainda mais, mas destrutivo golfe:
-4 bytes: torne a função única, removendo o ponteiro de reinicialização
g()
.-5 bytes: força o chamador a executar o término da sequência, retornando a sequência sem terminação
buffer
e o final da sequência emresult
.fonte
Carvão , 36 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Insira o valor.
Envie três listas vazias para a lista vazia predefinida.
Faça um loop entre os caracteres
139
e o alfabeto maiúsculo.Indexe ciclicamente a lista de listas com o valor e envie o caractere atual a ele.
Divida o valor por 3, mas arredonde-o adicionando 1 primeiro.
Loop duas vezes. Na segunda vez, imprima a
|
.Cada loop aparece a última entrada da lista; a primeira vez que isso nos fornece as entradas que tinham um restante de
2
(que corresponde a um dígito ternário balanceado de-1
), enquanto a segunda vez isso nos dá as entradas correspondentes a um dígito ternário balanceado de1
. A matriz resultante normalmente imprime verticalmente, mas girar a direção da impressão para cima cancela isso.fonte
J ,
69 6458 bytesExperimente online!
fonte
Perl 5 ,
9289 bytesInspirado nas respostas java e python.
Experimente online!
Com algum espaço em branco:
fonte
PHP, 73 bytes
porta da resposta do xnor , 53 bytes
Execute como pipe
-nr
ou experimente-os online .fonte