Nesse desafio, você receberá uma entrada, a converterá em hexadecimal, fará algumas alterações e exibirá o resultado.
Como eles têm apenas 16 caracteres em hexadecimal, seu código precisará ser o mais curto possível.
Exemplos
Os exemplos são separados por uma linha em branco. A primeira linha é inserida, a segunda linha mostra as etapas, a terceira mostra a saída
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
Passos
A entrada sempre será um número inteiro positivo
Para gerar a saída, você seguirá as seguintes etapas:
- Converta a entrada em hexadecimal
- Substitua qualquer letra pelo índice no alfabeto (por exemplo
a -> 1, b -> 2
) - Converta o resultado novamente em hexadecimal
- Se o resultado contiver alguma letra, vá para a etapa 2. Caso contrário, envie o resultado
Este é o código-golfe, pelo que o código mais curto em bytes vence!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
fonte
fonte
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Respostas:
Gelatina , 18 bytes
Experimente online!
A versão binária de 18 bytes do código-fonte possui o despejo xxd
e trabalha com esta versão do intérprete Jelly .
Como funciona
Ḍ
(decimal para inteiro) deveria ter funcionado como uma abreviação paraḅ⁵
, mas a versão mais recente do Jelly na época desta publicação tinha um bug que me impedia de usá-lo.fonte
JavaScript ES6,
98926764 bytesGuardado 3 bytes graças a @Downgoat, mais 3 graças a @ user81655
Encontrei uma versão muito, muito mais curta, descartando o loop de recursão:
Provavelmente a parte mais interessante deste programa é a
replace
função:Snippet de teste
(tirada daqui )
fonte
.toString(16)
:x=>eval("for(x=(j=n=>n.toString(16))(x);/\\D/.test(x);)x=j(+x.replace(/\\D/g,z=>+('0x'+z)-9))")
. Também pode salvar alguns bytes usando a recursão.replace
na corda antes de avaliar, mas acabou por mais tempo.h=
CJam,
2119 bytesTeste aqui.
Explicação
Um caso muito raro de resultados negativos do módulo é útil. :)
fonte
Ruby, 35 + 1 = 36
Com sinalizador de linha de comando
p
, executeExplicação:
O sinalizador -p cria um loop, armazenando a entrada e eventual saída na variável
$_
.'%x'
faz a conversão hexadecimal,tr!
substitui o dígito e retorna um valor de falsey se não houver nada para alterar. refazer começa com o novo$_
.fonte
Julia,
7874 bytesEsta é uma função recursiva que aceita um número inteiro e retorna uma string.
Ungolfed:
fonte
MATL , 23
25bytesaviso Legal
Enquanto escrevia esta resposta, notei um erro na
dec2base
função do MATL , corrigi-o e lancei uma nova versão com a correção (assim como algumas outras alterações não relacionadas e acumuladas) .Como estou usando uma versão posterior a esse desafio, de acordo com o consenso no Meta, essa resposta não é elegível para ganhar .
Código
Exemplo
Explicação
fonte
Dyalog APL,
373633 bytesAgradecimentos a Adám e ngn por sugestões. Estou mantendo em
16⊥⍣¯1⊢⍵
vez de⍵⊤⍨⍴⍨16
- é um byte extra, mas nos permite operar em números de tamanho arbitrário em vez de 64 bits.fonte
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(tecnicamente não equivalente, mas funciona para dígitos hexadecimais)16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105 bytesfonte
PHP,
14012612211411287 ou 84 bytes (incluindo-r
)Não tenho muita certeza de como as regras em torno disso, pois esta é minha primeira tentativa de codegolf, mas o código pode ser executado
php -r
sem a necessidade<?
e?>
Código
Formatado
Código alternativo (usando argv em vez de stdin)
Formatado
Notas
Edit 1: Recortei uma chamada para
intval()
salvar 14 caracteres, pois o PHP tratará as seqüências numéricas como números.Editar 2: removi
\n
da saída que esqueci de remover após o teste e removi aspas do eco final para salvar um total de 4 caracteres.Editar 3: Removida a última chamada para
intval()
Editar 4: Saved 2 bytes por remover aspas da linha de regex
Editar 5: Mudou
[a-f]
para\D
salvar 3 caracteres, removeustrval
chamada depreg_replace
mais 8; versão adicionada que usa emargv[]
vez de STDIN, moveu o terminador de loop para a instrução while (oops!) economizando mais 11 caracteres e moveu a chamada de dechex para asubject
parte depreg_replace
por outros 3, perfazendo um total de 25; também adicionou uma versão não stdin como uma versão alternativa que usa menos 3 caracteres. Obrigado pela ajuda, @Blackholefonte
-r
opção). Mas uma liderança;
é sempre mais curta que uma liderança?>
, então não esqueça. A propósito, aqui está um código mais curto:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 bytes).153
deve dar63
, não99
. Mas-r
é grátis. (consulte codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 bytes-3 bytes usando em
if
vez dewhile
-1 byte graças a Giuseppe usando em
as.double
vez deas.integer
Experimente online!
Basta adicionar
a(your_integer_here)
ao TIO para ver o resultado.Usei a recursão para reaplicar a função a cada iteração sucessiva, com a condição de que não encontre nenhuma das letras 'abcdef' na string, quando essa condição for False, ela gera o resultado como uma string. A melhor parte foi a descoberta da
chartr
função, que me permite trocar elementos pelos elementos correspondentes em uma string. Essa cadeia de caracteres vem da função que aplica o hexadecimal em um formato de cadeia.Edit: Eu tentei usar em
sprint("%x",y)
vez deas.hexmode(as.double(y))
, mas ainda sou obrigado a usaras.double
em algum lugar do código, que era21 byte mais longo.fonte
as.double
é menor queas.integer
05AB1E , 12 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
ÐþQ
Como alternativa, poderia serD.ï
(D
: duplicado.ï
;: is_int?) para a mesma contagem de bytes.fonte
[hÐþQ#Au₂L‡
, o @MagicOctopusUrn nem sempre funciona. O desafio declara converter para hexadecimal uma vez primeiro e depois a cada iteração. Se eu colar o seu código no meu conjunto de testes, os três primeiros casos de teste estão corretos, mas os dois últimos falham.C # (compilador interativo do Visual C #) , 92 bytes
Experimente online!
Menos código de golfe:
fonte
Mathematica, 107 bytes
Não consigo pensar em mais maneiras de jogar golfe ...
fonte
Mathematica, 80 bytes
Isso usa um truque interessante para as repetições que aprendi com os alefalpha. O
//.
é "aplica esta regra de substituição o mais rápido possível". Em seguida, usamos um padrão,l_/;Max@l>9
que corresponde apenas se a lista de dígitos hexadecimais ainda contiver dígitos maiores que 9.fonte
Japonês,
4540 bytesCom base na minha resposta JS:
Muito patético para uma linguagem de golfe, não é? Parece haver muita gente percebendo durante esse desafio que seus intérpretes têm bugs, e agora estou incluído entre eles. Isso deve ser feito em 30 bytes ou menos, mas um bug torna isso impossível.
Isso cria uma função
H
que pode ser chamada assim:Como alternativa, aqui está um programa completo, recebendo informações do STDIN:
Experimente online!
fonte
GNU Sed (com extensão eval), 44
Eu gostaria
sed
que permitissey/A-F/1-6/
. Mas isso não acontece.fonte
Python 3,
10189 bytesNo geral, isso é bastante semelhante à solução do Boomerang , mas são necessárias algumas abordagens diferentes para vários aspectos.
Esta é a versão expandida do meu código original:
11 bytes foram eliminados graças ao @pacholik (substituindo as entranhas do
join
por uma única operação que funcionava tanto para dígitos quanto para letras). Outro byte foi cortado substituindo-ojoin
por um truque de cortar as cordas que me atingiu em um momento de lâmpada (mas que já existe nas dicas de golfe em Python , embora sob um cabeçalho que especifique Python 2).fonte
join
pode ser reduzido parastr(ord(c)%12)for c in n
.Java, 201 bytes
fonte
Japonês , 21 bytes
Experimente online!
Uma melhoria significativa em relação à resposta japonesa existente. Ele não lida com o
153 -> 63
caso proposto em um comentário, mas nenhuma das outras respostas parece, portanto, deixarei a menos que o OP esclareça.A saída como uma lista de dígitos decimais pode ser alterada para gerar um número decimal para 1 byte
Explicação:
fonte
APL (NARS) 104 caracteres, 208 bytes
teste:
Não sei se está tudo bem ... Possível, não é suficiente para a resposta de qualidade padrão ...
fonte
Sério, 42 bytes
Hex Dump:
Experimente online
Tem que haver uma maneira mais curta do que isso, mas é isso que eu tenho ... (É aqui que me encontro desejando
W
realmente aparecer, já que é mais curto colocar um pouco;
antes do último quando você NÃO o deseja. para colocar umX
depois de CADAW
. Aqui, terW
pop em vez de espiar economizaria três bytes.)fonte
Japonês, 18 bytes
Tente
fonte
PHP, 71 bytes
Execute como pipe
-nR
ou experimente online .Emite um aviso para algumas entradas no PHP 7.1 e posterior; substitua
-
por!=
para corrigir.Rende outro aviso no PHP 7.2; coloque
abcdef
aspas para corrigir.fonte