Odwróć i odwróć ciąg

27

Odwróć i odwróć ciąg

Wyzwanie

W tym wyzwaniu. Będziesz pisać program, który wyświetli lub zwróci dane wejściowe, odwrócony i odwrócony.

Po pierwsze, każdy znak należy przekonwertować na kod znaku. Następnie należy to przekonwertować na base-2. Następnie ciąg powinien zostać odwrócony. Następnie ciąg powinien zostać odwrócony (1 -> 0 i 0 -> 1). Na koniec należy to przekonwertować z powrotem na bazę 2, a następnie z powrotem na postać. Jeśli znak jest niemożliwy do wydrukowania, możesz go opcjonalnie wypisać, ale nie trzeba go usuwać.

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)

Punktacja

Najkrótszy kod w bajtach wygrywa.

-15% Premia: jeśli twój program usunie z wydruku nie dające się wydrukować. Musi to być co najmniej wszystkie znaki poniżej 32, z wyjątkiem znaków nowej linii (znak 10)

Downgoat
źródło
Muszę sprawić, by mój interpreter Simplex znów działał XDGBktnkZs
Conor O'Brien
Więc znaki w ciągu nie są odwrócone, ale bity w każdym znaku są?
xnor
Dla pewności: dla 0010000 bit jest odwrotny 0000100 lub 00001?
Digital Trauma
@DigitalTrauma Jeśli kod binarny jest 0010000, to należy go traktować 10000tak, jak na odwrót00001
Downgoat
2
Czy możemy założyć tylko ASCII (jako twoje przykłady), czy też powinno działać to niezależnie od postaci w moim języku? (Ponadto, jeśli język używa innego kodu znakowego, czy powinienem go używać zamiast ASCII / Unicode)?
Paŭlo Ebermann

Odpowiedzi:

4

CJam, 14

q{i2bW%:!2bc}%

Wypróbuj online

Wyjaśnienie:

Całkiem proste:

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

Wersja „do wydruku”, 20–15% = 17

q{i2bW%:!2bc' ,N--}%
aditsu
źródło
Cholera, ty. Właśnie miałem opublikować odpowiedź CJam D:
anOKsquirrel
@anOKsquirrel przepraszam ^^ czy było podobnie?
aditsu
Byłoby, gdybym to skończył.
anOKsquirrel
Jak działa W%? W wynosi -1, więc ...
anOKsquirrel
1
@anOKsquirrel patrz dokumentacja tutaj
aditsu
9

Pyth, 14 bajtów

smCi!M_jCd2 2z

Wypróbuj online.

Jak to działa

 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
źródło
2
Alternatywne rozwiązania (wszystkie 14 bajtów):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis,
Co powiesz na wersję, która usuwa niedrukowalne elementy, po prostu z braku zainteresowania / do porównania? Prawdopodobnie jako osobna odpowiedź.
hyde
8

Perl, 57 51 znaków

(Kod 50 znaków + opcja wiersza poleceń 1 znak).

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
1
51 bajtów: -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&jest krótszy niż sprintf'%b',ord$&i dodatkowo dekoduje w odwrotnej kolejności. Niestety generuje również końcowe zera, które należy usunąć.
primo,
Dziękuję @primo. unpackwciąż jest dla mnie nieodkrytym terenem.
manatwork
42 bajtów: -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Odwróć znak, bez konieczności transliteracji;)
primo
7

JavaScript ( ES6 ES7), 119 114 108 bajtów

