Inverser et inverser une chaîne

27

Inverser et inverser une chaîne

Défi

Dans ce défi. Vous allez écrire un programme qui affichera ou renverra l'entrée, inversée et inversée.

Tout d'abord, chaque caractère doit être converti en son code de caractère. Ensuite, cela devrait être converti en base-2. Ensuite, cette chaîne doit être inversée. Après, la chaîne doit être inversée (1 -> 0 et 0 -> 1). Enfin, cela devrait être reconverti en base 2, puis reconverti en personnage. Si un personnage s'avère être non imprimable, vous pouvez éventuellement le sortir mais il n'est pas nécessaire de le supprimer.

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)

Notation

Le code le plus court en octets gagne.

-15% Bonus: si votre programme supprime les non imprimables de la sortie. Ce doit être au moins tous les caractères inférieurs à 32 sauf les sauts de ligne (caractère 10)

Downgoat
la source
Je dois faire travailler mon interprète Simplex XDGBktnkZs
Conor O'Brien
Ainsi, les caractères de la chaîne ne sont pas inversés, mais les bits de chaque caractère le sont?
xnor
Juste pour être sûr: pour 0010000 est le bit inversé 0000100 ou 00001?
Digital Trauma
@DigitalTrauma Si le code binaire est 0010000, il devrait être traité comme 10000si l'inverse serait00001
Downgoat
2
Pouvons-nous supposer juste ASCII (comme vos exemples), ou cela devrait-il fonctionner pour tout ce qui est un caractère dans ma langue? (De plus, si une langue utilise un code de caractère différent, dois-je utiliser celui-ci au lieu de ASCII / Unicode)?
Paŭlo Ebermann

Réponses:

4

CJam, 14

q{i2bW%:!2bc}%

Essayez-le en ligne

Explication:

Assez simple:

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

Version "imprimable", 20 - 15% = 17

q{i2bW%:!2bc' ,N--}%
aditsu
la source
Dangit, toi. J'étais sur le point de poster une réponse CJam D:
anOKsquirrel
@anOKsquirrel désolé ^^ était-ce similaire?
aditsu
Ça l'aurait été si j'avais fini.
anOKsquirrel
Comment fonctionne W%? W est -1, alors ...
anOKsquirrel
1
@anOKsquirrel voir la documentation ici
aditsu
9

Pyth, 14 octets

smCi!M_jCd2 2z

Essayez-le en ligne.

Comment ça marche

 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
la source
2
Solutions alternatives (tous les 14 octets):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis
Que diriez-vous d'une version qui supprime les non imprimables, juste par intérêt / pour comparaison? Probablement comme réponse distincte.
hyde
8

Perl, 57 51 caractères

(Code de 50 caractères + option de ligne de commande de 1 caractère.)

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

Exemple d'exécution:

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
homme au travail
la source
1
51 Octets -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&est plus court que sprintf'%b',ord$&, et décode en outre dans l'ordre inverse. Malheureusement, il produit également des 0 de fin, qui doivent être supprimés.
primo
Merci @primo. unpackest encore un terrain inexploré pour moi.
manatwork
42 Octets -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Inversez le personnage, pas besoin de translittérer;)
primo
7

JavaScript ( ES6 ES7), 119 114 108 octets

Cela s'est avéré beaucoup plus long que prévu :(

Merci à @vihan pour 5 octets enregistrés! Merci à @ETHProductions pour encore 6 octets enregistrés!

Pour tester:  exécutez l'extrait de code ci-dessous, entrez une entrée comme "Hello, World!"et cliquez sur Tester!

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
la source
Je pense que vous pourriez économiser 4 octets remplaçant le parseIntavec +('0b'+<code>)comme décrit ici et un autre en utilisant au w^1lieu de+!+w
Downgoat
2
Je n'aurais jamais pensé que cela était possible, mais je viens de jouer au golf à 0,05 octet : 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). il ne gère que 10 == \n, non 13 == \r. @ Vɪʜᴀɴ quelle est votre opinion?
ETHproductions
1
J'obtiens Unexpected token '>'lorsque j'essaie d'exécuter l'extrait de code.
Paul R
1
@ETHproductions: merci - je n'ai que Safari et Chrome à portée de main et je suppose que ni l'un ni l'autre n'est "conforme à l'ES6".
Paul R
1
@PaulR ES6, ou ECMAScript 6, est l'un des derniers ensembles de nouvelles fonctionnalités pour JavaScript. Voir ce site pour plus d'informations. Il existe également un tableau de compatibilité qui montre quelles fonctionnalités sont prises en charge par quels navigateurs (et autres programmes). Cette réponse nécessite notamment des "fonctions fléchées", "l'opérateur d'étalement" et les "compréhensions de tableaux" d'ES7.
ETHproductions
5

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

