A linguagem do compilador sem acrônimo pronunciável, abreviado INTERCAL , é uma linguagem de programação muito exclusiva. Entre suas qualidades improdutíveis estão seus operadores binários.
Os dois operadores binários da INTERCAL são intercalados (também conhecidos como misturar ) e selecionados . A intercalação é representada com uma alteração (¢) e a seleção é representada com um quadrado (~).
A intercalação funciona tomando dois números no intervalo de 0 a 65535 e alternando seus bits. Por exemplo:
234 ¢ 4321
234 = 0000011101010
4321 = 1000011100001
Result: 01000000001111110010001001
Output: 16841865
Selecione trabalhos, pegando dois números no intervalo de 0 a 65535, pegando os bits no primeiro operando que estão na mesma posição que 1s no segundo operando e colocando esses bits à direita.
2345 ~ 7245
2345 = 0100100101001
7245 = 1110001001101
Taken : 010 0 10 1
Result: 0100101
Output: 37
Nesse desafio, você receberá uma expressão binária usando a operação intercalar ou selecionar. Você deve calcular o resultado usando o menor número possível de bytes.
A expressão será dada como uma sequência separada por espaço, consistindo em um número inteiro em 0-65535, um espaço em um ¢
ou em ~
um espaço e um número inteiro em 0-65535.
A entrada e a saída podem ser feitas através de qualquer sistema padrão (STDIN, função, linha de comando, etc.). Falhas padrão proibidas.
Exemplos:
5 ¢ 6
54
5 ~ 6
2
51234 ¢ 60003
4106492941
51234 ~ 60003
422
Este é o código golf - o menor número de bytes vence. Boa sorte.
EDIT: Como alguns idiomas não suportam o símbolo de alteração (¢) da INTERCAL, você pode usar o símbolo de muito dinheiro ($), com uma penalidade de 5 bytes.
$
.FIVE ONE TWO THREE FOUR
? E a saída não deveria estar em algarismos romanos?Respostas:
Pitão,
323129 bytesExperimente on-line: Conjunto regular de entrada / teste
Obrigado a @isaacg por jogar fora um byte.
Explicação:
fonte
hMfeT
parasmmFd
e movendo a duplicata paras
fora do ternário. Além disso, o código atual é de 32 bytes, e não 33.Python 2,
115112 bytesA sequência na segunda linha contém um único caractere não imprimível
\x7d
, o próximo caractere a seguir~
.Todas as esperanças de um lambda único e agradável são esmagadas pelo formato de entrada. Provavelmente existe uma maneira melhor de ler as entradas. Entrada como
"51234 ¢ 60003"
via STDIN.A função
f
combina as duas funções recursivas a seguir:(-3 bytes com a ajuda de @xnor)
fonte
(a%2*2+b%2)/3**d
salva 3 caracteres, mas usa o complementod=1-c
. Você tem uma maneira de fazer-~(3*c|b%2)
com o complemento? Na pior das hipóteses, perde 2 caracteres com3-3*d
. Além disso, o formatoand-~x+y
podeandy-~x
durar desde quey
comece com um símbolo ou número.(b%2+5&4-d)
. Obrigado!CJam, 31 bytes
Experimente on-line no intérprete CJam .
Como funciona
fonte
JavaScript (ES6), 103
117 119 124Editar agora trabalhando com números em vez de cadeias
(sem contar espaços iniciais, novas linhas e comentários)
Teste a execução do snippet em qualquer navegador compatível com EcmaScript 6 (principalmente o Chrome, não o MSIE. Eu testei no Firefox, o Safari 9 poderia ir)
fonte
Matlab,
119113 bytesUngolfed:
Exemplos:
fonte
R, 145 bytes
Ungolfed + explicação:
fonte
Python 3,
174166148126 126Operações simples e simples de string, depois conversão de volta para inteiro.
Limitado a números que em binário possuem 99 dígitos (máximo 2 ^ 99-1 = 633825300114114700748351602687).
Obrigado, Sp3000 e Vioz!
Ou 165 caracteres, sem limite:
Ungolfed:
fonte
zfill
em vez derjust
para o preenchimento com zerosa,b
, basta colocá-lo nozip
com um*
splat, 2)(i if j=='1'else'') -> i[:j>'0']
3) Você pode usar essa dica para salvar do outroif/else
Pitão, 43 bytes
Parte de mim se sente nervosa ao postar uma resposta Pyth tão longa na pergunta de isaacg ...: oP
Explicação:
fonte
C,
127123 bytes + 5 penalidade = 128scanf
conta o símbolo unicode como mais de um caractere, o que complica bastante as coisas, por isso estou aplicando a penalidade de 5 bytes pelo uso$
.As alterações da versão original são:
-O teste de $ ou ~ foi revisado de
q&2
paraq%7
. Isso inverte os valores verdadeiro / falso, permitindo que o código do operador $ vá antes do:
que significa que um conjunto de parênteses pode ser eliminado.-O
i
loop agora conta com potências de 2 maiores, mas permite>>
ser substituído por/
e salva alguns parênteses.Versão original 127 bytes
Fui com um único loop com as condicionais dentro para evitar a sobrecarga de dois loops. Em ambos os casos, eu desloco os bits dos operandos para o bit 1 e constro o resultado do bit mais significativo para o menos significativo, mantendo o resultado à esquerda (multiplicando por 2 ou 4) à medida que for avançando.
fonte
main
causasq
a serem corrompidas na minha máquina, o que é estranho. Eu espero que o problema real esteja comscanf
, mas por causa disso eu os deixei como declarações normais.q
é garantido que seja zero, mas com a declaração como um parâmetro de funçãoq
contém lixo de 32 bits. Isso não seria um problema se eu atribuído um valor aq
, masscanf
com"%c"
única substitui os 8 bits menos significativos do lixo, deixando o outro 24 indefinido. Eu posso ter sorte com outro compilador!K5,
5352 bytesVersão de 53 bytes:
Ainda precisa de um pouco mais de golfe.
fonte
CJam,
6150464134 bytesObrigado @Dennis por apontar um golfe de 4 bytes.
Experimente online .
fonte
]{}/
é um noop.Haskell, 77
A entrada é fornecida aplicando a entrada às funções / operadores
?
e¢
definida no código (Haskell não pode definir um operador~
por razões técnicas).basicamente funciona a antiga abordagem recursiva.
fonte
J, 173
espera uma linha de entrada
entrada esperada para terminar após nova linha com EOF
fonte
Javascript ES6 (3 argumentos)
141138136121119 bytesTeste:
Javascript ES6 (1 argumento)
135133 bytesTeste:
PS: A nova linha é contada como 1 byte, pois pode ser substituída por
;
.fonte
Python 3, 157 bytes
A versão completa e explicativa pode ser encontrada no meu pastebin .
fonte
e
uma vez, não pode simplesmente incorporá-lo?Mathematica, 155 bytes
Avalia como uma função anônima, tendo a string como entrada. Quebras de linha adicionadas para maior clareza.
f
eg
converter de / para a base 2.Riffle
faz exatamente o que a intercalação deve fazer. Eu queria usarSelect
para selecionar, masCases
é melhor, infelizmente. A última linha é um pouco de truque; os espaços são alterados para~
o operador de infixo do Mathematica, a sequência é avaliada.fonte