Inverter e inverter uma string

27

Inverter e inverter uma string

Desafio

Neste desafio. Você estará escrevendo um programa que produzirá ou retornará a entrada, invertida e invertida.

Primeiro, cada caractere deve ser convertido em seu código de caractere. Então, isso deve ser convertido em base-2. A seguir, essa sequência deve ser revertida. Depois, a string deve ser invertida (1 -> 0 e 0 -> 1). Finalmente, isso deve ser convertido novamente para a base 2 e depois convertido para um caractere. Se um caractere for imprimível, você pode, opcionalmente, imprimi-lo, mas ele não precisa ser removido.

H -> 72  -> 1001000 -> 0001001 -> 1110110 -> 118 -> v
e -> 101 -> 1100101 -> 1010011 -> 0101100 -> 44  -> ,
l -> 108 -> 1101100 -> 0011011 -> 1100100 -> 100 -> d
l -> 108 -> 1101100 -> 0011011 -> 1100100 -> 100 -> d
o -> 111 -> 1101111 -> 1111011 -> 0000100 -> 4   -> (unprintable)
, -> 44  -> 101100  -> 001101  -> 110010  -> 50  -> 2
  -> 32  -> 100000  -> 000001  -> 111110  -> 62  -> >
W -> 87  -> 1010111 -> 1110101 -> 0001010 -> 10  -> (newline)
o -> 111 -> 1101111 -> 1111011 -> 0000100 -> 4   -> (unprintable)
r -> 114 -> 1110010 -> 0100111 -> 1011000 -> 88  -> X
l -> 108 -> 1101100 -> 0011011 -> 1100100 -> 100 -> d
d -> 100 -> 1100100 -> 0010011 -> 1101100 -> 108 -> l
! -> 33  -> 100001  -> 100001  -> 011110  -> 30  -> (unprintable)

Pontuação

O menor código em bytes vence.

-15% Bônus: se o seu programa remover os imprimíveis da saída. Deve ter pelo menos todos os caracteres abaixo de 32, exceto novas linhas (caractere 10)

Downgoat
fonte
Eu preciso para obter o meu Simplex intérprete trabalhar novamente XDGBktnkZs
Conor O'Brien
Portanto, os caracteres da sequência não são revertidos, mas os bits de cada caractere são?
Xnor
Só para ter certeza: para 0010000 o bit é reverso 0000100 ou 00001?
Digital Trauma
@DigitalTrauma Se o código binário é 0010000, ele deve ser tratado como 10000para que o inverso seria00001
Downgoat
2
Podemos assumir apenas ASCII (como seus exemplos), ou isso deve funcionar para qualquer caractere no meu idioma? (Além disso, se um idioma usar um código de caractere diferente, devo usá-lo em vez de ASCII / Unicode)?
Paŭlo Ebermann

Respostas:

4

CJam, 14

q{i2bW%:!2bc}%

Experimente online

Explicação:

Bem direto:

q       read input
{…}%    convert each character
  i     convert to number
  2b    convert to base 2 (digit array)
  W%    reverse
  :!    invert each digit
  2b    convert from base 2
  c     convert to character

Versão "imprimível", 20 - 15% = 17

q{i2bW%:!2bc' ,N--}%
aditsu
fonte
Dangit, você. Eu estava prestes a postar uma resposta CJam D:
anOKsquirrel 6/15
@anOKsquirrel sorry ^^ foi semelhante?
Aditsu
Teria sido se eu tivesse terminado.
Anoksquirrel
Como W% funciona? W é -1, então ...
anOKsquirrel
1
@anOKsquirrel veja a documentação aqui
aditsu
9

Pitão, 14 bytes

smCi!M_jCd2 2z

Experimente online.

Como funciona

 m           z  Map over the input with lambda d:
        Cd        Cast d to character.
       j  2       Convert to base 2.
      _           Reverse the resulting array.
    !M            Mapped logical NOT.
   i        2     Convert back to integer.
  C               Cast to character.
s               Concatenate the resulting characters.
Dennis
fonte
2
Soluções alternativas (todos os 14 bytes):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis
Que tal uma versão que remove imprimíveis, apenas por interesse / para comparação? Provavelmente como uma resposta separada.
Hyde
8

Perl, 57 51 caracteres

(Código de 50 caracteres + opção de linha de comando de 1 caractere.)

s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee

Exemplo de execução:

bash-4.3$ perl -pe 's/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee' <<< 'Hello, World!'
v,dd2>
Xdl

bash-4.3$ perl -pe 's/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee' <<< 'Hello, World!' | od -tad1
0000000    v    ,    d    d  eot    2    >   nl  eot    X    d    l   rs   nl
         118   44  100  100    4   50   62   10    4   88  100  108   30   10
0000016
homem a trabalhar
fonte
1
51 bytes: -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&é mais curto que sprintf'%b',ord$&e decodifica adicionalmente na ordem inversa. Infelizmente, também produz 0s à direita, que precisam ser removidos.
primo
Obrigado @primo. unpackainda é um terreno inexplorado para mim.
Manatwork
42 bytes: -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Inverter o personagem, não há necessidade de transliterate;)
primo
7