Je jouais avec cette réponse pour voir si le bonus en valait la peine. Apparemment, ça l'est. La suite de tests a été volée à partir de la même réponse, mais j'ai ajouté ma propre touche: prise en charge complète du bonus 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
la source
Modification impressionnante de l'extrait de test! Il semble que l'extrait vérifie désormais automatiquement le bonus, puis-je vous demander comment vous avez fait cela? (ps si vous voulez la source originale (pas sur une seule ligne), n'hésitez pas à demander, il serait peut-être plus facile de modifier de cette façon)
jrich
@UndefinedFunction Oh, désolé de ne pas avoir répondu tout de suite! J'ai ajouté une getScore()fonction qui vérifie la Hello, World!conformité du cas de test (il contient commodément à la fois une nouvelle ligne et des caractères non imprimables), et renvoie le score multiplié par 0,85 ou 1, selon le résultat. Et oui, l'accès à l'extrait de code non réduit serait formidable. :)
ETHproductions
J'ai rendu le code d'extrait original disponible ici . S'amuser!
jrich
4

PHP - 187 182 163 octets

<?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))))))));?>

Passez la valeur comme GET["s"].

array_map renvoie un tableau avec tous les éléments du deuxième paramètre (un tableau) après avoir appliqué la fonction de rappel (premier paramètre) à chacun d'eux.

Je ne sais pas si je devrais retirer les 15%, car echone génère pas de caractères non imprimables, mais je ne les ai pas supprimés.

Je suis content d'avoir terminé, car c'est le premier défi auquel je participe.

indéfini
la source
1
Est plus courte si vous déclarez pas ces fonctions: $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 a complètement oublié cela. Merci.
undefined
Vous ne pouvez pas simplement mettre l'entrée dans une variable. Vous devez créer une fonction ou lire l'entrée depuis STDIN. Soit dit en passant, vous n'avez pas besoin d'utiliser des guillemets autour de la chaîne ( "chr", "bindec"...) puisque nous ne se soucient pas des avertissements. Cela devrait vous faire économiser 12 octets.
Blackhole
@Blackhole merci pour les infos, j'en serai conscient la prochaine fois.
indéfini
Vous feriez mieux de faire la modification de cette réponse, qui est par ailleurs invalide :). Cela ne vous coûtera presque pas d'octets, il suffit de le remplacer str_split($s)par str_split(fgets(STDIN))exemple.
Blackhole
3

K5, 28 octets

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

C'est un peu gênant car l' decodeopérateur de K5 effectue une conversion de base à largeur fixe, donc pour me conformer à l'énoncé du problème, je dois couper les zéros en tête. Le lambda {x@&|\x}accomplit cette étape.

Frottis:

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

Recueillir:

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

Sélectionner:

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

L'ensemble du programme en action:

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

Je crois que le comportement naturel de oK avec les non imprimables le rend éligible à -15%, ce qui lui donne un score de 28 * 0,85 = 23,8 .

JohnE
la source
+1 parce que j'ai essayé, mais je n'ai pas réussi à trouver un moyen de me débarrasser des zéros de tête!
kirbyfan64sos
Quelques constructions connexes peuvent être trouvées ici .
JohnE
3

Julia, 77 octets - 15% = 65,45

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

Cela crée un functon sans nom qui accepte une chaîne et renvoie une chaîne. Les caractères non imprimables sont supprimés, ce qui le qualifie pour le bonus.

Non golfé:

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.
la source
Bien qu'il le qualifie certainement pour le bonus, il coûte également plus que le bonus économisé. 16 octets filter(isprint,)et seulement 11,55 octets enregistrés grâce au bonus.
Glen O
Et si vous abandonnez l'étape de filtrage, vous pouvez éviter la compréhension et rejoindre en utilisant la carte directement sur la chaîne. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(pour 56 octets)
Glen O
@GlenO Merci pour les suggestions, mais cette approche laisse dans les non imprimables des codes hexadécimaux, ce que l'OP a déclaré non autorisé. L'utilisation des filter(isprint,)deux le qualifie pour le bonus et le rend conforme aux règles.
Alex A.
"Si un personnage s'avère non imprimable, vous pouvez éventuellement le sortir mais il n'est pas nécessaire de le supprimer."
Glen O
Et si l'inquiétude se trouve de l'autre côté (qu'elle s'affiche de \x04la même manière), alors print()coûte sept, ce qui porterait 56 à 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''

Utilise une quantité regrettable de certains appels / intégrés .NET, ce qui gonfle considérablement le code.

Expliqué:

Prend l'entrée param(..)et la transforme en un char[]afin que nous puissions y travailler de manière appropriée.

Le bit suivant (..)-join''recueille et joint notre sortie ensemble.

À l'intérieur de ces parens, nous itérons avec $a|%{..}une boucle foreach.