Okazało się to znacznie dłużej niż oczekiwano :(

Dzięki @vihan za 5 bajtów zapisanych! Dzięki @ETHProductions zaoszczędzono kolejne 6 bajtów!

Aby przetestować:  uruchom poniższy fragment kodu, wprowadź dane podobne do "Hello, World!"i kliknij Testuj!

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
źródło
Myślę, że możesz zapisać 4 bajty, zastępując je parseIntz +('0b'+<code>)opisanym tutaj, a innym, używając w^1zamiast+!+w
Downgoat
2
Nigdy bym nie pomyślał, że to możliwe, ale po prostu grałem w golfa .05 bajtów : 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) Może to jednak nie jest legalne; obsługuje tylko 10 == \n, a nie 13 == \r. @ Vɪʜᴀɴ jaka jest twoja opinia?
ETHprodukcje
1
Pojawia się, Unexpected token '>'gdy próbuję uruchomić fragment kodu.
Paul R
1
@ETHproductions: dzięki - mam tylko Safari i Chrome pod ręką i chyba żadne z nich nie jest zgodne z ES6.
Paul R
1
@PaulR ES6 lub ECMAScript 6 to jeden z najnowszych zestawów nowych funkcji JavaScript. Zobacz tę stronę, aby uzyskać więcej informacji. Istnieje również tabela kompatybilności, która pokazuje, które funkcje są obsługiwane przez które przeglądarki (i inne programy). Ta odpowiedź w szczególności wymaga „funkcji strzałek”, „operatora rozkładania” i „interpretacji tablic” ES7.
ETHprodukcje
5

JavaScript (ES7), 126 bajtów - 15% = 107,1

Bawiłem się tą odpowiedzią, aby zobaczyć, czy bonus był tego wart. Najwyraźniej tak jest. Zestaw testowy został skradziony z tej samej odpowiedzi, ale dodałem własny zwrot akcji: pełne wsparcie 15% premii! :)

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>

ETHprodukcje
źródło
Niesamowita modyfikacja fragmentu testowego! Wygląda na to, że fragment automatycznie sprawdza teraz premię. Czy mogę zapytać, jak to zrobiłeś? (ps, jeśli chcesz oryginalnego (nie w jednym wierszu) źródła, nie krępuj się zapytać, może być łatwiej zmodyfikować w ten sposób)
jrich
@UndefinedFunction Och, przepraszam, że nie odpowiedziałeś od razu! Dodałem getScore()funkcję, która sprawdza Hello, World!zgodność testu (zawiera dogodnie zarówno znaki nowej linii, jak i znaki niedrukowalne) i zwraca wynik pomnożony przez 0,85 lub 1, w zależności od wyniku. I tak, dostęp do nie zminimalizowanego fragmentu byłby świetny. :)
ETHproductions
Udostępniłem tutaj oryginalny fragment kodu . Baw się dobrze!
jrich
4

PHP - 187 182 163 bajtów

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

Podaj wartość jako GET["s"].

array_map zwraca tablicę ze wszystkimi elementami drugiego parametru (tablica) po zastosowaniu funkcji wywołania zwrotnego (pierwszy parametr) do wszystkich z nich.

Nie jestem pewien, czy powinienem wziąć 15% zniżki, ponieważ echonie wyświetla znaków niedrukowalnych, ale ich nie usunąłem.

Cieszę się, że skończyłem, ponieważ to pierwsze wyzwanie, które biorę.

niezdefiniowany
źródło
1
Jest krótszy, jeśli nie deklarować te funkcje: $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 zupełnie o tym zapomniał. Dzięki.
niezdefiniowany
Nie możesz po prostu wstawić danych wejściowych do zmiennej. Powinieneś utworzyć funkcję lub odczytać dane wejściowe z STDIN. Nawiasem mówiąc, nie trzeba używać cudzysłowu wokół sznurka ( "chr", "bindec"...) ponieważ nie dbają o ostrzeżeniach. To powinno ci zaoszczędzić 12 bajtów.
Blackhole
@Blackhole dzięki za informacje, będę o tym wiedział następnym razem.
niezdefiniowany
Lepiej zmodyfikuj tę odpowiedź, która w innym przypadku jest nieprawidłowa :). To będzie kosztować prawie nie bajtach, wystarczy wymienić str_split($s)z str_split(fgets(STDIN))na przykład.
Blackhole
3

K5, 28 bajtów

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

Jest to trochę niewygodne, ponieważ decodeoperator K5 wykonuje konwersję bazy o stałej szerokości, więc aby zachować zgodność z opisem problemu, muszę przyciąć początkowe zera. Lambda {x@&|\x}dokonuje tego kroku.

Rozmaz:

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