JavaScript ( ES6 ES7), 119 114 108 bytes

Isso acabou muito mais do que o esperado :(

Obrigado a @vihan por 5 bytes salvos! Obrigado a @ETHProductions por mais 6 bytes salvos!

Para testar:  Execute o snippet abaixo, insira a entrada como "Hello, World!"e clique em Testar!

x=>String.fromCharCode(...[for(y of x)+('0b'+[...y.charCodeAt().toString(2)].reverse().map(z=>z^1).join``)])
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

jrich
fonte
Eu acho que você poderia salvar um 4 bytes substituindo o parseIntcom +('0b'+<code>)como descrito aqui e outro usando w^1em vez de+!+w
Downgoat
2
Eu nunca pensei que isso fosse possível, mas acabei de jogar 0,05 bytes : x=>String.fromCharCode(...[for(y of x)if((c=+('0b'+[...y.charCodeAt().toString(2)].reverse().map(z=>z^1).join``)) >31||c==10)c])(127 - 15% = 107,95) Talvez isso não seja legal; ele só lida 10 == \n, não 13 == \r. @ Vɪʜᴀɴ qual é a sua opinião?
ETHproductions
1
Recebo Unexpected token '>'quando tento executar o snippet.
Paul R
1
@ETHproductions: obrigado - só tenho o Safari e o Chrome em mãos e acho que nenhum deles é "compatível com ES6".
Paul R
1
O @PaulR ES6, ou ECMAScript 6, é um dos conjuntos mais recentes de novos recursos para JavaScript. Veja este site para mais informações. Há também uma tabela de compatibilidade que mostra quais recursos são suportados por quais navegadores (e outros programas). Essa resposta, em particular, requer "funções de seta", "operador de propagação" e "compreensão de matriz" do ES7.
ETHproductions
5

JavaScript (ES7), 126 bytes - 15% = 107,1

Eu estava brincando com esta resposta para ver se o bônus valeu a pena. Aparentemente é. A suíte de testes foi roubada da mesma resposta, mas eu adicionei meu toque: suporte total do bônus de 15%! :)

x=>String.fromCharCode(...[for(y of x)if((c=+('0b'+[...y.charCodeAt().toString(2)].reverse().map(z=>z^1).join``))>31|c==10)c])
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><strong id="score" style="display:inline; font-size:32px; font-family:Helvetica">Score:</strong><strong id="scorediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px">"Hello, World!"</textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var score=document.getElementById("score");var scorediff=document.getElementById("scorediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function getScore(s){var a=1;try{b=eval('('+s+')("Hello, World!")');if(b=="v,dd2>\nXdl")a=.85}catch(e){};return getByteCount(s)*a}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}newLength=getScore(getNewCode());var oldLength=getScore(getOriginalCode());score.innerHTML="Score: "+newLength;var diff=Math.round((newLength-oldLength)*100)/100;if(diff>0){scorediff.innerHTML="(+"+diff+")";scorediff.style.color="lightcoral"}else if(diff<0){scorediff.innerHTML="("+diff+")";scorediff.style.color="lightgreen"}else{scorediff.innerHTML="("+diff+")";scorediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

ETHproductions
fonte
Modificação impressionante do snippet de teste! Parece que o trecho agora verifica automaticamente o bônus, posso perguntar como você fez isso? (ps se você quiser o original (e não em uma linha) de origem, não hesite em perguntar, pode ser mais fácil para modificar esse caminho)
jrich
@UndefinedFunction Oh, desculpe por não responder imediatamente! Eu adicionei uma getScore()função que verifica a Hello, World!conformidade do caso de teste (contém convenientemente uma nova linha e caracteres não imprimíveis) e retorna a pontuação multiplicada por 0,85 ou 1, dependendo do resultado. E sim, o acesso ao snippet não minificado seria ótimo. :)
ETHproductions
Disponibilizamos o código do snippet original aqui . Diverta-se!
jrich
4

