Einen String umkehren und invertieren


27

Einen String umkehren und invertieren

Herausforderung

In dieser Herausforderung. Sie schreiben ein Programm, das die Eingabe umgekehrt und invertiert ausgibt oder zurückgibt.

Zunächst sollte jedes Zeichen in seinen Zeichencode konvertiert werden. Dann sollte das in Base-2 konvertiert werden. Anschließend sollte diese Zeichenfolge umgekehrt werden. Danach sollte der String invertiert werden (1 -> 0 und 0 -> 1). Zum Schluss sollte dies wieder zur Basis 2 und dann wieder zu einem Charakter konvertiert werden. Wenn sich herausstellt, dass ein Zeichen nicht gedruckt werden kann, können Sie es optional ausgeben, müssen es jedoch nicht entfernen.

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)

Wertung

Kürzester Code in Bytes gewinnt.

-15% Bonus: Wenn Ihr Programm nicht druckbare Dateien aus der Ausgabe entfernt. Dies müssen mindestens alle Zeichen unter 32 sein, mit Ausnahme von Zeilenumbrüchen (Zeichen 10).


Ich muss meinen Simplex-Interpreter wieder zum Laufen bringen. XDGBktnkZs
Conor O'Brien

Die Zeichen in der Zeichenfolge werden also nicht umgekehrt, aber die Bits in den einzelnen Zeichen sind?
6.

Nur um sicher zu gehen: für 0010000 ist das Bit 0000100 oder 00001 umgekehrt?
Digitales Trauma

@DigitalTrauma Wenn der Binärcode ist 0010000, sollte er so behandelt werden, als 10000wäre das Gegenteil der Fall00001
Downgoat

2
Können wir nur ASCII (als Beispiel) annehmen oder sollte dies für alles funktionieren, was ein Zeichen in meiner Sprache ist? (Wenn eine Sprache einen anderen Zeichencode verwendet, sollte ich diesen anstelle von ASCII / Unicode verwenden.)
Paŭlo Ebermann,

Antworten:


4

CJam, 14

q{i2bW%:!2bc}%

Probieren Sie es online aus

Erläuterung:

Ziemlich einfach:

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

"Druckversion", 20 - 15% = 17

q{i2bW%:!2bc' ,N--}%

Verdammt, du. Ich wollte gerade eine CJam-Antwort schreiben D:
anOKsquirrel

@anOKsquirrel sorry ^^ war es ähnlich?
Aditsu

Es wäre gewesen, wenn ich es beendet hätte.
anOKsquirrel

Wie funktioniert W%? W ist -1, also ...
anOKsquirrel

1
@anOKsquirrel finden Sie in der Dokumentation hier
Aditsu

9

Pyth, 14 Bytes

smCi!M_jCd2 2z

Probieren Sie es online aus.

Wie es funktioniert

 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.

2
Alternative Lösungen (alle 14 Bytes):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis

Wie wäre es mit einer Version, die Unbedruckbares entfernt, nur aus Interesse / zum Vergleich? Wahrscheinlich als separate Antwort.
Hyde

8

Perl, 57 51 Zeichen

(50 Zeichen Code + 1 Zeichen Befehlszeilenoption.)

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

Probelauf:

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

1
51 Bytes -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&ist kürzer als sprintf'%b',ord$&und dekodiert zusätzlich in umgekehrter Reihenfolge. Leider werden auch nachfolgende 0s erzeugt, die entfernt werden müssen.
Primo

Vielen Dank an @primo. unpackist für mich noch unerforschtes Terrain.
Handarbeit

42 Bytes -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Invertieren Sie den Charakter, keine Notwendigkeit zu transliterieren;)
Primo

7

JavaScript ( ES6 ES7), 119 114 108 Byte