Zbierać:

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

Wybierz:

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

Cały program w akcji:

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

Wierzę , że naturalne zachowanie OK przy drukowaniu sprawia, że ​​kwalifikuje się to do -15%, co daje wynik 28 * 0,85 = 23,8 .

JohnE
źródło
+1, ponieważ próbowałem, ale nie mogłem znaleźć krótkiego sposobu na pozbycie się zer wiodących!
kirbyfan64sos
Kilka powiązanych konstrukcji można znaleźć tutaj .
JohnE,
3

Julia, 77 bajtów - 15% = 65,45

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

Tworzy to nienazwaną funkcję, która akceptuje ciąg i zwraca ciąg. Znaki niedrukowalne są usuwane, co kwalifikuje to do otrzymania premii.

Nie golfowany:

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.
źródło
Chociaż z pewnością kwalifikuje się do otrzymania bonusu, kosztuje również więcej niż oszczędza bonus. 16 bajtów do filter(isprint,)i tylko 11,55 bajtów zapisanych dzięki premii.
Glen O
A jeśli zrezygnujesz z kroku filtrowania, możesz uniknąć zrozumienia i dołączyć, używając mapy bezpośrednio na łańcuchu. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(dla 56 bajtów)
Glen O
@GlenO Dzięki za sugestie, ale takie podejście pozostawia się w postaci niedrukowalnej jako kody szesnastkowe, co według OP jest niedozwolone. Korzystanie z filter(isprint,)obu kwalifikuje go do premii i sprawia, że ​​jest zgodny z zasadami.
Alex A.,
„Jeśli postać nie nadaje się do wydrukowania, możesz ją opcjonalnie wydrukować, ale nie trzeba jej usuwać”.
Glen O
A jeśli problem jest po drugiej stronie (że wyświetla się jako \x04i tym podobne), wtedy print()kosztuje siedem, co doprowadziłoby do 56 do 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''

Korzysta z niefortunnej ilości niektórych wywołań / wbudowanych platform .NET, co znacznie rozszerza kod.

Wyjaśnił:

Pobiera dane wejściowe param(..)i przekazuje je jako char[], abyśmy mogli odpowiednio je przepracować.

Następny bit (..)-join''zbiera i łączy nasze wyniki razem.

Wewnątrz tych parenów iterujemy z $a|%{..}pętlą foreach.

Wewnątrz pętli:

  • Tworzymy nowy ciąg $b, który jest naszą literą wejściową rzutowaną jako int +$_i [convert]ed do bazy2
  • Ta kolejna część, ustawienie $c, jest trudna, więc zacznijmy od środka i wyjdźmy
  • Odwracamy ciąg za $bpomocą(-join$b[$b.length..0])
  • Wykorzystujemy mój poprzedni kod do odwracania ciągu binarnego i przekształcamy wynik jako ciąg za pomocą"$(..)"
  • Karmimy ten ciąg do innego połączenia .NET [convert]S ToInt32od podstawy 2, która jest przechowywana w końcu, że w$c
  • Jeśli $cjest większy 31lub równy 10, rzutujemy go jako char, a ta wartość pozostaje w potoku dla wyniku (który jest gromadzony i -join''edytowany razem, powyżej), w przeciwnym razie nic nie pozostanie w tej konkretnej iteracji

Uff

Kwalifikuje się również do premii -15%.

Przykład

PS C:\Tools\Scripts\golfing> .\reverse-and-invert-a-string.ps1 "Hello, World!"
v,dd2>
Xdl
AdmBorkBork
źródło
3

Funkcja C, 63

o;f(o,char *s){for(;*s;*s=o,s++)for(o=0;*s;*s/=2)o+=o+!(*s%2);}
Cyfrowa trauma
źródło
1

Minkolang 0.11 , 26 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie

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
źródło
1

MATLAB, 60 bajtów

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

Zasadniczo każdy znak z kolei jest konwertowany na ciąg binarny (bez zer wiodących). Tablica jest odwrócona i jest odejmowana od 97 („0” + „1”), co odwraca znak. To jest przeliczane z powrotem na dziesiętne. Po przetworzeniu wszystkich znaków cała tablica jest następnie przekształcana z powrotem w znaki, zanim zostaną zwrócone.

