Os créditos para a ideia do desafio vão para @AndrewPiliser. Sua proposta original na caixa de areia foi abandonada e, como ele não está ativo aqui há vários meses, assumi o desafio.
O ternário equilibrado é um sistema numérico não padrão. É como ternário, pois os dígitos aumentam em valor por um fator de 3 à medida que você vai para a esquerda - assim100
é9
e1001
é 28.
No entanto, em vez de ter valores de 0, 1 e 2, os dígitos têm valores de -1, 0 e 1 . (Você ainda pode usar isso para expressar qualquer número inteiro.)
Para esse desafio, o significado do dígito +1
será escrito como +
, -1
será escrito como -
e 0
é justo 0
. O ternário balanceado não usa o -
símbolo na frente dos números para negá-los como outros sistemas numéricos - veja exemplos.
Sua tarefa é escrever um programa completo que use um número inteiro decimal de 32 bits como entrada e o converta em um ternário balanceado. Nenhuma função de conversão básica embutida de qualquer tipo é permitida (o Mathematica provavelmente possui uma ...). A entrada pode estar na entrada padrão, argumentos de linha de comando etc.
Os zeros à esquerda podem estar presentes na entrada, mas não na saída, a menos que a entrada esteja 0
, nesse caso a saída também deve estar 0
.
Exemplos
São conversões de ternário balanceado para decimal; você terá que converter para o outro lado.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
fonte
Respostas:
Caracteres Python 2: 58
Gera o ternário balanceado, dígito por dígito, a partir do final. O último dígito é dada pelo resíduo
n%3
ser-1
,0
ou+1
. Em seguida, removemos o último dígito e dividimos por 3 usando a divisão do piso do Pythonn=(n+1)/3
. Em seguida, prosseguimos recursivamente com o novo último dígito até o número ser 0.Um caso especial é necessário para a entrada
0
fornecer,0
em vez da string vazia.As especificações não permitem isso, mas se alguém pudesse escrever uma função em vez de um programa e gerar a string vazia para 0, seria possível uma solução de 40 caracteres.
fonte
n*"."and
no caso apenas de função. Tambémprint s or 0
funciona melhor: Ps or 0
. Eu tentein*"."and
, mas falha quandon<0
.CJam, 24 bytes
Eu vim com isso de forma independente e acho que essa é, provavelmente, a única maneira de lidar com isso.
Algoritmicamente, é semelhante à resposta do xnor.
Experimente online aqui
Como funciona :
fonte
JavaScript (E6) 68
Um programa completo, conforme solicitado, com E / S via pop-up. O núcleo é a função R, 49 bytes.
Não é tão diferente das outras soluções recursivas, eu acho. Aproveitando a conversão automática entre string e número para evitar um caso especial para "0"
Teste no console do FireFox / FireBug, usando apenas a função R
Saída
fonte
d=(n%3+3)%3
quandod=n%3
produz o mesmo valord
?Pyth,
712423Esta é uma solução recursiva, baseada na função recursiva de 40 caracteres do @ xnor.
y
constrói o ternário balanceado da entrada, localizando o último dígito usando o índice mod 3 e, em seguida, usa o fato de que o restante dos dígitos é igual ao ternário balanceado para (n + 1) / 3, usando a divisão com piso. Em seguida, chama a função, retornando o resultado ou 0 se a entrada for 0.Experimente aqui.
fonte
Mathematica -
157154146 146128A versão golfed:
E com recuo para legibilidade:
Uso:
Saída:
Muito obrigado a Martin Büttner na redução do número de caracteres.
fonte
Mathematica, 54 caracteres
Semelhante à recursão do xnor
Símbolos Unicode são usadas para substituir
Floor
,Part
,!=
Saída
Armazenado quanto
f
à brevidade e escrito sem unicode, você não pode verfonte
GNU sed, 236 bytes
Experimente online!
Explicação
A primeira metade do código (menos a primeira linha) converte decimal em unário e vem diretamente de " Dicas para jogar golfe no sed ". Em seguida, ele traduz unário para ternário equilibrado, um trit de cada vez, o que demonstrarei trabalhando um exemplo manualmente.
Antes da saída final, os dígitos ternários
-
,0
e+
são representados por!
,:
e+
, respectivamente.Para um resultado interessante, começamos com
-48
, que foi convertido em unário (com o-
intacto). Para calcular o primeiro trit (mais à direita), temos que calcular o restante de 48 ÷ 3. Podemos fazer isso substituindo111
s por3
s:48 ÷ 3 não tem resto, então não há mais
1
s, e sabemos que nosso primeiro ponto é:
(para 0), então o substituímos:Agora, temos o nosso "local de quem", para que saibamos que os
3
s restantes representam o terceiro lugar. Para manter a matemática funcionando, precisamos dividi-los por 3, ou seja, substituí-los por1
s:Vamos verificar novamente nossa matemática: temos 16 (unário
1111111111111111
) nos três lugares e zero (:
) nos mesmos . Isso é 3✕16 + 1✕0 = 48. Até agora tudo bem.Agora vamos começar de novo. Substitua
111
s por3
s:Desta vez, o restante é
1
, então colocamos+
em três lugares e substituímos os3
s restantes por1
s:Tempo de verificação da sanidade: Temos um 5 (unário
11111
) no lugar dos noves, 1 (+
) no:
terceiro e 0 ( ) no primeiro: 9✕5 + 3✕1 + 1✕0 = 48. Ótimo! Novamente, substituímos111
s por3
s:Desta vez, o restante é 2 (
11
). Isso ocupa dois trits (+!
), o que significa que temos um carry. Assim como na aritmética decimal, significa que pegamos o dígito mais à direita e adicionamos o restante à coluna à esquerda. Em nosso sistema, isso significa que colocamos!
o lugar dos noves e adicionamos outros três à sua esquerda e substituímos todos os3
s por1
s para representar o lugar dos 27s:Agora não temos mais 3s, para que possamos substituir os dígitos unários restantes pelos seus trits correspondentes. Dois (
11
) são+!
:No código real, isso é feito em duas etapas
s/1/+/
ey/1:/!0/
, para salvar bytes. O segundo passo também substitui:
s por0
s, portanto, ele realmente faz isso:Agora verificamos se temos um número negativo. Como fazemos, temos que nos livrar do sinal e depois inverter cada trit:
Finalmente, substituímos
!
s por-
s:É isso aí!
fonte
Stax , 17 bytes
Execute e depure
A resposta mais curta até agora, mas deve ser facilmente derrotada por alguns idiomas do golfe. O algoritmo é o mesmo que a resposta Python do @ xnor.
Equivalente ASCII:
fonte
JavaScript
108102 (ES6, sem chamadas recursivas)Entrada original às 108
Não é tão chique quanto a resposta da @ edc65 ... eu apreciaria qualquer ajuda para reduzir isso ainda mais ...
fonte
Clojure, 242 bytes
Essa é a resposta mais longa do Clojure até agora?
Sem Golfe (com comentários):
fonte
8th ,
179171167 caracteresAqui está um programa completo no dia 8, que pega um número inteiro com sinal decimal como entrada e o converte em ternário balanceado
Teste
A primeira vez que o programa solicita um número para converter (conforme necessário). Em seguida, é possível invocar a palavra
f
para converter mais números, como na seguinte linha:Saída
Explicação do código
Este é o código para manipulação de entrada. O núcleo do código está dentro da palavra
f
. Longe do campo de golfe, eu teria usado a palavra em>bt
vez def
. Aqui está uma versão não destruída def
(com comentários):fonte
Java,
327269 caracteresMinha primeira tentativa no código de golfe. Eu não conheço nenhuma dessas linguagens realmente curtas, então aqui está uma solução em Java. Eu gostaria de receber conselhos para reduzi-lo ainda mais.
Experimente aqui: http://ideone.com/fxlBBb
EDITAR
Substituído
BufferedReader
porScanner
, permitindo remover athrows
cláusula, mas tive que alterar a importação (+2 caracteres). SubstituídoInteger
porint
. Infelizmente, o programa não será compilado se não houverString[] h
nomain
.fonte
Scanner
vez do seuBufferedReader
. Além disso,String[] h
ethrows java.lang.Exception
provavelmente não são necessários, você pode salvar mais alguns bytes usando emint
vez deInteger
.JavaScript (ES6), 51 bytes
Repete os caracteres. Primeiro multiplique o total total de vezes anterior 3 e, se isNaN (caractere) for verdadeiro, converta a string (caractere + "1") em um número e adicione-o, caso contrário, zero.
fonte
Stax , 14 bytes
Execute e depure
fonte
05AB1E , 20 bytes
Experimente online!
fonte
APL (NARS), 26 caracteres, 52 bytes
teste:
possível, poderia ser menor se ⊥ for usado, mas é proibido ...
fonte