PHP - 187 182 163 bytes

<?php $s=$_GET["s"];$m="array_map";echo join($m("chr",$m("bindec",$m(function($v){return strtr($v,[1,0]);},$m("strrev",$m("decbin",$m("ord",str_split($s))))))));?>

Passe o valor como GET["s"].

array_map retorna uma matriz com todos os elementos do segundo parâmetro (uma matriz) após aplicar a função de retorno de chamada (primeiro parâmetro) a todos eles.

Não tenho certeza se devo retirar os 15% de desconto, pois echonão gera caracteres imprimíveis, mas não os removi.

Ainda bem que terminei, pois esse é o primeiro desafio que faço.

Indefinido
fonte
1
É mais curto, se você não declarar essas funções: $m='array_map';echo join($m("chr",$m("bindec",$m(function($v){return strtr($v,[1,0]);},$m("strrev",$m("decbin",$m("ord",str_split($s))))))));.
Manatwork
@ manatwork esqueceu completamente isso. Obrigado.
Undefined
Você não pode simplesmente colocar a entrada em uma variável. Você deve criar uma função ou ler a entrada STDIN. By the way, você não precisa usar aspas em torno string ( "chr", "bindec"...) uma vez que não se preocupam com avisos. Isso deve economizar 12 bytes.
Blackhole
@ Blackhole obrigado pelas informações, estarei ciente disso na próxima vez.
Indefinido
É melhor fazer a modificação nesta resposta, que é inválida :). Vai custar-lhe quase nenhum bytes, basta substituir str_split($s)por, str_split(fgets(STDIN))por exemplo.
Blackhole
3

K5, 28 bytes