Tom Carpenter
źródło
1

Python 3, 95 91

Prosta implementacja.

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

Nie golfowany:

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
źródło
1

Ruby, 62 znaki

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
człowiek w pracy
źródło
1

C #, 156 bajtów - 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{}}}

Wcięcia i nowe linie dla przejrzystości:

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
źródło
1

JavaScript 123 bajty

s=>[].map.call(s,s=>String.fromCharCode("0b"+s.charCodeAt().toString(2).split('').reverse().map(s=>s^1).join(''))).join('')
Naouak
źródło
1

Retina , 1107 629 bajtów - 15% = 534,65 (niekonkurujące)

Wykorzystuje funkcje dodane po dacie wyzwania. (Niejawny zachowanie $*, sortowania)

Retina nie ma wbudowanego narzędzia do konwersji postaci na numer porządkowy ASCII lub na odwrót ... więc zobacz jej błyszczącą długość. Obsługuje drukowalne ASCII i usuwa zarówno niedrukowalne, jak i nowe wiersze. Liczba bajtów zakłada kodowanie ISO 8859-1.

Kod zawiera znaki niedrukowalne.


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

Wypróbuj online

Jeśli zapoznasz się z samouczkiem Retina dotyczącym arytmetyki jednorzędowej , rozpoznasz kilka różnych fragmentów mojego kodu jako pochodzących z tego miejsca.

Podziękowania dla Martina za grę w golfa na setkach bajtów

mbomb007
źródło
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);}}}

Nie golfowany:

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

Myślę, że to rozwiązanie jest nieco interesujące pod względem wykorzystania Integermetod Integer.reversei Integer.numberOfLeadingZerosktóre działają tak, jak brzmią, i przesunięcie -1 >>> sgdzie sjest liczba wiodących zer, aby maska ​​maskowała wysokie bity, których nie chcemy. Żałuję tylko, że nazwa tej drugiej metody jest tak cholernie gadatliwa, ale to właśnie dostaję do gry w golfa w Javie.

Wydajność:

v,dd2>
Xdl
David Conrad
źródło
1

Japt, 25 bajtów

Chcesz stworzyć golfowy program JavaScript, ale najkrótsza metoda wymaga wielu długich nazw funkcji? Po to został stworzony Japt. :)

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

Wypróbuj w tłumaczu online !

Jak to działa

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

Używając bieżącej wersji Japt (od wersji 1.4.4), liczbę bajtów można zmniejszyć do 14:

®c ¤w m^1 n2 d

Przetestuj online!

ETHprodukcje
źródło
0

Haskell, 167 bajtów

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

Niestety, Haskell staje się bardzo gadatliwy, kiedy musi czytać / drukować w innej bazie…

arjanen
źródło
0

Perl 6, 66 bajtów

Wyjście na całość poprzez usunięcie niedrukowalnych znaków kontrolnych prowadzi mnie do (83 + 1) -15% = 71,4

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

Jeśli usunę kod usuwający znaki kontrolne, zaoszczędzę sporo 65 + 1 = 66

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

(Użyłem »zamiast >>dla jasności)

Brad Gilbert b2gills
źródło
0

Galaretka , 6 bajtów (niekonkurencyjna)

OBU¬ḄỌ

Wypróbuj online!

Wyjaśnienie:

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 the Outgolfer
źródło
0

Rakieta 250 15% bonus = 212 bajtów

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

Nie golfowany:

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

Testowanie:

(f "Hello, World!")

Wydajność:

"v,dd2>\nXdl"
rnso
źródło
0

PHP, 80 bajtów

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

pobiera dane wejściowe z STDIN; biegać z -R.

wersja bonusowa, 97 110 bajtów -> wynik 93,5

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

drukuje ASCII 10 i 32 do 126 (nowa linia i drukowalne)


podział, TiO i jeśli to możliwe, nastąpi gra w golfa; Jestem teraz zmęczony.

Tytus
źródło