Dies stellte sich viel länger als erwartet heraus :(

Vielen Dank an @vihan für 5 Bytes gespeichert! Danke an @ETHProductions für weitere 6 Bytes gespart!

Zum Testen:  Führen Sie das folgende Snippet aus, geben Sie input like ein "Hello, World!"und klicken Sie auf Test!

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>


Ich glaube , Sie könnten ein 4 Bytes speichern die ersetzende parseIntmit , +('0b'+<code>)wie hier und ein anderes unter Verwendung w^1anstelle von+!+w
Downgoat

2
Ich hätte das nie für möglich gehalten, aber ich habe nur 0,05 Bytes abgespielt : 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) Vielleicht ist das aber nicht legal; es geht nur 10 == \n, nicht 13 == \r. @Vɪʜᴀɴ was ist deine Meinung?
ETHproductions

1
Ich bekomme, Unexpected token '>'wenn ich versuche, das Snippet auszuführen.
Paul R

1
@ETHproductions: danke - ich habe nur Safari und Chrome zur Hand und ich denke, keiner von diesen ist "ES6-konform".
Paul R

1
@PaulR ES6 oder ECMAScript 6 ist eine der neuesten Funktionen für JavaScript. Weitere Informationen finden Sie auf dieser Website . Es gibt auch eine Kompatibilitätstabelle , aus der hervorgeht, welche Funktionen von welchen Browsern (und anderen Programmen) unterstützt werden. Diese Antwort erfordert insbesondere "Pfeilfunktionen", den "Spread-Operator" und das "Array-Verständnis" von ES7.
ETHproductions

5

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

Ich habe mit dieser Antwort herumgespielt, um zu sehen, ob sich der Bonus gelohnt hat. Anscheinend ist es das. Die Testsuite wurde aus derselben Antwort gestohlen, aber ich habe meinen eigenen Twist hinzugefügt: volle Unterstützung des 15% -Bonus! :)

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>


Tolle Modifikation des Test-Snippets! Es scheint, dass das Snippet jetzt automatisch nach dem Bonus sucht. Darf ich fragen, wie Sie das gemacht haben? (ps, wenn Sie die ursprüngliche (nicht in einer Zeile) Quelle möchten, zögern Sie nicht zu fragen, könnte einfacher sein, auf diese Weise zu ändern)
jrich

@UndefinedFunction Oh, entschuldigen Sie, dass Sie nicht sofort geantwortet haben! Ich habe eine getScore()Funktion hinzugefügt , die den Testfall Hello, World!auf Konformität prüft (sie enthält bequemerweise sowohl Zeilenumbrüche als auch nicht druckbare Zeichen) und die je nach Ergebnis mit 0,85 oder 1 multiplizierte Punktzahl zurückgibt. Und ja, der Zugriff auf das nicht minimierte Snippet wäre großartig. :)
ETHproductions

Ich habe den Original-Snippet-Code hier verfügbar gemacht . Habe Spaß!
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))))))));?>

Übergeben Sie den Wert als GET["s"].

array_map gibt ein Array mit allen Elementen des zweiten Parameters (eines Arrays) zurück, nachdem die Rückruffunktion (erster Parameter) auf alle angewendet wurde.

Ich bin mir nicht sicher, ob ich die 15% echosparen soll , da keine nicht druckbaren Zeichen ausgegeben werden, aber ich habe sie nicht entfernt.

Ich bin nur froh, dass ich fertig bin, da dies die erste Herausforderung ist, an der ich teilnehme.


1
Ist kürzer , wenn Sie nicht die Funktionen erklären: $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 hat das komplett vergessen. Vielen Dank.
undefined

Sie können die Eingabe nicht einfach in eine Variable einfügen. Sie sollten eine Funktion erstellen oder die Eingabe von lesen STDIN. By the way, brauchen Sie keine Anführungszeichen um Zeichenfolge zu verwenden ( "chr", "bindec", ...) , da wir über Warnungen nicht zu kümmern. Das sollte Ihnen 12 Bytes ersparen.
Blackhole

@Blackhole Danke für die Infos, das werde ich mir beim nächsten Mal merken.
undefined