`c${b/~|{x@&|\x}@(b:8#2)\x}'

Isso é um pouco inconveniente, porque o decodeoperador do K5 realiza uma conversão básica de largura fixa; portanto, para cumprir a declaração do problema, preciso ajustar os zeros à esquerda. O lambda {x@&|\x}realiza essa etapa.

Mancha:

  |\0 0 1 0 1 1 0 1
0 0 1 1 1 1 1 1

Reunir:

  &|\0 0 1 0 1 1 0 1
2 3 4 5 6 7

Selecione:

  {x@&|\x}0 0 1 0 1 1 0 1
1 0 1 1 0 1

Todo o programa em ação:

  `c${b/~|{x@&|\x}@(b:8#2)\x}'"Hello, World"
"v,dd2>\nXdl"

Acredito que o comportamento natural da OK com os não imprimíveis a torne elegível para -15%, atribuindo uma pontuação de 28 * 0,85 = 23,8 .

JohnE
fonte
+1 porque tentei, mas não consegui descobrir uma maneira curta de me livrar dos zeros à esquerda!
precisa saber é o seguinte
Algumas construções relacionadas podem ser encontradas aqui .
Johne
3

Julia, 77 bytes - 15% = 65,45

s->join(filter(isprint,[Char(parse(Int,join(1-digits(Int(c),2)),2))for c=s]))

Isso cria um functon sem nome que aceita uma string e retorna uma string. Caracteres não imprimíveis são removidos, o que qualifica isso para o bônus.

Ungolfed:

function f(s::AbstractString)
    # digits() returns the digits in reverse order, so no explicit
    # reverse() is needed
    x = [Char(parse(Int, join(1 - digits(Int(c), 2)), 2)) for c = s]

    # Remove unprintables, join into a string
    return join(filter(isprint, x))
end
Alex A.
fonte
Embora certamente o qualifique para o bônus, também custa mais do que o bônus economizado. 16 bytes filter(isprint,)e apenas 11,55 bytes salvos através do bônus.
Glen O
E se você desistir da etapa do filtro, poderá evitar a compreensão e ingressar usando o mapa diretamente na sequência. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(para 56 bytes)
Glen O
@GlenO Obrigado pelas sugestões, mas essa abordagem não pode ser impressa como códigos hexadecimais, que o OP disse não ser permitido. O uso de filter(isprint,)ambos qualifica o bônus e o torna compatível com as regras.
Alex A.
"Se um caractere for imprimível, você poderá imprimi-lo opcionalmente, mas ele não precisará ser removido."
Glen O
E se a preocupação é no outro lado do mesmo (que mostra como \x04e similares), em seguida, print()custa sete, o que traria 56 até 63.
Glen O
3

PowerShell, 199 175 (171 - 15%) = 145,35

param([char[]]$a)($a|%{$b=[convert]::ToString(+$_,2);$c=[convert]::ToInt32("$((-join$b[$b.Length..0])-split0-replace1,0-join1)",2);if($c-gt31-or$c-eq10){[char]$c}})-join''

Usa uma quantidade infeliz de algumas chamadas / built-ins do .NET, que incha significativamente o código.

Explicado:

Pega a entrada param(..)e lança-a como um char[]para que possamos trabalhar com ela adequadamente.

O próximo bit (..)-join''coleta e une nossa saída.

Dentro dessas parênteses, iteramos $a|%{..}como um loop foreach.

Dentro do loop:

  • Criamos uma nova string $b, que é nossa letra de entrada convertida como int +$_e [convert]ed para basear2
  • O próximo passo, configuração $c, é complicado, então vamos começar por dentro e trabalhar o nosso caminho
  • Invertemos a string $bcom(-join$b[$b.length..0])
  • Aproveitamos meu código anterior para inverter uma string binária e reformulamos o resultado como uma string com"$(..)"
  • Alimentamos essa string em uma chamada .NET diferente que [convert]é ToInt32da base 2, que finalmente é armazenada na$c
  • Se $cfor maior que 31ou igual a 10, nós o lançamos como um caractere e esse valor é deixado no pipeline de saída (que é o que é coletado e -join''editado acima), caso contrário, nada resta nessa iteração específica

Ufa.

Também se qualifica para o bônus de -15%.

Exemplo

PS C:\Tools\Scripts\golfing> .\reverse-and-invert-a-string.ps1 "Hello, World!"
v,dd2>
Xdl
AdmBorkBork
fonte
3

Função C, 63

o;f(o,char *s){for(;*s;*s=o,s++)for(o=0;*s;*s/=2)o+=o+!(*s%2);}
Trauma Digital
fonte
1

Minkolang 0.11 , 26 bytes

od?.(d2%,$r2:d)xrI1-[2*+]O

Experimente aqui.

Explicação

od?.            Takes input as character, halting if empty
(d2%,$r2:d)x    Converts to binary, inverting digits on the way
r               Reverses stack
I1-[2*+]        Converts to decimal
O               Outputs as character (if printable)
El'endia Starman
fonte
1

MATLAB, 60 bytes

@(y)[arrayfun(@(x)bin2dec([97-fliplr(dec2bin(x)) '']),y) '']

Basicamente, cada caractere, por sua vez, é convertido em uma sequência binária (sem zeros à esquerda). A matriz é invertida e subtraída de 97 ('0' + '1') que inverte o caractere. Isso é convertido novamente em decimal. Depois que todos os caracteres foram processados, toda a matriz é convertida novamente em caracteres antes de ser retornada.

Tom Carpenter
fonte
1

Python 3, 95 91

Implementação direta.

print(''.join(chr(int(''.join('10'[j>'0']for j in bin(ord(i))[:1:-1]),2))for i in input()))

Ungolfed:

inp = input()
ints = (ord(i) for i in inp)
bins = (bin(i) for i in ints)
revs = (i[2:][::-1] for i in bins) #without leading '0b'
invs = (''.join('0' if j == '1' else '1' for j in i) for i in revs)
newInts = (int(i, 2) for i in invs)
newChars = (chr(i) for i in newInts)
newStr = ''.join(newChars)
print(newStr)
Trang Oul
fonte
1

Ruby, 62 caracteres

gets.bytes{|b|$><<b.to_s(2).reverse.tr("01","10").to_i(2).chr}

Exemplo de execução:

bash-4.3$ ruby -e 'gets.bytes{|b|$><<b.to_s(2).reverse.tr("01","10").to_i(2).chr}' <<< 'Hello, World!'
v,dd2>
Xdl

bash-4.3$ ruby -e 'gets.bytes{|b|$><<b.to_s(2).reverse.tr("01","10").to_i(2).chr}' <<< 'Hello, World!' | od -tad1
0000000    v    ,    d    d  eot    2    >   nl  eot    X    d    l   rs   nl
         118   44  100  100    4   50   62   10    4   88  100  108   30   10
0000016
homem a trabalhar
fonte
1

C #, 156 bytes - 15% = 132,6

class P{static void Main(string[]a){try{for(int i=0,b,c;;){for(b=a[0][i++],c=0;b>0;b/=2)c=c<<1|1-b%2;if(c==10|c>31)System.Console.Write((char)c);}}catch{}}}

Recuo e novas linhas para maior clareza:

class P{
    static void Main(string[]a){
        try{
            for(int i=0,b,c;;){
                for(b=a[0][i++],c=0;b>0;b/=2)
                    c=c<<1|1-b%2;
                if(c==10|c>31)
                    System.Console.Write((char)c);
            }
        }
        catch{}
    }
}
Mão-E-Comida
fonte
1

Javascript 123 bytes

s=>[].map.call(s,s=>String.fromCharCode("0b"+s.charCodeAt().toString(2).split('').reverse().map(s=>s^1).join(''))).join('')
Naouak
fonte
1

Retina , 1107 629 bytes - 15% = 534,65 (não concorrente)

Usa recursos adicionados após a data do desafio. (O comportamento implícito de $*, , triagem)

O Retina não tem um built-in para converter um caractere em seu ordinal ASCII ou vice-versa ... então observe seu comprimento brilhante. Ele lida com ASCII imprimível e remove os não imprimíveis e as novas linhas. A contagem de bytes assume a codificação ISO 8859-1.

O código contém caracteres não imprimíveis.


¶
±
S_`
%(S`±
{2`
$`
}T01`-`_o
)Ms`.
\d+
$*
+`(1+)\1
${1}0
01
1
%O$^`.

T`01`10
1
01
+`10
011
0

m`^1{1,31}$

M%`1
m`^0¶?

126
~
125
}
124
|
123
{
122
z
121
y
120
x
119
w
118
v
117
u
116
t
115
s
114
r
113
q
112
p
111
o
110
n
109
m
108
l
107
k
106
j
105
i
104
h
103
g
102
f
101
e
100
d
99
c
98
b
97
a
96
`
95
_
94
^
93
]
92
\
91
[
90
Z
89
Y
88
X
87
W
86
V
85
U
84
T
83
S
82
R
81
Q
80
P
79
O
78
N
77
M
76
L
75
K
74
J
73
I
72
H
71
G
70
F
69
E
68
D
67
C
66
B
65
A
64
@
63
?
62
>
61
=
60
<
59
;
58
:
57
9
56
8
55
7
54
6
32

33
!
34
"
35
#
36
$
37
%
38
&
39
'
40
(
41
)
42
*
43
+
44
,
45
-
46
.
47
/
48
0
49
1
50
2
51
3
52
4
53
5
¶

Experimente online

Se você verificar o tutorial da Retina quanto à aritmética unária , reconhecerá várias partes diferentes do meu código como provenientes de lá.

Agradecimentos a Martin por jogar centenas de bytes

mbomb007
fonte
1

Java, 205 - 15% = 174,2

interface F{static void main(String[]a){for(int i=0,c,s;i<a[0].length();++i){c=a[0].charAt(i);s=Integer.numberOfLeadingZeros(c);c=~(Integer.reverse(c)>>s)&-1>>>s;if(c==10|c>31)System.out.print((char)c);}}}

Ungolfed:

interface F {
    static void main(String[] a) {
        for (int i = 0, c, s; i < a[0].length(); ++i) {
            c = a[0].charAt(i);
            s = Integer.numberOfLeadingZeros(c);
            c = ~(Integer.reverse(c) >> s) & -1 >>> s;
            if (c == 10 | c > 31) System.out.print((char)c);
        }
    }
}

Eu acho que essa solução é um pouco interessante no uso dos Integermétodos Integer.reversee Integer.numberOfLeadingZerosque fazem o que parecem, e a mudança de -1 >>> sonde sestá o número de zeros à esquerda, para fazer com que a máscara oculte os bits altos que não queremos. Só lamento que o nome do último método seja tão detalhado, mas é o que recebo pelo golfe em Java.

Saída:

v,dd2>
Xdl
David Conrad
fonte
1

Japt, 25 bytes

Deseja criar um programa JavaScript de golfe, mas o método mais curto envolve muitos nomes de funções longos? Foi para isso que Japt foi feito. :)

