"Ajustar números"
Sam tem uma idéia "brilhante" para compactação! Você pode ajudar?
Aqui está um resumo do esquema de compactação de Sam. Primeiro, pegue uma representação da base 10 de qualquer número natural estritamente menor que 2 ^ 16 e escreva-a como uma sequência binária sem zeros à esquerda.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10000 17 -> 10001 65535 -> 111111111111111
Agora substitua qualquer grupo de um ou mais zeros por um único zero. Isso ocorre porque o número ficou menor. Sua string binária agora ficará assim.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Agora você converte a string binária de volta para uma representação da base 10 e a produz em qualquer formato aceitável. Aqui estão seus casos de teste. O primeiro número inteiro representa uma entrada e o último número inteiro representa uma saída. Observe que alguns números não mudam e, portanto, podem ser chamados de "ajuste"
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 1111111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Você pode usar qualquer idioma, mas observe que Sam odeia brechas padrão. Este é o código golf, portanto o código pode ser o mais curto possível para liberar espaço para os números "compactados".
Nota: Este NÃO é um esquema de compactação aceitável. Usando isso, você será imediatamente demitido.
Necessidade de citação: Não aceito crédito por esse conceito. Isso vem do blog de @Conor O 'Brien aqui, veja este OEIS de números adequados. https://oeis.org/A090078
10000
?Respostas:
05AB1E ,
86 bytesExplicação
Experimente online
Economizou 2 bytes graças a Adnan
fonte
„00'0
por00¬
:).Utilitários Bash + GNU, 27
Entrada lida de STDIN.
fonte
dc
:)JavaScript (ES6), 41 bytes
fonte
Água-viva , 20 bytes
Experimente online!
Explicação
i
é entrada.b
converte-o em binário (lista de dígitos)\d
com argumentos2
e a lista de dígitos se aplicad
(dígitos binários ao número) a cada substring de comprimento 2 da lista de dígitos.*
assume signum dos resultados: 00 vai para 0, todo o resto para 1.,1
coloca um 1 no final, para que o último dígito não seja perdido.# S
selecionabi
os dígitos que têm 1 na lista calculada acima: aqueles que não são as metades esquerdas de 00.d
converte novamente em número ep
imprime o resultado.fonte
Python 2, 36 bytes
Uma implementação recursiva direta sem built-ins de conversão base ou operações de string. Menos golfe:
Quando
n
é um múltiplo de 4, termina em dois 0 de em binário, então vamos cortar um por do chão dividindo por 2. Caso contrário, nós dividimosn
em(n%2) + 2*(n/2)
, deixe o último dígito binárion%2
sozinho, e recurse em outros dígitosn/2
.fonte
n%2
redundante?|n
dá resultados errados.(n%4>0)|n%2
por(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 byteseditar:
sed -E 's/0+
parased 's/00*
eco alterado e tubo usado para passar o valor para bc com<<<
.exemplo:
fonte
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
é 2 bytes mais curtoecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Masdc
etr
torne isso mais curto .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
em vez de sed você pode obter até 36 bytesPerl 6 ,
3127 bytesExplicação:
Exemplo:
fonte
MATL,
1198 bytesEsta versão funciona apenas no MATLAB, pois
strrep
no MATLAB pode lidar com entradas lógicas. Aqui está uma versão que funcionará em oitava (9 bytes) (e, portanto, o interpretador on-line) que lança explicitamente as entradas lógicas para digitardouble
.Experimente online
Explicação
fonte
Python 3,
55, 50 bytes.Economizou 4 bytes graças ao Sp3000.
Solução bastante simples.
fonte
0b
e apenas emeval
vez disso?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
Javascript (ES6), 40 bytes
fonte
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
que tornaria um envio de função válido.Na verdade, 14 bytes (não concorrentes)
Experimente online!
Este envio não é concorrente porque uma correção de bug para
Æ
foi feita após o lançamento deste desafio.Explicação:
fonte
Ruby,
3531 bytes-2 bytes graças a @Doorknob
Veja em repl.it: https://repl.it/CnnQ/2
fonte
Geléia ,
137 bytes6 bytes graças a Zgarb por seu algoritmo .
Experimente online!
fonte
PHP,
5351 bytesLeva um argumento do console.
Graças a:
@manatwork substitua "0" por 0
fonte
"0"
e0
são tratados da mesma maneira.Perl, 38 + 1 (
-p
) = 39 bytesPrecisa de
-p
sinalizador para executar (eu adicionei-l
sinalizador para torná-lo mais legível, mas não é necessário caso contrário):Observe muito a dizer sobre o código: ele converte o número em binário (
sprintf"%b"
), depois substitui os blocos de zeros por apenas um zero e converte o resultado em decimal (oct"0b".
).fonte
C #,
11291 bytes-8 bytes graças a TuukkaX
fonte
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 bytes usando regex. Já vi muitas soluções C # não serem incluídas,System.Text.RegularExpressions
então talvez seja permitido aqui também ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 bytes.Java, 75
Programa de teste:
fonte
PARI / GP ,
5443 bytesfonte
PowerShell v2 +, 69 bytes
( solicitação de recurso Uma maneira mais curta de converter de / para binário no PowerShell )
Recebe entrada
$args[0]
, usa o .NET interno[convert]::ToString(int,base)
para converter o número inteiro de entrada em uma cadeia de base binária. Isso é filtrado pelo-replace
para remover quaisquer execuções de um ou mais zeros para apenas0
. Essa sequência resultante é enviada de volta pela outra direção via[convert]::ToInt32(string,base)
para transformar o binário novamente em um número inteiro. Esse número inteiro é deixado no pipeline e a saída é implícita.Casos de teste
fonte
Implementação de referência no SILOS "apenas" 417 bytes
Golfe
Aqui está a implementação de referência totalmente desfeita. Como um recurso de bônus, ele exibe as etapas necessárias para obter uma resposta.
A pedido, a transpilação foi excluída. Sinta-se livre para visualizar o histórico de edições para recuperá-lo; caso contrário, acesse este repositório para um intérprete.
Saída de amostra para 65000
fonte
Pyth, 12
Conectados.
fonte
Retina , 30 bytes
Experimente online!
E aqui eu pensei que Retina estaria entre as primeiras respostas ...
fonte
Java,
152143138 bytesfonte
Integer i;
parte é simples e fantástica!Dyalog APL , 19 bytes
TryAPL online!
Esta função é realmente um "topo" de duas funções, a primeira função é:
2∘⊥⍣¯1
o inverso da conversão binário em decimal, ou seja, conversão binária de decimaldois
2
é vinculado∘
a decimal para⊥
repetir a operação
⍣
negativa uma vez¯1
(ou seja, uma vez, mas invertida)Na segunda função, o resultado binário do acima é representado por
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Booleano para onde {0, 0} começa em neg Negação~
booleana, agora temos ᴛʀᴜᴇ em todos os lugares, exceto nos zeros que não são os primeiros em execuções com zero,⍵/⍨
usam isso para filtrar ⍵, para remover nossos zeros indesejados e2⊥
converter o binário em decimalfonte
TSQL, 143 bytes
Não usando build ins para converter de e para binário.
Golfe:
Ungolfed:
Violino
fonte
CJam, 16
Experimente online
É bastante longo devido à falta de regex.
Explicação:
fonte
Java, 64 bytes
Programa de teste
fonte
CJam , 23 bytes
Experimente online!
Explicação
fonte
Ruby,
3735 bytesEconomizou dois bytes graças ao manatwork.
A abordagem ingênua. (:
fonte
"0"
, veja o 2º ponto sepp2k de ponta . Em relação a.to_i(2)
onde não há ambiguidade sobre onde um parâmetro pertence, os parênteses são opcionais.C, 37 bytes
fonte