Sie sollten die Änderung an dieser Antwort vornehmen, die ansonsten ungültig ist :). Es kostet Sie fast keine Bytes, ersetzen Sie einfach str_split($s)mit str_split(fgets(STDIN))zum Beispiel.
Blackhole

3

K5, 28 Bytes

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

Dies ist etwas unpraktisch, da der decodeOperator von K5 eine Basiskonvertierung mit fester Breite ausführt. Um der Problemanweisung zu entsprechen, muss ich führende Nullen kürzen. Das Lambda führt {x@&|\x}diesen Schritt aus.

Abstrich:

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

Versammeln:

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

Wählen:

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

Das ganze Programm in Aktion:

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

Ich glaube , oK ‚s natürliche Verhalten mit unprintables für -15% dieses qualifizierten macht, ist dies eine Punktzahl von 28 * 0,85 = geben 23,8 .


+1, weil ich versucht habe, aber keinen kurzen Weg gefunden habe, um die führenden Nullen loszuwerden!
kirbyfan64sos

Einige verwandte Konstruktionen finden Sie hier .
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]))

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Nicht druckbare Zeichen werden entfernt, was dies für den Bonus qualifiziert.

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

Zwar qualifiziert es sich sicherlich für den Bonus, aber es kostet auch mehr als der Bonus spart. 16 Bytes bis filter(isprint,)und nur 11,55 Bytes werden durch den Bonus eingespart.
Glen O

Und wenn Sie den Filterschritt aufgeben, können Sie das Verstehen vermeiden und beitreten, indem Sie die Karte direkt auf dem String verwenden. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(für 56 Bytes)
Glen O

@GlenO Danke für die Vorschläge, aber dieser Ansatz lässt nicht druckbare Hex-Codes zu, was laut OP nicht erlaubt ist. Die Verwendung von filter(isprint,)beiden qualifiziert es für den Bonus und macht es konform mit den Regeln.
Alex A.

"Wenn ein Zeichen nicht druckbar ist, können Sie es optional ausgeben, aber es muss nicht entfernt werden."
Glen O

Und wenn die Sorge auf der anderen Seite ist (dass sie als \x04und dergleichen angezeigt wird ), dann print()kostet sie sieben, was 56 bis 63 bringen würde.
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''

Verwendet eine unglückliche Menge an .NET-Aufrufen / -Integrierten , wodurch der Code erheblich aufgebläht wird.

Erklärt:

Nimmt die Eingabe param(..)und wandelt sie in eine um, char[]damit wir sie angemessen verarbeiten können.

Das nächste Stück (..)-join''sammelt und fügt unsere Ergebnisse zusammen.

In diesen Parens iterieren wir $a|%{..}als foreach-Schleife.

In der Schleife:

  • Wir erstellen eine neue Zeichenfolge $b, bei der es sich um unseren Eingabe-Buchstaben handelt, der als Basis für Int +$_und [convert]Ed verwendet wird2
  • Diese nächste Einstellung $cist knifflig. Beginnen wir also innen und arbeiten uns nach außen
  • Wir vertauschen die Zeichenfolge $bmit(-join$b[$b.length..0])
  • Wir nutzen meinen vorherigen Code zum Invertieren einer Binärzeichenfolge und setzen das Ergebnis als Zeichenfolge mit um"$(..)"
  • Wir fütterten diese Zeichenfolge in einen anderen .NET - Aufruf, der [convert]s ToInt32von der Basis 2, die schließlich gespeichert wird , dass in$c
  • Wenn $cgrößer 31oder gleich ist, 10wird es als Zeichen umgewandelt, und dieser Wert verbleibt in der Pipeline für die Ausgabe (was oben gesammelt und -join''zusammengefasst wird). Andernfalls bleibt bei dieser bestimmten Iteration nichts übrig

Puh.

Qualifiziert sich auch für den -15% Bonus.

Beispiel

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




1