UmX=>Xc s2 w mY=>Y^1 n2 d

Experimente no intérprete online !

Como funciona

         // Implicit: U = first item in input
UmX=>    // for each character X in U:
Xc s2 w  //  take the char-code of X, convert to binary, and reverse
mY=>     //  for each character Y in this:
Y^1      //   take Y XOR 1 (converts 1 to 0 and 0 to 1)
n2 d     //  convert the result back to decimal, then to a character
         // Implicit: output last expression

Usando a versão atual do Japt (a partir da v1.4.4), a contagem de bytes pode ser reduzida para 14:

®c ¤w m^1 n2 d

Teste online!

ETHproductions
fonte
0

Haskell, 167 bytes

import Data.Char
import Numeric
r '0'='1'
r '1'='0'
s=map (chr.fst.head.(readInt 2 (`elem` "01") digitToInt).(map r).reverse.flip (showIntAtBase 2 intToDigit . ord)"")

Infelizmente, Haskell fica bastante detalhado quando precisa ler / imprimir em outra base…

arjanen
fonte
0

Perl 6, 66 bytes

Fazer tudo ao remover os caracteres de controle que não imprimem me leva a (83 + 1) -15% = 71,4

perl6 -ne 'print grep /<-:C+[\n]>/,.ords».base(2)».flip.map({chr :2([~] $_.comb.map(+!+*))})'