À l'intérieur de la boucle:

  • Nous créons une nouvelle chaîne $b, qui est notre lettre d'entrée castée en int +$_et [convert]ed en base2
  • Ce bit suivant, le réglage $c, est délicat, alors commençons à l'intérieur et travaillons notre chemin
  • Nous inversons la chaîne $bavec(-join$b[$b.length..0])
  • Nous exploitons mon code précédent pour inverser une chaîne binaire et refondons le résultat sous forme de chaîne avec"$(..)"
  • Nous alimentons cette chaîne dans un autre appel .NET qui [convert]est ToInt32de la base 2, qui est finalement stockée que dans$c
  • Si $cest supérieur 31ou égal à 10, nous le convertissons en caractère et cette valeur est laissée sur le pipeline pour la sortie (ce qui est collecté et -join''édité ensemble, ci-dessus), sinon rien ne reste sur cette itération particulière

Phew.

Se qualifie également pour le bonus de -15%.

Exemple

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

Fonction C, 63

o;f(o,char *s){for(;*s;*s=o,s++)for(o=0;*s;*s/=2)o+=o+!(*s%2);}
Traumatisme numérique
la source
1

Minkolang 0,11 , 26 octets

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

Essayez-le ici.

Explication

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
la source
1

MATLAB, 60 octets

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

Fondamentalement, chaque caractère à son tour est converti en une chaîne binaire (sans zéros non significatifs). Le tableau est inversé et est soustrait de 97 ('0' + '1') qui inverse le caractère. Ceci est reconverti en décimal. Une fois que tous les caractères ont été traités, l'ensemble du tableau est ensuite reconverti en caractères avant d'être renvoyé.

Tom Carpenter
la source
1

Python 3, 95 91

Mise en œuvre simple.

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

Non golfé:

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
la source
1

Ruby, 62 caractères

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

Exécutez Samply:

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
homme au travail
la source
1

C #, 156 octets - 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{}}}

Indentation et nouvelles lignes pour plus de clarté:

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{}
    }
}
Hand-E-Food
la source
1

Javascript 123 octets

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

Rétine , 1107 629 octets - 15% = 534,65 (non concurrent)

Utilise des fonctionnalités ajoutées après la date du défi. (Comportement implicite de$* , , tri)

La rétine n'a pas de fonction intégrée pour convertir un personnage en ordinal ASCII ou en arrière ... alors voyez sa longueur brillante. Cela gère ASCII imprimable et supprime les non imprimables ainsi que les nouvelles lignes. Le nombre d'octets suppose un codage ISO 8859-1.

Le code contient des caractères non imprimables.


¶
±
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
¶

Essayez-le en ligne

Si vous consultez le tutoriel Retina pour l'arithmétique unaire , vous reconnaîtrez plusieurs morceaux différents de mon code comme venant de là.

Merci à Martin d'avoir joué à des centaines d'octets

mbomb007
la source
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);}}}

Non golfé:

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);
        }
    }
}

Je pense que cette solution est un peu intéressante dans son utilisation des Integerméthodes Integer.reverseet Integer.numberOfLeadingZerosqui font ce à quoi elles ressemblent, et le décalage de l' -1 >>> sendroit où sest le nombre de zéros en tête, pour obtenir le masque pour masquer les bits élevés que nous ne voulons pas. Je regrette juste que le nom de cette dernière méthode soit tellement verbeux, mais c'est ce que j'obtiens pour jouer au golf à Java.

Sortie:

v,dd2>
Xdl
David Conrad
la source
1

Japt, 25 octets

Vous voulez créer un programme JavaScript golfy, mais la méthode la plus courte implique de nombreux noms de fonction longs? C'est pour ça que Japt était fait. :)

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

Essayez-le dans l' interprète en ligne !

Comment ça marche

         // 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

En utilisant la version actuelle de Japt (à partir de la v1.4.4), le nombre d'octets peut être réduit à 14:

®c ¤w m^1 n2 d

Testez-le en ligne!

ETHproductions
la source
0

Haskell, 167 octets

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)"")

Malheureusement, Haskell devient assez verbeux lorsqu'il a besoin de lire / imprimer dans une autre base…

arjanen
la source
0

Perl 6, 66 octets

Tout faire en supprimant les caractères de contrôle non imprimables me fait (83 + 1) -15% = 71,4

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

Si je supprime le code qui supprime les caractères de contrôle, j'économise un peu 65 + 1 = 66

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

(J'ai utilisé »au lieu de >>pour plus de clarté)

Brad Gilbert b2gills
la source
0

Gelée , 6 octets (non concurrent)

OBU¬ḄỌ

Essayez-le en ligne!

Explication:

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 le Outgolfer
la source
0

Raquette 250 Bonus de 15% = 212 octets

(λ(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))))))))))))

Non golfé:

(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)
               )))))))))))

Essai:

(f "Hello, World!")

Sortie:

"v,dd2>\nXdl"
rnso
la source
0

PHP, 80 octets

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

prend l'entrée de STDIN; courir avec -R.

version bonus, 97110 octets -> score 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 et 32 ​​à 126 (nouvelle ligne et imprimables)


panne, TiO et si possible un peu de golf suivra; Je suis fatigué en ce moment.

Titus
la source