MATLAB, 60 Bytes

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

Grundsätzlich wird jedes Zeichen in eine Binärzeichenfolge (ohne führende Nullen) umgewandelt. Das Array wird umgedreht und von 97 ('0' + '1') abgezogen, wodurch das Zeichen invertiert wird. Dies wird zurück in Dezimal umgerechnet. Nachdem alle Zeichen verarbeitet wurden, wird das gesamte Array vor der Rückgabe wieder in Zeichen konvertiert.


1

Python 3, 95 91

Einfache Implementierung.

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)

1

Ruby, 62 Zeichen

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

Samply run:

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

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{}}}

Einrückung und neue Zeilen für Klarheit:

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{}
    }
}

1

Javascript 123 Bytes

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

1

Retina , 1107 629 Bytes - 15% = 534,65 (nicht konkurrierend)

Verwendet Funktionen, die nach dem Aufforderungsdatum hinzugefügt wurden. (Implizites Verhalten von$* , , Sorting)

In Retina ist keine Funktion zum Konvertieren eines Zeichens in die ASCII-Ordnungszahl oder zurück integriert. Sehen Sie sich also seine glänzende Länge an. Hiermit werden druckbare ASCII-Zeichen verarbeitet und nicht druckbare Zeichen sowie Zeilenumbrüche entfernt. Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

Der Code enthält nicht druckbare Zeichen.


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

Probieren Sie es online aus

Wenn Sie sich das Retina-Tutorial für unäre Arithmetik ansehen , werden Sie mehrere verschiedene Teile meines Codes als von dort stammend erkennen.

Vielen Dank an Martin für das Golfen mit Hunderten von Bytes


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

Ich denke , diese Lösung ein bisschen interessant in ihrer Nutzung der ist IntegerMethoden Integer.reverseund Integer.numberOfLeadingZerosdas tun , was , wie sie klingen, und die Verschiebung von -1 >>> swo sdie Anzahl der führenden Nullen, um die Maske zu bekommen High - Bits zu maskieren , dass wir nicht wollen. Ich bedaure nur, dass der Name der letzteren Methode so verdammt wörtlich ist, aber das ist, was ich für das Golfen in Java bekomme.

Ausgabe:

v,dd2>
Xdl

1

Japt, 25 Bytes

Möchten Sie ein Golf-JavaScript-Programm erstellen, bei der kürzesten Methode sind jedoch viele lange Funktionsnamen erforderlich? Dafür wurde Japt gemacht. :)

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

Probieren Sie es im Online-Dolmetscher aus !

Wie es funktioniert

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

Mit der aktuellen Version von Japt (ab v1.4.4) kann die Byteanzahl auf 14 reduziert werden:

®c ¤w m^1 n2 d

Online testen!


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

Leider wird Haskell ziemlich wortreich, wenn er in einer anderen Basis lesen / drucken muss…


0

Perl 6, 66 Bytes

Wenn ich die nicht druckbaren Steuerzeichen entferne, bekomme ich (83 + 1) -15% = 71,4

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

Wenn ich den Code entferne, der die Steuerzeichen entfernt, spare ich ziemlich viel 65 + 1 = 66

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

(Ich habe »statt aus >>Gründen der Klarheit verwendet)


0

Gelee , 6 Bytes (nicht konkurrierend)

OBU¬ḄỌ

Probieren Sie es online!

Erläuterung:

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.

0

Schläger 250 15% Bonus = 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)
               )))))))))))

Testen:

(f "Hello, World!")

Ausgabe:

"v,dd2>\nXdl"

0

PHP, 80 Bytes

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

nimmt Eingaben von STDIN entgegen; renn mit -R.

Bonusversion, 97 110 Bytes -> 93,5 Punkte

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

druckt ASCII 10 und 32 bis 126 (Zeilenvorschub und Ausdrucke)


Aufschlüsselung, TiO und wenn möglich etwas Golfen werden folgen; Ich bin jetzt müde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.