Se eu remover o código que retira os caracteres de controle, economizo bastante 65 + 1 = 66

perl6 -ne 'print .ords».base(2)».flip.map({chr :2([~] $_.comb.map(+!+*))})'

(Eu usei em »vez de >>clareza)

Brad Gilbert b2gills
fonte
0

Gelatina , 6 bytes (não concorrente)

OBU¬ḄỌ

Experimente online!

Explicação:

OBU¬ḄỌ Main link: z
O      Convert z to a list of character codes.
 B     Convert the codes to bit lists.
  U    Reverse the bits (not the lists).
   ¬   Invert the bits.
    Ḅ  Convert back to decimal.
     Ọ Convert back to string.
Erik, o Outgolfer
fonte
0

Raquete 250 15% de bônus = 212 bytes

(λ(s)(list->string(map integer->char(filter(λ(x)(or(> x 31)(= x 10)))(for/list((i(string->list s)))(string->number(string-append
"#b"(list->string(map(λ(i)(if(equal? #\0 i)#\1 #\0))(reverse(string->list(number->string(char->integer i)2))))))))))))

Ungolfed:

(define (f s)
    (list->string 
     (map 
      integer->char
      (filter
       (λ(x)(or(> x 31)(= x 10)))

       (for/list ((i (string->list s)))
         (string->number
          (string-append
           "#b"
           (list->string
            (map
             (λ(i)(if(equal? #\0 i) #\1 #\0))
             (reverse
              (string->list
               (number->string
                (char->integer i) 2)
               )))))))))))

Teste:

(f "Hello, World!")

Saída:

"v,dd2>\nXdl"
rnso
fonte
0

PHP, 80 bytes

while(a&$c=$argn[$i++])echo chr(bindec(strtr(strrev(decbin(ord($c))),10,"01")));

recebe entrada do STDIN; corra com -R.

versão bônus, 97 110 bytes -> pontuação 93,5

while(a&$c=$argn[$i++])ctype_print($c=chr(bindec(strtr(strrev(decbin(ord($c))),10,"01"))))||"
"==$c?print$c:0;

imprime ASCII 10 e 32 a 126 (nova linha e imprimíveis)


avaria, TiO e, se possível, algum golfe se seguirá; Estou cansado agora.

Titus
fonte