Pegue uma string s
contendo caracteres ASCII imprimíveis como entrada e produza sua "soma binária dividida". Precisa de uma explicação?
Como você obtém a soma binária dividida?
Usaremos a string A4
como exemplo na explicação a seguir.
Converta os caracteres em binários, tratando cada letra como um caractere ASCII de 7 bits
A -> ASCII 65 -> 1000001 4 -> ASCII 52 -> 0110100
Concatenar os números binários em um novo número binário
A4 -> 1000001 & 0110100 -> 10000010110100
Divida o novo número binário em blocos, onde nenhum
1
pode ter um0
à esquerda. Você não deve dividir1
s consecutivos .10000010110100 -> 100000, 10, 110, 100
Converta esses números binários em decimal
100000, 10, 110, 100 -> 32, 2, 6, 4
Tome a soma destes números:
32 + 2 + 6 + 4 = 44
Portanto, a saída para a string A4
deve ser 44
.
Casos de teste:
a
49
A4
44
codegolf
570
Hello, World!
795
code-golf
string
base-conversion
binary
Stewie Griffin
fonte
fonte
8372
na verdade.Respostas:
Python 2 ,
868176 bytes-5 bytes graças Adnan
-5 bytes graças xnor
Experimente online!
for c in input():s=s*128+ord(c)
para fazer a conversão ASCII numericamente, onde*128
é usado o turno esquerdos
7 vezes (etapas 1 e 2)eval(('0'+new_bin).replace('01','0+0b1'))
para dividir e somar (etapas 3, 4 e 5)fonte
eval
! Fazer a conversão ASCII numericamente salva alguns bytes.Gelatina , 13 bytes
Experimente online!
Como funciona
fonte
MATL , 14 bytes
Experimente online!
Explicação
Considere a entrada
'A4'
como um exemplo.fonte
05AB1E , 18 bytes
Código:
Explicação:
Usa a codificação 05AB1E . Experimente online!
fonte
05AB1E , 14 bytes
Uma porta da minha resposta Jelly , usando o deslocamento 128 da resposta 05ab1e de Adnan (em vez dos 256 na resposta Jelly que escrevi).
Experimente online!
Quão?
fonte
JavaScript (ES6),
9792 bytesEditar: salvou 5 bytes com alguma ajuda do @ ConorO'Brien.
fonte
s=>eval([...s].map(e=>(e.charCodeAt()+128).toString(2).slice(1)).join``.replace(/1+0*/g,'+0b$&'))
Você pode usar o meu método replace para salvar um byte, eu achoJaponês ,
1812 bytesRecebe a entrada como uma única sequência.
Eu também experimentei a adição 128 ou 256 usada por outras respostas, mas o preenchimento de 0 foi mais curto de usar.
Raspou um total de 6 bytes, graças à ETHproductions e Oliver .
Experimente aqui.
fonte
òÈ<YÃ
pode serò<
(com espaço à direita) eËn2Ãx
pode serxn2
. Você também pode usarT
no lugar de0
para economizar na vírgula. (Além disso, sinta-se livre para se juntar a nós na sala de chat Japt se você tiver dúvidas ou quiser ajuda com golfe :-))T
truque, não sabia que você poderia (ab) usar variáveis para isso, isso é muito útil. A função automáticaxn2
parece um pouco estranha quando compilada,x("n", 2)
por isso acho que ainda vai demorar um pouco até eu entender completamente a lógica por trás delas. Com sua ajuda, a solução Japt agora está empatada em primeiro lugar com a resposta Jelly .n2
:Í
. Não atingiu TIO ainda, mas você pode usá-lo aqui: ethproductions.github.io/japt/?v=1.4.5&code=Y1+k+VQ3w/...Geléia ,
1615 bytes-1 byte graças a Dennis (não é necessário achatar por 1 quando um achatamento completo é bom - substitua
;/
porF
)Experimente online!
Quão?
fonte
;/
pode ser substituído porF
.PHP, 116 bytes
Versão Online
PHP, 117 bytes
Experimente online!
PHP, 120 bytes
Experimente online!
ou
fonte
Pitão , 21 bytes
Está muito comprido...
Suíte de teste.
fonte
[F #],
249245 bytesExperimente online!
Nota: a versão em tio.run tem "Sistema aberto" no cabeçalho, adicionei sua contagem ao código acima. Não sei ao certo quais são as regras nas importações.
Ungolfed
fonte
open System
for o mesmo que C # susing System;
, sim, você precisará incluí-lo na contagem. Se você puder fazer isso em F #, poderá se qualificar totalmente para qualquer coisaSystem
. Por exemplo, em C # emSystem.Console...
vez deusing System;Console...
Perl 6 , 62 bytes
fonte
.ords
vez de.comb».ord
. prefixo[~]
geralmente pode ser usado em vez de.join
.comb
existe o que faz am:g/…
coisa./11*0*/
pode ser reduzido para/1+0*/
. Eu vim com{sum map {:2($_)},comb /1+0*/,[~] .ords».fmt('%07b')}
J , 34 bytes
Experimente online!
Explicação
fonte
mathematica 193 bytes
fonte
f=FromDigits;l=Flatten;
no início e, em seguida, substituindo todas as instâncias dessas duas funções porf
el
.J , 40 bytes
uso:
retorna 44
fonte
Clojure, 150 bytes
Bem, eu esperava que a conversão de ASCII para bytes fosse mais curta que isso. O corpo do loop real é bastante curto, usando
r
para acumular o resultado atual eR
acumular o resultado total. Se o bit anteriorp
é0
e o bit atualc
é1
, dividimos um novo pedaço e acumulamos paraR
, caso contrário, atualizamos or
e mantemosR
como estava.fonte
Python 123 bytes
Atualizado, graças a Martin Ender.
fonte
lambda w:
seria suficiente para validar sua resposta.lambda w:
.f=
, porque permitimos funções sem nome (a menos que você faça referência ao nome da função para chamadas recursivas).K (oK) , 31 bytes
Solução:
Experimente online!
Exemplos:
Explicação:
Converta em valores ASCII, converte em binário de 7 bits, achatar, encontre onde difere e contra a lista original para descobrir onde
1
s diferem. Corte nesses índices, converta de volta para decimal e resuma:Bônus
Também gerenciei uma versão de 31 bytes no K4 , mas como não há TIO, estou postando minha solução oK.
fonte
APL (Dyalog) , 30 bytes
Experimente online!
Quão?
⎕UCS⍵
- Unicodify2⊥⍣¯1¨
- codifique cada um em binário¯7↑¨
- e almofada para a esquerda com zeros para 7 lugares∊
- achatar1∘+⊆⊢
- partição auto aumentada em um2⊥¨
- decodificar cada um dos binários+/
- somafonte